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
429and5xx: retry with a wait (exponential backoff).4xx(other than429): do not resend the same request; fix it.POST /ordersis idempotent onexternal_ref: a retry returns the same order with200.