openapi: 3.0.3 info: title: Admin Account / Address Settings API contact: name: Spree Commerce url: https://spreecommerce.org email: hello@spreecommerce.org description: "Spree Admin API v3 - Administrative API for managing products, orders, and store settings.\n\n## Authentication\n\nThe Admin API requires a secret API key passed in the `x-spree-api-key` header.\nSecret API keys can be generated in the Spree admin dashboard.\n\n## Response Format\n\nAll responses are JSON. List endpoints return paginated responses with `data` and `meta` keys.\nSingle resource endpoints return a flat JSON object.\n\n## Resource IDs\n\nEvery resource is identified by an opaque string ID (e.g. `prod_86Rf07xd4z`,\n`variant_k5nR8xLq`, `or_UkLWZg9DAJ`). Use these IDs everywhere — URL paths,\nrequest bodies, and Ransack filters all accept them directly.\n\n## Error Handling\n\nErrors return a consistent format:\n```json\n{\n \"error\": {\n \"code\": \"validation_error\",\n \"message\": \"Validation failed\",\n \"details\": { \"name\": [\"can't be blank\"] }\n }\n}\n```\n" version: v3 servers: - url: http://{defaultHost} variables: defaultHost: default: localhost:3000 tags: - name: Settings description: Store-level settings — store profile, tags, store credit categories paths: /api/v3/admin/store_credit_categories: get: summary: List store credit categories tags: - Settings security: - api_key: [] bearer_auth: [] description: 'Returns the configured store credit categories. Categories classify store credits (e.g., "Goodwill", "Gift Card", "Refund") and surface in the admin UI as a dropdown when issuing or editing a store credit. Category names matching `Spree::Config[:non_expiring_credit_types]` are flagged via `non_expiring: true`. **Required scope:** `read_settings` (for API-key authentication).' x-codeSamples: - lang: javascript label: Spree Admin SDK source: "import { createAdminClient } from '@spree/admin-sdk'\n\nconst client = createAdminClient({\n baseUrl: 'https://your-store.com',\n secretKey: 'sk_xxx',\n})\n\nconst { data: categories } = await client.storeCreditCategories.list()" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true description: Bearer token for admin authentication schema: type: string - name: page in: query required: false description: Page number schema: type: integer - name: limit in: query required: false description: Number of records per page schema: type: integer - name: q[name_cont] in: query required: false description: Filter by name (contains) schema: type: string - name: sort in: query required: false description: Sort by field. Prefix with `-` for descending (e.g., `-created_at`). schema: type: string - name: fields in: query required: false description: Comma-separated list of fields to include. id is always included. schema: type: string responses: '200': description: store credit categories found content: application/json: example: data: - id: sccat_UkLWZg9DAJ name: Goodwill created_at: '2026-06-12T17:25:17.833Z' updated_at: '2026-06-12T17:25:17.833Z' non_expiring: false meta: page: 1 limit: 25 count: 1 pages: 1 from: 1 to: 1 in: 1 previous: null next: null schema: type: object properties: data: type: array items: $ref: '#/components/schemas/StoreCreditCategory' meta: $ref: '#/components/schemas/PaginationMeta' required: - data - meta '401': description: unauthorized content: application/json: example: error: code: authentication_required message: Authentication required schema: $ref: '#/components/schemas/ErrorResponse' /api/v3/admin/store_credit_categories/{id}: parameters: - name: id in: path required: true description: Store credit category ID schema: type: string get: summary: Get a store credit category tags: - Settings security: - api_key: [] bearer_auth: [] description: 'Returns a single store credit category by prefixed ID. **Required scope:** `read_settings` (for API-key authentication).' x-codeSamples: - lang: javascript label: Spree Admin SDK source: "import { createAdminClient } from '@spree/admin-sdk'\n\nconst client = createAdminClient({\n baseUrl: 'https://your-store.com',\n secretKey: 'sk_xxx',\n})\n\nconst category = await client.storeCreditCategories.get('sccat_UkLWZg9DAJ')" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true description: Bearer token for admin authentication schema: type: string - name: fields in: query required: false description: Comma-separated list of fields to include. id is always included. schema: type: string responses: '200': description: store credit category found content: application/json: example: id: sccat_UkLWZg9DAJ name: Goodwill created_at: '2026-06-12T17:25:18.145Z' updated_at: '2026-06-12T17:25:18.145Z' non_expiring: false schema: $ref: '#/components/schemas/StoreCreditCategory' '404': description: store credit category not found content: application/json: example: error: code: record_not_found message: Store credit category not found schema: $ref: '#/components/schemas/ErrorResponse' /api/v3/admin/store: get: summary: Get the current store tags: - Settings security: - api_key: [] bearer_auth: [] description: 'Returns the current store configuration. The store is resolved from the request context (host or admin selection); there is no `id` parameter. **Required scope:** `read_settings` (for API-key authentication).' x-codeSamples: - lang: javascript label: Spree Admin SDK source: "import { createAdminClient } from '@spree/admin-sdk'\n\nconst client = createAdminClient({\n baseUrl: 'https://your-store.com',\n secretKey: 'sk_xxx',\n})\n\nconst store = await client.store.get()" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true description: Bearer token for admin authentication schema: type: string responses: '200': description: current store content: application/json: example: id: store_UkLWZg9DAJ metadata: {} name: Spree Test Store default_currency: USD default_locale: en mail_from_address: no-reply@example.com customer_support_email: support@example.com new_order_notifications_email: store-owner@example.com preferred_send_consumer_transactional_emails: true preferred_admin_locale: null preferred_timezone: UTC preferred_weight_unit: lb preferred_unit_system: imperial created_at: '2026-06-12T17:23:41.091Z' updated_at: '2026-06-12T17:25:18.763Z' url: http://www.example.com:3000 supported_currencies: - USD supported_locales: - en logo_url: null mailer_logo_url: null schema: $ref: '#/components/schemas/Store' '401': description: unauthorized content: application/json: example: error: code: authentication_required message: Authentication required schema: $ref: '#/components/schemas/ErrorResponse' patch: summary: Update the current store tags: - Settings security: - api_key: [] bearer_auth: [] description: 'Updates the current store configuration. **Required scope:** `write_settings` (for API-key authentication).' x-codeSamples: - lang: javascript label: Spree Admin SDK source: "import { createAdminClient } from '@spree/admin-sdk'\n\nconst client = createAdminClient({\n baseUrl: 'https://your-store.com',\n secretKey: 'sk_xxx',\n})\n\nconst store = await client.store.update({\n name: 'My Store'\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true description: Bearer token for admin authentication schema: type: string responses: '200': description: store updated content: application/json: example: id: store_UkLWZg9DAJ metadata: {} name: Renamed Store default_currency: USD default_locale: en mail_from_address: no-reply@example.com customer_support_email: support@example.com new_order_notifications_email: store-owner@example.com preferred_send_consumer_transactional_emails: true preferred_admin_locale: null preferred_timezone: UTC preferred_weight_unit: lb preferred_unit_system: imperial created_at: '2026-06-12T17:23:41.091Z' updated_at: '2026-06-12T17:25:19.408Z' url: http://www.example.com:3000 supported_currencies: - USD supported_locales: - en logo_url: null mailer_logo_url: null schema: $ref: '#/components/schemas/Store' '422': description: validation error content: application/json: example: error: code: validation_error message: Site Name can't be blank details: name: - can't be blank schema: $ref: '#/components/schemas/ErrorResponse' requestBody: content: application/json: schema: type: object properties: name: type: string example: My Store preferred_admin_locale: type: string example: en preferred_timezone: type: string example: UTC preferred_weight_unit: type: string example: kg preferred_unit_system: type: string example: metric /api/v3/admin/tags: get: summary: List tags tags: - Settings security: - api_key: [] bearer_auth: [] description: Returns tag names for a given taggable type. Used for autocomplete in tag inputs on products, orders, and customers. x-codeSamples: - lang: javascript label: Spree Admin SDK source: "import { createAdminClient } from '@spree/admin-sdk'\n\nconst client = createAdminClient({\n baseUrl: 'https://your-store.com',\n secretKey: 'sk_xxx',\n})\n\nconst { data: tags } = await client.tags.list({\n taggable_type: 'Spree::User',\n q: 'vip',\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string - name: taggable_type in: query required: true description: Taggable type (`Spree::Product`, `Spree::Order`, or `Spree::User`) schema: type: string - name: q in: query required: false description: Optional case-insensitive substring filter schema: type: string responses: '200': description: tags found content: application/json: example: data: - name: vip - name: wholesale '422': description: invalid taggable type content: application/json: example: error: code: invalid_taggable_type message: taggable_type must be one of Spree::Product, Spree::Order, Spree::LegacyUser components: schemas: Store: type: object properties: id: type: string metadata: type: object name: type: string default_currency: type: string default_locale: type: string mail_from_address: type: string nullable: true customer_support_email: type: string nullable: true new_order_notifications_email: type: string nullable: true preferred_send_consumer_transactional_emails: type: boolean preferred_admin_locale: type: string nullable: true preferred_timezone: type: string preferred_weight_unit: type: string preferred_unit_system: type: string created_at: type: string updated_at: type: string url: type: string supported_currencies: type: array items: type: string supported_locales: type: array items: type: string logo_url: type: string nullable: true mailer_logo_url: type: string nullable: true required: - id - metadata - name - default_currency - default_locale - mail_from_address - customer_support_email - new_order_notifications_email - preferred_send_consumer_transactional_emails - preferred_admin_locale - preferred_timezone - preferred_weight_unit - preferred_unit_system - created_at - updated_at - url - supported_currencies - supported_locales - logo_url - mailer_logo_url x-typelizer: true StoreCreditCategory: type: object properties: id: type: string name: type: string created_at: type: string updated_at: type: string non_expiring: type: boolean required: - id - name - created_at - updated_at - non_expiring x-typelizer: true PaginationMeta: type: object properties: page: type: integer example: 1 limit: type: integer example: 25 count: type: integer example: 100 description: Total number of records pages: type: integer example: 4 description: Total number of pages from: type: integer example: 1 description: Index of first record on this page to: type: integer example: 25 description: Index of last record on this page in: type: integer example: 25 description: Number of records on this page previous: type: integer nullable: true example: null description: Previous page number next: type: integer nullable: true example: 2 description: Next page number required: - page - limit - count - pages - from - to - in ErrorResponse: type: object properties: error: type: object properties: code: type: string example: record_not_found message: type: string example: Record not found details: type: object description: Field-specific validation errors nullable: true example: name: - is too short - is required email: - is invalid required: - code - message required: - error example: error: code: validation_error message: Validation failed details: name: - is too short email: - is invalid securitySchemes: api_key: type: apiKey name: x-spree-api-key in: header description: Secret API key for admin access bearer_auth: type: http scheme: bearer bearerFormat: JWT description: JWT token for admin user authentication x-tagGroups: - name: Authentication tags: - Authentication - name: Products & Catalog tags: - Products - Variants - Option Types - Custom Fields - Channels - name: Pricing tags: - Pricing - Markets - name: Orders & Fulfillment tags: - Orders - Payments - Fulfillments - Refunds - name: Customers tags: - Customers - Customer Groups - name: Promotions & Gift Cards tags: - Promotions - Gift Cards - name: Data tags: - Exports - name: Configuration tags: - Settings - Stock Locations - Payment Methods - Staff - API Keys - Allowed Origins - Webhooks