Request Offset API Key

Offset Management API

BASE URL https://api.securecheckout.com/v1/

Welcome to the Offset Management API documentation. This API can be used for creating merchant facing applications powered by the Offset platform.

Headers

There are 2 HTTP Headers used by the management API:

  • Content-Type
  • X-Auth-Token

The Content-Type header is a standard header and should be set to application/json for all requests.

The X-Auth-Token header is used to authenticate with the API server.

Getting Started

Every request needs an API key. An authorized user can provision one in Offset Commerce under Settings › More › API Keys. No account, or need a hand? Email developer@offsetpartners.com.

Thank you for choosing Offset to power your wine business.

Authentication

There are 3 endpoints used for authenticating with the API:

Authenticate User

The Authenticate User method allows authentication provided a valid administrator username and password. Along with basic profile information this method returns a Ticket which can be used with the method Get Account Auth Token to obtain an Auth Token which can be passed in the X-Auth-Token Header to allow API access for an account. If you already know what account you want to access you can do this in a single step by supplying the account you wish to access as well using the optional account field.

2 Factor Authentication

The Authenticate User 2 Factor Auth method allows authentication for administrators who have optionaly enabled the 2 Factor Auth feature. If 2FA is enabled then the response from Authenticate User will have the 2FA "Token" and an additional field "require_2fa" which will be set to 1. The 2FA Token along with the 2FA Code that was sent directly to the administrator can be sumitted using Authenticate User 2 Factor Auth to complete the Authentication process and return an Authentication Ticket which can be supplied to Get Account Auth Token.

Get Account Auth Token

The Get Account Auth Token method takes an Authentication Ticket supplied by the Authenticate User method and an account you wish to access and returns an Auth Token that can be passed in the X-Auth-Token header to allow access to an account via the API.

Errors

The API uses standard HTTP status codes. A successful request returns 200 OK. Any other status code indicates an error, and the response body contains a JSON object wrapping a ServerFault with a numeric code and a human-readable details message:

{
    "ServerFault": {
        "code": 401,
        "details": "Invalid or expired authentication token."
    }
}

Common error codes:

  • 400 — Bad Request (malformed request or failed validation)
  • 401 — Unauthorized (missing, invalid, or expired X-Auth-Token)
  • 404 — Not Found (the requested resource does not exist)
  • 500 — Server Fault (an unexpected server error occurred)

A 401 response means the authentication token is no longer valid. Obtain a new token via the Authentication endpoints before retrying the request.

Pagination

List endpoints that can return large result sets accept limit and page parameters. The page index is zero-based — the first page is page 0. To retrieve an entire collection, request successive pages until a page returns fewer than limit records:

GET /customers/5000/0
GET /customers/5000/1
...

A few high-volume endpoints use keyset (cursor) pagination instead, taking a pageSize and the lastId returned by the previous page (for example, Get All Open Credit). Continue requesting pages, passing the last id from each response, until an empty page is returned.

Conventions

Account Scope

Every request operates in the context of a single merchant account. The account is bound to your X-Auth-Token (obtained via the Authentication endpoints); some deployments also accept an X-Auth-Account header to select the account explicitly.

Data Types

For compatibility, most scalar values are transmitted as JSON strings, including numbers and identifiers. Monetary amounts are decimal strings such as "36.00". Timestamps use the format YYYY-MM-DD HH:MM:SS (for example "2026-02-16 15:17:00"); date-only fields use YYYY-MM-DD.

Booleans

Boolean-style fields are not uniform across resources: many use the strings "Yes" / "No", some use "1" / "0", and account configuration flags use "TRUE" / "FALSE". Refer to each field's description for its expected values.

Filtering

Endpoints named Filter (for example Filter Customers, Filter Orders, Filter Products) accept an ElasticSearch-style list of query clauses in the request body, plus a set of special keys that are resolved server-side (such as groups, clubs, tags, and shipping states).

Account

Resources related to Account.

POST /account/authenticate Authenticate User

Authenticates a user by username and password (optionally scoped to an account) against the auth server and returns an authentication ticket, the user profile, and the accounts they can access. This is the first step of login; if the account requires two-factor auth, follow up with Authenticate User 2 Factor Auth before exchanging the ticket for an account token via Get Account Auth Token.

Parameters
NameTypeRequiredDescriptionExample
account string Optional Account Name
password string Required Customer Password
username string Required Customer Username
Examples
Request
POST/account/authenticate
Headers
Content-Type: application/json
Body
{
    "username": "example@figurecommerce.com",
    "password": "XXXXXX"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "profile": {
        "id": "42",
        "email": "example@figurecommerce.com",
        "first_name": "Jane",
        "last_name": "Doe",
        "created": "2013-09-03 09:02:07"
    },
    "accounts": {
        "209": {
            "id": "209",
            "app": "pos",
            "account": "figureapi",
            "name": "Figure Commerce"
        }
    }
}
POST /account/authenticate/2fa Authenticate User 2 Factor Auth

Completes two-factor authentication by submitting the ticket from the initial authenticate step together with the user's 2FA pin. Returns the verified ticket, profile, and accessible accounts.

Parameters
NameTypeRequiredDescriptionExample
pin string Required 2FA Code
ticket string Required Customer Authentication Token
Examples
Request
POST/account/authenticate/2fa
Headers
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "pin": "123456"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "profile": {
        "id": "42",
        "email": "example@figurecommerce.com",
        "first_name": "Jane",
        "last_name": "Doe",
        "created": "2013-09-03 09:02:07"
    },
    "accounts": {
        "209": {
            "id": "209",
            "app": "pos",
            "account": "figureapi",
            "name": "Figure Commerce"
        }
    }
}
POST /account/authenticate/single-use-token Authenticate with Single use Token

Exchanges a single-use token (issued by Get Single Use Token) for an authentication ticket, enabling cross-domain magic-link login without re-entering credentials. The token is consumed on use. Returns the ticket, profile, and accessible accounts.

Parameters
NameTypeRequiredDescriptionExample
account string Optional Account Name
token string Required Single Use Token
Examples
Request
POST/account/authenticate/single-use-token
Headers
Content-Type: application/json
Body
{
    "token": "XXXXXXXXXX",
    "account": "figureapi"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "profile": {
        "id": "42",
        "email": "example@figurecommerce.com",
        "first_name": "Jane",
        "last_name": "Doe",
        "created": "2013-09-03 09:02:07"
    },
    "accounts": {
        "209": {
            "id": "209",
            "app": "pos",
            "account": "figureapi",
            "name": "Figure Commerce"
        }
    }
}
POST /account/authorize Get Account Auth Token

Exchanges an authentication ticket for an account-scoped access token for the named account, returning the token and account details. This token is the value passed as the X-Auth-Token header on all subsequent Management API calls.

Parameters
NameTypeRequiredDescriptionExample
account string Required Account Name
ticket string Required Customer Authentication Token
Examples
Request
POST/account/authorize
Headers
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "account": "figureapi"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "account": {
        "id": "209",
        "name": "Figure API Demo",
        "account": "figureapi",
        "created": "2018-02-13 09:15:56"
    }
}
POST /account/single-use-token Get Single Use Token

Issues a short-lived, single-use token from an authenticated ticket for handing login off to another domain or context. Returns the bare token string, which is later redeemed via Authenticate with Single use Token.

Parameters
NameTypeRequiredDescriptionExample
ticket string Required Get Single Use Token
Examples
Request
POST/account/single-use-token
Headers
Content-Type: application/json
Body
{
    "ticket": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
Response
Headers · 200
Content-Type: application/json
Body
"e53f60de34978f83982b13c2cd9880f1a55bff93"

Addresses

Resources related to Addresses.

POST /addresses Create Address

Creates a new address for a customer (customer_id required) and returns the created record, including its new id and server-computed fields such as geocode coordinates and the residential and verified flags.

Parameters
NameTypeRequiredDescriptionExample
address string Required Street Address
address_2 string Optional Unit Number
city string Required City
customer_id number Required Customer Id
first_name string Required Receipient First Name
last_name string Required Recipient Last Name
phone string Optional Recipient Phone Number
state string Required State
title string Optional Address Title
zip string Required Zip Code
Examples
Request
POST/addresses
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "first_name": "Jane",
    "last_name": "Doe",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "email": "example@commercebyfigure.com",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3989",
    "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
    "created": "2018-03-05 22:03:28",
    "last_update": "2018-04-20 20:48:32",
    "title": "",
    "first_name": "Jane",
    "last_name": "Doe",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "email": "",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "zip_ext": "3302",
    "country": "US",
    "lat": "38.29401000",
    "long": "-122.28348000",
    "residential": "1",
    "verified": "1",
    "customer_id": "42",
    "default": "1",
    "public": "0"
}
DELETE /addresses/{id} Delete Address

Deletes the address with the given id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Address Id
Examples
Request
DELETE/addresses/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /addresses/{id} Get Address

Returns a single address record by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Address Id
Examples
Request
GET/addresses/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3989",
    "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
    "created": "2018-03-05 22:03:28",
    "last_update": "2018-04-20 20:48:32",
    "title": "",
    "first_name": "Jane",
    "last_name": "Doe",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "email": "",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "zip_ext": "3302",
    "country": "US",
    "lat": "38.29401000",
    "long": "-122.28348000",
    "residential": "1",
    "verified": "1",
    "customer_id": "42",
    "default": "1",
    "public": "0"
}
GET /addresses/customer/{customer_id} Get Addresses By Customer

Returns all saved addresses for the given customer, keyed by address id.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/addresses/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "3989": {
        "id": "3989",
        "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
        "created": "2018-03-05 22:03:28",
        "last_update": "2018-04-20 20:48:32",
        "title": "",
        "first_name": "Jane",
        "last_name": "Doe",
        "birthday": "1985-06-01",
        "company": "Figure Commerce",
        "phone": "7075558520",
        "email": "",
        "address": "523 Brown St",
        "address_2": "",
        "city": "Napa",
        "state": "CA",
        "zip": "94559",
        "zip_ext": "3302",
        "country": "US",
        "lat": "38.29401000",
        "long": "-122.28348000",
        "residential": "1",
        "verified": "1",
        "customer_id": "42",
        "default": "1",
        "public": "0"
    }
}
GET /addresses/{limit}/{page} Get All Addresses

Returns a paginated list of all addresses, keyed by id. Pagination is 0-based, so page 0 is the first page.

Examples
Request
GET/addresses/{limit}/{page}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "3989": {
        "id": "3989",
        "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
        "created": "2018-03-05 22:03:28",
        "last_update": "2018-04-20 20:48:32",
        "title": "",
        "first_name": "Jane",
        "last_name": "Doe",
        "birthday": "1985-06-01",
        "company": "Figure Commerce",
        "phone": "7075558520",
        "email": "",
        "address": "523 Brown St",
        "address_2": "",
        "city": "Napa",
        "state": "CA",
        "zip": "94559",
        "zip_ext": "3302",
        "country": "US",
        "lat": "38.29401000",
        "long": "-122.28348000",
        "residential": "1",
        "verified": "1",
        "customer_id": "42",
        "default": "1",
        "public": "0"
    }
}
GET /addresses/customer/{customer_id}/default Get Default Customer Address

Returns the customer's default (ship-to) address.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/addresses/customer/{customer_id}/default
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3989",
    "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
    "created": "2018-03-05 22:03:28",
    "last_update": "2018-04-20 20:48:32",
    "title": "",
    "first_name": "Jane",
    "last_name": "Doe",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "email": "",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "zip_ext": "3302",
    "country": "US",
    "lat": "38.29401000",
    "long": "-122.28348000",
    "residential": "1",
    "verified": "1",
    "customer_id": "42",
    "default": "1",
    "public": "0"
}
PUT /addresses/customer/{customer_id}/default/{id} Set Default Customer Address

Marks the given address as the customer's default ship-to address. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
id number Required Address Id
Examples
Request
PUT/addresses/customer/{customer_id}/default/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /addresses/{id} Update Address

Updates the given address with the supplied fields (only the keys sent are changed) and returns the updated record.

Parameters
NameTypeRequiredDescriptionExample
address string Optional Street Address
address_2 string Optional Unit Number
city string Optional City
company string Optional Company Name
first_name string Optional First Name
last_name string Optional Last Name
phone string Optional Phone Number
state string Optional State
title string Optional Address Title
zip string Optional Zip Code
id number Required Address Id
Examples
Request
PUT/addresses/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "address": "523 Brown St",
    "city": "Napa",
    "state": "CA"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3989",
    "hash": "a187902adebd6b1aab810511fabcf475e4f5c8e2",
    "created": "2018-03-05 22:03:28",
    "last_update": "2018-04-20 20:48:32",
    "title": "",
    "first_name": "Jane",
    "last_name": "Doe",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "email": "",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "zip_ext": "3302",
    "country": "US",
    "lat": "38.29401000",
    "long": "-122.28348000",
    "residential": "1",
    "verified": "1",
    "customer_id": "42",
    "default": "1",
    "public": "0"
}

Appointments

Resources related to Appointments.

POST /appointments Create Appointment

Creates a tasting-room appointment for a customer at the given timestamp and returns the created appointment. status is one of Requested, Pending, Waitlist, Confirmed, Declined, Cancelled, No Show or Checked In; category is one of Consumer Acquisition, Consumer Conversion, Consumer Retention, Trade or Industry. Up to 20 product SKUs may be attached as wine_1 through wine_20.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
status string Optional Appointment Status
timestamp string Required Appointment Time
Examples
Request
POST/appointments
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "customer_id": 1,
    "timestamp": "2020-07-31 11:00:00",
    "status": "Requested",
    "page_source": "Visit",
    "created_by": "Customer",
    "ip_address": "5.42.254.123",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@gmail.com",
    "mobile_phone": "7075551234",
    "alternate_date": "01/10/2021",
    "preferred_time": "Morning",
    "appointment_type": "Winery Tour & Tasting",
    "size": "2",
    "guests": "John DoernJane Doe",
    "customer_comments": "I understand the tasting is unavailable to us (as members awaiting allocation), and I hope the Monday appointment is available. Thanks in advance!",
    "name": "Jon Doe",
    "customer_first_name": "Jon",
    "cancellation_reason": "",
    "customer_last_name": "Doe",
    "customer_phone": "7075551234",
    "customer_email": "john.doe@gmail.com",
    "hour": "10:00 AM",
    "endtime": "11:30 AM",
    "host": "",
    "room": "Foyer Lounge",
    "reason": "Waiting List",
    "category": "Consumer Conversion",
    "notes": "Very kind, read the rules and requested a monday morning. Offered the 10am time slot."
}
Response
Headers · 200
Content-Type: application/json
Body
"35"
DELETE /appointments/{id} Delete Appointment

Deletes the appointment with the given id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Appointment Id
Examples
Request
DELETE/appointments/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /appointments/after/{start} Get All Appointments After Date

Returns all appointments scheduled on or after the given date/time.

Parameters
NameTypeRequiredDescriptionExample
start string Required Appointment Date
Examples
Request
GET/appointments/after/{start}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": 35,
        "customer_id": 1,
        "timestamp": "2020-07-31 11:00:00",
        "status": "Requested",
        "page_source": "Visit",
        "created_by": "Customer",
        "ip_address": "5.42.254.123",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@gmail.com",
        "mobile_phone": "7075551234",
        "alternate_date": "01/10/2021",
        "preferred_time": "Morning",
        "appointment_type": "Winery Tour & Tasting",
        "size": "2",
        "guests": "John DoernJane Doe",
        "customer_comments": "I understand the tasting is unavailable to us (as members awaiting allocation), and I hope the Monday appointment is available. Thanks in advance!",
        "name": "Jon Doe",
        "customer_first_name": "Jon",
        "cancellation_reason": "",
        "customer_last_name": "Doe",
        "customer_phone": "7075551234",
        "customer_email": "john.doe@gmail.com",
        "hour": "10:00 AM",
        "endtime": "11:30 AM",
        "host": "",
        "room": "Foyer Lounge",
        "reason": "Waiting List",
        "category": "Consumer Conversion",
        "notes": "Very kind, read the rules and requested a monday morning. Offered the 10am time slot."
    }
]
GET /appointments/before/{end} Get All Appointments Before Date

Returns all appointments scheduled on or before the given date/time.

Parameters
NameTypeRequiredDescriptionExample
end string Required Appointment Date
Examples
Request
GET/appointments/before/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": 35,
        "customer_id": 1,
        "timestamp": "2020-07-31 11:00:00",
        "status": "Requested",
        "page_source": "Visit",
        "created_by": "Customer",
        "ip_address": "5.42.254.123",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@gmail.com",
        "mobile_phone": "7075551234",
        "alternate_date": "01/10/2021",
        "preferred_time": "Morning",
        "appointment_type": "Winery Tour & Tasting",
        "size": "2",
        "guests": "John DoernJane Doe",
        "customer_comments": "I understand the tasting is unavailable to us (as members awaiting allocation), and I hope the Monday appointment is available. Thanks in advance!",
        "name": "Jon Doe",
        "customer_first_name": "Jon",
        "cancellation_reason": "",
        "customer_last_name": "Doe",
        "customer_phone": "7075551234",
        "customer_email": "john.doe@gmail.com",
        "hour": "10:00 AM",
        "endtime": "11:30 AM",
        "host": "",
        "room": "Foyer Lounge",
        "reason": "Waiting List",
        "category": "Consumer Conversion",
        "notes": "Very kind, read the rules and requested a monday morning. Offered the 10am time slot."
    }
]
GET /appointments/{start}/{end} Get All Appointments in Date Range

Returns all appointments scheduled between the given start and end date/times.

Parameters
NameTypeRequiredDescriptionExample
end string Required Appointments End Date
start string Required Appointments Start Date
Examples
Request
GET/appointments/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": 35,
        "customer_id": 1,
        "timestamp": "2020-07-31 11:00:00",
        "status": "Requested",
        "page_source": "Visit",
        "created_by": "Customer",
        "ip_address": "5.42.254.123",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@gmail.com",
        "mobile_phone": "7075551234",
        "alternate_date": "01/10/2021",
        "preferred_time": "Morning",
        "appointment_type": "Winery Tour & Tasting",
        "size": "2",
        "guests": "John DoernJane Doe",
        "customer_comments": "I understand the tasting is unavailable to us (as members awaiting allocation), and I hope the Monday appointment is available. Thanks in advance!",
        "name": "Jon Doe",
        "customer_first_name": "Jon",
        "cancellation_reason": "",
        "customer_last_name": "Doe",
        "customer_phone": "7075551234",
        "customer_email": "john.doe@gmail.com",
        "hour": "10:00 AM",
        "endtime": "11:30 AM",
        "host": "",
        "room": "Foyer Lounge",
        "reason": "Waiting List",
        "category": "Consumer Conversion",
        "notes": "Very kind, read the rules and requested a monday morning. Offered the 10am time slot."
    }
]
GET /appointments/{id} Get Appointment

Returns a single appointment by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Appointment Id
Examples
Request
GET/appointments/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": 35,
    "customer_id": 1,
    "timestamp": "2020-07-31 11:00:00",
    "status": "Requested",
    "page_source": "Visit",
    "created_by": "Customer",
    "ip_address": "5.42.254.123",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john.doe@gmail.com",
    "mobile_phone": "7075551234",
    "alternate_date": "01/10/2021",
    "preferred_time": "Morning",
    "appointment_type": "Winery Tour & Tasting",
    "size": "2",
    "guests": "John DoernJane Doe",
    "customer_comments": "I understand the tasting is unavailable to us (as members awaiting allocation), and I hope the Monday appointment is available. Thanks in advance!",
    "name": "Jon Doe",
    "customer_first_name": "Jon",
    "cancellation_reason": "",
    "customer_last_name": "Doe",
    "customer_phone": "7075551234",
    "customer_email": "john.doe@gmail.com",
    "hour": "10:00 AM",
    "endtime": "11:30 AM",
    "host": "",
    "room": "Foyer Lounge",
    "reason": "Waiting List",
    "category": "Consumer Conversion",
    "notes": "Very kind, read the rules and requested a monday morning. Offered the 10am time slot."
}
PUT /appointments/{id} Update Appointment

Updates the given appointment, for example to reschedule its timestamp or change its status. status is one of Requested, Pending, Waitlist, Confirmed, Declined, Cancelled, No Show or Checked In. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Appointment Id
Examples
Request
PUT/appointments/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "timestamp": "2020-07-31 13:30:00",
    "status": "Confirmed"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /appointments/customer/{customer_id} Get Appointments By Customer

Returns all tasting-room appointments for a given customer.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/appointments/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": 35,
        "customer_id": 1,
        "created": "2026-07-01 09:00:00",
        "created_by": "Jane Doe",
        "status": "Confirmed",
        "timestamp": "2026-07-31 10:00:00",
        "hour": "10:00 AM",
        "endtime": "11:30 AM",
        "cancellation_reason": "",
        "notes": "Members awaiting allocation; offered the 10am slot.",
        "name": "John Doe",
        "size": "2",
        "category": "Consumer Conversion",
        "reason": "Waiting List",
        "occasion": "Anniversary",
        "host": "",
        "appointment_type": "Winery Tour & Tasting",
        "location": "Estate",
        "room": "Foyer Lounge",
        "table": "3",
        "guests": "John Doe\nJane Doe",
        "customer_wines_enjoyed": "Pinot Noir, Chardonnay",
        "customer_other_wineries": "",
        "wine_1": "PN2019",
        "wine_2": "CH2020",
        "customer_first_name": "John",
        "customer_last_name": "Doe",
        "customer_email": "john.doe@gmail.com",
        "customer_phone": "7075551234"
    }
]
GET /appointments/search/{query} Search Appointments

Searches appointments by a free-text query (for example a guest name or email) and returns the matching appointments. status is one of Requested, Pending, Waitlist, Confirmed, Declined, Cancelled, No Show or Checked In; category is one of Consumer Acquisition, Consumer Conversion, Consumer Retention, Trade or Industry. Up to 20 product SKUs may be attached as wine_1 through wine_20.

Parameters
NameTypeRequiredDescriptionExample
query string Required Search query, e.g. a guest name or email
Examples
Request
GET/appointments/search/{query}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": 35,
        "customer_id": 1,
        "created": "2026-07-01 09:00:00",
        "created_by": "Jane Doe",
        "status": "Confirmed",
        "timestamp": "2026-07-31 10:00:00",
        "hour": "10:00 AM",
        "endtime": "11:30 AM",
        "cancellation_reason": "",
        "notes": "Members awaiting allocation; offered the 10am slot.",
        "name": "John Doe",
        "size": "2",
        "category": "Consumer Conversion",
        "reason": "Waiting List",
        "occasion": "Anniversary",
        "host": "",
        "appointment_type": "Winery Tour & Tasting",
        "location": "Estate",
        "room": "Foyer Lounge",
        "table": "3",
        "guests": "John Doe\nJane Doe",
        "customer_wines_enjoyed": "Pinot Noir, Chardonnay",
        "customer_other_wineries": "",
        "wine_1": "PN2019",
        "wine_2": "CH2020",
        "customer_first_name": "John",
        "customer_last_name": "Doe",
        "customer_email": "john.doe@gmail.com",
        "customer_phone": "7075551234"
    }
]

Cart

Resources related to Cart.

POST /cart/session/admin/{customer_id} Create Admin Cart Session

Creates (or resumes) an admin checkout cart session for a customer and returns the bare session id string (grammar 'Admin-{customer}-{random}'). Pass this id as the X-Session-Id header on all subsequent cart calls.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
POST/cart/session/admin/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
Admin-42-XXXXXXX
POST /cart/session/club/{club_id}/{member_id} Create Club Cart Session

Creates (or resumes) the checkout cart session for a specific club member and returns the bare session id string (grammar 'club-{club}-{member}'). Pass this id as the X-Session-Id header on all subsequent cart calls.

Parameters
NameTypeRequiredDescriptionExample
club_id number Required Club Id
member_id number Required Club Member Id
Examples
Request
POST/cart/session/club/{club_id}/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
club-12-345
POST /cart/session/wish/{customer_id} Create Wish Cart Session

Creates (or resumes) a wishlist/allocation cart session for a customer and returns the bare session id string (grammar 'Wish-{customer}-{order}'). Pass this id as the X-Session-Id header on all subsequent cart calls. Optionally scope to an existing order via the order_id body field.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
order_id number Optional Existing order id to scope the wish cart to (optional)
Examples
Request
POST/cart/session/wish/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "order_id": "1001"
}
Response
Headers · 200
Content-Type: application/json
Body
Wish-42-wo-1001
GET /cart Get Cart

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns the full cart envelope: config, items keyed by SKU, shipment, and the monetary totals which are top-level siblings of config/items/shipment (not nested under a totals key).

Examples
Request
GET/cart
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
GET /cart/config Get Cart Config

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns just the cart config sub-object (the free-form key/value bag of ~40 order, exemption, discount, and shipping-address fields).

Examples
Request
GET/cart/config
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_type": "Admin",
    "customer_id": "42",
    "tax_exempt": "No",
    "free_shipping": "0",
    "tax_rate": "8.25",
    "promo_code": "",
    "payment_type": "",
    "shipping_first_name": "Jane",
    "shipping_last_name": "Doe",
    "shipping_address": "123 Vine St",
    "shipping_city": "Napa",
    "shipping_state": "CA",
    "shipping_zip": "94558",
    "shipping_country": "US",
    "shipping_method": "3",
    "address_id": "1201",
    "payment_id": "880"
}
GET /cart/totals Get Cart Totals

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns a compact totals summary. Separate from Get Cart; used by gift-card partial-pay and batch-order flows.

Examples
Request
GET/cart/totals
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "subtotal": "432.00",
    "tax": "35.64",
    "shipping": "25.00",
    "discount": "0.00",
    "total": "492.64",
    "tax_rate": "8.25"
}
GET /cart/inventory Get Cart Inventory

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns current on-hand inventory for the SKUs in the cart, keyed by SKU, so the client can validate availability before checkout.

Examples
Request
GET/cart/inventory
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "CAB-EST-2019": {
        "sku": "CAB-EST-2019",
        "quantity": "48",
        "location": "Main",
        "bin_location": "A-12"
    }
}
POST /cart/config Configure Cart

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Merges the supplied key/value pairs into the cart config. Accepts the full ~40-field config bag (financial toggles/exemptions, discount/promo, order meta/workflow, profile, and shipping-address fields); only the keys you send are updated. There is no server-side whitelist, so send only known keys.

