REST API για πελάτες του Syncore. Κάθε token ανήκει σε έναν χρήστη και βλέπει μόνο τα δεδομένα της δικής του επιχείρησης. Τα tokens δημιουργούνται στο Προφίλ με δικαιώματα (abilities). Όριο αιτημάτων ανά λεπτό ανάλογα με το πλάνο, και προαιρετικά χαμηλότερο όριο ανά token (429 με Retry-After όταν ξεπεραστεί).
Every endpoint, as described in openapi.json. Base URL: https://app.syncore.gr/api/v1
· Authorization: Bearer <token>
· v1.0.0
· openapi.json
Products
get
/api/v1/products
Λίστα προϊόντων
products:read
Parameters
-
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]
Responses
-
200OKExample
{ "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
Parameters
-
idpath · integer required
Responses
-
200OKExample
{ "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)
Parameters
-
idpath · integer required
Request body (JSON)
-
enabledboolean -
manual_pricenumber|null — null = επιστροφή στους κανόνες τιμών
Example
{
"enabled": true,
"manual_price": 19.9
}
Responses
-
200OK -
403Το token δεν έχει το απαιτούμενο δικαίωμα -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
Inventory
get
/api/v1/inventory
Δικό σου απόθεμα
inventory:read
Parameters
-
pagequery · integer -
per_pagequery · integer max 100 -
searchquery · string
Responses
-
200OKExample
{ "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
Parameters
-
skupath · string required
Request body (JSON)
-
quantityinteger required min 0 -
notesstring
Example
{
"quantity": 1,
"notes": "string"
}
Responses
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
post
/api/v1/inventory/bulk
Μαζική ενημέρωση (έως 500)
inventory:write
Request body (JSON)
-
itemsarray<object> required max items 500-
skustring required -
quantityinteger required min 0
-
Example
{
"items": [
{
"sku": "string",
"quantity": 1
}
]
}
Responses
-
200updated / failed / not_found λίστες SKU
Orders
get
/api/v1/orders
Λίστα παραγγελιών
orders:read
Parameters
-
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
Responses
-
200OK
post
/api/v1/orders
Νέα παραγγελία από το δικό σου κατάστημα (idempotent στο external_ref)
orders:write
Request body (JSON)
-
external_refstring required — ο κωδικός της παραγγελίας στο κατάστημά σου -
order_numberstring -
currencystring default EUR -
shipping_costnumber -
payment_methodstring -
notesstring -
placed_atstring -
customerobject-
namestring -
emailstring -
phonestring
-
-
shipping_addressobject -
billing_addressobject -
itemsarray<object> required max items 500-
skustring required -
namestring -
quantityinteger required min 1 -
unit_pricenumber required
-
Example
{
"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
}
]
}
Responses
-
201Δημιουργήθηκε -
200Υπήρχε ήδη (ίδιο external_ref) -
422Λάθος δεδομένα: {message, errors}
get
/api/v1/orders/{id}
Μία παραγγελία με γραμμές
orders:read
Parameters
-
idpath · integer required
Responses
-
200OKExample
{ "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.
Parameters
-
idpath · integer required
Request body (JSON)
-
statusstring required ["processing", "shipped", "completed", "cancelled"]
Example
{
"status": "processing"
}
Responses
-
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). Επανάληψη με τα ίδια στοιχεία ξαναδοκιμάζει μόνο αν δεν έχει πετύχει.
Parameters
-
idpath · integer required
Request body (JSON)
-
courierstring required max length 64 -
tracking_numberstring required max length 128
Example
{
"courier": "string",
"tracking_number": "string"
}
Responses
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
Suppliers
get
/api/v1/suppliers
Οι προμηθευτές σου
suppliers:read
Responses
-
200OK
Channels
get
/api/v1/channels
Κανάλια πώλησης
channels:read
Responses
-
200OK
get
/api/v1/feeds
Διευθύνσεις feeds ανά κανάλι
feeds:read
Responses
-
200OK
Price rules
get
/api/v1/price-rules
Κανόνες τιμών
prices:read
Parameters
-
pagequery · integer -
per_pagequery · integer max 100
Responses
-
200OK
post
/api/v1/price-rules
Νέος κανόνας
prices:write
Request body (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
Example
{
"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
}
Responses
-
201Δημιουργήθηκε -
422Λάθος δεδομένα: {message, errors}
get
/api/v1/price-rules/{id}
Ένας κανόνας
prices:read
Parameters
-
idpath · integer required
Responses
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
patch
/api/v1/price-rules/{id}
Αλλαγή (μερική)
prices:write
Parameters
-
idpath · integer required
Request body (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
Example
{
"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
}
Responses
-
200OK -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση) -
422Λάθος δεδομένα: {message, errors}
delete
/api/v1/price-rules/{id}
Διαγραφή
prices:write
Parameters
-
idpath · integer required
Responses
-
204Διαγράφηκε -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
Prices
get
/api/v1/prices
Τελικές τιμές πώλησης
prices:read
Parameters
-
pagequery · integer -
per_pagequery · integer max 100 -
skuquery · string — SKUs χωρισμένα με κόμμα -
supplier_idquery · integer
Responses
-
200OKExample
{ "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
Parameters
-
pagequery · integer -
per_pagequery · integer max 100 -
statusquery · string [pending, issued, failed] -
kindquery · string [invoice, credit_note] -
order_idquery · integer
Responses
-
200OKExample
{ "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
Parameters
-
idpath · integer required
Responses
-
200OKExample
{ "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
Responses
-
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.
Request body (JSON)
-
urlstring required — δημόσια https διεύθυνση -
eventsarray<string> required
Example
{
"url": "https://example.com/path",
"events": [
"order.created"
]
}
Responses
-
201Δημιουργήθηκε (περιέχει secret) -
422Λάθος δεδομένα: {message, errors}
delete
/api/v1/webhooks/{id}
Διαγραφή endpoint
webhooks:manage
Parameters
-
idpath · integer required
Responses
-
204Διαγράφηκε -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)
post
/api/v1/webhooks/{id}/rotate-secret
Νέο secret υπογραφής (επιστρέφεται μία φορά· το παλιό παύει αμέσως)
webhooks:manage
Parameters
-
idpath · integer required
Responses
-
200OK (περιέχει secret) -
404Δεν βρέθηκε (ή ανήκει σε άλλη επιχείρηση)