Skip to content
Syncore

Errors

The API always answers JSON, even when the request sends no Accept: application/json.

Error format

Every error has a human-readable message (most Syncore messages are in Greek). Validation errors (422) also have errors, a list of codes or messages per field:

{
  "message": "The quantity field is required.",
  "errors": {
    "quantity": ["The quantity field is required."]
  }
}

Base your code on the HTTP status and the keys of errors, not on the message text, which may change.

Status codes

Code Meaning What to do
200 Success —
201 Created —
204 Deleted (no body) —
401 Token missing, wrong or expired Check the Authorization header
402 The business has no active subscription Activate a subscription in Syncore
403 The token lacks the ability, or the user is not allowed on the API Create a token with the right ability
404 Not found — or it belongs to another business Check the id / SKU
422 Invalid data or action not allowed Read errors
429 Rate limit exceeded Wait Retry-After seconds
500 Syncore error Retry later

402 — no subscription

{ "message": "Δεν υπάρχει ενεργή συνδρομή." }

("There is no active subscription.")

403 — user not allowed on the customer API

{ "message": "Το token δεν επιτρέπεται στο API πελατών." }

429 — rate limit

{ "message": "Πάρα πολλά αιτήματα. Δοκίμασε ξανά σε λίγο." }

with the headers Retry-After, X-RateLimit-Limit and X-RateLimit-Remaining: 0. See Authentication & limits.

Special codes in errors

Field / code When
status: ["transition_not_allowed"] The order status change or shipment is not allowed now. The status change response also has allowed, the statuses allowed now.
enabled: ["plan_limit"] Enabling the product exceeds the plan limit.
{
  "message": "Η αλλαγή κατάστασης δεν επιτρέπεται.",
  "errors": { "status": ["transition_not_allowed"] },
  "allowed": ["processing", "cancelled"]
}

Retries

  • 429 and 5xx: retry with a wait (exponential backoff).
  • 4xx (other than 429): do not resend the same request; fix it.
  • POST /orders is idempotent on external_ref: a retry returns the same order with 200.