Gett Developer Portal
  • Welcome
  • Distribution Partners
  • Brand Partners
  • Commerce Partners
  • Ecosystem Partners
  • Errors
  • API Reference
Documentation
  • Get Started
  • Marketfront SDK
  • API Reference
Resources
  • Payments
Company
  • Gett
  • Terms of Service
  • Privacy Policy

Copyright 2026 Gett. All rights reserved.

Marketfront SDK
Marketfront API
    Getting StartedConventionsOrder LifecycleCatalogSet
    API Reference
Marketfront AI
Shared Guides
powered by Zuplo
Marketfront API

API Conventions

This section covers the core mechanics of the Marketfront API, including error handling, rate limiting, and caching.

Authentication

All requests require a Bearer token in the Authorization header. See the Authentication guide for key management, environment setup, and security best practices.

Money & amounts

Every monetary value is a self-describing money object: the amounts breakdown carries a currency (ISO 4217, e.g. USD) and each amount is a decimal string — "10.50", never a bare JSON number.

Code
{ "amounts": { "currency": "USD", "subTotal": "18.00", "fees": "2.99", "taxes": "1.71", "tip": "3.00", "total": "25.70" } }

Send amounts the same way you receive them — as strings (e.g. amounts.tip on validateOrder).

Why strings? Parsing money as a JSON number invites IEEE-754 drift (0.1 + 0.2 !== 0.3). A decimal string parsed with a decimal/big-decimal type on your side is exact. Currency is explicit so you never have to assume USD.

Schema inheritance

Some schemas in the API reference render as allOf: [{$ref: Base}, {additional properties}]. Read this as inheritance — the object has all the fields from the referenced base schema, plus the additional ones listed. For example, DeliveryFulfillment extends Fulfillment (adding address, deliveryType, instructions), and OrderPlaceRequest extends OrderValidateRequest (adding payment).

This is why a field can appear once and apply everywhere. The required client object is declared on OrderCore, so both validateOrder and placeOrder carry it — see End-user client context.

Decimal places per currency

An amount must not carry more decimal places than its currency's minor unit, or the request is rejected with 422 PRECISION_EXCEEDED. Round to the currency's scale before sending.

Minor-unit scaleExample currenciesExample
2 (default)USD, EUR, GBP, CAD, AUD"10.50"
0JPY, KRW, VND, CLP"1000"
3BHD, KWD, OMR, TND"10.500"

Error Handling

All error responses use RFC 9457 application/problem+json format. Every error includes machine-readable fields (errorCategory, retryable, retryAfter) for programmatic handling. Domain-specific errors include an errorCode field identifying the specific issue.

The API supports content negotiation via the Accept header — request text/markdown for a compact text representation suitable for AI agents and CLI tooling. See the Error Reference for full details.

HTTP Status Codes

StatusMeaning
400Invalid request body, missing fields, or domain-specific errors (see errorCode)
401Missing or invalid API key
404Resource does not exist
409Conflict (e.g., order token already used)
422Request-shape or semantic validation of the request body failed (e.g. malformed body, PRECISION_EXCEEDED)
429Rate limit exceeded
500Unexpected server error

Order/business validation is different

validateOrder never returns a 4xx for business or order problems (item unavailable, store closed, minimum not met, etc.). It returns HTTP 200 with isValid: false and a populated errors[] on the Order body. Only malformed requests and authentication failures produce 4xx from that endpoint. See Validation vs Placement in the Order Lifecycle guide.

Error Codes

Domain-specific errors include an errorCode field.

Cart & Item Errors

CodeDescriptionAction
CART_EMPTYCart has no itemsAdd items before validating
CATALOGSET_REQUIREDCart creation requires a catalogSetIdInclude catalogSetId when cart is null
ITEM_UNAVAILABLEItem no longer availableRemove from cart and re-validate
MODIFIER_REQUIREDRequired modifier group has no selectionPrompt user to select
ORDER_BELOW_MINIMUMBelow store's order minimumAdd more items

Store Errors

CodeDescriptionAction
STORE_CLOSEDStore is no longer openRe-discover stores
STORE_NOT_FOUNDStore does not existRe-discover stores
CATALOGSET_NOT_FOUNDCatalogSet does not existRe-discover for updated catalogSetId

Payment Errors

CodeDescriptionAction
PAYMENT_FAILEDTransient processing failureRetry with the same idempotency key
PAYMENT_METHOD_INVALIDPayment method payload not validRe-prompt the user for payment details
PAYMENT_DECLINEDDeclined by issuerUse a different payment method

Order Errors

CodeDescriptionAction
ORDER_TOTAL_DIFFERENTTotal changed since validationRe-validate the order
ORDER_ALREADY_PLACEDIdempotency-key conflictThis order was already placed

Open enum: order errors[].code

The errors[].code values on an order (both validateOrder 200 responses and placeOrder 4xx ProblemDetail responses) are an open enum (x-extensible-enum). The set above lists the current values but is not exhaustive — new codes may be added as new failure modes are identified. Clients must handle unknown values as OTHER and must not hard-fail on an unrecognized code. Do not deserialize into a closed/strict enum type. See the full code table with suggested actions in the Order Lifecycle guide.

This is distinct from the top-level ProblemDetail.errorCode field (a single string naming the overall failure reason on a 4xx place response).

Address Errors

CodeDescriptionAction
ADDRESS_INVALIDCould not be validatedVerify the address
ADDRESS_OUT_OF_RANGEOutside store's delivery zoneChoose a different store

Authentication Errors

CodeHTTPDescriptionAction
SESSION_USER_REQUIRED401Endpoint requires an authenticated user identityEnsure the end user is signed in before making this request

Retry Strategy

CategoryRetryable?Strategy
401 UnauthorizedNoFix your API key
400 Bad RequestNoFix the request
404 Not FoundNoResource doesn't exist
429 Too Many RequestsYesWait for X-RateLimit-Reset, then retry
500 Internal ErrorYesExponential backoff (1s, 2s, 4s, max 30s)

Always include the requestId when contacting support about a specific error.

Rate Limits

Per-partner rate limits ensure fair usage and platform stability.

Endpoint TypeLimitExamples
Read operations1,000/min/stores/discover, /catalog-sets/{catalogSetId}
Write operations100/min/orders/validate, /orders/place
Store discovery60/min/stores/discover (also counted under reads)

Sandbox rate limits are 5x higher than production.

Rate limits are scoped to your partner organization — all keys belonging to the same organization share the same quota.

Every response includes rate limit headers:

HeaderDescription
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets

When rate limited, the API returns 429 Too Many Requests. Read the X-RateLimit-Reset header to know when to retry. If the header is missing, use exponential backoff starting at 1 second.

Caching Strategy

Data TypeStrategyWhy
Store resultsNever cacheStore status changes constantly
CatalogSetsCache aggressivelyImmutable — use catalogSetId as cache key
Validation tokensExpire in 15 minSecurity and price accuracy
Getting StartedOrder Lifecycle
On this page
  • Authentication
  • Money & amounts
    • Schema inheritance
    • Decimal places per currency
  • Error Handling
    • HTTP Status Codes
    • Error Codes
    • Retry Strategy
  • Rate Limits
  • Caching Strategy
JSON