Parameters
NameTypeRequiredDescriptionExample
order_type string Optional Order type: Admin/Club/Offering/POS or save type corporate/Wish/Saved
tax_exempt string Optional Tax exemption (Yes/No)
crv_exempt string Optional CA redemption value exemption (0/1)
mbd_exempt string Optional Maine bottle deposit exemption (0/1)
payment_exempt string Optional Payment exemption (0/1); routes to Wire for some clients
free_shipping string Optional Free shipping toggle (0/1)
insurance string Optional Shipping insurance toggle (0/1; empty string = not yet set)
disallow_credits string Optional Disallow store credits (0/1)
override_discount string Optional Manual discount override (decimal string or empty)
override_shipping string Optional Manual shipping override (decimal string or empty)
tip_amount string Optional Tip amount (decimal string)
payment_type string Optional Payment type (e.g. Wire, gift_card)
tax_rate string Optional Tax rate percent
discount_percent string Optional Discount percent
discount_fixed string Optional Fixed discount amount
promo_code string Optional Applied promo code
sc_tax_type string Optional ShipCompliant tax type ('' / onsite / offsite)
original_wooden_case string Optional Original wooden case (Yes/No)
location string Optional Order/pickup location
inventory_location string Optional Inventory location (changing it clears the cart)
sale_credit string Optional Sales credit attribution
order_source string Optional Order source
email_template string Optional Confirmation email template
shipcompliant_tag string Optional ShipCompliant tag
club_id number Optional Associated club id
club_name string Optional Associated club name
club_member_id number Optional Associated club member id
customerTags string Optional Customer tags (comma-joined)
orderTags string Optional Order tags (comma-joined)
requested_ship_date string Optional Requested ship date (date)
actual_ship_date string Optional Actual ship date (date)
ship_status string Optional Ship status
allowed_methods array Optional Allowed shipping method ids (JSON array)
ship_method_address_lock string Optional Lock shipping method to address (0/1)
instructions string Optional Delivery instructions
gift_message string Optional Gift message
additional_order_notes string Optional Additional order notes
editable_notes string Optional Editable notes
manual_address string Optional Manual address flag (0/1)
group_name string Optional Group name
shipping_first_name string Optional Ship-to first name
shipping_last_name string Optional Ship-to last name
shipping_email string Optional Ship-to email
shipping_phone string Optional Ship-to phone
shipping_address string Optional Ship-to street address
shipping_address_2 string Optional Ship-to address line 2
shipping_city string Optional Ship-to city
shipping_state string Optional Ship-to state (auto-derived from zip if omitted)
shipping_zip string Optional Ship-to zip (auto-derives state)
shipping_country string Optional Ship-to country
shipping_method number Optional Selected shipping method id
address_id number Optional Selected saved address id
payment_id number Optional Selected saved payment method id
first_name string Optional Customer first name
last_name string Optional Customer last name
phone string Optional Customer phone
birthday string Optional Customer birthday
Examples
Request
POST/cart/config
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "order_type": "Admin",
    "tax_exempt": "No",
    "free_shipping": "0",
    "shipping_method": "3",
    "requested_ship_date": "2026-07-15",
    "email_template": "order_confirmation"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
POST /cart/items Add Cart Item

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Adds a product to the cart (upsert by SKU: re-adding an existing SKU updates it). Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
quantity number Required Quantity
price string Optional Unit price (decimal string; volume-adjusted by the API on read-back)
description string Optional Line-item description
bottle_count number Optional Bottle count
expires string Optional Expiration datetime (0000-00-00... = none; drives cart expiry)
name string Optional Product name
subtitle string Optional Product subtitle
min_purchase number Optional Minimum purchase quantity
max_purchase number Optional Maximum purchase quantity
club_id number Optional Associated club id
club_member_id number Optional Associated club member id
tax_exempt string Optional Line-item tax exemption (Yes/No)
shipping_included string Optional Shipping included in price (0/1)
product_type string Optional Product type ('Gift Card' gates CO retail delivery fee)
discount string Optional Line-item discount
Examples
Request
POST/cart/items
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "sku": "CAB-EST-2019",
    "quantity": 6,
    "price": "72.00",
    "name": "Estate Cabernet Sauvignon",
    "subtitle": "2019 750ml",
    "product_type": "Wine",
    "bottle_count": 6
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
DELETE /cart/items/{sku} Remove Cart Item

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Removes the line item with the given SKU from the cart. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
Examples
Request
DELETE/cart/items/{sku}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/items/{sku}/quantity/{quantity} Update Item Quantity

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Sets the quantity of the line item with the given SKU. Returns the updated cart envelope (price is volume-adjusted by the API).

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
quantity number Required New quantity
Examples
Request
PUT/cart/items/{sku}/quantity/{quantity}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/items/{sku}/price/{price} Update Item Price

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Overrides the unit price of the line item with the given SKU. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
price string Required New unit price (decimal string)
Examples
Request
PUT/cart/items/{sku}/price/{price}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
DELETE /cart/items Clear Cart

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Empties the cart of all line items (releases any reserved inventory). Returns the emptied cart envelope.

Examples
Request
DELETE/cart/items
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {},
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 0,
    "subtotal": "0.00",
    "discount": "0.00",
    "tax": "0.00",
    "shipping": "0.00",
    "total": "0.00"
}
PUT /cart/address/{id} Select Address

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Selects a saved customer address as the cart ship-to address. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
id number Required Address Id
Examples
Request
PUT/cart/address/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/payment/{id} Select Payment Method

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Selects a saved customer payment method for the cart. Returns the full updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
id number Required Payment Method Id
Examples
Request
PUT/cart/payment/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/shipping-method/{id} Select Shipping Method

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Selects a shipping method (by rate/method id) for the cart, recalculating shipping. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
id number Required Shipping Method Id
Examples
Request
PUT/cart/shipping-method/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
GET /cart/shipping-options Get Shipping Options

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns the shipping methods available for the current cart contents and ship-to address, with computed rates.

Examples
Request
GET/cart/shipping-options
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "3",
        "name": "Ground",
        "code": "GND",
        "rate": "25.00"
    },
    {
        "id": "5",
        "name": "2-Day Air",
        "code": "2DA",
        "rate": "45.00"
    }
]
GET /cart/shipping-states Get Shipping States

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns the list of states/regions the current cart is allowed to ship to (compliance-gated by the cart contents).

Examples
Request
GET/cart/shipping-states
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "code": "CA",
        "name": "California"
    },
    {
        "code": "NV",
        "name": "Nevada"
    },
    {
        "code": "OR",
        "name": "Oregon"
    }
]
PUT /cart/override/discount/{amount} Override Discount

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Applies a manual discount override to the cart. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
amount string Required Override discount amount (decimal string)
Examples
Request
PUT/cart/override/discount/{amount}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/override/shipping/{amount} Override Shipping

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Applies a manual shipping override to the cart. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
amount string Required Override shipping amount (decimal string)
Examples
Request
PUT/cart/override/shipping/{amount}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/promo/{code} Apply Promo Code

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Applies a promo code to the cart, recalculating the discount. Returns the updated cart envelope.

Parameters
NameTypeRequiredDescriptionExample
code string Required Promo code
Examples
Request
PUT/cart/promo/{code}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
DELETE /cart/promo Clear Promo Code

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Removes any applied promo code from the cart. Returns the updated cart envelope.

Examples
Request
DELETE/cart/promo
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
PUT /cart/giftcard/{code} Apply Gift Card

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Applies a gift card to the cart by code. Returns the updated cart envelope with gift_card_code/gift_card_balance/gift_total populated in config.

Parameters
NameTypeRequiredDescriptionExample
code string Required Gift card code
Examples
Request
PUT/cart/giftcard/{code}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
GET /cart/giftcard/{code} Get Gift Card

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Looks up a gift card by code (balance and status) without applying it to the cart.

Parameters
NameTypeRequiredDescriptionExample
code string Required Gift card code
Examples
Request
GET/cart/giftcard/{code}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "code": "GC-8842-XYZ",
    "balance": "150.00",
    "status": "Active",
    "expires": "2027-01-01 00:00:00"
}
DELETE /cart/giftcard Clear Gift Card

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Removes any applied gift card from the cart. Returns the updated cart envelope.

Examples
Request
DELETE/cart/giftcard
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
POST /cart/partial-payments Apply Partial Payment

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Records a partial payment against the cart (e.g. a gift-card charge) toward the total before checkout. Returns the updated cart envelope with the remaining balance.

Parameters
NameTypeRequiredDescriptionExample
amount string Required Payment amount (decimal string)
payment_type string Required Payment type (e.g. gift_card)
gift_card_code string Optional Gift card code, when payment_type is gift_card
reference string Optional External payment reference
Examples
Request
POST/cart/partial-payments
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "150.00",
    "payment_type": "gift_card",
    "gift_card_code": "GC-8842-XYZ"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "amount": "150.00",
    "payment_type": "gift_card",
    "total_remaining": "342.64",
    "total": "492.64"
}
DELETE /cart/partial-payments Void Partial Payments

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Voids all partial payments recorded against the cart. Returns the updated cart envelope.

Examples
Request
DELETE/cart/partial-payments
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "config": {
        "order_type": "Admin",
        "customer_id": "42",
        "tax_exempt": "No",
        "free_shipping": "0",
        "tax_rate": "8.25",
        "promo_code": "",
        "payment_type": "",
        "shipping_first_name": "Jane",
        "shipping_last_name": "Doe",
        "shipping_address": "123 Vine St",
        "shipping_city": "Napa",
        "shipping_state": "CA",
        "shipping_zip": "94558",
        "shipping_country": "US",
        "shipping_method": "3",
        "address_id": "1201",
        "payment_id": "880"
    },
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "name": "Estate Cabernet Sauvignon",
            "subtitle": "2019 750ml",
            "quantity": "6",
            "price": "72.00",
            "discount": "0.00",
            "bottle_size": "750ml",
            "bottle_count": "6",
            "discount_eligible": "Yes",
            "tax_exempt": "No",
            "shipping_included": "0",
            "product_type": "Wine",
            "expires": "0000-00-00 00:00:00"
        }
    },
    "shipment": {
        "address": {
            "id": "1201",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "123 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US",
            "phone": "707-555-0134",
            "default": "Yes"
        },
        "method": {
            "id": "3",
            "name": "Ground",
            "code": "GND"
        }
    },
    "item_count": 6,
    "subtotal": "432.00",
    "discount": "0.00",
    "credits": "0.00",
    "ca_redemption_value": "0.60",
    "co_retail_delivery_fee": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "35.64",
    "shipping": "25.00",
    "shipping_insurance": "0.00",
    "tip": "0.00",
    "total": "492.64"
}
POST /cart/checkout Checkout

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Converts the cart into an order and returns the bare new order id (no envelope); check success/errors separately. The supplied fields are merged over the cart config; club_id/club_name are added for Club orders and actual_ship_date for picked-up orders.

Parameters
NameTypeRequiredDescriptionExample
order_type string Optional Order type
shipping_method number Optional Shipping method id
club_member_id number Optional Club member id (Club orders)
location string Optional Order/pickup location
sc_tax_type string Optional ShipCompliant tax type
sales_agent string Optional Sales agent
sale_credit string Optional Sales credit attribution
email_template string Optional Confirmation email template
requested_ship_date string Optional Requested ship date
shipcompliant_tag string Optional ShipCompliant tag
wish_record_id number Optional Wish record id (wish carts)
wish_granted boolean Optional Whether the wish is granted (wish carts)
payment_exempt string Optional Payment exemption (0/1)
payment_type string Optional Payment type
Examples
Request
POST/cart/checkout
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "order_type": "Admin",
    "shipping_method": 3,
    "location": "Napa",
    "email_template": "order_confirmation",
    "requested_ship_date": "2026-07-15"
}
Response
Headers · 200
Content-Type: application/json
Body
100482
POST /cart/save/{type} Save Cart

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Persists the current cart as a saved order of the given type (Saved for pending orders, corporate for gifting) without checking out. Returns the saved order id.

Parameters
NameTypeRequiredDescriptionExample
type string Required Save type (Saved | corporate)
Examples
Request
POST/cart/save/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
wo-1001
GET /cart/saved/{type} Get Saved Orders By Type

Returns the list of saved carts/orders of the given type for the current customer/session (Saved for pending, Wish for wish requests). Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session).

Parameters
NameTypeRequiredDescriptionExample
type string Required Saved order type (Saved | Wish)
Examples
Request
GET/cart/saved/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "wo-1001",
        "order_type": "Wish",
        "customer_id": "42",
        "subtotal": "432.00",
        "total": "492.64",
        "item_count": "6",
        "created": "2026-07-01 09:12:00"
    }
]
GET /cart/allocation Get Allocation

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Returns the allocation structure for the cart's SKUs (a separate structure from core line items): per-SKU min/max wish and quantity limits and the allocation window.

Examples
Request
GET/cart/allocation
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "CAB-EST-2019": {
        "sku": "CAB-EST-2019",
        "min_wish": "0",
        "max_wish": "12",
        "wish_quantity": "6",
        "min_quantity": "0",
        "max_quantity": "12",
        "allocation_start": "2026-06-01 00:00:00",
        "allocation_end": "2026-07-31 23:59:59"
    }
}
GET /cart/allocation/wishlist/{wishlist_session_id} Get Allocation Wishlist By Id

Returns the allocation wishlist for a specific wishlist session id (used to reload a customer's saved allocation wishlist).

Parameters
NameTypeRequiredDescriptionExample
wishlist_session_id string Required Wishlist session id (e.g. Wish-42-wo-1001)
Examples
Request
GET/cart/allocation/wishlist/{wishlist_session_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "session": "Wish-42-wo-1001",
    "customer_id": "42",
    "items": {
        "CAB-EST-2019": {
            "sku": "CAB-EST-2019",
            "wish_quantity": "6",
            "max_wish": "12"
        }
    }
}
POST /cart/stripe-client-secret Get Stripe Elements Client Secret

Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session). Creates/updates the payment intent for the cart total and returns the bare Stripe Elements client-secret string (empty string on failure). payment_methods defaults to ['card'] plus any enabled wallet/bank methods.

Parameters
NameTypeRequiredDescriptionExample
payment_methods array Required Enabled payment method types: card, us_bank_account, link, google_pay, apple_pay
Examples
Request
POST/cart/stripe-client-secret
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "payment_methods": [
        "card",
        "us_bank_account",
        "link"
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
pi_3QabcDEF12345_secret_XyZ098765
POST /cart/emails/cancellation/{order_id} Send Cancellation Email

Sends the order cancellation email for the given order id. Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session).

Parameters
NameTypeRequiredDescriptionExample
order_id number Required Order Id
Examples
Request
POST/cart/emails/cancellation/{order_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /cart/emails/receipt/{order_id} Send Receipt Email

Sends (or re-sends) the order receipt/confirmation email for the given order id. Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session).

Parameters
NameTypeRequiredDescriptionExample
order_id number Required Order Id
Examples
Request
POST/cart/emails/receipt/{order_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /cart/emails/tracking/{order_id} Send Tracking Email

Sends the shipment tracking email for the given order id. Operates on the cart session identified by the X-Session-Id request header (the bare session id returned by Create Admin/Club/Wish Cart Session).

Parameters
NameTypeRequiredDescriptionExample
order_id number Required Order Id
Examples
Request
POST/cart/emails/tracking/{order_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}

ClubMembers

Resources related to ClubMembers.

PUT /clubMembers/{id}/cancel cancel

Cancels a membership by id, setting canceled to 1 and stamping cancellation_date plus an optional cancellation_reason (Personal | Health | Too much wine | Financial | Moving | No longer interested | Other, or a custom value). Returns the updated member row.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Member Id
cancellation_reason string Optional Cancellation reason (Personal | Health | Too much wine | Financial | Moving | No longer interested | Other)
Examples
Request
PUT/clubMembers/{id}/cancel
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "cancellation_reason": "Moving"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "1",
    "cancellation_date": "2026-02-10 11:04:22",
    "cancellation_reason": "Moving",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
POST /clubMembers create

Creates a club membership for a customer, affixing a shipping/pickup method, ship-to address, and payment method; delivery_preference is reconciled with method_id and created becomes the signup date. Returns the new member row, including its reserved club-{club}-{member} cart session.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
club_id number Required Club Id
method_id number Optional Shipping/pickup method id
address_id number Optional Ship-to address id
payment_id number Optional Payment method id affixed to the membership
signup_type string Optional Web | Tasting Room | Phone (+ custom)
is_gift string Optional Yes | No
email_template string Optional '' (Welcome) | none
delivery_preference string Optional shipping | pickup
method_id_shipping number Optional Shipping method id (when delivery_preference=shipping)
method_id_pickup number Optional Pickup method id (when delivery_preference=pickup)
Examples
Request
POST/clubMembers
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "customer_id": "100216",
    "club_id": "12",
    "method_id": "6",
    "address_id": "44120",
    "payment_id": "88231",
    "signup_type": "Web",
    "is_gift": "No",
    "email_template": "",
    "delivery_preference": "shipping",
    "method_id_shipping": "6"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
POST /clubMembers/{id}/order createOrder

Starts a batch order for the club ({id} is the club id) from a subtotal, shipping method, discount, and items[] payload, fanning out one reserved cart per club member. Returns the club id, an order_status flag, the carts_created count, and the requested ship date. Mirrors clubs::createOrder.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
subtotal number Optional Batch order subtotal
shipping_method number Optional Shipping method id
free_shipping boolean Optional Free shipping (1|0)
requested_ship_date string Optional Requested ship date (Y-m-d)
ship_status string Optional Initial ship status
discount number Optional Order-level discount
items array Required Batch items: {sku,name,price,quantity,min_purchase,max_purchase,tax_exempt,shipping_included,bottle_size}
Examples
Request
POST/clubMembers/{id}/order
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "subtotal": "180.00",
    "shipping_method": "6",
    "free_shipping": "0",
    "requested_ship_date": "2026-03-02",
    "ship_status": "Not Shipped",
    "discount": "0.00",
    "items": [
        {
            "sku": "2021-PN-750",
            "name": "2021 Estate Pinot Noir",
            "price": "60.00",
            "quantity": "3",
            "min_purchase": "3",
            "max_purchase": "6",
            "tax_exempt": "No",
            "shipping_included": "0",
            "bottle_size": "750mL"
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "club_id": "12",
    "order_status": "1",
    "carts_created": "342",
    "requested_ship_date": "2026-03-02"
}
DELETE /clubMembers/{id} delete

Permanently deletes a membership by id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Member Id
Examples
Request
DELETE/clubMembers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /clubMembers/{id}/order deleteOrder

Discards the club's in-process batch order ({id} is the club id), clearing the saved order_data and the members' reserved carts. Returns true. Mirrors clubs::deleteOrder.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
DELETE/clubMembers/{id}/order
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /clubMembers/{id} get

Returns a single membership by id. Many attributes live inside the JSON data blob, which the API does NOT auto-expand for club members - decode and merge it client-side.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Member Id
Examples
Request
GET/clubMembers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
GET /clubMembers getAll

Returns every club membership across all clubs as an array of member rows. The per-member JSON data blob is not auto-expanded and must be decoded client-side.

Examples
Request
GET/clubMembers
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5581",
        "customer_id": "100216",
        "club_id": "12",
        "payment_id": "88231",
        "address_id": "44120",
        "method_id": "6",
        "cart_session": "club-12-5581",
        "exclude_until": "",
        "status": "Ready",
        "authorization": "",
        "amount": "210.00",
        "total": "210.00",
        "error": "",
        "created": "2021-06-14 10:22:41",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "0",
        "cancellation_date": "0000-00-00 00:00:00",
        "cancellation_reason": "",
        "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
    }
]
GET /clubMembers/canceled getCanceled

Returns all cancelled memberships (canceled = 1), each carrying its cancellation_date and cancellation_reason.

Examples
Request
GET/clubMembers/canceled
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5581",
        "customer_id": "100216",
        "club_id": "12",
        "payment_id": "88231",
        "address_id": "44120",
        "method_id": "6",
        "cart_session": "club-12-5581",
        "exclude_until": "",
        "status": "",
        "authorization": "",
        "amount": "210.00",
        "total": "210.00",
        "error": "",
        "created": "2021-06-14 10:22:41",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "1",
        "cancellation_date": "2026-02-10 11:04:22",
        "cancellation_reason": "Moving",
        "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
    }
]
GET /clubMembers/{id}/canceled getCanceledByCustomer

Returns a customer's cancelled memberships ({id} is the customer id), each with its cancellation_date and cancellation_reason.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/clubMembers/{id}/canceled
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5581",
        "customer_id": "100216",
        "club_id": "12",
        "payment_id": "88231",
        "address_id": "44120",
        "method_id": "6",
        "cart_session": "club-12-5581",
        "exclude_until": "",
        "status": "",
        "authorization": "",
        "amount": "210.00",
        "total": "210.00",
        "error": "",
        "created": "2021-06-14 10:22:41",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "1",
        "cancellation_date": "2026-02-10 11:04:22",
        "cancellation_reason": "Moving",
        "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
    }
]
GET /clubMembers/{id}/members/{member_id} getMember

Returns a single hydrated member ({id} is the club, {member_id} the membership). Its data field is a JSON string the API does NOT auto-expand - decode and merge it client-side. Mirrors clubs::getMember.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
Examples
Request
GET/clubMembers/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "club_id": "12",
    "customer_id": "100216",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancelation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}",
    "customer": {
        "id": "100216",
        "first_name": "Jane",
        "last_name": "Doe",
        "email": "jane@example.com",
        "phone": "7075551234"
    },
    "address": {
        "id": "44120",
        "first_name": "Jane",
        "last_name": "Doe",
        "address": "100 Vine St",
        "city": "Napa",
        "state": "CA",
        "zip": "94558",
        "country": "US"
    },
    "payment": {
        "id": "88231",
        "credit_type": "Visa",
        "credit_number": "4242",
        "credit_expires_month": "08",
        "credit_expires_year": "2027"
    },
    "groups": "Allocation Tier A"
}
GET /clubMembers/{id}/members/count getMemberCount

Returns the club's member count ({id} is the club id) as a numeric string. Mirrors clubs::getMemberCount.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
GET/clubMembers/{id}/members/count
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"342"
GET /clubMembers/{id}/members getMembers

Returns the club's members ({id} is the club id) as an array of member rows for batch-order review; the JSON data blob is not auto-expanded. Mirrors clubs::getMembers.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
GET/clubMembers/{id}/members
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5581",
        "club_id": "12",
        "customer_id": "100216",
        "payment_id": "88231",
        "address_id": "44120",
        "method_id": "6",
        "cart_session": "club-12-5581",
        "exclude_until": "",
        "status": "Ready",
        "authorization": "",
        "amount": "210.00",
        "total": "210.00",
        "error": "",
        "created": "2021-06-14 10:22:41",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "0",
        "cancelation_date": "0000-00-00 00:00:00",
        "cancellation_reason": "",
        "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}",
        "customer": {
            "id": "100216",
            "first_name": "Jane",
            "last_name": "Doe",
            "email": "jane@example.com",
            "phone": "7075551234"
        },
        "address": {
            "id": "44120",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "100 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US"
        },
        "payment": {
            "id": "88231",
            "credit_type": "Visa",
            "credit_number": "4242",
            "credit_expires_month": "08",
            "credit_expires_year": "2027"
        },
        "groups": "Allocation Tier A"
    }
]
DELETE /clubMembers/{id}/members/{member_id} removeMember

Removes membership {member_id} from club {id}. Returns true. Mirrors clubs::removeMember.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
Examples
Request
DELETE/clubMembers/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /clubMembers/{id}/cancel uncancel

Reinstates a cancelled membership, clearing canceled back to 0 and its cancellation fields. Note a resumed member may retain canceled = '0' alongside a sentinel 0000-00-00 00:00:00 cancellation date. Returns the updated member row.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Member Id
Examples
Request
DELETE/clubMembers/{id}/cancel
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
PUT /clubMembers/{id} update

Updates a membership (method, address, payment, delivery preference, admin comments, etc.), resolving method_id from delivery_preference and migrating the reserved cart session when club_id changes. Returns the updated member row.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Member Id
customer_id number Required Customer Id
club_id number Required Club Id
method_id number Optional Shipping/pickup method id
address_id number Optional Ship-to address id
payment_id number Optional Payment method id affixed to the membership
signup_type string Optional Web | Tasting Room | Phone (+ custom)
is_gift string Optional Yes | No
email_template string Optional '' (Welcome) | none
delivery_preference string Optional shipping | pickup
method_id_shipping number Optional Shipping method id (when delivery_preference=shipping)
method_id_pickup number Optional Pickup method id (when delivery_preference=pickup)
Examples
Request
PUT/clubMembers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "club_id": "12",
    "method_id": "9",
    "address_id": "44120",
    "payment_id": "88231",
    "admin_comments": "Prefers even-numbered allocations.",
    "delivery_preference": "pickup",
    "method_id_pickup": "9"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
PUT /clubMembers/{id}/members/{member_id} updateMember

Updates a member of club {id} ({member_id} is the membership), reconciling method_id with the delivery preference. Returns the updated member row. Mirrors clubs::updateMember.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
customer_id number Required Customer Id
club_id number Required Club Id
method_id number Optional Shipping/pickup method id
address_id number Optional Ship-to address id
payment_id number Optional Payment method id affixed to the membership
signup_type string Optional Web | Tasting Room | Phone (+ custom)
is_gift string Optional Yes | No
email_template string Optional '' (Welcome) | none
delivery_preference string Optional shipping | pickup
method_id_shipping number Optional Shipping method id (when delivery_preference=shipping)
method_id_pickup number Optional Pickup method id (when delivery_preference=pickup)
Examples
Request
PUT/clubMembers/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "club_id": "12",
    "method_id": "9",
    "address_id": "44120",
    "payment_id": "88231",
    "admin_comments": "Prefers even-numbered allocations.",
    "delivery_preference": "pickup",
    "method_id_pickup": "9"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
GET /clubMembers/customer/{customer_id} Get Memberships By Customer

Returns all active club memberships for a customer, keyed by membership id. Many attributes live inside the JSON data blob, which the API does NOT auto-expand for club members - decode and merge it client-side. created is the signup date.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/clubMembers/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "812": {
        "id": "812",
        "customer_id": "42",
        "club_id": "14",
        "method_id": "7",
        "address_id": "3989",
        "payment_id": "305",
        "status": "Ready",
        "canceled": "0",
        "cancellation_date": "0000-00-00 00:00:00",
        "cancellation_reason": "",
        "signup_type": "Web",
        "created": "2026-01-12 09:14:00",
        "exclude_until": "0000-00-00",
        "cart_session": "club-14-812",
        "amount": "216.00",
        "total": "240.00",
        "authorization": "",
        "error": "",
        "last_update": "2026-02-16 15:17:00",
        "data": "{\"is_gift\":\"0\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"7\",\"method_id_pickup\":\"0\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
    }
}
POST /clubMembers/canceled Create Canceled Membership

Creates a historical (already-cancelled) membership, used when importing members that carry a cancellation date. Equivalent to create() but forces email_template='none' and persists the cancellation. Note the cancellation date is dual-columned: the API falls back between cancellation_date and the misspelled legacy cancelation_date.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
club_id number Required Club Id
method_id number Optional Stored shipping/pickup method Id
address_id number Optional Shipping address Id
payment_id number Optional Stored card Id
signup_type string Optional Web / Tasting Room / Phone or custom
created string Optional Signup date
cancellation_date string Required Date the membership was cancelled
cancellation_reason string Optional One of the 7 immutable reasons or a custom reason
Examples
Request
POST/clubMembers/canceled
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "customer_id": "42",
    "club_id": "14",
    "method_id": "7",
    "address_id": "3989",
    "payment_id": "305",
    "signup_type": "Web",
    "created": "2022-04-03 00:00:00",
    "cancellation_date": "2025-11-30 00:00:00",
    "cancellation_reason": "Moving",
    "email_template": "none"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "812",
    "customer_id": "42",
    "club_id": "14",
    "method_id": "7",
    "address_id": "3989",
    "payment_id": "305",
    "status": "",
    "canceled": "1",
    "cancellation_date": "2025-11-30 00:00:00",
    "cancellation_reason": "Moving",
    "signup_type": "Web",
    "created": "2026-01-12 09:14:00",
    "exclude_until": "0000-00-00",
    "cart_session": "",
    "amount": "0.00",
    "total": "0.00",
    "authorization": "",
    "error": "",
    "last_update": "2026-02-16 15:17:00",
    "data": "{\"is_gift\":\"0\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"7\",\"method_id_pickup\":\"0\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
