Skip to content
Syncore

Παραγγελίες

Οι παραγγελίες από όλα τα κανάλια σου (Skroutz, Shopflix, eMAG, Trendyol, Temu, TikTok Shop, WooCommerce, Shopify, …) και όσες δημιουργείς εσύ μέσω API.

Endpoint Ability
GET /orders, GET /orders/{id} orders:read
POST /orders orders:write
PATCH /orders/{id}/status orders:write
POST /orders/{id}/shipment orders:write

Λίστα

curl -s "https://app.syncore.gr/api/v1/orders?status=pending&updated_since=2026-10-28T00:00:00Z" \
  -H "Authorization: Bearer $SYNCORE_TOKEN"

Φίλτρα: status (pending, processing, shipped, completed, cancelled, refunded), source_channel, search (αριθμός / πελάτης), placed_from, placed_to, updated_since (ISO 8601), page, per_page.

Για συγχρονισμό, κράτα την ώρα του τελευταίου αιτήματος και ζήτα updated_since — ή χρησιμοποίησε τα webhooks order.created / order.updated.

Μία παραγγελία

GET /orders/{id} επιστρέφει την παραγγελία με τις γραμμές της:

{
  "data": {
    "id": 5001,
    "order_number": "SK-240001",
    "external_ref": null,
    "source_channel": "skroutz",
    "status": "processing",
    "payment_status": "succeeded",
    "payment_method": "card",
    "currency": "EUR",
    "subtotal": 39.8,
    "shipping_cost": 3.5,
    "total_amount": 43.3,
    "customer": { "name": "Πελάτης Παράδειγμα", "email": "customer@example.com", "phone": "2100000000" },
    "shipping_address": { "address": "Οδός 1", "city": "Αθήνα", "postcode": "10000" },
    "billing_address": null,
    "notes": null,
    "shipment": {
      "courier": null,
      "tracking_number": null,
      "shipped_at": null,
      "push_status": null,
      "push_error": null,
      "pushed_at": null
    },
    "placed_at": "2026-10-29T09:40:00+02:00",
    "created_at": "2026-10-29T09:41:00+02:00",
    "updated_at": "2026-10-29T10:00:00+02:00",
    "items": [
      { "id": 9001, "product_id": 1201, "sku": "ABC-1001", "name": "Παράδειγμα προϊόντος", "quantity": 2, "unit_price": 19.9, "total_price": 39.8 }
    ]
  }
}

Νέα παραγγελία από το κατάστημά σου

POST /orders καταχωρεί παραγγελία του δικού σου καταστήματος (source_channel: "api"). Είναι idempotent στο external_ref: η ίδια τιμή ξανά επιστρέφει την υπάρχουσα παραγγελία με 200 αντί για 201.

curl -s -X POST "https://app.syncore.gr/api/v1/orders" \
  -H "Authorization: Bearer $SYNCORE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "external_ref": "SHOP-10045",
    "order_number": "10045",
    "currency": "EUR",
    "shipping_cost": 3.5,
    "payment_method": "cod",
    "customer": { "name": "Πελάτης Παράδειγμα", "email": "customer@example.com", "phone": "2100000000" },
    "shipping_address": { "address": "Οδός 1", "city": "Αθήνα", "postcode": "10000" },
    "items": [ { "sku": "ABC-1001", "quantity": 2, "unit_price": 19.9 } ]
  }'

Υποχρεωτικά: external_ref και items (1–500 γραμμές, καθεμία με sku, quantity ≥ 1, unit_price).

Αλλαγή κατάστασης

curl -s -X PATCH "https://app.syncore.gr/api/v1/orders/5001/status" \
  -H "Authorization: Bearer $SYNCORE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"status": "processing"}'

Επιτρέπεται μόνο το επόμενο βήμα pending → processing → shipped → completed, ή cancelled από κάθε μη τελική κατάσταση. Άλλη μετάβαση απαντά 422 με errors.status = ["transition_not_allowed"] και allowed (τι επιτρέπεται τώρα).

Αποστολή (courier & αριθμός αποστολής)

POST /orders/{id}/shipment κάνει την παραγγελία shipped και στέλνει τη μεταφορική και τον αριθμό αποστολής (voucher) πίσω στο κανάλι προέλευσης — Skroutz, Shopflix, eMAG, Trendyol, Temu ή TikTok Shop.

curl -s -X POST "https://app.syncore.gr/api/v1/orders/5001/shipment" \
  -H "Authorization: Bearer $SYNCORE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"courier": "ACS", "tracking_number": "1234567890"}'

Η αποστολή στο κανάλι γίνεται στην ουρά. Η πρόοδος φαίνεται στο shipment.push_status:

push_status Σημασία
pending Στην ουρά
success Το κανάλι το δέχτηκε
failed Απέτυχε — δες shipment.push_error
skipped Το κανάλι δεν χρειάζεται / δεν υποστηρίζει αποστολή στοιχείων

Επανάληψη με τα ίδια στοιχεία ξαναδοκιμάζει μόνο αν δεν έχει ήδη πετύχει. Κάθε αλλαγή στέλνει webhook order.updated.