REST API για πελάτες του Syncore. Κάθε token ανήκει σε έναν χρήστη και βλέπει μόνο τα δεδομένα της δικής του επιχείρησης. Τα tokens δημιουργούνται στο Προφίλ με δικαιώματα (abilities). Όριο αιτημάτων ανά λεπτό ανάλογα με το πλάνο, και προαιρετικά χαμηλότερο όριο ανά token (429 με Retry-After όταν ξεπεραστεί).
Όλα τα endpoints, όπως περιγράφονται στο openapi.json. Βάση: https://app.syncore.gr/api/v1
· Authorization: Bearer <token>
· v1.0.0
· openapi.json
Products
get
/api/v1/products
Λίστα προϊόντων
products:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100 -
searchquery · string — SKU ή όνομα -
skuquery · string — SKUs χωρισμένα με κόμμα -
supplier_idquery · integer -
enabledquery · integer [0, 1] -
stock_statusquery · string [in_stock, low_stock, out_of_stock]
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": [ { "id": 1, "sku": "string", "ean": "string", "name": "string", "brand": "string", "supplier": { "id": 1, "name": "string" }, "base_price": 19.9, "final_price": 19.9, "manual_price": true, "enabled": true, "supplier_stock": 1, "variant_count": 1, "updated_at": "2026-10-29T10:00:00+02:00" } ], "meta": { "current_page": 1, "per_page": 1, "total": 1, "last_page": 1 }, "links": {} } -
403Το token δεν έχει το απαιτούμενο δικαίωμα -
429Ξεπεράστηκε το όριο αιτημάτων· δες Retry-After
get
/api/v1/products/{id}
Ένα προϊόν
products:read
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": { "id": 1, "sku": "string", "ean": "string", "name": "string", "brand": "string", "supplier": { "id": 1, "name": "string" }, "base_price": 19.9, "final_price": 19.9, "manual_price": true, "enabled": true, "supplier_stock": 1, "variant_count": 1, "updated_at": "2026-10-29T10:00:00+02:00" } } -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
patch
/api/v1/products/{id}
Ενεργό / χειροκίνητη τιμή
products:write (+ prices:write για manual_price)
Παράμετροι
-
idpath · integer υποχρεωτικό
Σώμα αιτήματος (JSON)
-
enabledboolean -
manual_pricenumber|null — null = επιστροφή στους κανόνες τιμών
Παράδειγμα
{
"enabled": true,
"manual_price": 19.9
}
Απαντήσεις
-
200OK -
403Το token δεν έχει το απαιτούμενο δικαίωμα -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
Inventory
get
/api/v1/inventory
Δικό σου απόθεμα
inventory:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100 -
searchquery · string
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": [ { "product_id": 1, "sku": "string", "name": "string", "quantity": 1, "reserved": 1, "last_sync_at": "2026-10-29T10:00:00+02:00" } ], "meta": { "current_page": 1, "per_page": 1, "total": 1, "last_page": 1 } }
put
/api/v1/inventory/{sku}
Ορισμός αποθέματος για ένα SKU
inventory:write
Παράμετροι
-
skupath · string υποχρεωτικό
Σώμα αιτήματος (JSON)
-
quantityinteger υποχρεωτικό min 0 -
notesstring
Παράδειγμα
{
"quantity": 1,
"notes": "string"
}
Απαντήσεις
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
post
/api/v1/inventory/bulk
Μαζική ενημέρωση (έως 500)
inventory:write
Σώμα αιτήματος (JSON)
-
itemsarray<object> υποχρεωτικό max items 500-
skustring υποχρεωτικό -
quantityinteger υποχρεωτικό min 0
-
Παράδειγμα
{
"items": [
{
"sku": "string",
"quantity": 1
}
]
}
Απαντήσεις
-
200updated / failed / not_found λίστες SKU
Orders
get
/api/v1/orders
Λίστα παραγγελιών
orders:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100 -
statusquery · string [pending, processing, shipped, completed, cancelled, refunded] -
source_channelquery · string -
searchquery · string -
placed_fromquery · string -
placed_toquery · string -
updated_sincequery · string
Απαντήσεις
-
200OK
post
/api/v1/orders
Νέα παραγγελία από το δικό σου κατάστημα (idempotent στο external_ref)
orders:write
Σώμα αιτήματος (JSON)
-
external_refstring υποχρεωτικό — ο κωδικός της παραγγελίας στο κατάστημά σου -
order_numberstring -
currencystring default EUR -
shipping_costnumber -
payment_methodstring -
notesstring -
placed_atstring -
customerobject-
namestring -
emailstring -
phonestring
-
-
shipping_addressobject -
billing_addressobject -
itemsarray<object> υποχρεωτικό max items 500-
skustring υποχρεωτικό -
namestring -
quantityinteger υποχρεωτικό min 1 -
unit_pricenumber υποχρεωτικό
-
Παράδειγμα
{
"external_ref": "string",
"order_number": "string",
"currency": "string",
"shipping_cost": 19.9,
"payment_method": "string",
"notes": "string",
"placed_at": "2026-10-29T10:00:00+02:00",
"customer": {
"name": "string",
"email": "string",
"phone": "string"
},
"shipping_address": {
"key": "string"
},
"billing_address": {
"key": "string"
},
"items": [
{
"sku": "string",
"name": "string",
"quantity": 1,
"unit_price": 19.9
}
]
}
Απαντήσεις
-
201Δημιουργήθηκε -
200Υπήρχε ήδη (ίδιο external_ref) -
422Λάθος δεδομένα: {message, errors}
get
/api/v1/orders/{id}
Μία παραγγελία με γραμμές
orders:read
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": { "id": 1, "order_number": "string", "external_ref": "string", "source_channel": "string", "status": "pending", "currency": "string", "subtotal": 19.9, "shipping_cost": 19.9, "total_amount": 19.9, "customer": { "name": "string", "email": "string", "phone": "string" }, "items": [ { "product_id": 1, "sku": "string", "name": "string", "quantity": 1, "unit_price": 19.9, "total_price": 19.9 } ] } } -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
patch
/api/v1/orders/{id}/status
Αλλαγή κατάστασης (επόμενο βήμα ή ακύρωση)
orders:write
pending → processing → shipped → completed· cancelled από κάθε μη τελική κατάσταση. Άλλη μετάβαση: 422 με allowed.
Παράμετροι
-
idpath · integer υποχρεωτικό
Σώμα αιτήματος (JSON)
-
statusstring υποχρεωτικό ["processing", "shipped", "completed", "cancelled"]
Παράδειγμα
{
"status": "processing"
}
Απαντήσεις
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
post
/api/v1/orders/{id}/shipment
Αποστολή με μεταφορική και αριθμό αποστολής
orders:write
Η παραγγελία γίνεται shipped και η μεταφορική/αριθμός αποστολής στέλνονται (στην ουρά) στο κανάλι προέλευσης (Skroutz, Shopflix, eMAG, Trendyol, Temu, TikTok Shop). Η πρόοδος φαίνεται στο shipment.push_status (pending, success, failed, skipped). Επανάληψη με τα ίδια στοιχεία ξαναδοκιμάζει μόνο αν δεν έχει πετύχει.
Παράμετροι
-
idpath · integer υποχρεωτικό
Σώμα αιτήματος (JSON)
-
courierstring υποχρεωτικό max length 64 -
tracking_numberstring υποχρεωτικό max length 128
Παράδειγμα
{
"courier": "string",
"tracking_number": "string"
}
Απαντήσεις
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
Suppliers
get
/api/v1/suppliers
Οι προμηθευτές σου
suppliers:read
Απαντήσεις
-
200OK
Channels
get
/api/v1/channels
Κανάλια πώλησης
channels:read
Απαντήσεις
-
200OK
get
/api/v1/feeds
Διευθύνσεις feeds ανά κανάλι
feeds:read
Απαντήσεις
-
200OK
Price rules
get
/api/v1/price-rules
Κανόνες τιμών
prices:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100
Απαντήσεις
-
200OK
post
/api/v1/price-rules
Νέος κανόνας
prices:write
Σώμα αιτήματος (JSON)
-
namestring -
descriptionstring -
rule_typeinteger [1, 2, 3] — 1 ποσοστό, 2 σταθερό ποσό, 3 σταθερή τιμή -
valuenumber min 0 -
price_rule_scopeinteger [1, 2, 3, 4] — 1 όλα, 2 προμηθευτής, 3 κατηγορία, 4 προϊόν -
global_supplier_idinteger -
global_category_idinteger -
global_product_idinteger -
rule_conditionsboolean -
price_comparisoninteger [1, 2] — 1 μικρότερη από, 2 μεγαλύτερη από -
price_thresholdnumber -
is_enabledboolean
Παράδειγμα
{
"name": "string",
"description": "string",
"rule_type": 1,
"value": 19.9,
"price_rule_scope": 1,
"global_supplier_id": 1,
"global_category_id": 1,
"global_product_id": 1,
"rule_conditions": true,
"price_comparison": 1,
"price_threshold": 19.9,
"is_enabled": true
}
Απαντήσεις
-
201Δημιουργήθηκε -
422Λάθος δεδομένα: {message, errors}
get
/api/v1/price-rules/{id}
Ένας κανόνας
prices:read
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
patch
/api/v1/price-rules/{id}
Αλλαγή (μερική)
prices:write
Παράμετροι
-
idpath · integer υποχρεωτικό
Σώμα αιτήματος (JSON)
-
namestring -
descriptionstring -
rule_typeinteger [1, 2, 3] — 1 ποσοστό, 2 σταθερό ποσό, 3 σταθερή τιμή -
valuenumber min 0 -
price_rule_scopeinteger [1, 2, 3, 4] — 1 όλα, 2 προμηθευτής, 3 κατηγορία, 4 προϊόν -
global_supplier_idinteger -
global_category_idinteger -
global_product_idinteger -
rule_conditionsboolean -
price_comparisoninteger [1, 2] — 1 μικρότερη από, 2 μεγαλύτερη από -
price_thresholdnumber -
is_enabledboolean
Παράδειγμα
{
"name": "string",
"description": "string",
"rule_type": 1,
"value": 19.9,
"price_rule_scope": 1,
"global_supplier_id": 1,
"global_category_id": 1,
"global_product_id": 1,
"rule_conditions": true,
"price_comparison": 1,
"price_threshold": 19.9,
"is_enabled": true
}
Απαντήσεις
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
delete
/api/v1/price-rules/{id}
Διαγραφή
prices:write
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
204Διαγράφηκε -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
Prices
get
/api/v1/prices
Τελικές τιμές πώλησης
prices:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100 -
skuquery · string — SKUs χωρισμένα με κόμμα -
supplier_idquery · integer
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": [ { "product_id": 1, "sku": "string", "base_price": 19.9, "final_price": 19.9, "manual_price": true, "price_rule_id": 1, "updated_at": "2026-10-29T10:00:00+02:00" } ], "meta": { "current_page": 1, "per_page": 1, "total": 1, "last_page": 1 }, "links": {} }
Invoices
get
/api/v1/invoices
Παραστατικά Oxygen (τιμολόγια, αποδείξεις, πιστωτικά)
invoices:read
Παράμετροι
-
pagequery · integer -
per_pagequery · integer max 100 -
statusquery · string [pending, issued, failed] -
kindquery · string [invoice, credit_note] -
order_idquery · integer
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": [ { "id": 1, "order_id": 1, "kind": "invoice", "status": "pending", "document_type": "string", "mydata_type": "string", "number": "string", "mark": "string", "total": 19.9, "is_paid": true, "pdf_url": "https://example.com/path", "error": "string", "issued_at": "2026-10-29T10:00:00+02:00", "created_at": "2026-10-29T10:00:00+02:00" } ], "meta": { "current_page": 1, "per_page": 1, "total": 1, "last_page": 1 }, "links": {} }
get
/api/v1/invoices/{id}
Ένα παραστατικό (pdf_url: σύνδεσμος προβολής/PDF του Oxygen)
invoices:read
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
200OKΠαράδειγμα
{ "data": { "id": 1, "order_id": 1, "kind": "invoice", "status": "pending", "document_type": "string", "mydata_type": "string", "number": "string", "mark": "string", "total": 19.9, "is_paid": true, "pdf_url": "https://example.com/path", "error": "string", "issued_at": "2026-10-29T10:00:00+02:00", "created_at": "2026-10-29T10:00:00+02:00" } } -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
Webhooks
get
/api/v1/webhooks
Webhook endpoints
webhooks:manage
Απαντήσεις
-
200OK
post
/api/v1/webhooks
Νέο endpoint (το secret επιστρέφεται μία φορά)
webhooks:manage
Κάθε αποστολή: POST JSON {id, event, created_at, data} με headers X-Syncore-Event, X-Syncore-Delivery, X-Syncore-Timestamp και X-Syncore-Signature = sha256=HEX(HMAC-SHA256(secret, timestamp + '.' + body)). Μη-2xx απάντηση ξαναδοκιμάζεται (1, 5, 30 λεπτά, 2 ώρες). stock.low: μία φορά όταν το απόθεμα πέφτει στο όριο χαμηλού αποθέματος (data: product_id, sku, quantity, quantity_before, reserved, threshold). feed.generated: data: channel, trigger, products_count, file_size, feed_url, generated_at.
Σώμα αιτήματος (JSON)
-
urlstring υποχρεωτικό — δημόσια https διεύθυνση -
eventsarray<string> υποχρεωτικό
Παράδειγμα
{
"url": "https://example.com/path",
"events": [
"order.created"
]
}
Απαντήσεις
-
201Δημιουργήθηκε (περιέχει secret) -
422Λάθος δεδομένα: {message, errors}
delete
/api/v1/webhooks/{id}
Διαγραφή endpoint
webhooks:manage
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
204Διαγράφηκε -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
post
/api/v1/webhooks/{id}/rotate-secret
Νέο secret υπογραφής (επιστρέφεται μία φορά· το παλιό παύει αμέσως)
webhooks:manage
Παράμετροι
-
idpath · integer υποχρεωτικό
Απαντήσεις
-
200OK (περιέχει secret) -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)