POST /clubMembers/{id}/cart-session Set Cart Session

Points a membership at a cart session id (the club-{club}-{member} reserved batch cart). Used when (re)binding a member's batch cart during the lifecycle.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club member Id
cart_session string Required Cart session id, e.g. "club-14-812"
Examples
Request
POST/clubMembers/{id}/cart-session
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "cart_session": "club-14-812"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "812",
    "cart_session": "club-14-812"
}

Clubs

Resources related to Clubs.

POST /clubs create

Creates a club definition from the edit-form fields: name, status (Active | Inactive | Test Mode), website description/benefits/price-range, confirmation message, and the discount/free_shipping applied to subsequent non-club orders. signup_groups is a CSV of customer group ids joined on signup. Returns the new club with derived member_count.

Parameters
NameTypeRequiredDescriptionExample
name string Required Club Name
status string Optional Active | Inactive | Test Mode
description string Optional Website description (HTML)
club_info_1 string Optional Website benefits (HTML)
club_info_2 string Optional Price range label
club_confirmation_message string Optional Post-signup thank-you (HTML)
discount number Optional Discount percent applied to subsequent non-club orders
free_shipping boolean Optional Free shipping on subsequent non-club orders (1|0)
signup_groups string Optional Comma-separated customer group ids joined on signup
Examples
Request
POST/clubs
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Cellar Club",
    "status": "Inactive",
    "description": "<p>Our flagship allocation club.</p>",
    "club_info_1": "<p>Three curated shipments per year.</p>",
    "club_info_2": "$150 - $300 per shipment",
    "club_confirmation_message": "<p>Welcome!</p>",
    "discount": "10",
    "free_shipping": "1",
    "signup_groups": "4,7"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cellar Club",
    "status": "Active",
    "description": "<p>Our flagship allocation club.</p>",
    "club_info_1": "<p>Three curated shipments per year.</p>",
    "club_info_2": "$150 - $300 per shipment",
    "club_confirmation_message": "<p>Welcome to the Cellar Club!</p>",
    "discount": "10",
    "free_shipping": "1",
    "signup_groups": "4,7",
    "member_count": "342",
    "order_status": "",
    "last_update": "2026-02-16 15:17:00",
    "created": "2019-04-02 09:12:33"
}
POST /clubs/{id}/order createOrder

Starts a batch order for club {id} from a subtotal, shipping method, discount, and items[] payload, fanning out one reserved cart per club member. Returns the club id, an order_status flag, the carts_created count, and the requested ship date.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
subtotal number Optional Batch order subtotal
shipping_method number Optional Shipping method id
free_shipping boolean Optional Free shipping (1|0)
requested_ship_date string Optional Requested ship date (Y-m-d)
ship_status string Optional Initial ship status
discount number Optional Order-level discount
items array Required Batch items: {sku,name,price,quantity,min_purchase,max_purchase,tax_exempt,shipping_included,bottle_size}
Examples
Request
POST/clubs/{id}/order
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "subtotal": "180.00",
    "shipping_method": "6",
    "free_shipping": "0",
    "requested_ship_date": "2026-03-02",
    "ship_status": "Not Shipped",
    "discount": "0.00",
    "items": [
        {
            "sku": "2021-PN-750",
            "name": "2021 Estate Pinot Noir",
            "price": "60.00",
            "quantity": "3",
            "min_purchase": "3",
            "max_purchase": "6",
            "tax_exempt": "No",
            "shipping_included": "0",
            "bottle_size": "750mL"
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "club_id": "12",
    "order_status": "1",
    "carts_created": "342",
    "requested_ship_date": "2026-03-02"
}
DELETE /clubs/{id} delete

Permanently deletes a club by id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
DELETE/clubs/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /clubs/{id}/order deleteOrder

Discards the club's in-process batch order, clearing the saved order_data and the members' reserved carts. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
DELETE/clubs/{id}/order
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /clubs/{id} get

Returns a single club definition by id, including derived member_count. order_status is truthy while a batch order is in process, and order_data holds the saved batch as a JSON string the API strips backslashes from (repair it client-side).

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
GET/clubs/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cellar Club",
    "status": "Active",
    "description": "<p>Our flagship allocation club.</p>",
    "club_info_1": "<p>Three curated shipments per year.</p>",
    "club_info_2": "$150 - $300 per shipment",
    "club_confirmation_message": "<p>Welcome to the Cellar Club!</p>",
    "discount": "10",
    "free_shipping": "1",
    "signup_groups": "4,7",
    "member_count": "342",
    "order_status": "",
    "last_update": "2026-02-16 15:17:00",
    "created": "2019-04-02 09:12:33"
}
GET /clubs getAll

Returns all club definitions as an array, each with its derived member_count and current order_status.

Examples
Request
GET/clubs
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "12",
        "name": "Cellar Club",
        "status": "Active",
        "description": "<p>Our flagship allocation club.</p>",
        "club_info_1": "<p>Three curated shipments per year.</p>",
        "club_info_2": "$150 - $300 per shipment",
        "club_confirmation_message": "<p>Welcome to the Cellar Club!</p>",
        "discount": "10",
        "free_shipping": "1",
        "signup_groups": "4,7",
        "member_count": "342",
        "order_status": "",
        "last_update": "2026-02-16 15:17:00",
        "created": "2019-04-02 09:12:33"
    }
]
GET /clubs/{id}/members/{member_id} getMember

Returns a single hydrated member of club {id} ({member_id} is the membership). Its data field is a JSON string the API does NOT auto-expand - decode and merge it client-side.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
Examples
Request
GET/clubs/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "club_id": "12",
    "customer_id": "100216",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancelation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}",
    "customer": {
        "id": "100216",
        "first_name": "Jane",
        "last_name": "Doe",
        "email": "jane@example.com",
        "phone": "7075551234"
    },
    "address": {
        "id": "44120",
        "first_name": "Jane",
        "last_name": "Doe",
        "address": "100 Vine St",
        "city": "Napa",
        "state": "CA",
        "zip": "94558",
        "country": "US"
    },
    "payment": {
        "id": "88231",
        "credit_type": "Visa",
        "credit_number": "4242",
        "credit_expires_month": "08",
        "credit_expires_year": "2027"
    },
    "groups": "Allocation Tier A"
}
GET /clubs/{id}/members/count getMemberCount

Returns the club's member count as a numeric string.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
GET/clubs/{id}/members/count
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"342"
GET /clubs/{id}/members getMembers

Returns the club's members as an array of member rows, used to drive the batch-order review. Append an optional status segment (blank | Ready | Complete | Exclude) to filter to a single batch state; the JSON data blob is not auto-expanded.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
Examples
Request
GET/clubs/{id}/members
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5581",
        "club_id": "12",
        "customer_id": "100216",
        "payment_id": "88231",
        "address_id": "44120",
        "method_id": "6",
        "cart_session": "club-12-5581",
        "exclude_until": "",
        "status": "Ready",
        "authorization": "",
        "amount": "210.00",
        "total": "210.00",
        "error": "",
        "created": "2021-06-14 10:22:41",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "0",
        "cancelation_date": "0000-00-00 00:00:00",
        "cancellation_reason": "",
        "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}",
        "customer": {
            "id": "100216",
            "first_name": "Jane",
            "last_name": "Doe",
            "email": "jane@example.com",
            "phone": "7075551234"
        },
        "address": {
            "id": "44120",
            "first_name": "Jane",
            "last_name": "Doe",
            "address": "100 Vine St",
            "city": "Napa",
            "state": "CA",
            "zip": "94558",
            "country": "US"
        },
        "payment": {
            "id": "88231",
            "credit_type": "Visa",
            "credit_number": "4242",
            "credit_expires_month": "08",
            "credit_expires_year": "2027"
        },
        "groups": "Allocation Tier A"
    }
]
DELETE /clubs/{id}/members/{member_id} removeMember

Removes membership {member_id} from club {id}. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
Examples
Request
DELETE/clubs/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /clubs/{id}/sort/{position} reorder

Sets the club's display sort position. Returns true. The position is write-only - it has no direct read on the club object.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
position number Required New sort position
Examples
Request
PUT/clubs/{id}/sort/{position}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /clubs/{id} update

Updates a club definition using the same field set as create, with signup_groups imploded to a CSV. Returns the updated club.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
name string Required Club Name
status string Optional Active | Inactive | Test Mode
description string Optional Website description (HTML)
club_info_1 string Optional Website benefits (HTML)
club_info_2 string Optional Price range label
club_confirmation_message string Optional Post-signup thank-you (HTML)
discount number Optional Discount percent applied to subsequent non-club orders
free_shipping boolean Optional Free shipping on subsequent non-club orders (1|0)
signup_groups string Optional Comma-separated customer group ids joined on signup
Examples
Request
PUT/clubs/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Cellar Club",
    "status": "Active",
    "discount": "15",
    "free_shipping": "1",
    "signup_groups": "4,7"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cellar Club",
    "status": "Active",
    "description": "<p>Our flagship allocation club.</p>",
    "club_info_1": "<p>Three curated shipments per year.</p>",
    "club_info_2": "$150 - $300 per shipment",
    "club_confirmation_message": "<p>Welcome to the Cellar Club!</p>",
    "discount": "10",
    "free_shipping": "1",
    "signup_groups": "4,7",
    "member_count": "342",
    "order_status": "",
    "last_update": "2026-02-16 15:17:00",
    "created": "2019-04-02 09:12:33"
}
PUT /clubs/{id}/members/{member_id} updateMember

Updates a member of club {id} ({member_id} is the membership) - method, address, payment, and delivery preference - reconciling method_id. Returns the updated member row. Mirrors clubMembers::update.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
member_id number Required Club Member Id
customer_id number Required Customer Id
club_id number Required Club Id
method_id number Optional Shipping/pickup method id
address_id number Optional Ship-to address id
payment_id number Optional Payment method id affixed to the membership
signup_type string Optional Web | Tasting Room | Phone (+ custom)
is_gift string Optional Yes | No
email_template string Optional '' (Welcome) | none
delivery_preference string Optional shipping | pickup
method_id_shipping number Optional Shipping method id (when delivery_preference=shipping)
method_id_pickup number Optional Pickup method id (when delivery_preference=pickup)
Examples
Request
PUT/clubs/{id}/members/{member_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "club_id": "12",
    "method_id": "9",
    "address_id": "44120",
    "payment_id": "88231",
    "admin_comments": "Prefers even-numbered allocations.",
    "delivery_preference": "pickup",
    "method_id_pickup": "9"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5581",
    "customer_id": "100216",
    "club_id": "12",
    "payment_id": "88231",
    "address_id": "44120",
    "method_id": "6",
    "cart_session": "club-12-5581",
    "exclude_until": "",
    "status": "Ready",
    "authorization": "",
    "amount": "210.00",
    "total": "210.00",
    "error": "",
    "created": "2021-06-14 10:22:41",
    "last_update": "2026-02-16 15:17:00",
    "canceled": "0",
    "cancellation_date": "0000-00-00 00:00:00",
    "cancellation_reason": "",
    "data": "{\"is_gift\":\"No\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"6\",\"method_id_pickup\":\"\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"0\",\"do_not_combine\":\"0\",\"override_shipping\":false}"
}
GET /clubs/{id}/members/with-carts Get Members With Carts

Returns the club's batch members with each member's reserved cart hydrated under a cart key. Cancelled members are dropped, the JSON data blob is merged up, and derived method, ccNum, and ccType are added. Append an optional status segment (blank/Ready/Complete/Exclude) to filter to a single batch state. Used to drive the batch-order review screen.

Parameters
NameTypeRequiredDescriptionExample
id number Required Club Id
status string Optional Optional batch status filter: Ready, Complete, or Exclude
Examples
Request
GET/clubs/{id}/members/with-carts
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "812",
        "club_id": "14",
        "customer_id": "42",
        "payment_id": "305",
        "address_id": "3989",
        "method_id": "7",
        "cart_session": "club-14-812",
        "exclude_until": "0000-00-00",
        "status": "Ready",
        "authorization": "",
        "amount": "216.00",
        "total": "240.00",
        "error": "",
        "created": "2026-01-12 09:14:00",
        "last_update": "2026-02-16 15:17:00",
        "canceled": "0",
        "cancelation_date": "0000-00-00 00:00:00",
        "cancellation_reason": "",
        "data": "{\"is_gift\":\"0\",\"signup_type\":\"Web\",\"sales_person\":\"\",\"referral\":\"\",\"delivery_preference\":\"shipping\",\"method_id_shipping\":\"7\",\"method_id_pickup\":\"0\",\"admin_comments\":\"\",\"notify_recipient\":\"0\",\"special_instructions\":\"\",\"do_not_combine\":\"0\",\"override_shipping\":false}",
        "method": "FedEx Ground",
        "ccNum": "4242",
        "ccType": "Visa",
        "cart": {
            "session_id": "club-14-812",
            "subtotal": "240.00",
            "discount": "24.00",
            "shipping": "18.00",
            "tax": "0.00",
            "total": "234.00",
            "items": {
                "CAB19": {
                    "sku": "CAB19",
                    "name": "2019 Estate Cabernet",
                    "quantity": "6",
                    "price": "40.00"
                }
            },
            "config": {
                "club_id": "14",
                "order_type": "Club",
                "shipping_method": "7"
            }
        }
    }
]
POST /clubs/members/{member_id}/status Set Member Batch Status

Sets a club member's batch-order status. Transitions drive the batch lifecycle (blank -> Ready -> Complete | Exclude). Moving Ready->Complete clears the member's reserved cart (releasing inventory); Complete->Ready re-adds the club-order items. Side-effectful.

Parameters
NameTypeRequiredDescriptionExample
member_id number Required Club member Id
status string Required New batch status: Ready, Complete, or Exclude (empty clears the batch)
Examples
Request
POST/clubs/members/{member_id}/status
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "status": "Complete"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "812",
    "status": "Complete"
}
POST /clubs/members/{member_id}/error Set Member Batch Error

Records (or clears) the batch failure message on a club member row after a failed charge/checkout. Pass an empty message to clear the error. (Legacy passed the message in the URL path; here it is a body field.)

Parameters
NameTypeRequiredDescriptionExample
member_id number Required Club member Id
message string Required Failure reason; empty string clears the error
Examples
Request
POST/clubs/members/{member_id}/error
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "message": "Card declined"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "812",
    "error": "Card declined"
}
POST /clubs/members/{member_id}/amount Set Member Batch Amount

Sets the per-member batch charge amount (computed by the batch calc step before processing). Amount is a decimal money string.

Parameters
NameTypeRequiredDescriptionExample
member_id number Required Club member Id
amount string Required Batch charge amount as a decimal string, e.g. "216.00"
Examples
Request
POST/clubs/members/{member_id}/amount
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "216.00"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "812",
    "amount": "216.00"
}

Customers

Resources related to Customers.

POST /customers Create Customer

Creates a customer and returns the new customer object. Requires first_name, last_name, email, and password; groups are not accepted here (assign them separately, and the account's default_group is added automatically).

Parameters
NameTypeRequiredDescriptionExample
email string Required Customer Email Address
first_name string Required Customer First Name
last_name string Required Customer Last Name
password string Required Customer Password
Examples
Request
POST/customers
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "password": "XXXXXXXXX"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "status": "Active",
    "state": "",
    "order_count": "0",
    "order_total": "0.00",
    "last_order": "0000-00-00 00:00:00",
    "last_order_total": "0.00",
    "last_update": "2018-04-18 16:14:00",
    "created": "2018-04-18 16:14:00",
    "signup_email_last_sent": "2018-04-18 16:14:00"
}
DELETE /customers/{id} Delete Customer

Permanently deletes a customer. Blocked if the customer has any order history; returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
DELETE/customers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /customers/filter Filter Customers

Returns customers matching a posted list of ElasticSearch-style clauses (term, not_terms, range, query_string) plus special server-side keys (groups, clubs, tags, order_skus, billing/shipping states, zip_codes, credits). Results are keyed by id; rows lacking an id are dropped.

Examples
Request
POST/customers/filter
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    {
        "type": "range",
        "key": "created",
        "from": 1522540800,
        "to": 1524097161
    },
    {
        "type": "term",
        "key": "customer_source",
        "value": "Web"
    }
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "status": "Active",
        "state": "CA",
        "customer_source": "Web",
        "order_count": "0",
        "order_total": "0.00",
        "last_order": "0000-00-00 00:00:00",
        "last_order_total": "0.00",
        "last_update": "2018-04-18 16:35:48",
        "created": "2018-04-18 16:14:00",
        "signup_email_last_sent": "2018-04-18 16:14:00"
    }
}
GET /customers/{id} Get Customer

Retrieves a single customer by id, including derived purchase-history and lifecycle fields.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "status": "Active",
    "state": "CA",
    "order_count": "0",
    "order_total": "0.00",
    "last_order": "0000-00-00 00:00:00",
    "last_order_total": "0.00",
    "last_update": "2018-04-18 16:14:00",
    "created": "2018-04-18 16:14:00",
    "signup_email_last_sent": "2018-04-18 16:14:00"
}
GET /customers/{id}/clubs Get Customer Clubs

Returns the club memberships associated with the customer. Empty array when the customer belongs to no clubs.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}/clubs
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[]
GET /customers/{id}/transactions Get Customer Transactions

Returns the customer's payment transaction rows (debits, refunds, and chargebacks) across all of their orders.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}/transactions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[]
GET /customers/search/{query} Search Customers

Full-text search across customers (name, email, and related fields), returning matches keyed by id. For structured criteria use the filter endpoint instead.

Parameters
NameTypeRequiredDescriptionExample
query string Required Customer Search Query String
Examples
Request
GET/customers/search/{query}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "status": "Active",
        "state": "CA",
        "customer_source": "Web",
        "order_count": "0",
        "order_total": "0.00",
        "last_order": "0000-00-00 00:00:00",
        "last_order_total": "0.00",
        "last_update": "2018-04-18 16:35:48",
        "created": "2018-04-18 16:14:00",
        "signup_email_last_sent": "2018-04-18 16:14:00"
    }
}
PUT /customers/{id} Update Customer

Updates the supplied fields on a customer and returns the full updated object. Derived fields (order counts/totals, first-purchase, timestamps) are read-only and ignored if sent.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
PUT/customers/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "state": "CA"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "status": "Active",
    "state": "CA",
    "order_count": "0",
    "order_total": "0.00",
    "last_order": "0000-00-00 00:00:00",
    "last_order_total": "0.00",
    "last_update": "2018-04-18 16:35:48",
    "created": "2018-04-18 16:14:00",
    "signup_email_last_sent": "2018-04-18 16:14:00"
}
PUT /customers/{id}/password Update Customer Password

Sets the customer's login password to the supplied value. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
PUT/customers/{id}/password
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "password": "XXXXXXXXX"
}
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /customers/{id}/groups/{group_id} Add Customer To Group

Adds the customer to the given group. Returns true; idempotent if the customer is already a member.

Parameters
NameTypeRequiredDescriptionExample
group_id number Required Group Id
id number Required Customer Id
Examples
Request
PUT/customers/{id}/groups/{group_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /customers/{id}/groups Clear All Customer Groups

Removes the customer from every group they belong to. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
DELETE/customers/{id}/groups
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /customers/{id}/groups Get Customer Groups

Returns the groups the customer belongs to, keyed by group id, each with its discount, free-shipping, and checkout-minimum settings.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}/groups
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "1": {
        "id": "1",
        "name": "Mailing List",
        "discount": "0",
        "free_shipping": "0",
        "checkout_cart_min": "0"
    },
    "2": {
        "id": "2",
        "name": "Customer Group I",
        "discount": "0",
        "free_shipping": "0",
        "checkout_cart_min": "0"
    }
}
DELETE /customers/{id}/groups/{group_id} Remove Customer From Group

Removes the customer from a single group. Returns true.

Parameters
NameTypeRequiredDescriptionExample
group_id number Required Group Id
id number Required Customer Id
Examples
Request
DELETE/customers/{id}/groups/{group_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /customers/{id}/notes Add Customer Note

Adds a note to the customer. type selects Log (activity log) or Admin (notes panel, the default); category defaults to General. Returns the created note.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
POST/customers/{id}/notes
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "message": "John would like to ship FedEx if possible.",
    "user_id": 1,
    "user_name": "Jane Doe",
    "type": "Admin"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": 246,
    "customer_id": "42",
    "message": "John would like to ship FedEx if possible.",
    "user_id": 1,
    "user_name": "Jane Doe",
    "type": "Admin"
}
GET /customers/{id}/notes/{type} Get Customer Notes

Returns the customer's notes of the given type (Log for the activity log, Admin for the editable notes panel), newest first.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
type string Required Note Type
Examples
Request
GET/customers/{id}/notes/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "4",
        "customer_id": "42",
        "created": "2018-04-19 09:14:09",
        "type": "Admin",
        "user_id": "1",
        "user_name": "Jane Doe",
        "message": "John is a Great Customer!"
    },
    {
        "id": "1",
        "customer_id": "42",
        "created": "2018-04-19 09:09:51",
        "type": "Admin",
        "user_id": "1",
        "user_name": "Jane Doe",
        "message": "John would like to ship FedEx if possible."
    }
]
PUT /customers/{id}/tags/{tag} Add Tag to Customer

Attaches a tag to the customer. Tags are stored uppercased; returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
tag string Required Tag
Examples
Request
PUT/customers/{id}/tags/{tag}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /customers/{id}/tags Clear All Tags from Customer

Removes all tags from the customer. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
DELETE/customers/{id}/tags
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /customers/{id}/tags Get Customer Tags

Returns the customer's tags as an array of strings.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}/tags
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    "VIPCustomer",
    "FedExOnly"
]
DELETE /customers/{id}/tags/{tag} Remove Tag from Customer

Removes a single tag from the customer. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
tag string Required Tag
Examples
Request
DELETE/customers/{id}/tags/{tag}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /customers/batch Get Customers By Id

Bulk-hydrate multiple customers in one call by POSTing a bare array of customer ids. Returns a map keyed by customer id. Use this instead of many single GET /customers/{id} calls when rendering lists.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of customer ids to hydrate
Examples
Request
POST/customers/batch
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    42,
    43
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "phone": "5105551234",
        "active_account": "Yes",
        "order_count": "3",
        "order_total": "642.00",
        "last_order": "2026-01-14 10:22:00",
        "created": "2018-04-18 16:14:00"
    },
    "43": {
        "id": "43",
        "first_name": "Jane",
        "last_name": "Smith",
        "email": "jane@commercebyfigure.com",
        "phone": "5105559876",
        "active_account": "Yes",
        "order_count": "0",
        "order_total": "0.00",
        "last_order": "0000-00-00 00:00:00",
        "created": "2019-06-02 08:41:00"
    }
}
GET /customers/{limit}/{page} Get All Customers

Returns a paginated list of all customers. Supply the page size and the 1-based page number in the path. Returns a map keyed by customer id.

Parameters
NameTypeRequiredDescriptionExample
limit number Required Number of customers per page
page number Required 1-based page number
Examples
Request
GET/customers/{limit}/{page}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "phone": "5105551234",
        "active_account": "Yes",
        "order_count": "3",
        "order_total": "642.00",
        "last_order": "2026-01-14 10:22:00",
        "last_order_total": "128.00",
        "created": "2018-04-18 16:14:00"
    }
}
POST /customers/external/{external_id} Create Customer With Id

Import path that creates a customer keyed to an external system id (e.g. a Cultivate or AMS id) so subsequent syncs are idempotent. Same body as Create Customer; any nested address is stripped and created separately against the Addresses resource.

Parameters
NameTypeRequiredDescriptionExample
external_id string Required External system id to key the customer on
first_name string Required First name
last_name string Required Last name
email string Required Email address
password string Required Account password (write-only, never returned)
mobile_phone string Optional Mobile phone; mirrored to phone on create
birthday string Optional Birthday (Y-m-d)
customer_source string Optional Acquisition source
legacy_customer_id string Optional Legacy/import id carried through
Examples
Request
POST/customers/external/{external_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "password": "XXXXXXXXX",
    "mobile_phone": "5105551234",
    "customer_source": "Import"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "first_name": "John",
    "last_name": "Doe",
    "email": "example@commercebyfigure.com",
    "phone": "5105551234",
    "active_account": "Yes",
    "customer_source": "Import",
    "created": "2026-02-16 15:17:00"
}
GET /customers/stats Get Customer Stats

Returns a computed rollup of customer counts for dashboard tiles (a report/aggregate read, not a resource object). Fields are derived server-side.

Examples
Request
GET/customers/stats
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "total": "1842",
    "active": "1710",
    "inactive": "132",
    "club_members": "463",
    "new_this_month": "38"
}
GET /customers/stats/signups/{start}/{end} Get Signup Stats

Returns a computed rollup of new-customer signups bucketed over the given date range (a report/aggregate read). Use for signup trend charts.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start (Y-m-d)
end string Required Range end (Y-m-d)
Examples
Request
GET/customers/stats/signups/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "2026-01-01": "12",
    "2026-01-02": "8",
    "2026-01-03": "15"
}
GET /customers/signups/{start}/{end} Get Customers By Signup Date

Returns the customers whose accounts were created within the given date range. Returns a map keyed by customer id.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start (Y-m-d)
end string Required Range end (Y-m-d)
Examples
Request
GET/customers/signups/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "customer_source": "Web",
        "active_account": "Yes",
        "created": "2026-01-14 09:03:00"
    }
}
GET /customers/top/{limit}/{page} Get Top Customers

Returns the highest-value customers ranked by lifetime order total, paginated. Returns a map keyed by customer id including the derived order_total/order_count fields.

Parameters
NameTypeRequiredDescriptionExample
limit number Required Number of customers per page
page number Required 1-based page number
Examples
Request
GET/customers/top/{limit}/{page}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "order_count": "27",
        "order_total": "9184.00",
        "last_order": "2026-02-01 12:44:00",
        "last_order_total": "412.00"
    }
}
GET /customers/club Get Club Customers

Returns all customers who are members of at least one wine club. Returns a map keyed by customer id.

Examples
Request
GET/customers/club
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "active_account": "Yes",
        "order_count": "12",
        "order_total": "3420.00"
    }
}
GET /customers/non-club Get Non-Club Customers

Returns all customers who are not members of any wine club. Returns a map keyed by customer id.

Examples
Request
GET/customers/non-club
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "57": {
        "id": "57",
        "first_name": "Erin",
        "last_name": "Wells",
        "email": "erin@commercebyfigure.com",
        "active_account": "Yes",
        "order_count": "2",
        "order_total": "210.00"
    }
}
POST /customers/clubs/batch Get Customer Clubs By Id

Bulk variant of Get Customer Clubs. POST a bare array of customer ids to fetch each customer's club memberships in one call. Returns a map keyed by customer id.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of customer ids
Examples
Request
POST/customers/clubs/batch
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    42,
    43
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": [
        {
            "id": "9",
            "club_id": "3",
            "customer_id": "42",
            "status": "",
            "created": "2025-03-01 10:00:00"
        }
    ],
    "43": []
}
POST /customers/groups/batch Get Customer Groups By Id

