Beta Delivery Zone is in private beta and not yet open to customers — public launch coming soon.
Developer documentation

Delivery Zone API.

One authenticated endpoint. Send a postcode and basket value — get back a clear delivery decision, zone, price, and reason code.

POST/api/v1/delivery/check

Public Delivery Check API Contract

This API is used by external systems (custom backends, checkouts, or ERPs) to check if a postcode is deliverable based on your configured delivery zones and rules.

[!WARNING] Permitted use — real-time validation only. API responses must not be stored, cached, bulk-collected, exported, resold, or used to create, enrich, reconstruct, or replace any postcode, address, distance, delivery-zone, geographic, or similar dataset. Automated scraping, systematic enumeration, or bulk querying of the API is prohibited. Full restrictions: API Terms of Use and Acceptable Use Policy.
<strong>Note.</strong> The Finland postcode dataset is centrally managed by Gn-Projects / Delivery Zone. Customers do not upload, export, or download raw postcode data. The API returns delivery decisions based on this central dataset and your specific zone rules. Beta dataset note: During private beta, the active postcode dataset uses licensed third-party Finnish postcode reference data. Coordinates are estimated centroid values and are provided without accuracy warranty.

Endpoint

POST /api/v1/delivery/check

Headers

  • X-Api-Key: Your public API key.
  • Content-Type: application/json

Request Body

{
  "destinationPostcode": "00100",
  "basketValueCents": 4500
}

Success Responses (200 OK)

A 200 OK is returned for any valid check that completes, regardless of whether delivery is possible.

Deliverable

{
  "canDeliver": true,
  "matchedZoneName": "Helsinki Center",
  "priceCents": 590,
  "currency": "EUR",
  "estimatedDeliveryMinutes": 45,
  "reasonCode": "DELIVERABLE",
  "reasonMessage": "Delivery is available."
}

Not Deliverable

{
  "canDeliver": false,
  "reasonCode": "NOT_DELIVERABLE",
  "reasonMessage": "Delivery is not available for this postcode."
}

Not Deliverable — Minimum Order Not Met

{
  "canDeliver": false,
  "reasonCode": "BASKET_VALUE_TOO_LOW",
  "reasonMessage": "The location is covered, but the minimum order value was not met."
}
<strong>Note.</strong> All non-deliverable outcomes that relate to postcode coverage or zone configuration return the generic NOT_DELIVERABLE reason code. This is intentional. Internal zone identifiers, raw distances, and postcode dataset membership signals are never included in the public API response.

Error Responses

400 Bad Request

The request was malformed or the postcode format was fundamentally invalid.

{
  "canDeliver": false,
  "reasonCode": "INVALID_POSTCODE",
  "reasonMessage": "The provided postcode format is invalid."
}

401 Unauthorized

{
  "error": "Invalid API key"
}

402 Payment Required

Your organisation's monthly plan quota has been exhausted. Upgrade your plan or wait for your quota to reset at the start of the next billing period. Do not retry this request automatically — the result will not change until your quota resets or your plan is upgraded.

{
  "canDeliver": false,
  "reasonCode": "PLAN_LIMIT_EXCEEDED",
  "reasonMessage": "Your plan's API quota has been exhausted. Please upgrade your plan or wait for your quota to reset."
}

429 Too Many Requests

Your requests are arriving faster than your plan's per-minute rate limit allows. Back off and retry after a short delay. This is a temporary condition — no plan change is required.

{
  "canDeliver": false,
  "reasonCode": "RATE_LIMITED",
  "reasonMessage": "Too many requests. Please slow down and try again shortly."
}

503 Service Unavailable

The system is currently unable to process requests (e.g. no active central dataset).

{
  "canDeliver": false,
  "reasonCode": "NO_ACTIVE_DATASET",
  "reasonMessage": "Service temporarily unavailable."
}

Authentication

All requests require an X-Api-Key header. Get your key by creating a free account. Keys are scoped per environment and can be rotated from the dashboard.

Rate limits

Rate limits vary by plan. The Free plan allows 500 checks per month. Exhausting your monthly quota returns HTTP 402 Payment Required with PLAN_LIMIT_EXCEEDED — upgrade your plan or wait for the next billing period. Exceeding your per-minute request rate returns HTTP 429 Too Many Requests — back off and retry.