Authentication & limits
Bearer token
Every request to https://app.syncore.gr/api/v1 needs the header:
Authorization: Bearer <TOKEN>
The token is a personal access token of the user who created it (Profile → API tokens). It works only when:
- the user belongs to a business (store admin or store user) and the account is active,
- the business has an active subscription (or one that is past due),
- the token has not expired or been revoked.
Otherwise the answer is 401, 402 or 403 — see Errors. Every call is logged (method, route, status, duration).
Abilities
Every token has one or more abilities. An endpoint whose ability the token lacks answers 403.
| Ability | Allows |
|---|---|
products:read |
List and read products |
products:write |
Enable / disable products |
prices:read |
Final prices, price rules |
prices:write |
Manual price; create / change / delete price rules |
inventory:read |
Your own stock |
inventory:write |
Set stock (one SKU or in bulk) |
orders:read |
List and read orders |
orders:write |
Create orders, change status, ship |
suppliers:read |
Your suppliers |
channels:read |
Sales channels |
feeds:read |
Feed URLs |
invoices:read |
Oxygen invoices |
webhooks:manage |
Manage webhook endpoints |
PATCH /products/{id} with manual_price also needs prices:write.
MCP tokens have separate abilities (mcp, mcp:write) and do not work on the REST API — see MCP.
Rate limits
The limit is counted per minute, per business (all its tokens together) and depends on the plan:
| Plan | Requests / minute |
|---|---|
| Marketplace only | 60 |
| E-shop sync | 300 |
| Full ecosystem | 1000 |
| No plan | 60 |
On top of that, each token can have its own lower limit (set on the Profile page when you create it, or later). Then both limits apply.
Every response carries headers for the tighter limit:
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 287
When it is exceeded the answer is 429 with Retry-After (seconds):
HTTP/1.1 429 Too Many Requests
Retry-After: 42
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 0
{"message": "Πάρα πολλά αιτήματα. Δοκίμασε ξανά σε λίγο."}
Wait as long as Retry-After says before you retry. For many stock changes use the bulk POST /inventory/bulk (up to 500 SKUs per request).
Plan and API limits
| Limit | Value |
|---|---|
| Results per page | 25 by default, up to 100 |
| Bulk stock | up to 500 SKUs per request |
| Order lines | up to 500 per order |
| Webhook endpoints | up to 10 per business |
| Enabled products | as many as your plan allows |
Enabling a product beyond the plan limit answers 422 with errors.enabled = ["plan_limit"].
Error
messagetexts are in Greek. Base your code on the HTTP status and the keys inerrors, not on the message text.