Bulk variant of Get Customer Groups (getGroupsById). POST a bare array of customer ids to fetch each customer's group memberships in one call. Returns a map keyed by customer id. Note: the per-customer getGroupsByCustomer alias is served by GET /customers/{id}/groups.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of customer ids
Examples
Request
POST/customers/groups/batch
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    42,
    43
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": [
        {
            "id": "5",
            "name": "Allocation A",
            "type": "allocation"
        }
    ],
    "43": [
        {
            "id": "1",
            "name": "Newsletter",
            "type": "standard"
        }
    ]
}
GET /customers/{id}/emails Get Customer Email History

Returns the log of transactional/marketing emails sent to a customer. Rows are derived from the send log (template, subject, recipient, status, timestamp).

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
GET/customers/{id}/emails
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "template": "signup",
        "subject": "Welcome to the winery",
        "to": "example@commercebyfigure.com",
        "status": "Sent",
        "created": "2026-01-14 09:04:00"
    },
    {
        "template": "receipt",
        "subject": "Your order receipt",
        "to": "example@commercebyfigure.com",
        "status": "Sent",
        "created": "2026-01-16 11:20:00"
    }
]
POST /customers/{id}/signup-email Send Signup Email

Sends (or re-sends) a signup/welcome email to the customer using the named email template. The template name maps to a content template (e.g. signup, signup-tastingroom).

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
template string Required Email template name to send
Examples
Request
POST/customers/{id}/signup-email
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "template": "signup"
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /customers/{id}/preauth-token Generate Preauth Token

Generates a preauthorization token for the customer, used for magic/cross-domain links such as cart recovery. Optionally set an expiry window. Returns the token and its expiry.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
expires string Optional Optional expiry (Y-m-d H:i:s); defaults to a standard 7-day window
flag string Optional Optional token-type flag
Examples
Request
POST/customers/{id}/preauth-token
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "expires": "2026-02-23 15:17:00"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "preauth_token": "a1b2c3d4e5f6a7b8c9d0e1f2",
    "preauth_expires": "2026-02-23 15:17:00"
}
DELETE /customers/{id}/preauth-token Delete Preauth Token

Revokes any active preauthorization token for the customer.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
DELETE/customers/{id}/preauth-token
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /customers/username/{email} Get Customer Id By Username

Resolves a customer's login username (their email address) to their numeric customer id. Returns the bare id.

Parameters
NameTypeRequiredDescriptionExample
email string Required Customer email / username
Examples
Request
GET/customers/username/{email}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"42"
POST /customers/recalculate-order-totals Recalculate Customer Order Totals

Maintenance action that recomputes the derived purchase-history rollups (order_count, order_total, first_purchase_, last_order_) across all customers from their orders. Side-effectful; run as a batch job.

Examples
Request
POST/customers/recalculate-order-totals
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /customers/{id}/allocations Add Customer Allocation

Adds a single per-SKU allocation entry to the customer's individual allocation. Stored inside the customer's individual_allocation JSON. Use Set Customer Individual Allocation to replace the whole set at once.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
sku string Required Product SKU the allocation applies to
min_quantity number Optional Minimum purchase quantity
max_quantity number Optional Maximum purchase quantity
min_wish number Optional Minimum wishlist quantity
max_wish number Optional Maximum wishlist quantity
product_badge string Optional Optional badge label
Examples
Request
POST/customers/{id}/allocations
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "sku": "CAB-2021",
    "min_quantity": 0,
    "max_quantity": 6,
    "min_wish": 0,
    "max_wish": 12
}
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /customers/{id}/allocations/{sku} Remove Customer Allocation

Removes a single per-SKU entry from the customer's individual allocation.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
sku string Required Product SKU to remove from the allocation
Examples
Request
DELETE/customers/{id}/allocations/{sku}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /customers/{id}/allocations Clear Customer Allocations

Clears the customer's entire individual allocation (all per-SKU entries).

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
Examples
Request
DELETE/customers/{id}/allocations
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /customers/{id}/allocations Set Customer Individual Allocation

Replaces the customer's entire individual allocation with the supplied product list in one call (used by allocation import). Each item is a per-SKU allocation entry.

Parameters
NameTypeRequiredDescriptionExample
id number Required Customer Id
products array Required Array of allocation entries, each with sku, min_quantity, max_quantity, min_wish, max_wish, product_badge
Examples
Request
PUT/customers/{id}/allocations
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "products": [
        {
            "sku": "CAB-2021",
            "min_quantity": 0,
            "max_quantity": 6,
            "min_wish": 0,
            "max_wish": 12,
            "product_badge": "Reserve"
        },
        {
            "sku": "CHAR-2022",
            "min_quantity": 0,
            "max_quantity": 12,
            "min_wish": 0,
            "max_wish": 24
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /customers/allocation-timeframe Update Individual Allocation Timeframe

Updates the allocation timeframe fields (tier and start/end window) for a customer's individual allocation. Set by the allocation import.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
allocation_tier string Optional Allocation tier label
individual_allocation_start string Optional Allocation window start (Y-m-d H:i:s)
individual_allocation_end string Optional Allocation window end (Y-m-d H:i:s)
Examples
Request
PUT/customers/allocation-timeframe
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "customer_id": 42,
    "allocation_tier": "Gold",
    "individual_allocation_start": "2026-03-01 00:00:00",
    "individual_allocation_end": "2026-03-31 23:59:59"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /customers/allocation-wish-details Get All Allocation Wish Details

Returns aggregate individual-allocation and wishlist detail across customers (a report/aggregate read). Each entry mirrors the decoded individual_allocation structure per SKU.

Examples
Request
GET/customers/allocation-wish-details
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "CAB-2021": {
            "sku": "CAB-2021",
            "name": "Cabernet Sauvignon 2021",
            "min_quantity": "0",
            "max_quantity": "6",
            "quantity": "2",
            "min_wish": "0",
            "max_wish": "12"
        }
    }
}
GET /customers/auto-increment Get Customers Auto Increment

Returns the next customer id the system will assign (the config starting_customer_id counter). Used to align imported id ranges.

Examples
Request
GET/customers/auto-increment
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"1042"
PUT /customers/auto-increment Set Customers Auto Increment

Sets the customer id auto-increment starting value (config starting_customer_id). Use with care when seeding an id range for imports.

Parameters
NameTypeRequiredDescriptionExample
value number Required New starting customer id
Examples
Request
PUT/customers/auto-increment
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "value": 2000
}
Response
Headers · 200
Content-Type: application/json
Body
true

Groups

Resources related to Groups.

POST /groups Create Group

Creates a customer group and returns the new group object. name is required; status and description are optional. type distinguishes a standard group from an allocation group (whose per-SKU allocation items are managed separately).

Parameters
NameTypeRequiredDescriptionExample
description string Optional Description of Group
name string Required Group Title
status string Optional Group Status
Examples
Request
POST/groups
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Customer Group I",
    "status": "Active",
    "description": "New Customer Group."
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "2",
    "name": "Customer Group I",
    "status": "Active",
    "sort": "0",
    "allocation_message": "",
    "allocation_start": "0000-00-00 00:00:00",
    "checkout_cart_min": "0",
    "allocation_end": "0000-00-00 00:00:00",
    "discount": "0",
    "free_shipping": "0",
    "description": "New Customer Group."
}
DELETE /groups/{id} Delete Group

Permanently deletes a group by id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
Examples
Request
DELETE/groups/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /groups Get All Groups

Returns all groups (including archived ones), keyed by id. Use the non-archived variants to hide archived groups in pickers.

Examples
Request
GET/groups
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "2": {
        "id": "2",
        "name": "Customer Group I",
        "status": "Active",
        "sort": "0",
        "allocation_message": "",
        "allocation_start": "0000-00-00 00:00:00",
        "checkout_cart_min": "0",
        "allocation_end": "0000-00-00 00:00:00",
        "discount": "0",
        "free_shipping": "0",
        "description": "Updated Customer Group"
    },
    "1": {
        "id": "1",
        "name": "Mailing List",
        "status": "Active",
        "sort": "0",
        "allocation_message": "",
        "allocation_start": "0000-00-00 00:00:00",
        "checkout_cart_min": "0",
        "allocation_end": "0000-00-00 00:00:00",
        "discount": "0",
        "free_shipping": "0"
    }
}
GET /groups/{id}/customers Get Customers In Group

Returns the customers who are members of the given group, hydrated as customer objects keyed by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
Examples
Request
GET/groups/{id}/customers
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "example@commercebyfigure.com",
        "status": "Active",
        "state": "CA",
        "order_count": "0",
        "order_total": "0.00",
        "last_order": "0000-00-00 00:00:00",
        "last_order_total": "0.00",
        "last_update": "2018-04-18 16:35:48",
        "created": "2018-04-18 16:14:00",
        "signup_email_last_sent": "2018-04-18 16:14:00"
    }
}
GET /groups/{id} Get Group

Retrieves a single group by id, including its discount, free-shipping, exclusive-access, and allocation-window settings.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
Examples
Request
GET/groups/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "2",
    "name": "Customer Group I",
    "status": "Active",
    "sort": "0",
    "allocation_message": "",
    "allocation_start": "0000-00-00 00:00:00",
    "checkout_cart_min": "0",
    "allocation_end": "0000-00-00 00:00:00",
    "discount": "0",
    "free_shipping": "0",
    "description": "New Customer Group."
}
PUT /groups/{id} Update Group

Updates the supplied fields on a group and returns the full updated object. Fields include exclusive_access and exclusive_methods gating; archiving a group force-sets exclusive_access to No.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
Examples
Request
PUT/groups/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "description": "Updated Customer Group"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "2",
    "name": "Customer Group I",
    "status": "Active",
    "sort": "0",
    "allocation_message": "",
    "allocation_start": "0000-00-00 00:00:00",
    "checkout_cart_min": "0",
    "allocation_end": "0000-00-00 00:00:00",
    "discount": "0",
    "free_shipping": "0",
    "description": "Updated Customer Group"
}
GET /groups/non-archived Get All Non-Archived Groups

Returns all groups except those with status Archived. Use for pickers and assignment UIs where archived groups should be hidden.

Examples
Request
GET/groups/non-archived
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "31",
        "name": "Allocation Tier 1",
        "description": "Top allocation tier",
        "type": "allocation",
        "status": "Active",
        "sort": "2",
        "image": "https://cdn.example.com/groups/31.jpg",
        "discount": "10.00",
        "free_shipping": "0",
        "exclusive_access": "Yes",
        "exclusive_methods": {
            "7": "1",
            "9": "0"
        },
        "allocation_start": "2026-02-01 00:00",
        "allocation_end": "2026-03-01 00:00",
        "allocation_title": "Spring Release",
        "allocation_message": "Your allocation is ready",
        "purchase_message": "Thank you for your purchase",
        "checkout_cart_min": "3",
        "checkout_cart_max": "12",
        "checkout_dollar_min": "150.00",
        "associated_club": "14"
    }
]
GET /groups/non-archived/with-customer-ids Get All Non-Archived Groups With Customer Ids

Returns all non-archived groups, each augmented with a customer_ids array of its member customer ids. Avoids a per-group membership fetch.

Examples
Request
GET/groups/non-archived/with-customer-ids
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "31",
        "name": "Allocation Tier 1",
        "description": "Top allocation tier",
        "type": "allocation",
        "status": "Active",
        "sort": "2",
        "image": "https://cdn.example.com/groups/31.jpg",
        "discount": "10.00",
        "free_shipping": "0",
        "exclusive_access": "Yes",
        "exclusive_methods": {
            "7": "1",
            "9": "0"
        },
        "allocation_start": "2026-02-01 00:00",
        "allocation_end": "2026-03-01 00:00",
        "allocation_title": "Spring Release",
        "allocation_message": "Your allocation is ready",
        "purchase_message": "Thank you for your purchase",
        "checkout_cart_min": "3",
        "checkout_cart_max": "12",
        "checkout_dollar_min": "150.00",
        "associated_club": "14",
        "customer_ids": [
            "42",
            "57",
            "88"
        ]
    }
]
GET /groups/with-customer-ids Get All Groups With Customer Ids

Returns all groups (including archived), each augmented with a customer_ids array of its member customer ids.

Examples
Request
GET/groups/with-customer-ids
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "31",
        "name": "Allocation Tier 1",
        "description": "Top allocation tier",
        "type": "allocation",
        "status": "Active",
        "sort": "2",
        "image": "https://cdn.example.com/groups/31.jpg",
        "discount": "10.00",
        "free_shipping": "0",
        "exclusive_access": "Yes",
        "exclusive_methods": {
            "7": "1",
            "9": "0"
        },
        "allocation_start": "2026-02-01 00:00",
        "allocation_end": "2026-03-01 00:00",
        "allocation_title": "Spring Release",
        "allocation_message": "Your allocation is ready",
        "purchase_message": "Thank you for your purchase",
        "checkout_cart_min": "3",
        "checkout_cart_max": "12",
        "checkout_dollar_min": "150.00",
        "associated_club": "14",
        "customer_ids": [
            "42",
            "57",
            "88"
        ]
    }
]
GET /groups/with-customers Get All Groups With Customers

Returns all groups, each with a fully hydrated customers array (customer objects, not just ids). Heavier payload; use when you need member details inline.

Examples
Request
GET/groups/with-customers
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "31",
        "name": "Allocation Tier 1",
        "description": "Top allocation tier",
        "type": "allocation",
        "status": "Active",
        "sort": "2",
        "image": "https://cdn.example.com/groups/31.jpg",
        "discount": "10.00",
        "free_shipping": "0",
        "exclusive_access": "Yes",
        "exclusive_methods": {
            "7": "1",
            "9": "0"
        },
        "allocation_start": "2026-02-01 00:00",
        "allocation_end": "2026-03-01 00:00",
        "allocation_title": "Spring Release",
        "allocation_message": "Your allocation is ready",
        "purchase_message": "Thank you for your purchase",
        "checkout_cart_min": "3",
        "checkout_cart_max": "12",
        "checkout_dollar_min": "150.00",
        "associated_club": "14",
        "customers": [
            {
                "id": "42",
                "first_name": "Jane",
                "last_name": "Doe",
                "email": "example@commercebyfigure.com"
            }
        ]
    }
]
GET /groups/name/{name} Get Group By Name

Looks up a single group by its exact name. Used to resolve a group during imports/assignment when only the name is known.

Parameters
NameTypeRequiredDescriptionExample
name string Required Exact group name
Examples
Request
GET/groups/name/{name}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "31",
    "name": "Allocation Tier 1",
    "description": "Top allocation tier",
    "type": "allocation",
    "status": "Active",
    "sort": "2",
    "image": "https://cdn.example.com/groups/31.jpg",
    "discount": "10.00",
    "free_shipping": "0",
    "exclusive_access": "Yes",
    "exclusive_methods": {
        "7": "1",
        "9": "0"
    },
    "allocation_start": "2026-02-01 00:00",
    "allocation_end": "2026-03-01 00:00",
    "allocation_title": "Spring Release",
    "allocation_message": "Your allocation is ready",
    "purchase_message": "Thank you for your purchase",
    "checkout_cart_min": "3",
    "checkout_cart_max": "12",
    "checkout_dollar_min": "150.00",
    "associated_club": "14"
}
GET /groups/{id}/allocation Get Group Allocation

Returns the group's allocation product list, keyed by SKU. Note quantity is the per-customer Max Purchase (NOT inventory - a common trap) and min_quantity is Min Purchase. Rows come back in sort order; name, inventory, increment, and bottle_size are augmented on read.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
Examples
Request
GET/groups/{id}/allocation
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "CAB19": {
        "sku": "CAB19",
        "min_quantity": "1",
        "quantity": "6",
        "min_wish": "0",
        "max_wish": "12",
        "increment_override": "1",
        "sort": "0",
        "name": "2019 Estate Cabernet",
        "inventory": "340",
        "increment": "1",
        "bottle_size": "750ml"
    }
}
POST /groups/{id}/allocation Add Group Allocation Item

Adds (or updates) an allocation product on the group. quantity sets the per-customer Max Purchase and min_quantity the Min Purchase; min_wish/max_wish bound wishlist quantities.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
sku string Required Product SKU
increment_override number Optional Override the product's purchase increment
min_quantity number Optional Min Purchase per customer
quantity number Optional Max Purchase per customer (NOT inventory)
min_wish number Optional Minimum wishlist quantity
max_wish number Optional Maximum wishlist quantity
Examples
Request
POST/groups/{id}/allocation
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "sku": "CAB19",
    "increment_override": "1",
    "min_quantity": "1",
    "quantity": "6",
    "min_wish": "0",
    "max_wish": "12"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "sku": "CAB19",
    "min_quantity": "1",
    "quantity": "6",
    "min_wish": "0",
    "max_wish": "12",
    "increment_override": "1",
    "sort": "0",
    "name": "2019 Estate Cabernet",
    "inventory": "340",
    "increment": "1",
    "bottle_size": "750ml"
}
DELETE /groups/{id}/allocation/{sku} Remove Group Allocation Item

Removes a single allocation product from the group by SKU.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
sku string Required Product SKU to remove
Examples
Request
DELETE/groups/{id}/allocation/{sku}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /groups/{id}/allocation/{sku}/sort/{position} Reorder Group Allocation Item

Moves an allocation product to a new position in the group's allocation ordering. Positions are zero-based.

Parameters
NameTypeRequiredDescriptionExample
id number Required Group Id
sku string Required Product SKU to move
position number Required New zero-based sort position
Examples
Request
POST/groups/{id}/allocation/{sku}/sort/{position}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}

Orders

Resources related to Orders.

DELETE /orders/{id} Cancel Order

Cancels the order (not a hard delete), running the cancel flow that restores inventory and voids/refunds transactions as applicable. This is the only path that sets the reserved Cancelled ship status; returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
DELETE/orders/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /orders/filter Filter Orders

Returns orders matching a posted list of ElasticSearch-style clauses (term, terms, range, query_string, etc.) plus special server-side keys (skus, skus_all, query, order_tags, customer_tags, customer_groups, customer_source, transaction_date). Rows lacking an id are dropped client-side.

Examples
Request
POST/orders/filter
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    {
        "type": "range",
        "key": "datestamp",
        "from": 1522540800,
        "to": 1524097161
    },
    {
        "type": "term",
        "key": "payment_status",
        "value": "Paid"
    },
    {
        "type": "terms",
        "key": "ship_status",
        "value": [
            "Shipped",
            "Picked Up",
            "Completed"
        ]
    }
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "datestamp": "2018-03-23 16:24:15",
    "last_update": "2018-03-23 16:24:15",
    "status": "",
    "subtotal": "45.00",
    "tax": "3.15",
    "shipping": "20.00",
    "discount": "9.00",
    "credits": "0.00",
    "refund": "0.00",
    "total": "59.15",
    "customer_id": "1",
    "address": "",
    "address_2": "",
    "address_id": "3979",
    "birthday": "1982-11-1",
    "city": "",
    "company": "",
    "credit_id": "19",
    "credit_number": "4242",
    "credit_type": "Visa",
    "customer_credits": "0.00",
    "discount_customer": "0.2",
    "email": "example@commercebyfigure.com",
    "first_name": "John",
    "gift_message": "",
    "instructions": "",
    "item_count": "1",
    "last_name": "Doe",
    "order_id": "42",
    "order_type": "Web",
    "payment_status": "Paid",
    "phone": "707-287-6262",
    "salutation": "Mr.",
    "shipping_address": "770 3rd St E",
    "shipping_address_2": "",
    "shipping_city": "Sonoma",
    "shipping_company": "",
    "shipping_first_name": "John",
    "shipping_id": "3979",
    "shipping_last_name": "Doe",
    "shipping_method": "11",
    "shipping_method_carrier": "FedEx",
    "shipping_method_code": "FDXGND",
    "shipping_method_name": "Ground",
    "shipping_phone": "707-287-6262",
    "shipping_state": "CA",
    "shipping_title": "Shipping Address",
    "shipping_zip": "95476",
    "ship_status": "Shipped",
    "state": "",
    "tax_rate": "8.75",
    "transaction_id": "36",
    "zip": "",
    "products": [
        {
            "id": "42",
            "sku": "H",
            "name": "2017 Pinot Meunier",
            "type": "",
            "bottle_size": "750mL",
            "retail_price": "0.00",
            "discount": "0.00",
            "discount_type": "",
            "price": "45",
            "quantity": "1",
            "status": "",
            "description": "2017 Pinot Meunier ",
            "image": "",
            "stock_status": "",
            "shipped": "0",
            "created": "2018-03-23 16:24:18"
        }
    ]
}
GET /orders/{id} Get Order

Retrieves a single order by id, including its monetary totals, addresses, status fields, and line items.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "datestamp": "2018-03-23 16:24:15",
    "last_update": "2018-03-23 16:24:15",
    "status": "",
    "subtotal": "45.00",
    "tax": "3.15",
    "shipping": "20.00",
    "discount": "9.00",
    "credits": "0.00",
    "refund": "0.00",
    "total": "59.15",
    "customer_id": "1",
    "address": "",
    "address_2": "",
    "address_id": "3979",
    "birthday": "1982-11-1",
    "city": "",
    "company": "",
    "credit_id": "19",
    "credit_number": "4242",
    "credit_type": "Visa",
    "customer_credits": "0.00",
    "discount_customer": "0.2",
    "email": "example@commercebyfigure.com",
    "first_name": "John",
    "gift_message": "",
    "instructions": "",
    "item_count": "1",
    "last_name": "Doe",
    "order_id": "42",
    "order_type": "Web",
    "payment_status": "Paid",
    "phone": "707-287-6262",
    "salutation": "Mr.",
    "shipping_address": "770 3rd St E",
    "shipping_address_2": "",
    "shipping_city": "Sonoma",
    "shipping_company": "",
    "shipping_first_name": "John",
    "shipping_id": "3979",
    "shipping_last_name": "Doe",
    "shipping_method": "11",
    "shipping_method_carrier": "FedEx",
    "shipping_method_code": "FDXGND",
    "shipping_method_name": "Ground",
    "shipping_phone": "707-287-6262",
    "shipping_state": "CA",
    "shipping_title": "Shipping Address",
    "shipping_zip": "95476",
    "ship_status": "Not Shipped",
    "state": "",
    "tax_rate": "8.75",
    "transaction_id": "36",
    "zip": "",
    "products": [
        {
            "id": "42",
            "sku": "H",
            "name": "2017 Pinot Meunier",
            "type": "",
            "bottle_size": "750mL",
            "retail_price": "0.00",
            "discount": "0.00",
            "discount_type": "",
            "price": "45",
            "quantity": "1",
            "status": "",
            "description": "2017 Pinot Meunier ",
            "image": "",
            "stock_status": "",
            "shipped": "0",
            "created": "2018-03-23 16:24:18"
        }
    ]
}
GET /orders/search/{query} Search Orders

Full-text search across orders. For structured criteria (status, date, SKU, tags) use the filter endpoint instead.

Parameters
NameTypeRequiredDescriptionExample
query string Required Order Search Query String
Examples
Request
GET/orders/search/{query}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "datestamp": "2018-03-23 16:24:15",
    "last_update": "2018-03-23 16:24:15",
    "status": "",
    "subtotal": "45.00",
    "tax": "3.15",
    "shipping": "20.00",
    "discount": "9.00",
    "credits": "0.00",
    "refund": "0.00",
    "total": "59.15",
    "customer_id": "1",
    "address": "",
    "address_2": "",
    "address_id": "3979",
    "birthday": "1982-11-1",
    "city": "",
    "company": "",
    "credit_id": "19",
    "credit_number": "4242",
    "credit_type": "Visa",
    "customer_credits": "0.00",
    "discount_customer": "0.2",
    "email": "example@commercebyfigure.com",
    "first_name": "John",
    "gift_message": "",
    "instructions": "",
    "item_count": "1",
    "last_name": "Doe",
    "order_id": "42",
    "order_type": "Web",
    "payment_status": "Paid",
    "phone": "707-287-6262",
    "salutation": "Mr.",
    "shipping_address": "770 3rd St E",
    "shipping_address_2": "",
    "shipping_city": "Sonoma",
    "shipping_company": "",
    "shipping_first_name": "John",
    "shipping_id": "3979",
    "shipping_last_name": "Doe",
    "shipping_method": "11",
    "shipping_method_carrier": "FedEx",
    "shipping_method_code": "FDXGND",
    "shipping_method_name": "Ground",
    "shipping_phone": "707-287-6262",
    "shipping_state": "CA",
    "shipping_title": "Shipping Address",
    "shipping_zip": "95476",
    "ship_status": "Shipped",
    "state": "",
    "tax_rate": "8.75",
    "transaction_id": "36",
    "zip": "",
    "products": [
        {
            "id": "42",
            "sku": "H",
            "name": "2017 Pinot Meunier",
            "type": "",
            "bottle_size": "750mL",
            "retail_price": "0.00",
            "discount": "0.00",
            "discount_type": "",
            "price": "45",
            "quantity": "1",
            "status": "",
            "description": "2017 Pinot Meunier ",
            "image": "",
            "stock_status": "",
            "shipped": "0",
            "created": "2018-03-23 16:24:18"
        }
    ]
}
PUT /pos/orders/{id} Update Order

Updates the supplied fields on an order (status, ship_status, addresses, dates, notes, etc.) and returns true. item_count is always recomputed from line items and never trusted from the payload; the Cancelled ship status is reserved for the cancel flow and rejected here.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
PUT/pos/orders/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "ship_status": "Picked Up",
    "actual_ship_date": "2020-04-04 10:00:00",
    "shipping_first_name": "Tyson",
    "shipping_last_name": "Caly",
    "shipping_address": "523 Brown St.",
    "shipping_address_2": "Ste 2",
    "shipping_city": "Napa",
    "shipping_state": "CA",
    "shipping_zip": "94559"
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /orders/{id}/notes Add Note

Adds a note to the order. type selects Log (activity log) or Admin (notes panel, the default); category defaults to General. Returns the created note.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
POST/orders/{id}/notes
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "message": "John would like to ship FedEx if possible.",
    "user_id": 1,
    "user_name": "Jane Doe",
    "type": "Admin"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": 197,
    "customer_id": "42",
    "message": "John would like to ship FedEx if possible.",
    "user_id": 1,
    "user_name": "Jane Doe",
    "type": "Admin"
}
GET /orders/{id}/notes/{type} Get Notes

Returns the order's notes of the given type (Log for the activity log, Admin for the editable notes panel), newest first.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
type string Required Note Type
Examples
Request
GET/orders/{id}/notes/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "4",
        "customer_id": "42",
        "created": "2018-04-19 09:14:09",
        "type": "Admin",
        "user_id": "1",
        "user_name": "Jane Doe",
        "message": "John is a Great Customer!"
    },
    {
        "id": "1",
        "customer_id": "42",
        "created": "2018-04-19 09:09:51",
        "type": "Admin",
        "user_id": "1",
        "user_name": "Jane Doe",
        "message": "John would like to ship FedEx if possible."
    }
]
PUT /orders/{id}/packages Add Packages

Adds one or more tracking packages (PascalCase keys: TrackingNumber, Carrier, ShipMethod, DateShipped, etc.) to the order. Recording a package co-updates the order, setting ship_status to Shipped and actual_ship_date to DateShipped; returns true.

