openapi: 3.0.3 info: title: Admin Account / Address Gift Cards 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: Gift Cards description: Gift cards and gift card batches paths: /api/v3/admin/gift_card_batches: get: summary: List gift card batches tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Returns the gift card batches issued by the current store. Each batch groups the cards generated together for a campaign or bulk-issuance — the cards themselves live under `/admin/gift_cards` and reference the batch via `gift_card_batch_id`. **Required scope:** `read_gift_cards` (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: batches } = await client.giftCardBatches.list({ page: 1, limit: 25 })" 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: Records per page schema: type: integer - name: q[prefix_cont] in: query required: false description: Filter by prefix (contains) schema: type: string - name: sort in: query required: false description: Sort by field. Prefix with `-` for descending. schema: type: string responses: '200': description: gift card batches found content: application/json: example: data: - id: gcb_UkLWZg9DAJ codes_count: 2 currency: USD prefix: WELCOME created_at: '2026-06-12T17:24:14.398Z' updated_at: '2026-06-12T17:24:14.398Z' amount: '50.0' expires_at: null created_by_id: null 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/GiftCardBatch' meta: $ref: '#/components/schemas/PaginationMeta' required: - data - meta post: summary: Create a gift card batch tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Issues a batch of gift cards in a single call. The server generates `codes_count` cards inline for small batches (configurable via `Spree.config.gift_card_batch_web_limit`, default 500) or enqueues a background job for larger ones. Each card''s code is the batch `prefix` followed by random hex. **Required scope:** `write_gift_cards` (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 batch = await client.giftCardBatches.create({\n prefix: 'WELCOME',\n amount: '25.00',\n currency: 'USD',\n codes_count: 100,\n expires_at: '2030-12-31',\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string responses: '201': description: gift card batch created content: application/json: example: id: gcb_gbHJdmfrXB codes_count: 5 currency: USD prefix: NEWCAMP created_at: '2026-06-12T17:24:14.972Z' updated_at: '2026-06-12T17:24:14.972Z' amount: '25.0' expires_at: '2030-12-31' created_by_id: admin_UkLWZg9DAJ schema: $ref: '#/components/schemas/GiftCardBatch' '422': description: validation error content: application/json: example: error: code: validation_error message: Prefix can't be blank details: prefix: - can't be blank schema: $ref: '#/components/schemas/ErrorResponse' requestBody: content: application/json: schema: type: object required: - prefix - amount - codes_count properties: prefix: type: string example: WELCOME description: Lowercased and prepended to every generated code. amount: type: string example: '25.00' description: Decimal amount per card, greater than zero. currency: type: string example: USD description: ISO 4217 currency code. Defaults to the store currency. codes_count: type: integer example: 100 description: Number of cards to generate. Capped at `gift_card_batch_limit`. expires_at: type: string example: '2030-12-31' nullable: true /api/v3/admin/gift_card_batches/{id}: parameters: - name: id in: path required: true description: Gift card batch prefixed ID schema: type: string get: summary: Get a gift card batch tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Returns a single batch. **Required scope:** `read_gift_cards` (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 batch = await client.giftCardBatches.get('gcb_K3zr8x')" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string responses: '200': description: gift card batch found content: application/json: example: id: gcb_UkLWZg9DAJ codes_count: 2 currency: USD prefix: WELCOME created_at: '2026-06-12T17:24:15.269Z' updated_at: '2026-06-12T17:24:15.269Z' amount: '50.0' expires_at: null created_by_id: null schema: $ref: '#/components/schemas/GiftCardBatch' '404': description: gift card batch not found content: application/json: example: error: code: record_not_found message: Gift card batch not found schema: $ref: '#/components/schemas/ErrorResponse' /api/v3/admin/gift_cards: get: summary: List gift cards tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Returns the gift cards issued by the current store. Filter by `q[code_cont]` for code search, `q[user_id_eq]` for cards issued to a specific customer, or `q[state_eq]` for status filtering. **Required scope:** `read_gift_cards` (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: giftCards } = await client.giftCards.list({\n page: 1,\n limit: 25,\n expand: ['customer', 'created_by'],\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 - 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[code_cont] in: query required: false description: Filter by gift card code (contains) schema: type: string - name: q[state_eq] in: query required: false description: Filter by status (active, redeemed, partially_redeemed, canceled) 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: gift cards found content: application/json: example: data: - id: gc_UkLWZg9DAJ code: CD084BB41D246D4F status: active currency: USD amount: '50.0' amount_used: '0.0' amount_authorized: '0.0' amount_remaining: '50.0' display_amount: $50.00 display_amount_used: $0.00 display_amount_remaining: $50.00 expires_at: null redeemed_at: null expired: false active: true created_at: '2026-06-12T17:24:15.844Z' updated_at: '2026-06-12T17:24:15.844Z' customer_id: null created_by_id: null - id: gc_gbHJdmfrXB code: 1942CCC0C95DF267 status: active currency: USD amount: '25.0' amount_used: '0.0' amount_authorized: '0.0' amount_remaining: '25.0' display_amount: $25.00 display_amount_used: $0.00 display_amount_remaining: $25.00 expires_at: null redeemed_at: null expired: false active: true created_at: '2026-06-12T17:24:15.846Z' updated_at: '2026-06-12T17:24:15.846Z' customer_id: null created_by_id: null meta: page: 1 limit: 25 count: 2 pages: 1 from: 1 to: 2 in: 2 previous: null next: null schema: type: object properties: data: type: array items: $ref: '#/components/schemas/GiftCard' 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' post: summary: Create a gift card tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Issues a gift card scoped to the current store. The code is auto-generated when omitted. `currency` defaults to the store''s configured currency. Pass `user_id` (prefixed ID) to attach the card to a specific customer. **Required scope:** `write_gift_cards` (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 giftCard = await client.giftCards.create({\n amount: '25.00',\n currency: 'USD',\n expires_at: '2030-12-31',\n user_id: 'cus_UkLWZg9DAJ',\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string responses: '201': description: gift card created content: application/json: example: id: gc_EfhxLZ9ck8 code: 4F5E5C544DDFA6B5 status: active currency: USD amount: '25.0' amount_used: '0.0' amount_authorized: '0.0' amount_remaining: '25.0' display_amount: $25.00 display_amount_used: $0.00 display_amount_remaining: $25.00 expires_at: '2030-12-31' redeemed_at: null expired: false active: true created_at: '2026-06-12T17:24:16.432Z' updated_at: '2026-06-12T17:24:16.432Z' customer_id: null created_by_id: admin_UkLWZg9DAJ schema: $ref: '#/components/schemas/GiftCard' '422': description: validation error content: application/json: example: error: code: validation_error message: Amount must be greater than 0 details: amount: - must be greater than 0 schema: $ref: '#/components/schemas/ErrorResponse' requestBody: content: application/json: schema: type: object required: - amount properties: amount: type: string example: '25.00' description: Decimal amount, greater than zero. currency: type: string example: USD description: ISO 4217 currency code. Defaults to the store currency. code: type: string example: WELCOME50 description: Optional caller-supplied code. Auto-generated when omitted. expires_at: type: string example: '2030-12-31' description: ISO 8601 date. nullable: true user_id: type: string example: cus_UkLWZg9DAJ description: Optional customer prefixed ID. nullable: true /api/v3/admin/gift_cards/{id}: parameters: - name: id in: path required: true description: Gift card prefixed ID schema: type: string get: summary: Get a gift card tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Returns a single gift card. **Required scope:** `read_gift_cards` (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 giftCard = await client.giftCards.get('gc_K3zr8x', {\n expand: ['customer', 'created_by', 'orders'],\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true 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: gift card found content: application/json: example: id: gc_UkLWZg9DAJ code: CF2E19F27E7DA895 status: active currency: USD amount: '50.0' amount_used: '0.0' amount_authorized: '0.0' amount_remaining: '50.0' display_amount: $50.00 display_amount_used: $0.00 display_amount_remaining: $50.00 expires_at: null redeemed_at: null expired: false active: true created_at: '2026-06-12T17:24:16.734Z' updated_at: '2026-06-12T17:24:16.734Z' customer_id: null created_by_id: null schema: $ref: '#/components/schemas/GiftCard' '404': description: gift card not found content: application/json: example: error: code: record_not_found message: Gift card not found schema: $ref: '#/components/schemas/ErrorResponse' patch: summary: Update a gift card tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Updates an active gift card''s editable attributes. Redeemed or partially-redeemed cards cannot be edited. **Required scope:** `write_gift_cards` (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 giftCard = await client.giftCards.update('gc_K3zr8x', {\n amount: '75.00',\n})" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string responses: '200': description: gift card updated content: application/json: example: id: gc_UkLWZg9DAJ code: 38197D3D485C7386 status: active currency: USD amount: '75.0' amount_used: '0.0' amount_authorized: '0.0' amount_remaining: '75.0' display_amount: $75.00 display_amount_used: $0.00 display_amount_remaining: $75.00 expires_at: null redeemed_at: null expired: false active: true created_at: '2026-06-12T17:24:17.340Z' updated_at: '2026-06-12T17:24:17.626Z' customer_id: null created_by_id: null schema: $ref: '#/components/schemas/GiftCard' requestBody: content: application/json: schema: type: object properties: amount: type: string example: '75.00' expires_at: type: string example: '2031-12-31' nullable: true user_id: type: string example: cus_UkLWZg9DAJ nullable: true delete: summary: Delete a gift card tags: - Gift Cards security: - api_key: [] bearer_auth: [] description: 'Deletes an unused gift card. Cards that have been redeemed or partially redeemed cannot be deleted and return 422. **Required scope:** `write_gift_cards` (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\nawait client.giftCards.delete('gc_K3zr8x')" parameters: - name: x-spree-api-key in: header required: true schema: type: string - name: Authorization in: header required: true schema: type: string responses: '204': description: gift card deleted '422': description: redeemed gift card cannot be deleted content: application/json: example: error: code: validation_error message: Gift card cannot be deleted components: schemas: LineItem: type: object properties: id: type: string variant_id: type: string quantity: type: number currency: type: string name: type: string slug: type: string options_text: type: string price: type: string display_price: type: string total: type: string display_total: type: string adjustment_total: type: string display_adjustment_total: type: string additional_tax_total: type: string display_additional_tax_total: type: string included_tax_total: type: string display_included_tax_total: type: string discount_total: type: string display_discount_total: type: string pre_tax_amount: type: string display_pre_tax_amount: type: string discounted_amount: type: string display_discounted_amount: type: string display_compare_at_amount: type: string nullable: true compare_at_amount: type: string nullable: true thumbnail_url: type: string nullable: true option_values: type: array items: $ref: '#/components/schemas/OptionValue' digital_links: type: array items: $ref: '#/components/schemas/DigitalLink' metadata: type: object created_at: type: string updated_at: type: string cost_price: type: string nullable: true tax_category_id: type: string nullable: true variant: $ref: '#/components/schemas/Variant' tax_category: $ref: '#/components/schemas/TaxCategory' adjustments: type: array items: $ref: '#/components/schemas/Adjustment' required: - id - variant_id - quantity - currency - name - slug - options_text - price - display_price - total - display_total - adjustment_total - display_adjustment_total - additional_tax_total - display_additional_tax_total - included_tax_total - display_included_tax_total - discount_total - display_discount_total - pre_tax_amount - display_pre_tax_amount - discounted_amount - display_discounted_amount - display_compare_at_amount - compare_at_amount - thumbnail_url - option_values - digital_links - metadata - created_at - updated_at - cost_price - tax_category_id x-typelizer: true ReturnAuthorization: type: object properties: id: type: string number: type: string status: type: string order_id: type: string nullable: true stock_location_id: type: string nullable: true return_authorization_reason_id: type: string nullable: true created_at: type: string updated_at: type: string order: $ref: '#/components/schemas/Order' stock_location: $ref: '#/components/schemas/StockLocation' required: - id - number - status - order_id - stock_location_id - return_authorization_reason_id - created_at - updated_at x-typelizer: true StockItem: type: object properties: id: type: string count_on_hand: type: number backorderable: type: boolean stock_location_id: type: string nullable: true variant_id: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string allocated_count: type: number available_count: type: number stock_location: $ref: '#/components/schemas/StockLocation' variant: $ref: '#/components/schemas/Variant' required: - id - count_on_hand - backorderable - stock_location_id - variant_id - metadata - created_at - updated_at - allocated_count - available_count x-typelizer: true PaymentSource: type: object properties: id: type: string gateway_payment_profile_id: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string required: - id - gateway_payment_profile_id - metadata - created_at - updated_at x-typelizer: true AdminUser: type: object properties: id: type: string email: type: string first_name: type: string nullable: true last_name: type: string nullable: true full_name: type: string nullable: true created_at: type: string updated_at: type: string roles: type: array items: $ref: '#/components/schemas/AdminUserRoleAssignment' required: - id - email - first_name - last_name - full_name - created_at - updated_at - roles x-typelizer: true Adjustment: type: object properties: id: type: string label: type: string display_amount: type: string included: type: boolean created_at: type: string updated_at: type: string amount: type: string order_id: type: string nullable: true required: - id - label - display_amount - included - created_at - updated_at - amount - order_id x-typelizer: true Address: type: object properties: id: type: string first_name: type: string nullable: true last_name: type: string nullable: true full_name: type: string address1: type: string nullable: true address2: type: string nullable: true postal_code: type: string nullable: true city: type: string nullable: true phone: type: string nullable: true company: type: string nullable: true country_name: type: string country_iso: type: string state_text: type: string nullable: true state_abbr: type: string nullable: true quick_checkout: type: boolean is_default_billing: type: boolean is_default_shipping: type: boolean state_name: type: string nullable: true label: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string customer_id: type: string nullable: true required: - id - first_name - last_name - full_name - address1 - address2 - postal_code - city - phone - company - country_name - country_iso - state_text - state_abbr - quick_checkout - is_default_billing - is_default_shipping - state_name - label - metadata - created_at - updated_at - customer_id x-typelizer: true DeliveryRate: type: object properties: id: type: string delivery_method_id: type: string name: type: string selected: type: boolean cost: type: string total: type: string additional_tax_total: type: string included_tax_total: type: string tax_total: type: string display_cost: type: string display_total: type: string display_additional_tax_total: type: string display_included_tax_total: type: string display_tax_total: type: string delivery_method: $ref: '#/components/schemas/DeliveryMethod' created_at: type: string updated_at: type: string required: - id - delivery_method_id - name - selected - cost - total - additional_tax_total - included_tax_total - tax_total - display_cost - display_total - display_additional_tax_total - display_included_tax_total - display_tax_total - created_at - updated_at x-typelizer: true 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 FulfillmentManifestItem: type: object description: An item within a fulfillment — which line item and how many units are in this fulfillment properties: item_id: type: string description: Line item ID example: li_abc123 variant_id: type: string description: Variant ID example: variant_abc123 quantity: type: integer description: Quantity in this fulfillment example: 2 required: - item_id - variant_id - quantity CustomerGroup: type: object properties: id: type: string name: type: string description: type: string nullable: true customers_count: type: number created_at: type: string updated_at: type: string customers: type: array items: $ref: '#/components/schemas/Customer' required: - id - name - description - customers_count - created_at - updated_at x-typelizer: true CustomField: type: object properties: id: type: string label: type: string type: type: string deprecated: true field_type: type: string enum: - short_text - long_text - rich_text - number - boolean - json key: type: string value: type: object created_at: type: string updated_at: type: string storefront_visible: type: boolean custom_field_definition_id: type: string required: - id - label - type - field_type - key - value - created_at - updated_at - storefront_visible - custom_field_definition_id x-typelizer: true DeliveryMethod: type: object properties: id: type: string name: type: string code: type: string nullable: true created_at: type: string updated_at: type: string required: - id - name - code - created_at - updated_at x-typelizer: true Fulfillment: type: object properties: id: type: string number: type: string tracking: type: string nullable: true tracking_url: type: string nullable: true cost: type: string display_cost: type: string total: type: string display_total: type: string discount_total: type: string display_discount_total: type: string additional_tax_total: type: string display_additional_tax_total: type: string included_tax_total: type: string display_included_tax_total: type: string tax_total: type: string display_tax_total: type: string status: type: string fulfillment_type: type: string fulfilled_at: type: string nullable: true items: type: array items: $ref: '#/components/schemas/FulfillmentManifestItem' delivery_method: $ref: '#/components/schemas/DeliveryMethod' stock_location: $ref: '#/components/schemas/StockLocation' delivery_rates: type: array items: $ref: '#/components/schemas/DeliveryRate' metadata: type: object adjustment_total: type: string pre_tax_amount: type: string created_at: type: string updated_at: type: string order_id: type: string nullable: true stock_location_id: type: string nullable: true order: $ref: '#/components/schemas/Order' adjustments: type: array items: $ref: '#/components/schemas/Adjustment' required: - id - number - tracking - tracking_url - cost - display_cost - total - display_total - discount_total - display_discount_total - additional_tax_total - display_additional_tax_total - included_tax_total - display_included_tax_total - tax_total - display_tax_total - status - fulfillment_type - fulfilled_at - items - metadata - adjustment_total - pre_tax_amount - created_at - updated_at - order_id - stock_location_id x-typelizer: true Customer: type: object properties: id: type: string email: type: string first_name: type: string nullable: true last_name: type: string nullable: true phone: type: string nullable: true accepts_email_marketing: type: boolean full_name: type: string available_store_credit_total: type: string display_available_store_credit_total: type: string addresses: type: array items: $ref: '#/components/schemas/Address' default_billing_address: allOf: - $ref: '#/components/schemas/Address' nullable: true default_shipping_address: allOf: - $ref: '#/components/schemas/Address' nullable: true login: type: string nullable: true metadata: type: object last_sign_in_at: type: string nullable: true current_sign_in_at: type: string nullable: true created_at: type: string updated_at: type: string sign_in_count: type: number failed_attempts: type: number last_sign_in_ip: type: string nullable: true current_sign_in_ip: type: string nullable: true tags: type: array items: type: string internal_note_html: type: string nullable: true default_billing_address_id: type: string nullable: true default_shipping_address_id: type: string nullable: true orders_count: type: number total_spent: type: string display_total_spent: type: string last_order_completed_at: type: string nullable: true orders: type: array items: $ref: '#/components/schemas/Order' store_credits: type: array items: $ref: '#/components/schemas/StoreCredit' customer_groups: type: array items: $ref: '#/components/schemas/CustomerGroup' required: - id - email - first_name - last_name - phone - accepts_email_marketing - full_name - available_store_credit_total - display_available_store_credit_total - login - metadata - last_sign_in_at - current_sign_in_at - created_at - updated_at - sign_in_count - failed_attempts - last_sign_in_ip - current_sign_in_ip - tags - internal_note_html - default_billing_address_id - default_shipping_address_id - orders_count - total_spent - display_total_spent - last_order_completed_at x-typelizer: true DigitalLink: type: object properties: id: type: string access_counter: type: number filename: type: string content_type: type: string download_url: type: string authorizable: type: boolean expired: type: boolean access_limit_exceeded: type: boolean created_at: type: string updated_at: type: string required: - id - access_counter - filename - content_type - download_url - authorizable - expired - access_limit_exceeded - created_at - updated_at x-typelizer: true PriceHistory: type: object properties: id: type: string amount: type: string amount_in_cents: type: number currency: type: string display_amount: type: string recorded_at: type: string variant_id: type: string price_id: type: string compare_at_amount: type: string nullable: true created_at: type: string required: - id - amount - amount_in_cents - currency - display_amount - recorded_at - variant_id - price_id - compare_at_amount - created_at x-typelizer: true Market: type: object properties: id: type: string name: type: string currency: type: string default_locale: type: string tax_inclusive: type: boolean default: type: boolean country_isos: type: array items: type: string supported_locales: type: array items: type: string countries: type: array items: $ref: '#/components/schemas/Country' created_at: type: string updated_at: type: string required: - id - name - currency - default_locale - tax_inclusive - default - country_isos - supported_locales - created_at - updated_at x-typelizer: true Discount: type: object properties: id: type: string promotion_id: type: string name: type: string description: type: string nullable: true code: type: string nullable: true amount: type: string display_amount: type: string created_at: type: string updated_at: type: string required: - id - promotion_id - name - description - code - amount - display_amount - created_at - updated_at x-typelizer: true AdminUserRoleAssignment: type: object description: A role assignment for the current store on a staff member properties: id: type: string description: Prefixed role ID example: role_abc123 name: type: string description: Role name example: admin required: - id - name CreditCard: type: object properties: id: type: string brand: type: string last4: type: string month: type: number year: type: number name: type: string nullable: true default: type: boolean gateway_payment_profile_id: type: string nullable: true customer_id: type: string nullable: true payment_method_id: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string required: - id - brand - last4 - month - year - name - default - gateway_payment_profile_id - customer_id - payment_method_id - metadata - created_at - updated_at x-typelizer: true Price: type: object properties: id: type: string amount: type: string nullable: true amount_in_cents: type: number nullable: true compare_at_amount: type: string nullable: true compare_at_amount_in_cents: type: number nullable: true currency: type: string nullable: true display_amount: type: string nullable: true display_compare_at_amount: type: string nullable: true price_list_id: type: string nullable: true variant_id: type: string nullable: true created_at: type: string updated_at: type: string variant: $ref: '#/components/schemas/Variant' required: - id - amount - amount_in_cents - compare_at_amount - compare_at_amount_in_cents - currency - display_amount - display_compare_at_amount - price_list_id - variant_id - created_at - updated_at x-typelizer: true StockLocation: type: object properties: id: type: string state_abbr: type: string nullable: true name: type: string address1: type: string nullable: true city: type: string nullable: true zipcode: type: string nullable: true country_iso: type: string nullable: true country_name: type: string nullable: true state_text: type: string nullable: true admin_name: type: string nullable: true address2: type: string nullable: true state_name: type: string nullable: true phone: type: string nullable: true company: type: string nullable: true active: type: boolean default: type: boolean backorderable_default: type: boolean propagate_all_variants: type: boolean kind: type: string pickup_enabled: type: boolean pickup_stock_policy: type: string pickup_ready_in_minutes: type: number nullable: true pickup_instructions: type: string nullable: true created_at: type: string updated_at: type: string required: - id - state_abbr - name - address1 - city - zipcode - country_iso - country_name - state_text - admin_name - address2 - state_name - phone - company - active - default - backorderable_default - propagate_all_variants - kind - pickup_enabled - pickup_stock_policy - pickup_ready_in_minutes - pickup_instructions - created_at - updated_at x-typelizer: true GiftCardBatch: type: object properties: id: type: string codes_count: type: number currency: type: string nullable: true prefix: type: string nullable: true created_at: type: string updated_at: type: string amount: type: string nullable: true expires_at: type: string nullable: true created_by_id: type: string nullable: true required: - id - codes_count - currency - prefix - created_at - updated_at - amount - expires_at - created_by_id x-typelizer: true State: type: object properties: abbr: type: string name: type: string created_at: type: object updated_at: type: object required: - abbr - name - created_at - updated_at x-typelizer: true OptionType: type: object properties: id: type: string name: type: string label: type: string position: type: number kind: type: string metadata: type: object filterable: type: boolean created_at: type: string updated_at: type: string option_values: type: array items: $ref: '#/components/schemas/OptionValue' required: - id - name - label - position - kind - metadata - filterable - created_at - updated_at x-typelizer: true Refund: type: object properties: id: type: string transaction_id: type: string nullable: true amount: type: string nullable: true payment_id: type: string nullable: true refund_reason_id: type: string nullable: true reimbursement_id: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string payment: $ref: '#/components/schemas/Payment' reimbursement: $ref: '#/components/schemas/Reimbursement' required: - id - transaction_id - amount - payment_id - refund_reason_id - reimbursement_id - metadata - created_at - updated_at x-typelizer: true PaymentMethod: type: object properties: id: type: string name: type: string description: type: string nullable: true type: type: string session_required: type: boolean source_required: type: boolean metadata: type: object active: type: boolean auto_capture: type: boolean nullable: true storefront_visible: type: boolean position: type: number created_at: type: string updated_at: type: string preferences: type: object preference_schema: type: object required: - id - name - description - type - session_required - source_required - metadata - active - auto_capture - storefront_visible - position - created_at - updated_at - preferences - preference_schema x-typelizer: true GiftCard: type: object properties: id: type: string code: type: string status: type: string currency: type: string amount: type: string amount_used: type: string amount_authorized: type: string amount_remaining: type: string display_amount: type: string display_amount_used: type: string display_amount_remaining: type: string expires_at: type: string nullable: true redeemed_at: type: string nullable: true expired: type: boolean active: type: boolean created_at: type: string updated_at: type: string customer_id: type: string nullable: true created_by_id: type: string nullable: true customer: $ref: '#/components/schemas/Customer' created_by: $ref: '#/components/schemas/AdminUser' gift_card_batch: $ref: '#/components/schemas/GiftCardBatch' orders: type: array items: $ref: '#/components/schemas/Order' required: - id - code - status - currency - amount - amount_used - amount_authorized - amount_remaining - display_amount - display_amount_used - display_amount_remaining - expires_at - redeemed_at - expired - active - created_at - updated_at - customer_id - created_by_id x-typelizer: true Order: type: object properties: id: type: string market_id: type: string nullable: true channel_id: type: string nullable: true number: type: string email: type: string customer_note: type: string nullable: true currency: type: string locale: type: string nullable: true total_quantity: type: number item_total: type: string display_item_total: type: string adjustment_total: type: string display_adjustment_total: type: string discount_total: type: string display_discount_total: type: string tax_total: type: string display_tax_total: type: string included_tax_total: type: string display_included_tax_total: type: string additional_tax_total: type: string display_additional_tax_total: type: string total: type: string display_total: type: string gift_card_total: type: string display_gift_card_total: type: string amount_due: type: string display_amount_due: type: string delivery_total: type: string display_delivery_total: type: string fulfillment_status: type: string nullable: true payment_status: type: string nullable: true completed_at: type: string nullable: true store_credit_total: type: string display_store_credit_total: type: string covered_by_store_credit: type: boolean discounts: type: array items: $ref: '#/components/schemas/Discount' items: type: array items: $ref: '#/components/schemas/LineItem' fulfillments: type: array items: $ref: '#/components/schemas/Fulfillment' payments: type: array items: $ref: '#/components/schemas/Payment' billing_address: allOf: - $ref: '#/components/schemas/Address' nullable: true shipping_address: allOf: - $ref: '#/components/schemas/Address' nullable: true gift_card: allOf: - $ref: '#/components/schemas/GiftCard' nullable: true market: allOf: - $ref: '#/components/schemas/Market' nullable: true status: type: string last_ip_address: type: string nullable: true considered_risky: type: boolean confirmation_delivered: type: boolean store_owner_notification_delivered: type: boolean payment_total: type: string display_payment_total: type: string metadata: type: object canceled_at: type: string nullable: true approved_at: type: string nullable: true created_at: type: string updated_at: type: string preferred_stock_location_id: type: string nullable: true tags: type: array items: type: string internal_note: type: string nullable: true approver_id: type: string nullable: true canceler_id: type: string nullable: true created_by_id: type: string nullable: true customer_id: type: string nullable: true channel: $ref: '#/components/schemas/Channel' preferred_stock_location: $ref: '#/components/schemas/StockLocation' payment_methods: type: array items: $ref: '#/components/schemas/PaymentMethod' customer: $ref: '#/components/schemas/Customer' approver: $ref: '#/components/schemas/Customer' canceler: $ref: '#/components/schemas/Customer' created_by: $ref: '#/components/schemas/Customer' adjustments: type: array items: $ref: '#/components/schemas/Adjustment' return_authorizations: type: array items: $ref: '#/components/schemas/ReturnAuthorization' reimbursements: type: array items: $ref: '#/components/schemas/Reimbursement' required: - id - market_id - channel_id - number - email - customer_note - currency - locale - total_quantity - item_total - display_item_total - adjustment_total - display_adjustment_total - discount_total - display_discount_total - tax_total - display_tax_total - included_tax_total - display_included_tax_total - additional_tax_total - display_additional_tax_total - total - display_total - gift_card_total - display_gift_card_total - amount_due - display_amount_due - delivery_total - display_delivery_total - fulfillment_status - payment_status - completed_at - store_credit_total - display_store_credit_total - covered_by_store_credit - gift_card - market - status - last_ip_address - considered_risky - confirmation_delivered - store_owner_notification_delivered - payment_total - display_payment_total - metadata - canceled_at - approved_at - created_at - updated_at - preferred_stock_location_id - tags - internal_note - approver_id - canceler_id - created_by_id - customer_id x-typelizer: true Country: type: object properties: iso: type: string iso3: type: string name: type: string states_required: type: boolean zipcode_required: type: boolean states: type: array items: $ref: '#/components/schemas/State' market: allOf: - $ref: '#/components/schemas/Market' nullable: true created_at: type: object updated_at: type: object required: - iso - iso3 - name - states_required - zipcode_required - created_at - updated_at x-typelizer: true OptionValue: type: object properties: id: type: string option_type_id: type: string name: type: string label: type: string position: type: number color_code: type: string nullable: true option_type_name: type: string option_type_label: type: string image_url: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string option_type: $ref: '#/components/schemas/OptionType' required: - id - option_type_id - name - label - position - color_code - option_type_name - option_type_label - image_url - metadata - created_at - updated_at x-typelizer: true TaxCategory: type: object properties: id: type: string name: type: string tax_code: type: string nullable: true description: type: string nullable: true is_default: type: boolean created_at: type: string updated_at: type: string required: - id - name - tax_code - description - is_default - created_at - updated_at x-typelizer: true StoreCredit: type: object properties: id: type: string amount: type: string amount_used: type: string amount_remaining: type: string display_amount: type: string display_amount_used: type: string display_amount_remaining: type: string currency: type: string memo: type: string nullable: true metadata: type: object created_at: type: string updated_at: type: string customer_id: type: string nullable: true created_by_id: type: string nullable: true category_id: type: string nullable: true category_name: type: string nullable: true required: - id - amount - amount_used - amount_remaining - display_amount - display_amount_used - display_amount_remaining - currency - memo - metadata - created_at - updated_at - customer_id - created_by_id - category_id - category_name x-typelizer: true Channel: type: object properties: id: type: string name: type: string code: type: string active: type: boolean default: type: boolean preferred_order_routing_strategy: type: string nullable: true created_at: type: string updated_at: type: string required: - id - name - code - active - default - preferred_order_routing_strategy - created_at - updated_at x-typelizer: true Reimbursement: type: object properties: id: type: string number: type: string reimbursement_status: type: string nullable: true total: type: string nullable: true order_id: type: string nullable: true customer_return_id: type: string nullable: true created_at: type: string updated_at: type: string order: $ref: '#/components/schemas/Order' required: - id - number - reimbursement_status - total - order_id - customer_return_id - created_at - updated_at 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 Media: type: object properties: id: type: string product_id: type: string nullable: true variant_ids: type: array items: type: string position: type: number alt: type: string nullable: true media_type: type: string focal_point_x: type: number nullable: true focal_point_y: type: number nullable: true external_video_url: type: string nullable: true original_url: type: string nullable: true mini_url: type: string nullable: true small_url: type: string nullable: true medium_url: type: string nullable: true large_url: type: string nullable: true xlarge_url: type: string nullable: true og_image_url: type: string nullable: true created_at: type: string updated_at: type: string viewable_id: type: string download_url: type: string nullable: true metadata: type: object viewable_type: type: string required: - id - product_id - variant_ids - position - alt - media_type - focal_point_x - focal_point_y - external_video_url - original_url - mini_url - small_url - medium_url - large_url - xlarge_url - og_image_url - created_at - updated_at - viewable_id - download_url - metadata - viewable_type x-typelizer: true Variant: type: object properties: id: type: string product_id: type: string sku: type: string nullable: true options_text: type: string track_inventory: type: boolean media_count: type: number thumbnail_url: type: string nullable: true purchasable: type: boolean in_stock: type: boolean backorderable: type: boolean weight: type: number nullable: true height: type: number nullable: true width: type: number nullable: true depth: type: number nullable: true price: $ref: '#/components/schemas/Price' original_price: allOf: - $ref: '#/components/schemas/Price' nullable: true primary_media: $ref: '#/components/schemas/Media' media: type: array items: $ref: '#/components/schemas/Media' option_values: type: array items: $ref: '#/components/schemas/OptionValue' custom_fields: type: array items: $ref: '#/components/schemas/CustomField' prior_price: allOf: - $ref: '#/components/schemas/PriceHistory' nullable: true metadata: type: object position: type: number cost_price: type: string nullable: true cost_currency: type: string nullable: true barcode: type: string nullable: true weight_unit: type: string nullable: true dimensions_unit: type: string nullable: true deleted_at: type: string nullable: true created_at: type: string updated_at: type: string tax_category_id: type: string nullable: true available_stock: type: number nullable: true reserved_quantity: type: number total_on_hand: type: number nullable: true product_name: type: string prices: type: array items: $ref: '#/components/schemas/Price' stock_items: type: array items: $ref: '#/components/schemas/StockItem' required: - id - product_id - sku - options_text - track_inventory - media_count - thumbnail_url - purchasable - in_stock - backorderable - weight - height - width - depth - price - original_price - option_values - metadata - position - cost_price - cost_currency - barcode - weight_unit - dimensions_unit - deleted_at - created_at - updated_at - tax_category_id - available_stock - reserved_quantity - total_on_hand - product_name x-typelizer: true Payment: type: object properties: id: type: string payment_method_id: type: string response_code: type: string nullable: true number: type: string amount: type: string display_amount: type: string status: type: string source_type: type: string nullable: true enum: - credit_card - store_credit - payment_source source_id: type: string nullable: true source: anyOf: - $ref: '#/components/schemas/CreditCard' - $ref: '#/components/schemas/StoreCredit' - $ref: '#/components/schemas/PaymentSource' nullable: true payment_method: $ref: '#/components/schemas/PaymentMethod' metadata: type: object avs_response: type: string nullable: true cvv_response_code: type: string nullable: true cvv_response_message: type: string nullable: true created_at: type: string updated_at: type: string captured_amount: type: string order_id: type: string nullable: true order: $ref: '#/components/schemas/Order' refunds: type: array items: $ref: '#/components/schemas/Refund' required: - id - payment_method_id - response_code - number - amount - display_amount - status - source_type - source_id - source - metadata - avs_response - cvv_response_code - cvv_response_message - created_at - updated_at - captured_amount - order_id x-typelizer: true 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