Skip to main content
Snappy maintains two API versions in parallel: V2 (legacy, fully supported) and V3 (current, JSON:API-aligned). Most conventions on this page differ between the two - this page documents both, with V3 as the going-forward standard.
Same API key, different conventions. The same X-Api-Key authenticates both V2 and V3 - the version is in the URL path (/v2/... vs /v3/...). Pick the version that matches your endpoint; the conventions on this page follow the version of the endpoint you’re calling.

Version Conventions at a Glance

Field Selection

Snappy lets you control which fields a response includes via the fields query parameter on GET requests. This is particularly useful for mobile integrations and high-volume data processing where bandwidth and parsing speed matter. The fields parameter works identically in V2 and V3.

Constraints

  • Parent object only. fields applies to the primary object in the response - you can’t project fields on nested objects via this parameter.
  • No spaces. Use commas only (id,name,type), not id, name, type.
  • Case-sensitive. Field names must match the casing in the API reference exactly.
  • Defaults vary by endpoint. Each endpoint documents its own default field set - check the endpoint reference if you’re seeing fewer fields than expected.
To reduce round-trips, both V2 and V3 let you hydrate related entities inline - replacing a foreign-key reference with the full related object. The parameter name and syntax differ.

V3 - include (JSON:API)

In V3, the include query parameter takes a comma-separated list of related-entity names. Hydrated entities appear inline within their parent. Example:
The brand field is replaced by the full Brand object, and tags returns the full Tag objects rather than just IDs. Common V3 expandable entities:
  • Products / Collections - brand, tags
  • Orders - (no V3 includes; responses already carry full line items, recipient, and fulfillments) The API reference for each endpoint lists supported include values.

V2 - expand[]

In V2, the expand[] query parameter takes an array of expandable entity names. Each ID-based reference becomes the full object. Default V2 response:
Request with expansion:
Expanded response:
Common V2 expandable entities: product, recipient, campaign.

Best practices (both versions)

  • Only hydrate what your client actually needs - every expansion adds latency and payload weight.
  • Expansion is especially valuable for mobile clients where round-trip count is the bottleneck.
  • In V2 you can combine expand[] with fields projection; in V3 you can combine include with additive fields.

Pagination

V2 uses offset-based pagination; V3 uses JSON:API page-number pagination (with cursor pagination on a small number of high-volume endpoints).

V3 - page[number] / page[size] (page-number, default)

Most V3 list endpoints use 1-indexed page-number pagination.

V3 - page[cursor] / page[size] (cursor, product list endpoints)

A small number of high-volume V3 endpoints - currently GET /v3/products, GET /v3/collections/{collectionId}/products, and GET /v3/products/{productId}/variants - use cursor pagination instead.
Why both styles? Cursor pagination is more efficient and stable on high-volume, append-heavy catalogs (where new products keep arriving). Page-number is more intuitive for finite collections like Orders or Accounts. The endpoint documentation always specifies which style applies.

V2 - skip / limit (offset)

V2 list endpoints use offset-based pagination.
  1. The number of items in results is less than limit.
  2. results is empty.

Filtering (V3)

V3 standardizes filtering with JSON:API-style filter[field] query parameters. Range filters use nested brackets: filter[field][gte] (inclusive lower bound) and filter[field][lte] (inclusive upper bound).
Common patterns across V3:
  • Exact match - filter[status]=active
  • Multi-value - filter[idempotencyKey]=key_a,key_b,key_c (comma-separated)
  • Range - filter[price][gte]=25&filter[price][lte]=200
  • Free-text search - filter[search]=cold+brew V2 endpoints filter too, but the parameter names and shapes are bespoke per endpoint - check the endpoint documentation.

Sorting (V3)

V3 standardizes sorting with a single sort query parameter. Prefix the field with - for descending order. Single field per request.
Each endpoint documents its supported sort fields and default sort order. V2 endpoints sort too, but the parameter is bespoke per endpoint.

Metadata

Metadata lets you attach custom key-value pairs to Snappy resources (Gifts, Orders, etc.). Metadata round-trips: any pairs you provide at creation appear in subsequent GET responses and in webhook payloads. Supported on both V2 and V3.

Date Formats

Both V2 and V3 use ISO 8601 for all date and time fields. All timestamps are returned in UTC.
  • Format: YYYY-MM-DDTHH:mm:ss.sssZ
  • Example: 2026-04-13T12:00:00.000Z

Error Responses

When a request can’t be processed, Snappy returns a flat error object alongside the relevant HTTP status code. The error shape is the same in V2 and V3. The structure differs slightly between validation errors (HTTP 400) and all other errors. Validation errors (HTTP 400):
All other errors (401, 403, 404, 409, 422, 5xx):
Last modified on July 2, 2026