Parameters
NameTypeRequiredDescriptionExample
Carrier string Required Shipment Carrier
DateShipped string Optional Date Package was Shipped
ShipMethod string Required Shipping Method
ShipToName string Optional Recipient Name
TotalCharges number Optional Shipping Cost
TrackingNumber string Required Tracking Number
Weight number Optional Package Weight
id number Required Order Id
Examples
Request
PUT/orders/{id}/packages
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    {
        "TrackingNumber": "1z078b0v1475364917",
        "Carrier": "UPS",
        "ShipMethod": "UP2",
        "DateShipped": "2022-05-22",
        "ShipToName": "John Smith",
        "TotalCharges": 14.85,
        "Weight": 3.5
    },
    {
        "TrackingNumber": "538134318386",
        "Carrier": "FedEx",
        "ShipMethod": "FXG",
        "DateShipped": "2022-05-24",
        "ShipToName": "John Smith",
        "TotalCharges": 18.4,
        "Weight": 6
    }
]
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /orders/{id}/packages Clear Packages

Removes all tracking packages from the order. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
DELETE/orders/{id}/packages
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /orders/{id}/packages Get Packages

Returns the order's tracking packages, each with its tracking number, carrier, ship method, and ship date. Empty array when none exist.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}/packages
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[]
DELETE /orders/{id}/packages/{tracking_number} Remove Package

Removes a single package from the order, keyed by its tracking number. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
tracking_number string Required Package Tracking Number
Examples
Request
DELETE/orders/{id}/packages/{tracking_number}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /orders/{id}/tags/{tag} Add Tag

Attaches a tag to the order. Tags are stored uppercased; returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
tag string Required Tag
Examples
Request
PUT/orders/{id}/tags/{tag}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /orders/{id}/tags Clear Tags

Removes all tags from the order. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
DELETE/orders/{id}/tags
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /orders/{id}/tags Get Tags

Returns the order's tags as an array of strings.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}/tags
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    "RushDevliery",
    "FedExOnly"
]
DELETE /orders/{id}/tags/{tag} Remove Tag

Removes a single tag from the order. Returns true.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
tag string Required Tag
Examples
Request
DELETE/orders/{id}/tags/{tag}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /orders/by-id Get Orders By Id

Bulk-fetch full order objects for an array of order ids in a single call. Use when hydrating a set of orders returned from a list/filter that only carried ids.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of order ids to fetch
Examples
Request
POST/orders/by-id
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "ids": [
        "S1042",
        "S1043"
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "ship_status": "Shipped",
        "payment_status": "Paid",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "first_name": "Dana",
        "last_name": "Whitfield",
        "email": "dana@example.com",
        "subtotal": "120.00",
        "tax": "9.90",
        "shipping": "18.00",
        "total": "147.90",
        "item_count": "2"
    }
]
GET /orders/{limit}/{page} Get All Orders

Paginated list of all orders, most recent first. Pass the page size and page number as path segments.

Parameters
NameTypeRequiredDescriptionExample
limit number Required Page size (rows per page)
page number Required Page number (1-based)
Examples
Request
GET/orders/{limit}/{page}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "ship_status": "Shipped",
        "payment_status": "Paid",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "first_name": "Dana",
        "last_name": "Whitfield",
        "email": "dana@example.com",
        "total": "147.90",
        "item_count": "2"
    }
]
GET /orders/customer/{customer_id} Get Orders By Customer

Return every order belonging to a single customer, most recent first.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/orders/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "ship_status": "Shipped",
        "payment_status": "Paid",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "total": "147.90",
        "item_count": "2"
    }
]
GET /orders/date/{start}/{end} Get Orders By Date

List orders created within an inclusive date range (Y-m-d). An optional page size and page number may be appended (/orders/date/{start}/{end}/{limit}/{page}) for pagination.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start date (Y-m-d)
end string Required Range end date (Y-m-d)
limit number Optional Optional page size
page number Optional Optional page number (1-based)
Examples
Request
GET/orders/date/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "ship_status": "Shipped",
        "payment_status": "Paid",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "total": "147.90",
        "item_count": "2"
    }
]
GET /orders/sku/{sku} Get Orders By Sku

Return orders that contain at least one line item for the given product SKU. Matches against the accumulated order-product rows.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
Examples
Request
GET/orders/sku/{sku}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "total": "147.90",
        "item_count": "2"
    }
]
GET /orders/{id}/next Get Next Order

Return the next order after the given order id in chronological sequence. Used for prev/next navigation on the order detail screen.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}/next
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1043",
    "code": "S1043",
    "status": "Processing",
    "ship_status": "Not Shipped",
    "payment_status": "Paid",
    "order_type": "Web",
    "created": "2026-02-16 16:02:00",
    "customer_id": "8845",
    "total": "89.10"
}
GET /orders/{id}/prev Get Previous Order

Return the previous order before the given order id in chronological sequence. Used for prev/next navigation on the order detail screen.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}/prev
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1041",
    "code": "S1041",
    "status": "Complete",
    "ship_status": "Shipped",
    "payment_status": "Paid",
    "order_type": "Club",
    "created": "2026-02-16 14:51:00",
    "customer_id": "8830",
    "total": "210.45"
}
GET /orders/stats Get Order Stats

Return a computed rollup of order counts and sales used by the dashboard. The exact key set is a server-side aggregate, not a stored resource.

Examples
Request
GET/orders/stats
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_count": "1284",
    "total_sales": "184320.55",
    "average_order": "143.55",
    "orders_today": "14",
    "pending": "37",
    "processing": "58",
    "shipped": "1189"
}
GET /orders/totals/{start}/{end} Get Order Totals

Return summed monetary totals across all orders in an inclusive date range (Y-m-d). A computed aggregate rather than a resource list.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start date (Y-m-d)
end string Required Range end date (Y-m-d)
Examples
Request
GET/orders/totals/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "start": "2026-02-01",
    "end": "2026-02-28",
    "order_count": "312",
    "subtotal": "41230.00",
    "discount": "1200.00",
    "tax": "3210.55",
    "shipping": "4820.00",
    "tip": "0.00",
    "total": "48060.55"
}
GET /orders/{id}/transactions Get Order Transactions

Return the payment transaction rows (Debit/Refund/Chargeback) recorded against an order. subtotal, co_retail_delivery_fee and shipping_insurance are not on the raw row (added client-side); refunds store negated monetary values with parent_id pointing at the parent Debit.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
GET/orders/{id}/transactions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "55201",
        "uri": "",
        "type": "Debit",
        "gateway": "Stripe",
        "status": "captured",
        "credit_type": "Visa",
        "account_number": "4242",
        "total": "147.90",
        "fees": "4.59",
        "tax": "9.90",
        "shipping": "18.00",
        "tip": "0.00",
        "ca_redemption_value": "0.00",
        "me_bottle_deposit": "0.00",
        "credits": "0.00",
        "discount": "0.00",
        "parent_amount": "0.00",
        "order_id": "S1042",
        "customer_id": "8842",
        "shipment_id": "",
        "parent_id": "",
        "created": "2026-02-16 15:17:02",
        "note": ""
    }
]
POST /orders/{external_id} Create Order With Id

Create an order that carries a caller-supplied external/legacy id (used by importers and integrations). The order object is posted in the body; the external id is the path segment.

Parameters
NameTypeRequiredDescriptionExample
external_id string Required External / legacy order id to assign
customer_id number Required Customer Id
order_type string Required Order type: POS, Admin, Offering, Web, Club, Gift, Invoice
status string Optional Order status
shipping_first_name string Optional Shipping recipient first name
shipping_last_name string Optional Shipping recipient last name
shipping_address string Optional Shipping street address
shipping_city string Optional Shipping city
shipping_state string Optional Shipping state (auto-derived from shipping_zip)
shipping_zip string Optional Shipping ZIP
shipping_country string Optional Shipping country
shipping_method string Optional Shipping method name
subtotal number Optional Order subtotal (decimal string)
tax number Optional Tax (includes CO retail delivery fee)
shipping number Optional Shipping (includes insurance)
total number Optional Order total
products array Optional Line items to seed, each {sku, quantity, price, discount}
Examples
Request
POST/orders/{external_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "customer_id": "8842",
    "order_type": "Web",
    "status": "Complete",
    "shipping_first_name": "Dana",
    "shipping_last_name": "Whitfield",
    "shipping_address": "14 Vine St",
    "shipping_city": "Napa",
    "shipping_state": "CA",
    "shipping_zip": "94558",
    "shipping_country": "US",
    "shipping_method": "Ground",
    "subtotal": "120.00",
    "tax": "9.90",
    "shipping": "18.00",
    "total": "147.90",
    "products": [
        {
            "sku": "CAB2021",
            "quantity": 2,
            "price": "60.00",
            "discount": "0.00"
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1044",
    "legacy_order_id": "LEG-88231",
    "code": "S1044",
    "status": "Complete",
    "order_type": "Web",
    "customer_id": "8842",
    "total": "147.90",
    "item_count": "2",
    "created": "2026-02-16 15:20:00"
}
DELETE /orders/{id}/permanent Delete Order

Permanently delete an order record (hard delete). Distinct from Cancel Order, which is the reversible cancel flow; use with care.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
DELETE/orders/{id}/permanent
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
PUT /orders/{id}/ship-status/{status} Update Ship Status

Set the order's ship status. Cancelled is reserved for the cancel flow and is blocked here (OFF-536). Setting a shipped status does not itself create tracking (see Add Packages).

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
status string Required New ship status (e.g. Not Shipped, Processing, Hold, Shipped)
Examples
Request
PUT/orders/{id}/ship-status/{status}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "ship_status": "Processing"
}
PUT /orders/{id}/payment-status/{status} Update Payment Status

Set the order's payment status. Only selectable payment statuses may be assigned by an admin. Convenience action equivalent to updating the payment_status attribute.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
status string Required New payment status
Examples
Request
PUT/orders/{id}/payment-status/{status}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "payment_status": "Paid"
}
PUT /orders/{id}/order-type/{type} Update Order Type

Set the order type. Convenience action equivalent to updating the order_type attribute (POS, Admin, Offering, Web, Club, Gift, Invoice).

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
type string Required New order type
Examples
Request
PUT/orders/{id}/order-type/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "order_type": "Admin"
}
PUT /orders/{id}/inventory-location/{location} Update Inventory Location

Reassign the fulfillment/inventory location for an order. Changing the inventory location re-scopes which warehouse stock the order draws from.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
location string Required Inventory location name
Examples
Request
PUT/orders/{id}/inventory-location/{location}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "inventory_location": "Napa Warehouse"
}
POST /orders/{id}/products Insert Products

Append line-item rows to an order. Line items are stored as immutable add/remove rows: a negative quantity records a removal, and current quantity per SKU is the signed sum. Adjusts inventory. item_count is always recomputed.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
products array Required Line-item rows, each {sku, quantity (signed), price, discount}
Examples
Request
POST/orders/{id}/products
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "products": [
        {
            "sku": "CHARD2022",
            "quantity": 1,
            "price": "42.00",
            "discount": "0.00"
        },
        {
            "sku": "CAB2021",
            "quantity": -1,
            "price": "60.00",
            "discount": "0.00"
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "item_count": "2",
    "products": {
        "CAB2021": {
            "sku": "CAB2021",
            "name": "2021 Estate Cabernet",
            "quantity": "1",
            "price": "60.00",
            "bottle_size": "750ml"
        },
        "CHARD2022": {
            "sku": "CHARD2022",
            "name": "2022 Estate Chardonnay",
            "quantity": "1",
            "price": "42.00",
            "bottle_size": "750ml"
        }
    }
}
POST /orders/{id}/products/no-inventory Insert Products (No Inventory)

Same as Insert Products but does not touch inventory counts. Used for corrections/imports where stock should not be decremented or restored.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
products array Required Line-item rows, each {sku, quantity (signed), price, discount}
Examples
Request
POST/orders/{id}/products/no-inventory
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "products": [
        {
            "sku": "CHARD2022",
            "quantity": 1,
            "price": "42.00",
            "discount": "0.00"
        }
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "item_count": "3",
    "products": {
        "CAB2021": {
            "sku": "CAB2021",
            "name": "2021 Estate Cabernet",
            "quantity": "2",
            "price": "60.00"
        },
        "CHARD2022": {
            "sku": "CHARD2022",
            "name": "2022 Estate Chardonnay",
            "quantity": "1",
            "price": "42.00"
        }
    }
}
POST /orders/{id}/tax-info Get Tax Info

Resolve tax jurisdiction/rate for a shipping address and merge the resulting tax_* attributes back onto the order. Body fields are remapped from the order's shipping_* fields. The exact returned subset can vary by tax provider.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
address string Required Street address
address_2 string Optional Address line 2
city string Required City
state string Required State
zip string Required ZIP
country string Required Country
Examples
Request
POST/orders/{id}/tax-info
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "address": "14 Vine St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94558",
    "country": "US"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "tax_city": "Napa",
    "tax_county": "Napa",
    "tax_jurisdiction": "CA",
    "tax_method": "destination",
    "tax_state": "CA",
    "tax_tac": "",
    "tax_zip": "94558",
    "tax_rate": "0.0775",
    "sc_tax_type": "onsite"
}
POST /orders/packages/by-id Get Packages By Id

Bulk-fetch package/tracking rows for an array of order ids. Package keys are PascalCase.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of order ids
Examples
Request
POST/orders/packages/by-id
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "ids": [
        "S1042",
        "S1043"
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "9021",
        "TrackingNumber": "1Z999AA10123456784",
        "Carrier": "UPS",
        "ShipMethod": "Ground",
        "ShipToName": "Dana Whitfield",
        "DateShipped": "2026-02-17",
        "TotalCharges": "18.00",
        "Weight": "6.5",
        "order_id": "S1042"
    }
]
GET /orders/packages/shipped/{start}/{end} Get Packages By Date Shipped

List package/tracking rows whose DateShipped falls within an inclusive date range (Y-m-d). Used for shipping/manifest reports.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start date (Y-m-d)
end string Required Range end date (Y-m-d)
Examples
Request
GET/orders/packages/shipped/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "9021",
        "TrackingNumber": "1Z999AA10123456784",
        "Carrier": "UPS",
        "ShipMethod": "Ground",
        "ShipToName": "Dana Whitfield",
        "DateShipped": "2026-02-17",
        "TotalCharges": "18.00",
        "Weight": "6.5",
        "order_id": "S1042"
    }
]
GET /orders/saved/{type} Get Saved Order Sessions

List saved/pending order cart sessions of a given type (Saved, Wish, or corporate). These are in-progress carts persisted for later checkout, keyed by cart session id.

Parameters
NameTypeRequiredDescriptionExample
type string Required Saved-order type: Saved, Wish, or corporate
Examples
Request
GET/orders/saved/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "session": "Admin-8842",
        "customer_id": "8842",
        "order_type": "Saved",
        "total": "120.00",
        "item_count": "2",
        "created": "2026-02-15 11:03:00"
    }
]
DELETE /orders/saved/{session} Delete Saved Order

Discard a saved/pending order cart session by its session id, releasing any reserved cart state.

Parameters
NameTypeRequiredDescriptionExample
session string Required Saved-order cart session id
Examples
Request
DELETE/orders/saved/{session}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
GET /orders/notes/{note_id} Get Note

Fetch a single order note by its note id.

Parameters
NameTypeRequiredDescriptionExample
note_id number Required Note Id
Examples
Request
GET/orders/notes/{note_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3310",
    "message": "Customer called to confirm delivery date.",
    "user_id": "17",
    "user_name": "Jamie Rand",
    "type": "Admin",
    "category": "Engagement",
    "created": "2026-02-16 15:40:00"
}
PUT /orders/notes/{note_id} Update Note

Update an order note's message and/or category. Notes are typed Log (activity log) or Admin (editable notes panel); category defaults to General (Alert renders a red badge).

Parameters
NameTypeRequiredDescriptionExample
note_id number Required Note Id
message string Optional Note body (HTML/newlines allowed)
category string Optional Category: General, Engagement, Feedback, Alert, or config-custom
Examples
Request
PUT/orders/notes/{note_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "message": "Customer confirmed delivery for 2/17.",
    "category": "Engagement"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3310",
    "message": "Customer confirmed delivery for 2/17.",
    "user_id": "17",
    "user_name": "Jamie Rand",
    "type": "Admin",
    "category": "Engagement",
    "created": "2026-02-16 15:40:00"
}
DELETE /orders/notes/{note_id} Delete Note

Delete an order note by its note id.

Parameters
NameTypeRequiredDescriptionExample
note_id number Required Note Id
Examples
Request
DELETE/orders/notes/{note_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /orders/tags/by-id Get Tags By Id

Bulk-fetch the tag list for an array of order ids. Tags are uppercased and use the internal __XX__ URL/DB-safe encoding on the wire.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of order ids
Examples
Request
POST/orders/tags/by-id
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "ids": [
        "S1042",
        "S1043"
    ]
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "S1042": [
        "VIP",
        "RESHIP"
    ],
    "S1043": [
        "GIFT"
    ]
}
GET /orders/tags Get All Tags

Return every distinct order tag defined across all orders.

Examples
Request
GET/orders/tags
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    "VIP",
    "RESHIP",
    "GIFT",
    "FRAUDULENT"
]
GET /orders/tags/details Get Tag Details

Return each order tag with the count of orders carrying it, for tag-management and filter UIs.

Examples
Request
GET/orders/tags/details
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "tag": "VIP",
        "count": "142"
    },
    {
        "tag": "RESHIP",
        "count": "38"
    },
    {
        "tag": "GIFT",
        "count": "512"
    }
]
GET /orders/tags/search/{tag} Search Orders By Tag

Return orders carrying the given tag. The tag path segment uses the internal encoding (spaces preserved, value uppercased).

Parameters
NameTypeRequiredDescriptionExample
tag string Required Encoded tag value
Examples
Request
GET/orders/tags/search/{tag}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "order_id": "S1042",
        "code": "S1042",
        "status": "Complete",
        "order_type": "Web",
        "created": "2026-02-16 15:17:00",
        "customer_id": "8842",
        "total": "147.90",
        "orderTags": "VIP,RESHIP"
    }
]
POST /orders/{id}/emails/receipt Send Receipt Email

Send (or resend) the order receipt/confirmation email to the customer.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
POST/orders/{id}/emails/receipt
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /orders/{id}/emails/tracking Send Tracking Email

Send the shipping/tracking notification email for an order (typically after a package with a tracking number is added).

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
POST/orders/{id}/emails/tracking
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /orders/{id}/emails/wish-grant-receipt Send Wish Grant Receipt

Send the wish-grant receipt email for a granted-wishlist order, covering the incremental charge/refund from the wish grant flow.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
Examples
Request
POST/orders/{id}/emails/wish-grant-receipt
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "success": true
}
POST /orders/{id} Update Order (Standard)

Update a standard order's attributes (status, ship_status, payment_status, compliance, addresses, monetary fields, etc.). This is the canonical order update; the POS-context variant is documented separately as "Update Order" (PUT /pos/orders/{id}). Update writable order attributes. Setting ship_status to Cancelled is rejected here (reserved for the cancel flow, OFF-536); compliance may be re-checked on update when configured.

Parameters
NameTypeRequiredDescriptionExample
id number Required Order Id
status string Optional Order status
ship_status string Optional Ship status (Cancelled not settable here)
order_type string Optional Order type
order_source string Optional Order source
actual_ship_date string Optional Actual ship date (Y-m-d)
cancelled_date string Optional Cancelled date
cancellation_reason string Optional Cancellation reason
compliance_status string Optional Compliance status (_null/Compliant/Not Compliant/Override/Bypass Compliance)
compliance_error string Optional Compliance error text
sc_tax_type string Optional ShipCompliant tax type (onsite/offsite)
ship_compliant_split_ids string Optional CSV of split order ids
editable_notes string Optional Editable notes panel content
fraudulent string Optional Fraudulent tag
wishlist_session_id string Optional Associated wishlist session id
Examples
Request
POST/orders/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "status": "Complete",
    "ship_status": "Shipped",
    "actual_ship_date": "2026-02-17",
    "compliance_status": "Compliant",
    "editable_notes": "Left with neighbor per customer request."
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "order_id": "S1042",
    "status": "Complete",
    "ship_status": "Shipped",
    "actual_ship_date": "2026-02-17",
    "compliance_status": "Compliant",
    "editable_notes": "Left with neighbor per customer request.",
    "total": "147.90",
    "item_count": "2",
    "last_saved": "2026-02-17 09:14:00"
}

Payment

Resources related to Payment.

POST /payment Create Payment Method

Creates a stored, tokenized payment method for a customer from a Stripe card_token; raw card numbers are never stored, so credit_number holds only the last four digits. Returns the created payment method record.

Parameters
NameTypeRequiredDescriptionExample
address string Required Street Address
address_2 string Optional Unit Number
card_token string Required Stripe Credit Card Token
card_type string Required Credit Card Brand ie: Visa, American Express, etc
city string Required City
credit_expires_month string Required Expires Month ie: 06
credit_expires_year string Required Expires Year ie: 2016
credit_number string Required Last 4 Digits of Credit Card Number
customer_id number Required Customer Id
first_name string Required Customer First Name
last_name string Required Customer Last Name
phone string Optional Customer Phone Number
state string Required State
zip string Required Zip Code
Examples
Request
POST/payment
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "first_name": "Jane",
    "last_name": "Doe",
    "card_token": "XXXXXXXXX",
    "credit_type": "Visa",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "birthday": "1985-06-01",
    "company": "Figure Commerce",
    "phone": "7075558520",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "22",
    "fingerprint": "",
    "credit_type": "Visa",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "profile_id": "0",
    "payment_profile_id": "0",
    "first_name": "Jane",
    "birthday": "",
    "phone": "",
    "company": "",
    "last_name": "Doe",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42",
    "default": "1",
    "created": "2018-03-05 22:03:01",
    "last_update": "0000-00-00 00:00:00"
}
DELETE /payment/{id} Delete Payment Method

Deletes the stored payment method with the given id. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
id number Required Payment Method Id
Examples
Request
DELETE/payment/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /payment Get All Payment Menthods

Returns all stored payment methods, keyed by id.

Examples
Request
GET/payment
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "22": {
        "id": "22",
        "fingerprint": "",
        "credit_type": "Visa",
        "credit_number": "1111",
        "credit_expires_month": "6",
        "credit_expires_year": "2026",
        "profile_id": "0",
        "payment_profile_id": "0",
        "first_name": "Jane",
        "birthday": "",
        "phone": "",
        "company": "",
        "last_name": "Doe",
        "address": "523 Brown St",
        "address_2": "",
        "city": "Napa",
        "state": "CA",
        "zip": "94559",
        "country": "US",
        "customer_id": "42",
        "default": "1",
        "created": "2018-03-05 22:03:01",
        "last_update": "0000-00-00 00:00:00"
    }
}
GET /payment/customer/{customer_id}/default Get Default Customer Payment Method

Returns the customer's default stored payment method.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/payment/customer/{customer_id}/default
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "22",
    "fingerprint": "",
    "credit_type": "Visa",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "profile_id": "0",
    "payment_profile_id": "0",
    "first_name": "Jane",
    "birthday": "",
    "phone": "",
    "company": "",
    "last_name": "Doe",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42",
    "default": "1",
    "created": "2018-03-05 22:03:01",
    "last_update": "0000-00-00 00:00:00"
}
GET /payment/{id} Get Payment Method

Returns a single stored payment method by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Payment Method Id
Examples
Request
GET/payment/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "22",
    "fingerprint": "",
    "credit_type": "Visa",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "profile_id": "0",
    "payment_profile_id": "0",
    "first_name": "Jane",
    "birthday": "",
    "phone": "",
    "company": "",
    "last_name": "Doe",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42",
    "default": "1",
    "created": "2018-03-05 22:03:01",
    "last_update": "0000-00-00 00:00:00"
}
GET /payment/customer/{customer_id} Get Payment Methods By Customer

Returns all stored payment methods for the given customer, keyed by id.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/payment/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "22": {
        "id": "22",
        "fingerprint": "",
        "credit_type": "Visa",
        "credit_number": "1111",
        "credit_expires_month": "6",
        "credit_expires_year": "2026",
        "profile_id": "0",
        "payment_profile_id": "0",
        "first_name": "Jane",
        "birthday": "",
        "phone": "",
        "company": "",
        "last_name": "Doe",
        "address": "523 Brown St",
        "address_2": "",
        "city": "Napa",
        "state": "CA",
        "zip": "94559",
        "country": "US",
        "customer_id": "42",
        "default": "1",
        "created": "2018-03-05 22:03:01",
        "last_update": "0000-00-00 00:00:00"
    }
}
PUT /payment/customer/{customer_id}/default/{id} Set Default Customer Payment Method

Marks the given payment method as the customer's default. Returns true on success.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
id number Required Payment Method Id
Examples
Request
PUT/payment/customer/{customer_id}/default/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
PUT /payment/{id} Update Payment Method

Updates the billing details on a stored payment method (only the keys sent are changed) and returns the updated record.

Parameters
NameTypeRequiredDescriptionExample
address string Optional Street Address
address_2 string Optional Unit Number
city string Optional City
company string Optional Company Name
first_name string Optional First Name
last_name string Optional Last Name
phone string Optional Phone Number
state string Optional State
title string Optional Address Title
zip string Optional Zip Code
id number Required Payment Method Id
Examples
Request
PUT/payment/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "address": "523 Brown St",
    "city": "Napa",
    "state": "CA"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "22",
    "fingerprint": "",
    "credit_type": "Visa",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "profile_id": "0",
    "payment_profile_id": "0",
    "first_name": "Jane",
    "birthday": "",
    "phone": "",
    "company": "",
    "last_name": "Doe",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42",
    "default": "1",
    "created": "2018-03-05 22:03:01",
    "last_update": "0000-00-00 00:00:00"
}
GET /payment/created/{start}/{end} Get Payment Methods By Created Date

Returns stored payment methods created within the given date range. Useful for reconciling newly added cards. Credit card numbers are returned as the last 4 digits only.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start date (Y-m-d)
end string Required Range end date (Y-m-d)
Examples
Request
GET/payment/created/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "22",
        "fingerprint": "",
        "credit_type": "Visa",
        "credit_number": "1111",
        "credit_expires_month": "6",
        "credit_expires_year": "2026",
        "payment_token": "pm_1QabcXYZ",
        "account_token": "cus_ABC123",
        "first_name": "Jane",
        "last_name": "Doe",
        "company": "",
        "phone": "",
        "birthday": "",
        "address": "523 Brown St",
        "address_2": "",
        "city": "Napa",
        "state": "CA",
        "zip": "94559",
        "country": "US",
        "customer_id": "42",
        "default": "1",
        "created": "2018-03-05 22:03:01",
        "last_update": "0000-00-00 00:00:00"
    }
]
POST /payment/{id}/verify Verify Payment Method

Admin update used to finalize a stored payment method by writing its Stripe tokens. This is the ACH micro-deposit verification path: once a bank account SetupIntent is confirmed, the payment_token and account_token are written to the payment method (the account_token replaces the literal 'pending' placeholder set while ACH verification was outstanding).

