Customizing JSON Responses
Spree uses Alba serializers to build API v3 responses. You can replace any serializer via Spree Dependencies.Adding Custom Attributes
Let’s say you want to add amy_custom_attribute column to the Product API response.
Create a custom serializer that inherits from the core one:
app/serializers/my_app/product_serializer.rb
config/initializers/spree.rb:
Adding an Association
Let’s say you’ve created aSpree::Brand model that belongs to Product (see the tutorial for the full example).
Create a serializer for the new model:
app/serializers/spree/api/v3/brand_serializer.rb
app/serializers/my_app/product_serializer.rb
config/initializers/spree.rb:
?expand=brand:
Serializer Dependency Keys
Here are the most commonly customized v3 serializers:
See
Spree::Api::ApiDependencies for the full list.
Adding New Endpoints
Controller
Inherit fromSpree::Api::V3::Store::ResourceController for Store API endpoints:
app/controllers/spree/api/v3/store/brands_controller.rb
ResourceController provides:
Override these methods to customize:
Routes
Add routes in your app’sconfig/routes.rb:
Permitted Attributes
For endpoints that accept writes (create/update), declare the attributes in your controller:params.permit fragments, so collections and nested structures use
the shapes you would pass there directly — [:name, { region_ids: [] }].
Declare
resource_permitted_attributes, not permitted_attributes. The
latter is what appends extension-contributed attributes to your list, so
overriding it replaces them.Adding an Attribute to a Core Resource
To make a new column writable on a Spree model without decorating the controllers that write it, append to the model’s permitted attributes:config/initializers/spree.rb
+=, never = — assigning replaces what another extension added — and
declare only attributes of your own, since redeclaring a key the controller
already permits replaces its filter rather than widening it.
For merchant-managed data, prefer Custom Fields,
which need no code and are filterable and sortable. This is for extensions
that add real database columns.