Parameters
NameTypeRequiredDescriptionExample
id number Required Payment Method Id
payment_token string Required Stripe payment method token (pm_...)
account_token string Required Stripe customer/account token (cus_...)
Examples
Request
POST/payment/{id}/verify
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "payment_token": "pm_1QbankAcct",
    "account_token": "cus_ABC123"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "22",
    "fingerprint": "",
    "credit_type": "ACH",
    "credit_number": "1111",
    "credit_expires_month": "6",
    "credit_expires_year": "2026",
    "payment_token": "pm_1QbankAcct",
    "account_token": "cus_ABC123",
    "first_name": "Jane",
    "last_name": "Doe",
    "company": "",
    "phone": "",
    "birthday": "",
    "address": "523 Brown St",
    "address_2": "",
    "city": "Napa",
    "state": "CA",
    "zip": "94559",
    "country": "US",
    "customer_id": "42",
    "default": "1",
    "created": "2018-03-05 22:03:01",
    "last_update": "0000-00-00 00:00:00"
}
GET /payment/customer/{customer_id}/account-token Get Customer Account Token

Returns the Stripe customer account token associated with a customer, used to attach and charge stored payment methods.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/payment/customer/{customer_id}/account-token
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"cus_ABC123"
POST /payment/customer/{customer_id}/account-token Set Customer Account Token

Sets the Stripe customer account token for a customer. Send the token in the request body.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
account_token string Required Stripe customer/account token (cus_...)
Examples
Request
POST/payment/customer/{customer_id}/account-token
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "account_token": "cus_ABC123"
}
Response
Headers · 200
Content-Type: application/json
Body
"true"

Products

GET /products/{id} Get Product

Retrieve a single product by its id, including all catalog, pricing, wine, and media fields.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
Examples
Request
GET/products/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "sku": "2021-CAB-750",
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "status": "Active",
    "website_visibility": "On",
    "price": "75.00",
    "retail_price": "85.00",
    "cost": "32.00",
    "quantity": "240",
    "starting_quantity": "300",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "tax_type": "Wine",
    "wine_type": "Red",
    "varietal": "Cabernet Sauvignon",
    "vintage": "2021",
    "bottle_size": "750mL",
    "bottle_count": "1",
    "appellation": "Napa Valley",
    "alcohol": "14.5",
    "featured_product": "Yes",
    "new_product": "No",
    "discount_eligible": "Yes",
    "free_shipping": "",
    "seo_slug": "2021-estate-cabernet-sauvignon",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    },
    "weight": "3.5",
    "image": "https://cdn.securecheckout.com/products/842/image.jpg",
    "created": "2026-01-14 09:22:00",
    "last_update": "2026-02-16 15:17:00"
}
GET /products Get All Products

Return the full list of active/inactive (non-archived) products. Not paginated.

Examples
Request
GET/products
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
GET /products/archived Get All Archived Products

Return all products whose status is Archived.

Examples
Request
GET/products/archived
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Archived",
        "website_visibility": "Off",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
POST /products/bulk Get Products by Id

Hydrate many products at once by POSTing a bare array of numeric ids. Returns a map keyed by id.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of product ids to fetch.
Examples
Request
POST/products/bulk
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    "842",
    "843"
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "842": {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
}
GET /products/sku/{sku} Get Product by SKU

Retrieve a single product by its unique SKU.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
Examples
Request
GET/products/sku/{sku}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "sku": "2021-CAB-750",
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "status": "Active",
    "website_visibility": "On",
    "price": "75.00",
    "retail_price": "85.00",
    "cost": "32.00",
    "quantity": "240",
    "starting_quantity": "300",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "tax_type": "Wine",
    "wine_type": "Red",
    "varietal": "Cabernet Sauvignon",
    "vintage": "2021",
    "bottle_size": "750mL",
    "bottle_count": "1",
    "appellation": "Napa Valley",
    "alcohol": "14.5",
    "featured_product": "Yes",
    "new_product": "No",
    "discount_eligible": "Yes",
    "free_shipping": "",
    "seo_slug": "2021-estate-cabernet-sauvignon",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    },
    "weight": "3.5",
    "image": "https://cdn.securecheckout.com/products/842/image.jpg",
    "created": "2026-01-14 09:22:00",
    "last_update": "2026-02-16 15:17:00"
}
GET /products/status/{status} Get Products by Status

Return all products with the given status (Active, Inactive, or Archived).

Parameters
NameTypeRequiredDescriptionExample
status string Required Product status filter
Examples
Request
GET/products/status/{status}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
GET /products/category/{category_id} Get Products by Category

Return all products that are members of the given category, in category sort order.

Parameters
NameTypeRequiredDescriptionExample
category_id number Required Category Id
Examples
Request
GET/products/category/{category_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
GET /products/search/{query} Search Products

Full-text search across products by name, SKU, and copy.

Parameters
NameTypeRequiredDescriptionExample
query string Required Search query
Examples
Request
GET/products/search/{query}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
POST /products/filter Filter Products

ElasticSearch-backed filter. POST an array of clause objects (term, not_terms, range, query_string). Rows joined through other tables may come back with empty ids and should be ignored.

Parameters
NameTypeRequiredDescriptionExample
type string Required Clause type: term, not_terms, range, or query_string.
key string Required Field the clause applies to.
value string Optional Value for term/not_terms clauses.
from string Optional Lower bound for range clauses.
to string Optional Upper bound for range clauses.
query string Optional Query string for query_string clauses.
Examples
Request
POST/products/filter
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    {
        "type": "term",
        "key": "status",
        "value": "Active"
    },
    {
        "type": "term",
        "key": "wine_type",
        "value": "Red"
    },
    {
        "type": "range",
        "key": "price",
        "from": "20",
        "to": "100"
    },
    {
        "type": "query_string",
        "key": "name",
        "query": "cabernet"
    }
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "842": {
        "id": "842",
        "sku": "2021-CAB-750",
        "name": "2021 Estate Cabernet Sauvignon",
        "subtitle": "Napa Valley",
        "status": "Active",
        "website_visibility": "On",
        "price": "75.00",
        "retail_price": "85.00",
        "cost": "32.00",
        "quantity": "240",
        "starting_quantity": "300",
        "product_type": "Wine",
        "sc_product_type": "Wine",
        "tax_type": "Wine",
        "wine_type": "Red",
        "varietal": "Cabernet Sauvignon",
        "vintage": "2021",
        "bottle_size": "750mL",
        "bottle_count": "1",
        "appellation": "Napa Valley",
        "alcohol": "14.5",
        "featured_product": "Yes",
        "new_product": "No",
        "discount_eligible": "Yes",
        "free_shipping": "",
        "seo_slug": "2021-estate-cabernet-sauvignon",
        "volume_discount": {
            "12": "70.00",
            "6": "72.00"
        },
        "weight": "3.5",
        "image": "https://cdn.securecheckout.com/products/842/image.jpg",
        "created": "2026-01-14 09:22:00",
        "last_update": "2026-02-16 15:17:00"
    }
}
POST /products Create Product

Create a product. Server generates starting_quantity (= quantity), and derives status/seo_slug when omitted. Gift-card SKUs additionally force tax/credits/shipping/is_gift_card flags.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Unique SKU. Non-[A-Za-z0-9-] characters are replaced with '-' on write.
name string Required Product name (required).
subtitle string Optional Subtitle / appellation line.
quantity number Required On-hand quantity (required).
price string Required Sale price as a decimal string (required).
retail_price string Optional Compare-at / retail price.
cost string Optional Unit cost.
status string Optional Active (Visible), Inactive (Hidden), or Archived. Defaults to Inactive on create.
website_visibility string Optional On or Off.
product_type string Optional Wine, General Merchandise, Food, Event, Tasting, Gift Card, Collateral, Packaging, Other.
sc_product_type string Optional ShipCompliant type: Wine, Sparkling Wine, Fortified Wine, Food, Freight, General Merchandise, General Non Taxable.
tax_type string Optional Wine, Merchandise, or Food.
wine_type string Optional Red, White, Rose, Sparkling, Dessert, Port/Fortified, Fruit/Berry, Mead, Other.
varietal string Optional One of the 84 supported varietals (e.g. Cabernet Sauvignon).
vintage string Optional Vintage year.
bottle_size string Optional e.g. 750mL, 1.5L (runtime list may override the static fallback).
appellation string Optional Appellation / region.
alcohol string Optional Alcohol by volume.
featured_product string Optional Yes or No.
new_product string Optional Yes or No.
discount_eligible string Optional Yes or No.
volume_discount object Optional Quantity-break map { "<qty>": "<price>" }, reverse-sorted by qty on write.
weight string Optional Shipping weight in lbs.
product_category string Optional Category id to attach the product to on create.
Examples
Request
POST/products
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "sku": "2021-CAB-750",
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "quantity": "300",
    "price": "75.00",
    "status": "Inactive",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "product_category": "12"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "sku": "2021-CAB-750",
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "status": "Inactive",
    "website_visibility": "On",
    "price": "75.00",
    "retail_price": "85.00",
    "cost": "32.00",
    "quantity": "240",
    "starting_quantity": "300",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "tax_type": "Wine",
    "wine_type": "Red",
    "varietal": "Cabernet Sauvignon",
    "vintage": "2021",
    "bottle_size": "750mL",
    "bottle_count": "1",
    "appellation": "Napa Valley",
    "alcohol": "14.5",
    "featured_product": "Yes",
    "new_product": "No",
    "discount_eligible": "Yes",
    "free_shipping": "",
    "seo_slug": "2021-estate-cabernet-sauvignon",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    },
    "weight": "3.5",
    "image": "https://cdn.securecheckout.com/products/842/image.jpg",
    "created": "2026-01-14 09:22:00",
    "last_update": "2026-02-16 15:17:00"
}
POST /products/{id} Update Product

Update a product with the full edit form. Any writable attribute may be sent; volume_discount is a JSON quantity-break map.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
sku string Required Unique SKU. Non-[A-Za-z0-9-] characters are replaced with '-' on write.
name string Required Product name (required).
subtitle string Optional Subtitle / appellation line.
quantity number Required On-hand quantity (required).
price string Required Sale price as a decimal string (required).
retail_price string Optional Compare-at / retail price.
cost string Optional Unit cost.
status string Optional Active (Visible), Inactive (Hidden), or Archived. Defaults to Inactive on create.
website_visibility string Optional On or Off.
product_type string Optional Wine, General Merchandise, Food, Event, Tasting, Gift Card, Collateral, Packaging, Other.
sc_product_type string Optional ShipCompliant type: Wine, Sparkling Wine, Fortified Wine, Food, Freight, General Merchandise, General Non Taxable.
tax_type string Optional Wine, Merchandise, or Food.
wine_type string Optional Red, White, Rose, Sparkling, Dessert, Port/Fortified, Fruit/Berry, Mead, Other.
varietal string Optional One of the 84 supported varietals (e.g. Cabernet Sauvignon).
vintage string Optional Vintage year.
bottle_size string Optional e.g. 750mL, 1.5L (runtime list may override the static fallback).
appellation string Optional Appellation / region.
alcohol string Optional Alcohol by volume.
featured_product string Optional Yes or No.
new_product string Optional Yes or No.
discount_eligible string Optional Yes or No.
volume_discount object Optional Quantity-break map { "<qty>": "<price>" }, reverse-sorted by qty on write.
weight string Optional Shipping weight in lbs.
product_category string Optional Category id to attach the product to on create.
Examples
Request
POST/products/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "price": "75.00",
    "retail_price": "85.00",
    "cost": "32.00",
    "quantity": "240",
    "status": "Active",
    "website_visibility": "On",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "tax_type": "Wine",
    "wine_type": "Red",
    "varietal": "Cabernet Sauvignon",
    "vintage": "2021",
    "bottle_size": "750mL",
    "appellation": "Napa Valley",
    "alcohol": "14.5",
    "featured_product": "Yes",
    "discount_eligible": "Yes",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    },
    "weight": "3.5"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "sku": "2021-CAB-750",
    "name": "2021 Estate Cabernet Sauvignon",
    "subtitle": "Napa Valley",
    "status": "Active",
    "website_visibility": "On",
    "price": "75.00",
    "retail_price": "85.00",
    "cost": "32.00",
    "quantity": "240",
    "starting_quantity": "300",
    "product_type": "Wine",
    "sc_product_type": "Wine",
    "tax_type": "Wine",
    "wine_type": "Red",
    "varietal": "Cabernet Sauvignon",
    "vintage": "2021",
    "bottle_size": "750mL",
    "bottle_count": "1",
    "appellation": "Napa Valley",
    "alcohol": "14.5",
    "featured_product": "Yes",
    "new_product": "No",
    "discount_eligible": "Yes",
    "free_shipping": "",
    "seo_slug": "2021-estate-cabernet-sauvignon",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    },
    "weight": "3.5",
    "image": "https://cdn.securecheckout.com/products/842/image.jpg",
    "created": "2026-01-14 09:22:00",
    "last_update": "2026-02-16 15:17:00"
}
DELETE /products/{id} Delete Product

Permanently delete a product.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
Examples
Request
DELETE/products/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /products/{id}/categories/{category_id} Add Product to Category

Attach a product to a category.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
category_id number Required Category Id
Examples
Request
POST/products/{id}/categories/{category_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /products/{id}/categories/{category_id} Remove Product from Category

Detach a product from a category.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
category_id number Required Category Id
Examples
Request
DELETE/products/{id}/categories/{category_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /products/{id}/categories/{category_id}/reorder Reorder Product in Category

Move a product to a new sort position within a category.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
category_id number Required Category Id
position number Required New zero-based sort position.
Examples
Request
POST/products/{id}/categories/{category_id}/reorder
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "position": "2"
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /products/{id}/categories/{category_id}/promote Promote Product in Category

Promote a product to the top of a category's sort order.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
category_id number Required Category Id
Examples
Request
POST/products/{id}/categories/{category_id}/promote
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /products/inventory Get Inventory

Return inventory rows across all products and locations.

Examples
Request
GET/products/inventory
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "sku": "2021-CAB-750",
        "quantity": "240",
        "location": "Main Warehouse"
    }
]
GET /products/{id}/inventory Get Product Inventory by Location

Return the per-location quantity map for a single product.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
Examples
Request
GET/products/{id}/inventory
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "Main Warehouse": {
        "quantity": "180"
    },
    "Tasting Room": {
        "quantity": "60"
    }
}
GET /products/inventory/location/{location} Get Inventory by Location

Return inventory rows for a single named location.

Parameters
NameTypeRequiredDescriptionExample
location string Required Inventory location name
Examples
Request
GET/products/inventory/location/{location}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "sku": "2021-CAB-750",
        "quantity": "180",
        "location": "Main Warehouse"
    }
]
POST /products/sku/{sku}/inventory Update Inventory by SKU

Set the (non-location) on-hand quantity for a SKU.

Parameters
NameTypeRequiredDescriptionExample
sku string Required Product SKU
quantity number Required New absolute quantity.
Examples
Request
POST/products/sku/{sku}/inventory
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "quantity": "240"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "sku": "2021-CAB-750",
    "quantity": "240"
}
POST /products/inventory/location/{location}/adjust Adjust Inventory at Location

Apply a signed quantity adjustment for a SKU at a location and record who/why in the transaction log.

Parameters
NameTypeRequiredDescriptionExample
location string Required Inventory location name
sku string Required Product SKU.
quantity number Required Signed adjustment (negative decrements).
user string Optional Name of the user making the adjustment.
note string Optional Reason / note for the adjustment.
Examples
Request
POST/products/inventory/location/{location}/adjust
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "sku": "2021-CAB-750",
    "quantity": "-6",
    "user": "Jane Doe",
    "note": "Damaged in transit"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "sku": "2021-CAB-750",
    "quantity": "174",
    "location": "Main Warehouse"
}
GET /products/inventory/transactions Get Inventory Transactions

Return the inventory adjustment ledger, optionally bounded by a date range. Rows are written straight to CSV, so the exact keys are not guaranteed (inferred below).

Parameters
NameTypeRequiredDescriptionExample
start string Optional Optional range start.
end string Optional Optional range end.
Examples
Request
GET/products/inventory/transactions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "sku": "2021-CAB-750",
        "quantity": "-6",
        "location": "Main Warehouse",
        "user": "Jane Doe",
        "note": "Damaged in transit"
    }
]
POST /products/{id}/volume-discount Add Volume Discount Tier

Add or overwrite a quantity-break tier in the product's volume_discount map. Tiers are reverse-sorted by quantity.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
quantity number Required Quantity threshold for the tier.
price string Required Per-unit price at this quantity.
Examples
Request
POST/products/{id}/volume-discount
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "quantity": "12",
    "price": "70.00"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "volume_discount": {
        "12": "70.00",
        "6": "72.00"
    }
}
DELETE /products/{id}/volume-discount/{quantity} Remove Volume Discount Tier

Remove a single quantity-break tier from the product's volume_discount map.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
quantity number Required Quantity threshold of the tier to remove.
Examples
Request
DELETE/products/{id}/volume-discount/{quantity}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "volume_discount": {
        "6": "72.00"
    }
}
POST /products/{id}/status Update Product Status

Set a product's status (Active, Inactive, or Archived). Also used for bulk status/archive operations.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
status string Required Active, Inactive, or Archived.
Examples
Request
POST/products/{id}/status
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "status": "Active"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "status": "Active"
}
POST /products/{id}/new Toggle New Product

Set the new_product flag (Yes/No).

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
new_product string Required Yes or No.
Examples
Request
POST/products/{id}/new
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "new_product": "No"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "new_product": "No"
}
POST /products/{id}/discount-eligible Toggle Discount Eligible

Set the discount_eligible flag (Yes/No). Sibling flags discount_eligible_promo/club/group/case follow the same pattern.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
discount_eligible string Required Yes or No.
Examples
Request
POST/products/{id}/discount-eligible
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "discount_eligible": "Yes"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "discount_eligible": "Yes"
}
POST /products/{id}/website-visibility Toggle Website Visibility

Set the website_visibility flag (On/Off).

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
website_visibility string Required On or Off.
Examples
Request
POST/products/{id}/website-visibility
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "website_visibility": "On"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "website_visibility": "On"
}
POST /products/{id}/images Upload Product Image

Attach an image to a product. Images are stored as full S3 URLs; multi-size sections write four keys ({key}, {key}_large 3000px, {key}_medium 2000px, {key}_small 600px). Use image, image_2, or image_3 as the base key.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
image string Required Large / back-compat image URL (base key).
image_large string Optional 3000px variant URL.
image_medium string Optional 2000px variant URL.
image_small string Optional 600px variant URL.
image_alt string Optional Alt text for the image.
Examples
Request
POST/products/{id}/images
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "image": "https://cdn.securecheckout.com/products/842/image.jpg",
    "image_large": "https://cdn.securecheckout.com/products/842/image_large.jpg",
    "image_medium": "https://cdn.securecheckout.com/products/842/image_medium.jpg",
    "image_small": "https://cdn.securecheckout.com/products/842/image_small.jpg"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "842",
    "image": "https://cdn.securecheckout.com/products/842/image.jpg"
}
DELETE /products/{id}/images/{key} Remove Product Image

Clear a product image key (sets it to an empty string). Key is image, image_2, or image_3.

Parameters
NameTypeRequiredDescriptionExample
id number Required Product Id
key string Required Image key to clear (image, image_2, image_3).
Examples
Request
DELETE/products/{id}/images/{key}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true

Categories

GET /categories/{id} Get Category

Retrieve a single category by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
Examples
Request
GET/categories/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cabernet Sauvignon",
    "slug": "cabernet-sauvignon",
    "display_brand": "Estate Wines",
    "display_title": "Our Cabernets",
    "description": "Age-worthy Cabernets from our estate vineyards.",
    "short_description": "Estate Cabernets.",
    "extended_description": "A deeper look at our Cabernet program and terroir.",
    "status": "Active",
    "website_visibility": "Active",
    "classification": "Collection",
    "enable_buy_collection": "Yes",
    "sort": "3",
    "current_offer": "0",
    "cm_campaign_id": "",
    "image": "https://cdn.securecheckout.com/categories/12/image.jpg",
    "image_2": "",
    "image_3": ""
}
GET /categories Get All Categories

Return all categories. Pass an optional status query filter (Active or Inactive). Categories are flat (no parent) — hierarchy is expressed via product-to-category membership.

Parameters
NameTypeRequiredDescriptionExample
status string Optional Optional status filter: Active or Inactive.
Examples
Request
GET/categories
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "12",
        "name": "Cabernet Sauvignon",
        "slug": "cabernet-sauvignon",
        "display_brand": "Estate Wines",
        "display_title": "Our Cabernets",
        "description": "Age-worthy Cabernets from our estate vineyards.",
        "short_description": "Estate Cabernets.",
        "extended_description": "A deeper look at our Cabernet program and terroir.",
        "status": "Active",
        "website_visibility": "Active",
        "classification": "Collection",
        "enable_buy_collection": "Yes",
        "sort": "3",
        "current_offer": "0",
        "cm_campaign_id": "",
        "image": "https://cdn.securecheckout.com/categories/12/image.jpg",
        "image_2": "",
        "image_3": ""
    }
]
POST /categories Create Category

Create a category from the posted data.

Parameters
NameTypeRequiredDescriptionExample
name string Required Category name (required).
slug string Required Storefront URL segment (required).
display_brand string Optional Brand line shown with the category.
display_title string Required Display title / heading copy (required).
description string Optional Category description.
short_description string Optional Short description.
extended_description string Optional Extended description (retailer accounts only).
status string Optional Active, Inactive, or Archived.
website_visibility string Optional Active (Visible) or Inactive (Hidden).
classification string Optional Standard, Collection, Experience, Featured, Sampler, All, or Other (retailer only).
enable_buy_collection string Optional Yes or No (retailer only).
sort number Optional Sort order.
cm_campaign_id string Optional Campaign Monitor campaign id.
Examples
Request
POST/categories
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Cabernet Sauvignon",
    "slug": "cabernet-sauvignon",
    "display_brand": "Estate Wines",
    "display_title": "Our Cabernets",
    "description": "Age-worthy Cabernets from our estate vineyards.",
    "status": "Active",
    "website_visibility": "Active",
    "classification": "Collection",
    "sort": "3"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cabernet Sauvignon",
    "slug": "cabernet-sauvignon",
    "display_brand": "Estate Wines",
    "display_title": "Our Cabernets",
    "description": "Age-worthy Cabernets from our estate vineyards.",
    "short_description": "Estate Cabernets.",
    "extended_description": "A deeper look at our Cabernet program and terroir.",
    "status": "Active",
    "website_visibility": "Active",
    "classification": "Collection",
    "enable_buy_collection": "Yes",
    "sort": "3",
    "current_offer": "0",
    "cm_campaign_id": "",
    "image": "https://cdn.securecheckout.com/categories/12/image.jpg",
    "image_2": "",
    "image_3": ""
}
POST /categories/{id} Update Category

Update a category with the full edit form. Setting current_offer to '1' triggers setCurrentOffer; it is unset before the write.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
name string Required Category name (required).
slug string Required Storefront URL segment (required).
display_brand string Optional Brand line shown with the category.
display_title string Required Display title / heading copy (required).
description string Optional Category description.
short_description string Optional Short description.
extended_description string Optional Extended description (retailer accounts only).
status string Optional Active, Inactive, or Archived.
website_visibility string Optional Active (Visible) or Inactive (Hidden).
classification string Optional Standard, Collection, Experience, Featured, Sampler, All, or Other (retailer only).
enable_buy_collection string Optional Yes or No (retailer only).
sort number Optional Sort order.
cm_campaign_id string Optional Campaign Monitor campaign id.
Examples
Request
POST/categories/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Cabernet Sauvignon",
    "slug": "cabernet-sauvignon",
    "display_brand": "Estate Wines",
    "display_title": "Our Cabernets",
    "description": "Age-worthy Cabernets from our estate vineyards.",
    "status": "Active",
    "website_visibility": "Active",
    "classification": "Collection",
    "sort": "3"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "name": "Cabernet Sauvignon",
    "slug": "cabernet-sauvignon",
    "display_brand": "Estate Wines",
    "display_title": "Our Cabernets",
    "description": "Age-worthy Cabernets from our estate vineyards.",
    "short_description": "Estate Cabernets.",
    "extended_description": "A deeper look at our Cabernet program and terroir.",
    "status": "Active",
    "website_visibility": "Active",
    "classification": "Collection",
    "enable_buy_collection": "Yes",
    "sort": "3",
    "current_offer": "0",
    "cm_campaign_id": "",
    "image": "https://cdn.securecheckout.com/categories/12/image.jpg",
    "image_2": "",
    "image_3": ""
}
DELETE /categories/{id} Delete Category

Permanently delete a category.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
Examples
Request
DELETE/categories/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /categories/{id}/reorder Reorder Category

Move a category to a new sort position.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
position number Required New sort position.
Examples
Request
POST/categories/{id}/reorder
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "position": "2"
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /categories/{id}/current-offer Set Current Offer

Mark this category as the current offer (unsets the flag on other categories).

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
Examples
Request
POST/categories/{id}/current-offer
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /categories/{id}/images Upload Category Image

Attach an image to a category. Uses the same multi-size convention as products ({key}, {key}_large, {key}_medium, {key}_small). Base keys are image, image_2, image_3.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
image string Required Large / back-compat image URL (base key).
image_large string Optional 3000px variant URL.
image_medium string Optional 2000px variant URL.
image_small string Optional 600px variant URL.
Examples
Request
POST/categories/{id}/images
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "image": "https://cdn.securecheckout.com/categories/12/image.jpg",
    "image_large": "https://cdn.securecheckout.com/categories/12/image_large.jpg",
    "image_medium": "https://cdn.securecheckout.com/categories/12/image_medium.jpg",
    "image_small": "https://cdn.securecheckout.com/categories/12/image_small.jpg"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "image": "https://cdn.securecheckout.com/categories/12/image.jpg"
}
DELETE /categories/{id}/images/{key} Remove Category Image

Clear a category image key (sets it to an empty string). Key is image, image_2, or image_3.

Parameters
NameTypeRequiredDescriptionExample
id number Required Category Id
key string Required Image key to clear (image, image_2, image_3).
Examples
Request
DELETE/categories/{id}/images/{key}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true

Reviews

GET /reviews Get All Reviews

Return all product reviews.

Examples
Request
GET/reviews
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "57",
        "product_id": "842",
        "score": "95",
        "reviewer": "James Suckling",
        "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage.",
        "sort": "1"
    }
]
GET /reviews/{id} Get Review

Retrieve a single review by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Review Id
Examples
Request
GET/reviews/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "57",
    "product_id": "842",
    "score": "95",
    "reviewer": "James Suckling",
    "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage.",
    "sort": "1"
}
GET /reviews/product/{product_id} Get Reviews by Product

Return all reviews for a given product, in display (sort) order.

Parameters
NameTypeRequiredDescriptionExample
product_id number Required Product Id
Examples
Request
GET/reviews/product/{product_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "57",
        "product_id": "842",
        "score": "95",
        "reviewer": "James Suckling",
        "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage.",
        "sort": "1"
    }
]
POST /reviews Create Review

Create a review for a product. The body carries score, reviewer, and review; product_id ties the review to its product.

Parameters
NameTypeRequiredDescriptionExample
product_id number Required Product the review belongs to (FK).
score string Required Rating / score (free text, e.g. "95" or "95 pts").
reviewer string Required Reviewer byline.
review string Required Review body copy.
Examples
Request
POST/reviews
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "product_id": "842",
    "score": "95",
    "reviewer": "James Suckling",
    "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage."
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "57",
    "product_id": "842",
    "score": "95",
    "reviewer": "James Suckling",
    "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage.",
    "sort": "1"
}
POST /reviews/{id} Update Review

Update a review's score, reviewer, and/or body.

Parameters
NameTypeRequiredDescriptionExample
id number Required Review Id
score string Required Rating / score (free text, e.g. "95" or "95 pts").
reviewer string Required Reviewer byline.
review string Required Review body copy.
Examples
Request
POST/reviews/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "score": "96",
    "reviewer": "James Suckling",
    "review": "Even better with a year in bottle. Cassis, graphite, and fine tannins."
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "57",
    "product_id": "842",
    "score": "96",
    "reviewer": "James Suckling",
    "review": "Full-bodied and structured, with layers of cassis and graphite. A standout vintage.",
    "sort": "1"
}
DELETE /reviews/{id} Delete Review

Permanently delete a review.

Parameters
NameTypeRequiredDescriptionExample
id number Required Review Id
Examples
Request
DELETE/reviews/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /reviews/{id}/reorder Reorder Review

Move a review to a new display (sort) position.

Parameters
NameTypeRequiredDescriptionExample
id number Required Review Id
position number Required New sort position.
Examples
Request
POST/reviews/{id}/reorder
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "position": "2"
}
Response
Headers · 200
Content-Type: application/json
Body
true

Invites

GET /invites Get Invite History

Returns the full customer-referral invite history. Each row carries the inviter (customer_id), the invitee (newcustomer_id), status, the sort timestamp, the first-purchase order_id, and nested customer/newcustomer objects.

Examples
Request
GET/invites
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "customer_id": "42",
        "newcustomer_id": "57",
        "status": "JOINED",
        "updated": "2026-01-20 14:05:00",
        "order_id": "",
        "customer": {
            "first_name": "John",
            "last_name": "Doe",
            "email": "example@commercebyfigure.com"
        },
        "newcustomer": {
            "first_name": "Erin",
            "last_name": "Wells",
            "email": "erin@commercebyfigure.com"
        }
    },
    {
        "customer_id": "42",
        "newcustomer_id": "58",
        "status": "PAID",
        "updated": "2026-01-25 09:12:00",
        "order_id": "3391",
        "customer": {
            "first_name": "John",
            "last_name": "Doe",
            "email": "example@commercebyfigure.com"
        },
        "newcustomer": {
            "first_name": "Sam",
            "last_name": "Reyes",
            "email": "sam@commercebyfigure.com"
        }
    }
]
GET /invites/inviter/{customer_id} Get Inviter

Returns the customer who invited the given customer (the referrer), as a compact customer object.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required The invitee's customer id
Examples
Request
GET/invites/inviter/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "42",
    "first_name": "John",
    "last_name": "Doe"
}
GET /invites/customer/{customer_id} Get Invites By Customer

Returns the invites a customer has sent, grouped by status and then by the updated timestamp. Use to render a customer's referral activity.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required The inviter's customer id
Examples
Request
GET/invites/customer/{customer_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "JOINED": {
        "2026-01-20 14:05:00": {
            "customer_id": "42",
            "newcustomer_id": "57",
            "status": "JOINED",
            "updated": "2026-01-20 14:05:00",
            "order_id": "",
            "newcustomer_first_name": "Erin",
            "newcustomer_last_name": "Wells"
        }
    },
    "PAID": {
        "2026-01-25 09:12:00": {
            "customer_id": "42",
            "newcustomer_id": "58",
            "status": "PAID",
            "updated": "2026-01-25 09:12:00",
            "order_id": "3391",
            "newcustomer_first_name": "Sam",
            "newcustomer_last_name": "Reyes"
        }
    }
}
POST /invites/batch Get Invites By Customers

Bulk variant of Get Invites By Customer. POST a bare array of inviter customer ids to fetch each customer's sent invites in one call. Returns a map keyed by customer id.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of inviter customer ids
Examples
Request
POST/invites/batch
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    42,
    43
]
Response
Headers · 200
Content-Type: application/json
Body
{
    "42": [
        {
            "customer_id": "42",
            "newcustomer_id": "57",
            "status": "JOINED",
            "updated": "2026-01-20 14:05:00",
            "order_id": "",
            "newcustomer_first_name": "Erin",
            "newcustomer_last_name": "Wells"
        }
    ],
    "43": []
}
GET /invites/sent/{start}/{end} Get Invites Sent

Returns invites sent within the given date range, intended for reporting/export. On export the PAID status is relabeled PURCHASED. Rarely used (legacy export).

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start (Y-m-d)
end string Required Range end (Y-m-d)
Examples
Request
GET/invites/sent/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "customer_id": "42",
        "newcustomer_id": "58",
        "newcustomer_first_name": "Sam",
        "newcustomer_last_name": "Reyes",
        "status": "PAID",
        "updated": "2026-01-25 09:12:00",
        "order_id": "3391"
    }
]

Promotions

GET /promotions Get All Promotions

Returns every promotion (discount code) configured for the account, both Active and Inactive.

Examples
Request
GET/promotions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "12",
        "code": "SUMMER10",
        "name": "Summer 10% Off",
        "type": "Percentage",
        "amount": "10",
        "status": "Active",
        "multi_use": "1",
        "starts": "2026-06-01 00:00:00",
        "expires": "2026-08-31 23:59:59"
    }
]
GET /promotions/{id} Get Promotion

Returns a single promotion by its id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Promotion Id
Examples
Request
GET/promotions/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "code": "SUMMER10",
    "name": "Summer 10% Off",
    "type": "Percentage",
    "amount": "10",
    "status": "Active",
    "multi_use": "1",
    "starts": "2026-06-01 00:00:00",
    "expires": "2026-08-31 23:59:59"
}
POST /promotions Create Promotion

Creates a new promotion. The submitted code is slugified to uppercase alphanumeric (spaces, periods and dashes are removed), so "Summer 10" becomes "SUMMER10". New promotions are always created with status Active. Set type to Percentage or Dollar; amount is read as a percent or a dollar value accordingly. multi_use of 1 allows unlimited reuse, 0 restricts the code to a single use. Leave expires empty for a code that never expires.

Parameters
NameTypeRequiredDescriptionExample
code string Required Promo code entered by the customer at checkout. Slugified to uppercase alphanumeric on save
name string Optional Internal name for the promotion (never shown to the customer)
type string Required Discount type: Percentage or Dollar
amount string Required Discount amount: a percent when type is Percentage, a dollar value when type is Dollar
multi_use number Optional 1 for a multi-use code, 0 for a single-use code
starts string Optional Date and time the promotion becomes valid
expires string Optional Date and time the promotion expires; leave empty for no expiration
Examples
Request
POST/promotions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "code": "Summer 10",
    "name": "Summer 10% Off",
    "type": "Percentage",
    "amount": "10",
    "multi_use": "1",
    "starts": "2026-06-01 00:00:00",
    "expires": "2026-08-31 23:59:59"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "code": "SUMMER10",
    "name": "Summer 10% Off",
    "type": "Percentage",
    "amount": "10",
    "status": "Active",
    "multi_use": "1",
    "starts": "2026-06-01 00:00:00",
    "expires": "2026-08-31 23:59:59"
}
POST /promotions/{id} Update Promotion

Updates an existing promotion. code, starts and expires are required on update. The code is re-slugified to uppercase alphanumeric on save.

Parameters
NameTypeRequiredDescriptionExample
id number Required Promotion Id
code string Required Promo code. Slugified to uppercase alphanumeric on save
name string Optional Internal name for the promotion
type string Optional Discount type: Percentage or Dollar
amount string Optional Discount amount (percent or dollar value by type)
status string Optional Active or Inactive
multi_use number Optional 1 for a multi-use code, 0 for a single-use code
starts string Required Date and time the promotion becomes valid
expires string Required Date and time the promotion expires; leave empty for no expiration
Examples
Request
POST/promotions/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "code": "SUMMER10",
    "name": "Summer 10% Off",
    "type": "Percentage",
    "amount": "10",
    "status": "Active",
    "multi_use": "1",
    "starts": "2026-06-01 00:00:00",
    "expires": "2026-08-31 23:59:59"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12",
    "code": "SUMMER10",
    "name": "Summer 10% Off",
    "type": "Percentage",
    "amount": "10",
    "status": "Active",
    "multi_use": "1",
    "starts": "2026-06-01 00:00:00",
    "expires": "2026-08-31 23:59:59"
}
DELETE /promotions/{id} Delete Promotion

Permanently deletes a promotion by its id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Promotion Id
Examples
Request
DELETE/promotions/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"true"

Recovery

GET /recovery Get All Abandoned Carts

Returns all abandoned-cart recovery records. Each record is keyed by its checkout session and is enriched with the attached customer (groups pipe-joined), the derived cart total and item_count. Impersonation sessions (Admin- prefix) are excluded.

Examples
Request
GET/recovery
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "session": "XY12AB34CD56",
        "recovery_status": "Not Recovered",
        "recovery_date": "0000-00-00 00:00:00",
        "email_status": "Sent",
        "email_template": "recovery1",
        "email_sent": "2026-07-06 09:15:00",
        "customer_id": "42",
        "created": "2026-07-05 18:22:00",
        "items": {
            "PN2019": 2,
            "CH2020": 1
        },
        "customer": {
            "id": "42",
            "first_name": "John",
            "last_name": "Doe",
            "email": "john.doe@gmail.com",
            "groups": "Wine Club|VIP"
        },
        "total": "210.00",
        "item_count": 3
    }
]
GET /recovery/status/{status} Get Abandoned Carts By Status

Returns abandoned carts filtered by recovery_status. Valid values are Not Recovered, Recovered and Archived.

Parameters
NameTypeRequiredDescriptionExample
status string Required Recovery status: Not Recovered, Recovered or Archived
Examples
Request
GET/recovery/status/{status}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "session": "XY12AB34CD56",
        "recovery_status": "Not Recovered",
        "recovery_date": "0000-00-00 00:00:00",
        "email_status": "Sent",
        "email_template": "recovery1",
        "email_sent": "2026-07-06 09:15:00",
        "customer_id": "42",
        "created": "2026-07-05 18:22:00",
        "items": {
            "PN2019": 2,
            "CH2020": 1
        },
        "customer": {
            "id": "42",
            "first_name": "John",
            "last_name": "Doe",
            "email": "john.doe@gmail.com",
            "groups": "Wine Club|VIP"
        },
        "total": "210.00",
        "item_count": 3
    }
]
GET /recovery/{session} Get Abandoned Cart

Returns a single abandoned-cart recovery record by its checkout session id, including the enriched customer, line items, and derived total and item_count.

Parameters
NameTypeRequiredDescriptionExample
session string Required Checkout session id of the abandoned cart
Examples
Request
GET/recovery/{session}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "session": "XY12AB34CD56",
    "recovery_status": "Not Recovered",
    "recovery_date": "0000-00-00 00:00:00",
    "email_status": "Sent",
    "email_template": "recovery1",
    "email_sent": "2026-07-06 09:15:00",
    "customer_id": "42",
    "created": "2026-07-05 18:22:00",
    "items": {
        "PN2019": 2,
        "CH2020": 1
    },
    "customer": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@gmail.com",
        "groups": "Wine Club|VIP"
    },
    "total": "210.00",
    "item_count": 3
}
DELETE /recovery/{session} Drop Abandoned Cart

Drops an abandoned cart from the recovery list so it is no longer eligible for recovery emails.

Parameters
NameTypeRequiredDescriptionExample
session string Required Checkout session id of the abandoned cart
Examples
Request
DELETE/recovery/{session}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"true"
POST /recovery/{session}/archive Archive Abandoned Cart

Archives an abandoned cart, setting its recovery_status to Archived and stamping recovery_date. Archived carts are removed from the active recovery workflow.

Parameters
NameTypeRequiredDescriptionExample
session string Required Checkout session id of the abandoned cart
Examples
Request
POST/recovery/{session}/archive
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "session": "XY12AB34CD56",
    "recovery_status": "Archived",
    "recovery_date": "2026-07-08 10:00:00",
    "email_status": "Sent",
    "email_template": "recovery1",
    "email_sent": "2026-07-06 09:15:00",
    "customer_id": "42",
    "created": "2026-07-05 18:22:00",
    "items": {
        "PN2019": 2,
        "CH2020": 1
    },
    "customer": {
        "id": "42",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john.doe@gmail.com",
        "groups": "Wine Club|VIP"
    },
    "total": "210.00",
    "item_count": 3
}
POST /recovery/{session}/email/{template} Send Recovery Email

Sends a recovery email to the customer for the given abandoned cart using the named email template (for example recovery1, recovery2 or recovery3). The email links the customer back to a preauthenticated recovery URL and sets email_status to Sent.

Parameters
NameTypeRequiredDescriptionExample
session string Required Checkout session id of the abandoned cart
template string Required Name of the email template to send, e.g. recovery1
Examples
Request
POST/recovery/{session}/email/{template}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
"true"

Content

GET /content/emails Get Email Templates

Returns all email templates for the account, each with its name, subject and message. Known template names include: appointment-cancellation-01, appointment-confirmation-01, appointment-confirmation-02, appointment-confirmation-03, appointment-decline-01, appointment-reminder-01, cancellation, club-receipt, club-signup, gift-card, receipt, receipt-hospitality, receipt-update-wish, receipt-wish-only, receipt-wishlist, recovery1, recovery2, recovery3, signup, signup-3rd-party, signup-internal, signup-tastingroom, update. A -new suffix denotes a working copy and is stripped before lookup.

Examples
Request
GET/content/emails
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "name": "receipt",
        "subject": "Thank you for your order",
        "message": "<p>Hi {first_name},</p><p>Thank you for your order. Your wines are on the way.</p>"
    },
    {
        "name": "recovery1",
        "subject": "You left something in your cart",
        "message": "<p>Hi {first_name},</p><p>You still have items waiting in your cart. <a href=\"{recovery_url}\">Complete your order</a>.</p>"
    }
]
GET /content/emails/{name} Get Email Template

Returns a single email template by name. Known template names include: appointment-cancellation-01, appointment-confirmation-01, appointment-confirmation-02, appointment-confirmation-03, appointment-decline-01, appointment-reminder-01, cancellation, club-receipt, club-signup, gift-card, receipt, receipt-hospitality, receipt-update-wish, receipt-wish-only, receipt-wishlist, recovery1, recovery2, recovery3, signup, signup-3rd-party, signup-internal, signup-tastingroom, update.

Parameters
NameTypeRequiredDescriptionExample
name string Required Template name, e.g. receipt
Examples
Request
GET/content/emails/{name}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "name": "receipt",
    "subject": "Thank you for your order",
    "message": "<p>Hi {first_name},</p><p>Thank you for your order. Your wines are on the way.</p>"
}
POST /content/emails/{name} Save Email Template

Saves (creates or overwrites) an email template by name, setting its subject and message. Relative href="/..." links in the message are rewritten to absolute URLs using the account website_url. Known template names include: appointment-cancellation-01, appointment-confirmation-01, appointment-confirmation-02, appointment-confirmation-03, appointment-decline-01, appointment-reminder-01, cancellation, club-receipt, club-signup, gift-card, receipt, receipt-hospitality, receipt-update-wish, receipt-wish-only, receipt-wishlist, recovery1, recovery2, recovery3, signup, signup-3rd-party, signup-internal, signup-tastingroom, update.

Parameters
NameTypeRequiredDescriptionExample
name string Required Template name, e.g. receipt
subject string Required Email subject line
message string Required Email body (HTML)
Examples
Request
POST/content/emails/{name}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "subject": "Thank you for your order",
    "message": "<p>Hi {first_name},</p><p>Thank you for your order. Your wines are on the way.</p>"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "name": "receipt",
    "subject": "Thank you for your order",
    "message": "<p>Hi {first_name},</p><p>Thank you for your order. Your wines are on the way.</p>"
}

Transactions

GET /transactions/{id} Get Transaction

Fetch a single payment transaction row by its id, including type (Debit/Refund/Chargeback), gateway, monetary breakdown, and parent linkage.

Parameters
NameTypeRequiredDescriptionExample
id number Required Transaction Id
Examples
Request
GET/transactions/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "88431",
    "uri": "",
    "type": "Debit",
    "gateway": "Stripe",
    "status": "Approved",
    "credit_type": "Visa",
    "account_number": "4242",
    "total": "59.15",
    "fees": "2.02",
    "tax": "3.15",
    "shipping": "20.00",
    "tip": "0.00",
    "ca_redemption_value": "0.00",
    "me_bottle_deposit": "0.00",
    "credits": "0.00",
    "discount": "9.00",
    "parent_amount": "0.00",
    "order_id": "42",
    "customer_id": "1",
    "shipment_id": "",
    "parent_id": "",
    "created": "2026-02-16 15:17:00",
    "note": ""
}
GET /transactions/date/{start}/{end} Get Transactions By Date

List payment transactions created within the given date range (day boundaries). Used alongside the datetime variant to reconcile timezone-sensitive reporting.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start date (e.g. 2026-02-01)
end string Required Range end date (e.g. 2026-02-28)
Examples
Request
GET/transactions/date/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "88431",
        "uri": "",
        "type": "Debit",
        "gateway": "Stripe",
        "status": "Approved",
        "credit_type": "Visa",
        "account_number": "4242",
        "total": "59.15",
        "fees": "2.02",
        "tax": "3.15",
        "shipping": "20.00",
        "tip": "0.00",
        "ca_redemption_value": "0.00",
        "me_bottle_deposit": "0.00",
        "credits": "0.00",
        "discount": "9.00",
        "parent_amount": "0.00",
        "order_id": "42",
        "customer_id": "1",
        "shipment_id": "",
        "parent_id": "",
        "created": "2026-02-16 15:17:00",
        "note": ""
    }
]
GET /transactions/datetime/{start}/{end} Get Transactions By Date/Time

List payment transactions created within the given datetime range. Called back-to-back with the date variant so client reporting can reconcile local vs UTC day boundaries.

Parameters
NameTypeRequiredDescriptionExample
start string Required Range start datetime (e.g. 2026-02-01 00:00:00)
end string Required Range end datetime (e.g. 2026-02-28 23:59:59)
Examples
Request
GET/transactions/datetime/{start}/{end}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "88431",
        "uri": "",
        "type": "Debit",
        "gateway": "Stripe",
        "status": "Approved",
        "credit_type": "Visa",
        "account_number": "4242",
        "total": "59.15",
        "fees": "2.02",
        "tax": "3.15",
        "shipping": "20.00",
        "tip": "0.00",
        "ca_redemption_value": "0.00",
        "me_bottle_deposit": "0.00",
        "credits": "0.00",
        "discount": "9.00",
        "parent_amount": "0.00",
        "order_id": "42",
        "customer_id": "1",
        "shipment_id": "",
        "parent_id": "",
        "created": "2026-02-16 15:17:00",
        "note": ""
    }
]
GET /transactions/refunds/{order_id} Get Refunds For Order

Return the Refund and Chargeback rows tied to an order. Netting against the parent Debit is additive per monetary field; each row links to its parent via parent_id.

Parameters
NameTypeRequiredDescriptionExample
order_id number Required Order Id
Examples
Request
GET/transactions/refunds/{order_id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "88507",
        "uri": "",
        "type": "Refund",
        "gateway": "Stripe",
        "status": "Approved",
        "credit_type": "Visa",
        "account_number": "4242",
        "total": "-59.15",
        "fees": "0.00",
        "tax": "-3.15",
        "shipping": "-20.00",
        "tip": "0.00",
        "ca_redemption_value": "0.00",
        "me_bottle_deposit": "0.00",
        "credits": "0.00",
        "discount": "-9.00",
        "parent_amount": "-59.15",
        "order_id": "42",
        "customer_id": "1",
        "shipment_id": "",
        "parent_id": "88431",
        "created": "2026-02-18 10:04:22",
        "note": "Refunded per customer request"
    }
]
POST /transactions Create Transaction

Record a Debit transaction against an order. Accepts Stripe or Authorize.Net (authnet_*) payment identifiers plus the monetary breakdown. Side effect: when a credits amount is supplied, the customer's store-credit bank must be decremented separately via a credits call — this row only records the amount.

Parameters
NameTypeRequiredDescriptionExample
order_id number Required Order Id
customer_id number Required Customer Id
credit_type string Optional Card brand, ACH, or GiftCard
account_number string Optional Last 4 of the payment account
account_token string Optional Stripe customer token (or 'pending' for unverified ACH)
payment_token string Optional Stripe payment method token (pm_... / seti_...)
authnet_profile_id string Optional Authorize.Net customer profile id (legacy path)
authnet_payment_id string Optional Authorize.Net payment profile id (legacy path)
account_uri string Optional Gateway account URI
card_uri string Optional Gateway card URI
subtotal number Optional Line subtotal
discount number Optional Discount amount
credits number Optional Store credit applied (bank move happens separately)
ca_redemption_value number Optional CA redemption value (CRV)
me_bottle_deposit number Optional ME bottle deposit
tax number Optional Tax amount
shipping number Optional Shipping amount
tip number Optional Tip amount
total number Required Charge total
Examples
Request
POST/transactions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "order_id": "42",
    "customer_id": "1",
    "credit_type": "Visa",
    "account_number": "4242",
    "account_token": "cus_QXk2fJ...",
    "payment_token": "pm_1Nabc...",
    "authnet_profile_id": "",
    "authnet_payment_id": "",
    "account_uri": "",
    "card_uri": "",
    "subtotal": "45.00",
    "discount": "9.00",
    "credits": "0.00",
    "ca_redemption_value": "0.00",
    "me_bottle_deposit": "0.00",
    "tax": "3.15",
    "shipping": "20.00",
    "tip": "0.00",
    "total": "59.15"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "88431",
    "uri": "",
    "type": "Debit",
    "gateway": "Stripe",
    "status": "Approved",
    "credit_type": "Visa",
    "account_number": "4242",
    "total": "59.15",
    "fees": "2.02",
    "tax": "3.15",
    "shipping": "20.00",
    "tip": "0.00",
    "ca_redemption_value": "0.00",
    "me_bottle_deposit": "0.00",
    "credits": "0.00",
    "discount": "9.00",
    "parent_amount": "0.00",
    "order_id": "42",
    "customer_id": "1",
    "shipment_id": "",
    "parent_id": "",
    "created": "2026-02-16 15:17:00",
    "note": ""
}
POST /transactions/{id}/refund Refund Transaction

Issue a refund against a Debit transaction. Each monetary field is passed negated, and the parent total is passed as amount (the total→amount rename). Optionally flag fraudulent and pass a credits amount only when > 0 (a credits + order_id refund also adjusts the store-credit bank). Store-credit-only refunds bypass this endpoint and credit the bank directly.

Parameters
NameTypeRequiredDescriptionExample
id number Required Parent (Debit) Transaction Id
amount number Required Negated parent total to refund
discount number Optional Negated discount portion
tax number Optional Negated tax portion
shipping number Optional Negated shipping portion
ca_redemption_value number Optional Negated CRV portion
me_bottle_deposit number Optional Negated bottle-deposit portion
fraudulent string Optional Set to 'yes' to mark the refund fraudulent
credits number Optional Store-credit amount to refund (only when > 0)
Examples
Request
POST/transactions/{id}/refund
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "-59.15",
    "discount": "-9.00",
    "tax": "-3.15",
    "shipping": "-20.00",
    "ca_redemption_value": "0.00",
    "me_bottle_deposit": "0.00",
    "fraudulent": "yes",
    "credits": "0.00"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "88507",
    "uri": "",
    "type": "Refund",
    "gateway": "Stripe",
    "status": "Approved",
    "credit_type": "Visa",
    "account_number": "4242",
    "total": "-59.15",
    "fees": "0.00",
    "tax": "-3.15",
    "shipping": "-20.00",
    "tip": "0.00",
    "ca_redemption_value": "0.00",
    "me_bottle_deposit": "0.00",
    "credits": "0.00",
    "discount": "-9.00",
    "parent_amount": "-59.15",
    "order_id": "42",
    "customer_id": "1",
    "shipment_id": "",
    "parent_id": "88431",
    "created": "2026-02-18 10:04:22",
    "note": "Refunded per customer request"
}
POST /transactions/{id}/void Void Transaction

Void a transaction by id. No request body. (Note: the legacy controller flags this action as currently unused.)

Parameters
NameTypeRequiredDescriptionExample
id number Required Transaction Id
Examples
Request
POST/transactions/{id}/void
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true

GiftCards

GET /giftcards/{id} Get Gift Card

Fetch a single gift card by id, including its code, status (Active/Voided/Depleted), face amount, and remaining balance.

Parameters
NameTypeRequiredDescriptionExample
id number Required Gift Card Id
Examples
Request
GET/giftcards/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5012",
    "code": "YA6-KSV-E3S-T57",
    "status": "Active",
    "amount": "100.00",
    "balance": "64.00",
    "on_hold": "0.00",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
    "order_id": "42",
    "customer_id": "1",
    "created": "2026-01-04 12:00:00",
    "last_update": "2026-02-16 15:17:00"
}
GET /giftcards Get All Gift Cards

List all gift cards, sorted by last_update descending.

Examples
Request
GET/giftcards
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5012",
        "code": "YA6-KSV-E3S-T57",
        "status": "Active",
        "amount": "100.00",
        "balance": "64.00",
        "on_hold": "0.00",
        "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
        "order_id": "42",
        "customer_id": "1",
        "created": "2026-01-04 12:00:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
POST /giftcards/batch Get Gift Cards By Id

Bulk-hydrate gift cards by posting an array of ids. Returns the full card object for each id found.

Parameters
NameTypeRequiredDescriptionExample
ids array Required Array of gift card ids
Examples
Request
POST/giftcards/batch
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
[
    5012,
    5013
]
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5012",
        "code": "YA6-KSV-E3S-T57",
        "status": "Active",
        "amount": "100.00",
        "balance": "64.00",
        "on_hold": "0.00",
        "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
        "order_id": "42",
        "customer_id": "1",
        "created": "2026-01-04 12:00:00",
        "last_update": "2026-02-16 15:17:00"
    }
]
GET /giftcards/code/{code} Get Gift Card By Code

Look up a gift card by its printed code. Codes are 4×3 characters from the alphabet [A-HJ-NPR-Z2-9] (I/O/Q/0/1 omitted), dash-separated.

Parameters
NameTypeRequiredDescriptionExample
code string Required Gift card code, e.g. YA6-KSV-E3S-T57
Examples
Request
GET/giftcards/code/{code}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5012",
    "code": "YA6-KSV-E3S-T57",
    "status": "Active",
    "amount": "100.00",
    "balance": "64.00",
    "on_hold": "0.00",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
    "order_id": "42",
    "customer_id": "1",
    "created": "2026-01-04 12:00:00",
    "last_update": "2026-02-16 15:17:00"
}
GET /giftcards/{id}/transactions Get Gift Card Transactions

Return the ledger for a gift card: signed amount rows (+credit / -debit) with the running balance, sorted for history display (created, note, amount, balance). This ledger is distinct from the payment transactions resource.

Parameters
NameTypeRequiredDescriptionExample
id number Required Gift Card Id
Examples
Request
GET/giftcards/{id}/transactions
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "9901",
        "amount": "-36.00",
        "balance": "64.00",
        "note": "Order #42",
        "order_id": "42",
        "customer_id": "1",
        "created": "2026-02-16 15:17:00"
    }
]
POST /giftcards Create Gift Card

Issue a new gift card. amount is required and must be > 0; code is auto-generated when omitted. Recipient identity (first/last/email) is not a native field — fold it into note as 'Recipient: {last}, {first} ({email})[ - {note}]'. Side effect: an initial ledger transaction is written, noted 'Initial Balance: ...' (or 'Card Created' when an order exists with no note).

Parameters
NameTypeRequiredDescriptionExample
amount number Required Face/starting value (> 0)
customer_id number Optional Owning customer id
order_id number Optional Originating order id
code string Optional Explicit code; auto-generated if omitted
note string Optional Note (≤256 chars); carries packed recipient identity
Examples
Request
POST/giftcards
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "100.00",
    "customer_id": "1",
    "order_id": "42",
    "code": "",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5012",
    "code": "YA6-KSV-E3S-T57",
    "status": "Active",
    "amount": "100.00",
    "balance": "64.00",
    "on_hold": "0.00",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
    "order_id": "42",
    "customer_id": "1",
    "created": "2026-01-04 12:00:00",
    "last_update": "2026-02-16 15:17:00"
}
POST /giftcards/{id}/credit Credit Gift Card

Apply a signed amount to a gift card (negative = debit). The balance can never go negative (the guard rejects balance + amount < 0). A positive credit on a Depleted card flips its status back to Active.

Parameters
NameTypeRequiredDescriptionExample
id number Required Gift Card Id
amount number Required Signed amount (negative = debit)
note string Optional Ledger note
customer_id number Optional Customer id
order_id number Optional Order id
Examples
Request
POST/giftcards/{id}/credit
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "-36.00",
    "note": "Order #42",
    "customer_id": "1",
    "order_id": "42"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5012",
    "code": "YA6-KSV-E3S-T57",
    "status": "Active",
    "amount": "100.00",
    "balance": "64.00",
    "on_hold": "0.00",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
    "order_id": "42",
    "customer_id": "1",
    "created": "2026-01-04 12:00:00",
    "last_update": "2026-02-16 15:17:00"
}
POST /giftcards/{id}/void Void Gift Card

Void a gift card. Auto-zeroes the remaining balance and sets status to Voided. Also invoked automatically when a gift-card order is cancelled.

Parameters
NameTypeRequiredDescriptionExample
id number Required Gift Card Id
note string Optional Reason / void note
Examples
Request
POST/giftcards/{id}/void
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "note": "Voided at customer request"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "5012",
    "code": "YA6-KSV-E3S-T57",
    "status": "Voided",
    "amount": "100.00",
    "balance": "0.00",
    "on_hold": "0.00",
    "note": "Recipient: Doe, Jane (jane@example.com) - Happy Birthday",
    "order_id": "42",
    "customer_id": "1",
    "created": "2026-01-04 12:00:00",
    "last_update": "2026-02-16 15:17:00"
}
DELETE /giftcards/{id} Delete Gift Card

Permanently delete a gift card by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Gift Card Id
Examples
Request
DELETE/giftcards/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true

Credits

POST /customers/{customer_id}/credits Add Store Credit

Apply a signed adjustment to a customer's store-credit bank (positive = credit/refund, negative = debit). Passed as a body (the legacy transport carried amount and note as URL path segments, which the rebuild moves into the body). Manual adjustments suffix the note with ' --Adjusted by {admin}'.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
amount number Required Signed amount (positive = credit, negative = debit)
note string Optional Reason for the adjustment
Examples
Request
POST/customers/{customer_id}/credits
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "amount": "36.00",
    "note": "Refund for order #42"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "1",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john@example.com",
    "credits": "125.00",
    "last_credit": "36.00 ||| 2026-02-16 15:17:00 ||| Refund for order #42",
    "last_debit": "-14.00 ||| 2026-01-30 09:12:00 ||| Applied to order #38",
    "note": "Refund for order #42"
}
GET /customers/{customer_id}/credits/history Get Credit History

Return the store-credit ledger for a customer: each row has a signed amount (>0 credit / <0 debit) and the running balance total.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/customers/{customer_id}/credits/history
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "timestamp": "2026-02-16 15:17:00",
        "note": "Refund for order #42",
        "amount": "36.00",
        "total": "125.00"
    }
]
GET /customers/{customer_id}/credits/total Get Credit Total

Return the customer's current store-credit balance as a scalar numeric value.

Parameters
NameTypeRequiredDescriptionExample
customer_id number Required Customer Id
Examples
Request
GET/customers/{customer_id}/credits/total
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
125
GET /credits/open/{pageSize}/{lastId} Get All Open Credit

Keyset-paginated list of customers carrying an open store-credit balance. Pass pageSize and the lastId seen to fetch the next page. Each row's last_credit and last_debit are packed strings in the form 'amount ||| timestamp ||| note' (split client-side on ' ||| '); the empty-result fallback uses {customer_id, amount}.

Parameters
NameTypeRequiredDescriptionExample
pageSize number Required Number of rows per page
lastId number Required Highest customer id from the previous page (0 to start)
Examples
Request
GET/credits/open/{pageSize}/{lastId}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "1",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john@example.com",
        "credits": "125.00",
        "last_credit": "36.00 ||| 2026-02-16 15:17:00 ||| Refund for order #42",
        "last_debit": "-14.00 ||| 2026-01-30 09:12:00 ||| Applied to order #38"
    }
]

Rates

GET /rates/methods Get Shipping Methods

Returns all configured shipping methods in sort order. Append a state code (e.g. /rates/methods/CA) to return only the methods available for that destination state. All values wire as strings.

Parameters
NameTypeRequiredDescriptionExample
state string Optional Optional two-letter destination state to filter methods available in that state
Examples
Request
GET/rates/methods
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "3",
        "name": "FedEx Ground",
        "status": "Active",
        "sort": "1",
        "carrier": "FedEx",
        "code": "FEDEX_GROUND",
        "description": "Arrives in 3-5 business days",
        "internal_description": "Domestic ground service",
        "shipping_offer": "0",
        "ice_pack": "1",
        "ice_pack_price": "5.00",
        "ship_compliant_status": "PaymentAccepted",
        "type": "Shipping",
        "address_id": "0",
        "is_exclusive": "0",
        "max_charge": "{\"2\": {\"threshold\": \"13\", \"amount\": \"36.00\"}}",
        "visibility": "Standard"
    }
]
GET /rates/methods/{id} Get Shipping Method

Returns a single shipping method by id, including its max_charge threshold JSON.

Parameters
NameTypeRequiredDescriptionExample
id number Required Shipping method Id
Examples
Request
GET/rates/methods/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3",
    "name": "FedEx Ground",
    "status": "Active",
    "sort": "1",
    "carrier": "FedEx",
    "code": "FEDEX_GROUND",
    "description": "Arrives in 3-5 business days",
    "internal_description": "Domestic ground service",
    "shipping_offer": "0",
    "ice_pack": "1",
    "ice_pack_price": "5.00",
    "ship_compliant_status": "PaymentAccepted",
    "type": "Shipping",
    "address_id": "0",
    "is_exclusive": "0",
    "max_charge": "{\"2\": {\"threshold\": \"13\", \"amount\": \"36.00\"}}",
    "visibility": "Standard"
}
POST /rates/methods Create Shipping Method

Creates a new shipping method. Only the core fields are accepted at create; the remaining settings are applied via a subsequent update.

Parameters
NameTypeRequiredDescriptionExample
name string Required Customer-facing method name
status string Optional Active or Inactive (defaults Active)
carrier string Optional Carrier enum: custom, FedEx, FedExSDC, UPS, VinGoDirect, CopperPeak, DDC, M7, OutoftheBox, Vinfillment, Wineshipping, PNS, WCS, GSO
code string Optional Carrier service code
description string Optional Customer-facing description
Examples
Request
POST/rates/methods
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "FedEx Ground",
    "status": "Active",
    "carrier": "FedEx",
    "code": "FEDEX_GROUND",
    "description": "Arrives in 3-5 business days"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3",
    "name": "FedEx Ground",
    "status": "Active",
    "sort": "1",
    "carrier": "FedEx",
    "code": "FEDEX_GROUND",
    "description": "Arrives in 3-5 business days",
    "internal_description": "Domestic ground service",
    "shipping_offer": "0",
    "ice_pack": "1",
    "ice_pack_price": "5.00",
    "ship_compliant_status": "PaymentAccepted",
    "type": "Shipping",
    "address_id": "0",
    "is_exclusive": "0",
    "max_charge": "{\"2\": {\"threshold\": \"13\", \"amount\": \"36.00\"}}",
    "visibility": "Standard"
}
POST /rates/methods/{id} Update Shipping Method

Updates a shipping method. The derived visibility field round-trips back to status + is_exclusive on save. max_charge is a JSON string keyed by zone.

Parameters
NameTypeRequiredDescriptionExample
id number Required Shipping method Id
name string Optional Customer-facing method name
internal_description string Optional Internal-only description
visibility string Optional Standard | Exclusive | Admin-Only (maps to status + is_exclusive)
type string Optional Shipping | Pickup | 3rdparty | Club
shipping_offer boolean Optional Free-shipping offer flag (1/0)
description string Optional Customer-facing description
carrier string Optional Carrier enum
code string Optional Carrier service code
ship_compliant_status string Optional ''|PaymentAccepted|SentToFulfillment|Delivered
ice_pack boolean Optional Ice pack available flag (1/0)
ice_pack_price number Optional Ice pack surcharge (decimal string)
address_id number Optional Pickup/3rdparty origin address id
max_charge object Optional JSON string of per-zone max-charge thresholds, e.g. {"2":{"threshold":"13","amount":"36.00"}}
Examples
Request
POST/rates/methods/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "FedEx Ground",
    "internal_description": "Domestic ground service",
    "visibility": "Standard",
    "type": "Shipping",
    "shipping_offer": "0",
    "description": "Arrives in 3-5 business days",
    "carrier": "FedEx",
    "code": "FEDEX_GROUND",
    "ship_compliant_status": "PaymentAccepted",
    "ice_pack": "1",
    "ice_pack_price": "5.00",
    "max_charge": "{\"2\": {\"threshold\": \"13\", \"amount\": \"36.00\"}}"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "3",
    "name": "FedEx Ground",
    "status": "Active",
    "sort": "1",
    "carrier": "FedEx",
    "code": "FEDEX_GROUND",
    "description": "Arrives in 3-5 business days",
    "internal_description": "Domestic ground service",
    "shipping_offer": "0",
    "ice_pack": "1",
    "ice_pack_price": "5.00",
    "ship_compliant_status": "PaymentAccepted",
    "type": "Shipping",
    "address_id": "0",
    "is_exclusive": "0",
    "max_charge": "{\"2\": {\"threshold\": \"13\", \"amount\": \"36.00\"}}",
    "visibility": "Standard"
}
POST /rates/methods/{id}/reorder Reorder Shipping Method

Sets the sort position of a shipping method within the method list.

Parameters
NameTypeRequiredDescriptionExample
id number Required Shipping method Id
position number Required New zero-based sort position
Examples
Request
POST/rates/methods/{id}/reorder
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "position": 2
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /rates/rate/{state}/{method_id}/{size} Get Shipping Rate

Scalar rate lookup for a destination state, shipping method and bottle count. Returns the computed rate as a decimal string.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter destination state
method_id number Required Shipping method Id
size number Required Number of bottles
Examples
Request
GET/rates/rate/{state}/{method_id}/{size}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
36
GET /rates/methods/{method_id}/table Get Rate Table

Returns the nested rate grid for a method, shaped { [bottleSize]: { [zone 2-9]: { [numBottles]: rate } } }. The 750mL max-charge thresholds live separately on the method's max_charge JSON.

Parameters
NameTypeRequiredDescriptionExample
method_id number Required Shipping method Id
Examples
Request
GET/rates/methods/{method_id}/table
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "750mL": {
        "2": {
            "1": "18.00",
            "2": "24.00",
            "12": "36.00"
        },
        "3": {
            "1": "20.00",
            "12": "42.00"
        }
    },
    "1.5L": {
        "2": {
            "1": "22.00",
            "6": "60.00"
        }
    }
}
POST /rates/tables Create Rate Table

Creates a new named rate table and returns its new id.

Parameters
NameTypeRequiredDescriptionExample
name string Required Rate table name
Examples
Request
POST/rates/tables
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Standard 2025"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "12"
}
POST /rates/methods/{method_id}/table Save Rate Table

Replaces a method's rate grid. Post the same nested { [bottleSize]: { [zone]: { [numBottles]: rate } } } structure returned by Get Rate Table.

Parameters
NameTypeRequiredDescriptionExample
method_id number Required Shipping method Id
rates object Required Nested rate grid keyed by bottle size, zone, then bottle count
Examples
Request
POST/rates/methods/{method_id}/table
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "750mL": {
        "2": {
            "1": "18.00",
            "2": "24.00",
            "12": "36.00"
        },
        "3": {
            "1": "20.00",
            "12": "42.00"
        }
    },
    "1.5L": {
        "2": {
            "1": "22.00",
            "6": "60.00"
        }
    }
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /rates/tables/{id} Update Rate Table

Updates a standalone rate table by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Rate table Id
rates object Optional Nested rate grid to persist
Examples
Request
POST/rates/tables/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "750mL": {
        "2": {
            "1": "18.00",
            "2": "24.00",
            "12": "36.00"
        },
        "3": {
            "1": "20.00",
            "12": "42.00"
        }
    },
    "1.5L": {
        "2": {
            "1": "22.00",
            "6": "60.00"
        }
    }
}
Response
Headers · 200
Content-Type: application/json
Body
true
DELETE /rates/tables/{id} Delete Rate Table

Deletes a rate table by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Rate table Id
Examples
Request
DELETE/rates/tables/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
GET /rates/zones/state/{state} Get Zone

Returns the default shipping zone for a state as a scalar value.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
Examples
Request
GET/rates/zones/state/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
2
POST /rates/zones/state/{state} Set Zones By State

Sets per-method zones for a state. Post a map of method id to zone; only active methods are applied.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
zones object Required Map of shipping method id to zone number
Examples
Request
POST/rates/zones/state/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "3": "2",
    "4": "3"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /rates/methods/{method_id}/zones Get Shipping Zones By Method

Returns the zone assignment per state for a single shipping method.

Parameters
NameTypeRequiredDescriptionExample
method_id number Required Shipping method Id
Examples
Request
GET/rates/methods/{method_id}/zones
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "CA": {
        "zone": "1"
    },
    "NY": {
        "zone": "4"
    }
}
GET /rates/zones/state/{state}/methods Get Shipping Zones By State

Returns the zone assigned to each shipping method for a given state, shaped { [methodId]: {zone} }.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
Examples
Request
GET/rates/zones/state/{state}/methods
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "3": {
        "zone": "2"
    },
    "4": {
        "zone": "3"
    }
}
GET /rates/ship-dates/state/{state} Get Ship Dates

Returns the allowed ship dates for a state as a comma-separated date list.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
Examples
Request
GET/rates/ship-dates/state/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
2026-02-16, 2026-02-23, 2026-03-02
POST /rates/ship-dates/state/{state} Set Ship Dates

Sets the allowed ship dates for a state. Dates are persisted as a comma-separated list.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
dates string Required Comma-separated list of Y-m-d ship dates
Examples
Request
POST/rates/ship-dates/state/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "dates": "2026-02-16, 2026-02-23, 2026-03-02"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /rates/international/{country}/table Get International Rate Table

Returns the international rate grid for a country, shaped { [bottleSize]: { [1..6|12]: price } }. International shipping rules themselves live in config.

Parameters
NameTypeRequiredDescriptionExample
country string Required Country code or name
Examples
Request
GET/rates/international/{country}/table
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "750mL": {
        "1": "45.00",
        "6": "180.00",
        "12": "300.00"
    },
    "1.5L": {
        "1": "60.00",
        "6": "240.00"
    }
}
POST /rates/international/{country}/table Save International Rate Table

Replaces the international rate grid for a country. Post the same { [bottleSize]: { [count]: price } } structure returned by Get International Rate Table.

Parameters
NameTypeRequiredDescriptionExample
country string Required Country code or name
rates object Required Nested rate grid keyed by bottle size then bottle count
Examples
Request
POST/rates/international/{country}/table
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "750mL": {
        "1": "45.00",
        "6": "180.00",
        "12": "300.00"
    },
    "1.5L": {
        "1": "60.00",
        "6": "240.00"
    }
}
Response
Headers · 200
Content-Type: application/json
Body
true

Config

GET /config Get Config

Returns the full flat key/value config store. Boolean config values wire as the literal strings 'TRUE'/'FALSE'; some values (bottle_sizes, cubing_pack_sizes, case_discount_multi) are JSON-encoded strings.

Examples
Request
GET/config
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "website_url": "https://example.com",
    "enable_tips": "TRUE",
    "enable_international_shipping": "FALSE",
    "enable_store_credit": "TRUE",
    "enable_inventory_locations": "TRUE",
    "default_group": "5",
    "starting_order_id": "1000",
    "starting_customer_id": "500",
    "bottle_sizes": "[\"750mL\", \"375mL\", \"1.5L\"]",
    "payment_descriptor": "EXAMPLE WINERY"
}
GET /config/{key} Get Config Value

Returns a single config value by key. To fetch a subset, the client filters the full config locally.

Parameters
NameTypeRequiredDescriptionExample
key string Required Config key
Examples
Request
GET/config/{key}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
TRUE
POST /config Set Config

Merges the posted key/value pairs into the config store. Booleans must be sent as the strings 'TRUE'/'FALSE'.

Parameters
NameTypeRequiredDescriptionExample
enable_tips boolean Optional Feature flag ('TRUE'/'FALSE')
starting_order_id number Optional Next order id seed
payment_descriptor string Optional Statement descriptor
Examples
Request
POST/config
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "enable_tips": "TRUE",
    "payment_descriptor": "EXAMPLE WINERY"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /config/goals Get Goals

Returns the monthly sales goals, keyed by month number 1-12.

Examples
Request
GET/config/goals
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "1": "50000.00",
    "2": "55000.00",
    "12": "90000.00"
}
POST /config/goals Set Goals

Sets the monthly sales goals. Post a map of month number (1-12) to target amount.

Parameters
NameTypeRequiredDescriptionExample
goals object Required Map of month 1-12 to goal amount
Examples
Request
POST/config/goals
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "1": "50000.00",
    "2": "55000.00"
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /config/state-rules Get State Rules

Returns per-state shipping/tax rules, keyed by state code. tax is a percent, tax_shipping and bypass_sc_tax_rates are '1'/'0', ship_dates is a comma-separated date list.

Examples
Request
GET/config/state-rules
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "CA": {
        "status": "Active",
        "tax": "7.25",
        "zone": "1",
        "tax_shipping": "1",
        "bypass_sc_tax_rates": "0",
        "ship_dates": "2026-02-16, 2026-02-23"
    }
}
GET /config/state-rules/{state} Get Rules For State

Returns the shipping/tax rule for a single state.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
Examples
Request
GET/config/state-rules/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "status": "Active",
    "tax": "7.25",
    "zone": "1",
    "tax_shipping": "1",
    "bypass_sc_tax_rates": "0",
    "ship_dates": "2026-02-16, 2026-02-23"
}
POST /config/state-rules/{state} Update State

Updates the shipping/tax rule for a single state.

Parameters
NameTypeRequiredDescriptionExample
state string Required Two-letter state code
zone number Optional Default shipping zone
ship_dates string Optional Comma-separated Y-m-d ship dates
status string Optional Active | Inactive
tax number Optional Tax rate percent
bypass_sc_tax_rates boolean Optional Bypass Ship Compliant tax rates ('1'/'0')
tax_shipping boolean Optional Apply tax to shipping ('1'/'0')
Examples
Request
POST/config/state-rules/{state}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "zone": "1",
    "ship_dates": "2026-02-16, 2026-02-23",
    "status": "Active",
    "tax": "7.25",
    "bypass_sc_tax_rates": "0",
    "tax_shipping": "1"
}
Response
Headers · 200
Content-Type: application/json
Body
true
POST /config/state-rules Set State Rules

Bulk-replaces the per-state rules. Post a map of state code to rule object.

Parameters
NameTypeRequiredDescriptionExample
rules object Required Map of state code to rule object
Examples
Request
POST/config/state-rules
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "CA": {
        "status": "Active",
        "tax": "7.25",
        "zone": "1",
        "tax_shipping": "1",
        "bypass_sc_tax_rates": "0",
        "ship_dates": "2026-02-16, 2026-02-23"
    },
    "NY": {
        "status": "Active",
        "tax": "8.875",
        "zone": "4",
        "tax_shipping": "0",
        "bypass_sc_tax_rates": "0",
        "ship_dates": ""
    }
}
Response
Headers · 200
Content-Type: application/json
Body
true
GET /config/searches/{type} Get Saved Searches

Returns the saved searches of a given type. Each carries a JSON-encoded search clause list.

Parameters
NameTypeRequiredDescriptionExample
type string Required customers | products | orders
Examples
Request
GET/config/searches/{type}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "5",
        "type": "customers",
        "name": "VIP California",
        "search": "[{\"type\": \"term\", \"key\": \"state\", \"value\": \"CA\"}]"
    }
]
GET /config/international-rules/{country} Get International Rules

Returns the international shipping rule for a country.

Parameters
NameTypeRequiredDescriptionExample
country string Required Country code or name
Examples
Request
GET/config/international-rules/{country}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "2",
    "status": "Active",
    "method_name": "International Standard",
    "method_description": "7-14 business days",
    "method_code": "INTL_STD",
    "use_country_rate": "1",
    "rate_type": "Per Bottle",
    "flat_rate": "0.00"
}
POST /config/international-rules/{country} Set International Rules

Sets the international shipping rule for a country.

Parameters
NameTypeRequiredDescriptionExample
country string Required Country code or name
status string Optional Active | Disabled
method_name string Optional Customer-facing method name
method_description string Optional Customer-facing description
method_code string Optional Carrier service code
use_country_rate boolean Optional Use the country rate table ('1'/'0')
rate_type string Optional Per Bottle | Flat Rate
flat_rate number Optional Flat rate amount when rate_type is Flat Rate
Examples
Request
POST/config/international-rules/{country}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "status": "Active",
    "method_name": "International Standard",
    "method_description": "7-14 business days",
    "method_code": "INTL_STD",
    "use_country_rate": "1",
    "rate_type": "Per Bottle",
    "flat_rate": "0.00"
}
Response
Headers · 200
Content-Type: application/json
Body
true

Webhooks

GET /webhooks Get All Webhooks

Returns all configured webhook subscriptions.

Examples
Request
GET/webhooks
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "7",
        "event": "order.create",
        "url": "https://example.com/hooks/orders",
        "status": "Active",
        "description": "Notify ERP on new orders"
    }
]
POST /webhooks Create Webhook

Creates a webhook subscription for a single event; call once per event you want to subscribe to. Valid event keys: appointment.create, appointment.update, appointment.delete, customer.create, customer.update, customer.delete, customer.address.create, customer.address.update, customer.address.delete, customer.groups.add, customer.groups.remove, customer.membership.create, customer.membership.update, customer.membership.cancel, customer.note.create, customer.note.update, customer.note.delete, group.create, group.update, group.delete, order.create, order.update, order.refund, order.cancel, order.note.create, order.note.update, order.note.delete, product.create, product.update, product.delete, wish.create, wish.grant.

Parameters
NameTypeRequiredDescriptionExample
event string Required Event key from the catalog (e.g. order.create)
url string Required Destination URL to POST the event payload to
status string Optional Active (default)
description string Optional Human-readable label for the subscription
Examples
Request
POST/webhooks
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "event": "order.create",
    "url": "https://example.com/hooks/orders",
    "status": "Active",
    "description": "Notify ERP on new orders"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "7",
    "event": "order.create",
    "url": "https://example.com/hooks/orders",
    "status": "Active",
    "description": "Notify ERP on new orders"
}
POST /webhooks/{id} Update Webhook

Updates an existing webhook subscription.

Parameters
NameTypeRequiredDescriptionExample
id number Required Webhook Id
event string Optional Event key from the catalog
url string Optional Destination URL
status string Optional Active | Inactive
description string Optional Human-readable label
Examples
Request
POST/webhooks/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "url": "https://example.com/hooks/orders-v2",
    "status": "Active",
    "description": "Notify ERP on new orders"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "7",
    "event": "order.create",
    "url": "https://example.com/hooks/orders",
    "status": "Active",
    "description": "Notify ERP on new orders"
}
DELETE /webhooks/{id} Delete Webhook

Deletes a webhook subscription by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Webhook Id
Examples
Request
DELETE/webhooks/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true

InventoryLocations

GET /inventory-locations Get All Inventory Locations

Returns all inventory locations. Gated by config enable_inventory_locations === 'TRUE'.

Examples
Request
GET/inventory-locations
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
[
    {
        "id": "4",
        "name": "Main Warehouse",
        "description": "Primary fulfillment center"
    }
]
GET /inventory-locations/{id} Get Inventory Location

Returns a single inventory location by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Inventory location Id
Examples
Request
GET/inventory-locations/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "4",
    "name": "Main Warehouse",
    "description": "Primary fulfillment center"
}
POST /inventory-locations Create Inventory Location

Creates a new inventory location.

Parameters
NameTypeRequiredDescriptionExample
name string Required Location name
description string Optional Location description
Examples
Request
POST/inventory-locations
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Main Warehouse",
    "description": "Primary fulfillment center"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "4",
    "name": "Main Warehouse",
    "description": "Primary fulfillment center"
}
POST /inventory-locations/{id} Update Inventory Location

Updates an inventory location's name and description.

Parameters
NameTypeRequiredDescriptionExample
id number Required Inventory location Id
name string Optional Location name
description string Optional Location description
Examples
Request
POST/inventory-locations/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Main Warehouse",
    "description": "Primary fulfillment center"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "4",
    "name": "Main Warehouse",
    "description": "Primary fulfillment center"
}
DELETE /inventory-locations/{id} Delete Inventory Location

Deletes an inventory location by id.

Parameters
NameTypeRequiredDescriptionExample
id number Required Inventory location Id
Examples
Request
DELETE/inventory-locations/{id}
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /inventory-locations/init Initialize Inventory Locations

Bootstraps the default inventory location (typically named 'Default') when inventory locations are first enabled.

Parameters
NameTypeRequiredDescriptionExample
name string Optional Name for the default location (defaults to 'Default')
Examples
Request
POST/inventory-locations/init
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "name": "Default"
}
Response
Headers · 200
Content-Type: application/json
Body
{
    "id": "1",
    "name": "Default",
    "description": ""
}

TaxRates

DELETE /tax-rates Clear Tax Rates

Wipes the entire ZIP-to-rate tax table. Used as the first step of a full tax-rate sync before re-inserting rates.

Examples
Request
DELETE/tax-rates
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Response
Headers · 200
Content-Type: application/json
Body
true
POST /tax-rates Insert Tax Rate

Inserts a single ZIP-to-rate row into the tax table. During a full sync this is called once per ZIP after Clear Tax Rates.

Parameters
NameTypeRequiredDescriptionExample
zip string Required 5-digit zero-padded ZIP code
rate number Required Sales tax rate (numeric, from Ship Compliant)
Examples
Request
POST/tax-rates
Headers
Content-Type: application/json
X-Auth-Token: XXXXXXXXX
Body
{
    "zip": "94558",
    "rate": "7.75"
}
Response
Headers · 200
Content-Type: application/json
Body
true
Public URL copied