Skip to content

Objects

Every schema the API returns or accepts, with its properties and a generated example.

On this page

Error#

Every non-2xx response. 5xx bodies carry only internal_error and the request id.

NameTypeDescription
errorRequiredobject
codeRequiredstring

Stable machine code: invalid_request, unauthorized, forbidden, not_found, conflict, payload_too_large, rate_limited, internal_error, or a more specific code named on the operation.

messageRequiredstring
request_idstring

Echo of X-Request-Id; quote it when reporting a problem.

detailsobject
Example
{
  "error": {
    "code": "invalid_request",
    "message": "A human-readable explanation",
    "request_id": "req_01J8Z1K5X9",
    "details": {}
  }
}

Money#

Integer minor units plus the exponent that scales them. Never a float.

NameTypeDescription
amount_minorRequiredinteger
currencyRequiredstring
decimalsRequiredinteger

Minor-unit exponent for THIS amount. Dukkan deviates from ISO 4217 (SYP is zero-decimal), so always scale by this field, never by an ISO currency table.

Example
{
  "amount_minor": 275000,
  "currency": "SYP",
  "decimals": 0
}

OrderStatus#

Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds.

Values:placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded
Example
"placed"

SettableOrderStatus#

Statuses an app may set through PATCH /orders/{id}/status. Money-bearing statuses are reachable only through refunds.

Values:placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelled
Example
"placed"

PaymentStatus#

Ledger-projected payment state. Independent of the delivery status: a delivered COD order is unpaid until the remittance is confirmed.

Values:not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed
Example
"not_required"

WebhookTopic#

Webhook topic. Subscribing needs the read scope that governs the payload; app.uninstalled needs none and still delivers after revocation.

Values:order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled
Example
"order.created"

WebhookEnvelope#

Signed store event. Verify X-Dukkan-Hmac-Sha256 over {X-Dukkan-Timestamp}.{raw body} with the install's signing secret before parsing.

NameTypeDescription
idRequiredstring

Event id. Deduplicate on this signed value, never on the delivery header.

api_versionRequired"v1"
topicRequiredWebhookTopic

Webhook topic. Subscribing needs the read scope that governs the payload; app.uninstalled needs none and still delivers after revocation.

Values:order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled
store_idRequiredstring
install_idRequiredstring

The install this delivery was fanned out to. Verify the signature with THIS install's secret and refuse a store mismatch.

sequenceRequiredinteger

Strictly increasing per store with gaps. Order by it; never count on contiguity.

occurred_atRequiredstring
testboolean

Present and true only for sandbox test deliveries (POST /webhooks/test). Absent in production traffic.

dataRequiredobject
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "api_version": "v1",
  "topic": "order.created",
  "store_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "install_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "sequence": 1661,
  "occurred_at": "2026-08-18T16:00:00Z",
  "test": true,
  "data": {}
}

Order#

PII-free order. Customer contact fields appear only on the detail endpoint with the clients:read scope.

NameTypeDescription
idRequiredstring
order_numberRequiredstring
statusRequiredOrderStatus

Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds.

Values:placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded
payment_statusRequiredPaymentStatus

Ledger-projected payment state. Independent of the delivery status: a delivered COD order is unpaid until the remittance is confirmed.

Values:not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed
sourceRequirednullablestring

Sales channel that created the order (storefront, pos, admin, ...).

line_pricingRequiredstring

How line totals relate to order totals. "gross": sum of line totals equals subtotal and the discount lives on the order. "net" (POS orders): line totals are net of the applied promo, so sum of line totals plus discount equals subtotal. Branch on this field when reconciling, never on source.

Values:netgross
subtotalRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

discountRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

shippingRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

taxRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

totalRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

paidRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

refundedRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

exchange_rateRequirednullableobject

Snapshot of the rate applied when the order was priced in a non-store currency: rate = scaled / 10^scale.

scaledRequiredinteger
scaleRequiredinteger
tagsRequiredstring[]

Merchant and app tags (see PATCH /orders/{id}).

created_atRequiredstring
updated_atRequiredstring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_number": "1042",
  "status": "placed",
  "payment_status": "not_required",
  "source": "online",
  "line_pricing": "net",
  "subtotal": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "discount": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "shipping": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "tax": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "total": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "paid": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "refunded": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "exchange_rate": {
    "scaled": 1300000,
    "scale": 4
  },
  "tags": [
    "string"
  ],
  "created_at": "2026-08-18T16:00:00Z",
  "updated_at": "2026-08-18T16:00:00Z"
}

OrderItem#

Immutable line snapshot.

NameTypeDescription
idRequiredstring
variant_idRequirednullablestring

Null for custom lines.

kindRequiredstring

custom lines have no catalog link: they never touch inventory and refund by amount only.

Values:variantcustom
nameRequiredstring

Product name snapshot at order time.

quantityRequiredinteger
unit_priceRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

totalRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "kind": "variant",
  "name": "Olive oil 1 L",
  "quantity": 2,
  "unit_price": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "total": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  }
}

OrderCustomer#

Customer contact details. Requires the clients:read scope.

NameTypeDescription
first_nameRequirednullablestring
last_nameRequirednullablestring
emailRequirednullablestring
phoneRequirednullablestring
Example
{
  "first_name": "string",
  "last_name": "string",
  "email": "string",
  "phone": "string"
}

FulfillmentLine#

NameTypeDescription
order_item_idRequiredstring
quantityRequiredinteger
Example
{
  "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "quantity": 2
}

Fulfillment#

A shipment covering some or all lines of an order.

NameTypeDescription
idRequiredstring
providerRequirednullablestring
tracking_numberRequirednullablestring
statusRequiredstring
Values:pendingshippeddeliveredcancelled
created_atRequiredstring
updated_atRequiredstring
linesRequiredFulfillmentLine[]
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "provider": "Aramex",
  "tracking_number": "RX123456789SY",
  "status": "pending",
  "created_at": "2026-08-18T16:00:00Z",
  "updated_at": "2026-08-18T16:00:00Z",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2
    }
  ]
}

RefundLine#

NameTypeDescription
order_item_idRequirednullablestring
quantityRequiredinteger
amount_minorRequiredinteger
Example
{
  "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "quantity": 2,
  "amount_minor": 275000
}

Refund#

An append-only refund against captured funds.

NameTypeDescription
idRequiredstring
amountRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

reasonRequirednullablestring
created_atRequiredstring
linesRequiredRefundLine[]
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "amount": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "reason": "correction",
  "created_at": "2026-08-18T16:00:00Z",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2,
      "amount_minor": 275000
    }
  ]
}

OrderReference#

Link from an order back to the app's own record.

NameTypeDescription
kindRequiredstring

Record type in the app, e.g. quote.

numberRequiredstring

Human-readable record number, e.g. Q-1042.

urlnullablestring

Deep link into the app. Must be https on the app's registered origin; otherwise 422.

Default:null
Example
{
  "kind": "string",
  "number": "string",
  "url": null
}

OrderAttributes#

Up to 20 keys ([a-z0-9_.-]{1,64}), scalar values up to 1000 UTF-8 bytes, 8192 bytes in total. Private to the calling app.

Example
{}

OrderAttributesPatch#

Merged into the app's namespace; a null value deletes that key.

Example
{}

OrderDetail#

Order with its immutable line snapshots and reconciliation collections.

NameTypeDescription
idRequiredstring
order_numberRequiredstring
statusRequiredOrderStatus

Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds.

Values:placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded
payment_statusRequiredPaymentStatus

Ledger-projected payment state. Independent of the delivery status: a delivered COD order is unpaid until the remittance is confirmed.

Values:not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed
sourceRequirednullablestring

Sales channel that created the order (storefront, pos, admin, ...).

line_pricingRequiredstring

How line totals relate to order totals. "gross": sum of line totals equals subtotal and the discount lives on the order. "net" (POS orders): line totals are net of the applied promo, so sum of line totals plus discount equals subtotal. Branch on this field when reconciling, never on source.

Values:netgross
subtotalRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

discountRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

shippingRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

taxRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

totalRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

paidRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

refundedRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

exchange_rateRequirednullableobject

Snapshot of the rate applied when the order was priced in a non-store currency: rate = scaled / 10^scale.

scaledRequiredinteger
scaleRequiredinteger
tagsRequiredstring[]

Merchant and app tags (see PATCH /orders/{id}).

created_atRequiredstring
updated_atRequiredstring
itemsRequiredOrderItem[]
fulfillmentsRequiredFulfillment[]
refundsRequiredRefund[]
noteRequirednullablestring

Order note (merchant or app).

attributesRequiredOrderAttributes

The CALLING app's own attributes on this order. Other apps' namespaces are never returned.

customerOrderCustomer

Present only when the install holds the clients:read scope (customer-PII scope, DPA-gated). Absent entirely otherwise.

shipping_addressnullableobject

Free-form delivery address snapshot. Present only with the clients:read scope; absent entirely otherwise. May be null when the order has no delivery address (e.g. POS sales).

Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_number": "1042",
  "status": "placed",
  "payment_status": "not_required",
  "source": "online",
  "line_pricing": "net",
  "subtotal": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "discount": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "shipping": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "tax": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "total": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "paid": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "refunded": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "exchange_rate": {
    "scaled": 1300000,
    "scale": 4
  },
  "tags": [
    "string"
  ],
  "created_at": "2026-08-18T16:00:00Z",
  "updated_at": "2026-08-18T16:00:00Z",
  "items": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "kind": "variant",
      "name": "Olive oil 1 L",
      "quantity": 2,
      "unit_price": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "total": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      }
    }
  ],
  "fulfillments": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "provider": "Aramex",
      "tracking_number": "RX123456789SY",
      "status": "pending",
      "created_at": "2026-08-18T16:00:00Z",
      "updated_at": "2026-08-18T16:00:00Z",
      "lines": [
        {
          "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
          "quantity": 2
        }
      ]
    }
  ],
  "refunds": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "amount": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "reason": "correction",
      "created_at": "2026-08-18T16:00:00Z",
      "lines": [
        {
          "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
          "quantity": 2,
          "amount_minor": 275000
        }
      ]
    }
  ],
  "note": "Stock count 2026-08-18",
  "attributes": {},
  "customer": {
    "first_name": "string",
    "last_name": "string",
    "email": "string",
    "phone": "string"
  },
  "shipping_address": {}
}

Variant#

NameTypeDescription
idRequiredstring
product_idRequiredstring
skuRequirednullablestring
priceRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

statusRequiredstring
nameRequiredstring

Variant label (e.g. أحمر / L).

attributesRequiredobject

Option name → value, e.g. { color: 'أحمر', size: 'L' }.

barcodeRequirednullablestring
compare_at_priceRequirednullableMoney

Higher strike-through price when set.

image_urlRequirednullablestring

Main image for this variant (own image, else the product's).

weight_gramRequirednullableinteger
available_quantityRequirednullableinteger

Stock minus reservations across the store's locations. Null when the product is not inventory-managed or the install lacks inventory:read.

Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "sku": "OIL-1L",
  "price": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "status": "placed",
  "name": "Olive oil 1 L",
  "attributes": {},
  "barcode": "string",
  "compare_at_price": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "image_url": "string",
  "weight_gram": 1,
  "available_quantity": 1
}

VariantDetail#

Variant with its product's name and status (GET /products/variants).

NameTypeDescription
idRequiredstring
product_idRequiredstring
skuRequirednullablestring
priceRequiredMoney

Integer minor units plus the exponent that scales them. Never a float.

statusRequiredstring
nameRequiredstring

Variant label (e.g. أحمر / L).

attributesRequiredobject

Option name → value, e.g. { color: 'أحمر', size: 'L' }.

barcodeRequirednullablestring
compare_at_priceRequirednullableMoney

Higher strike-through price when set.

image_urlRequirednullablestring

Main image for this variant (own image, else the product's).

weight_gramRequirednullableinteger
available_quantityRequirednullableinteger

Stock minus reservations across the store's locations. Null when the product is not inventory-managed or the install lacks inventory:read.

product_nameRequiredstring
product_statusRequiredstring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "sku": "OIL-1L",
  "price": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "status": "placed",
  "name": "Olive oil 1 L",
  "attributes": {},
  "barcode": "string",
  "compare_at_price": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "image_url": "string",
  "weight_gram": 1,
  "available_quantity": 1,
  "product_name": "string",
  "product_status": "string"
}

VariantList#

Batch variant lookup. Unknown ids are omitted, never errors.

NameTypeDescription
dataRequiredVariantDetail[]
Example
{
  "data": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "sku": "OIL-1L",
      "price": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "status": "placed",
      "name": "Olive oil 1 L",
      "attributes": {},
      "barcode": "string",
      "compare_at_price": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "image_url": "string",
      "weight_gram": 1,
      "available_quantity": 1,
      "product_name": "string",
      "product_status": "string"
    }
  ]
}

ProductCategory#

NameTypeDescription
idRequiredstring
nameRequiredstring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "name": "Olive oil 1 L"
}

Product#

NameTypeDescription
idRequiredstring
dsinRequiredstring

Dukkan store item number: the merchant-facing product code.

nameRequiredstring
statusRequiredstring
updated_atRequirednullablestring
image_urlRequirednullablestring

Main product image.

image_colorRequirednullablestring

Dominant colour of the main image (#rrggbb) for placeholders.

brandRequirednullablestring
categoryRequirednullableProductCategory
descriptionRequirednullablestring

Plain text, at most 500 characters.

imagesstring[]

Gallery, present on GET /products/{id} only.

variantsRequiredVariant[]
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "dsin": "D7Q2K9",
  "name": "Olive oil 1 L",
  "status": "placed",
  "updated_at": "2026-08-18T16:00:00Z",
  "image_url": "string",
  "image_color": "string",
  "brand": "string",
  "category": {
    "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
    "name": "Olive oil 1 L"
  },
  "description": "string",
  "images": [
    "string"
  ],
  "variants": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "sku": "OIL-1L",
      "price": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "status": "placed",
      "name": "Olive oil 1 L",
      "attributes": {},
      "barcode": "string",
      "compare_at_price": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "image_url": "string",
      "weight_gram": 1,
      "available_quantity": 1
    }
  ]
}

Store#

Public identity and checkout facts of the token's store.

NameTypeDescription
idRequiredstring
slugRequiredstring
nameRequiredstring
descriptionRequirednullablestring
logo_urlRequirednullablestring
banner_urlsRequiredstring[]
storefront_urlRequiredstring

Public https origin; a connected custom domain wins over the platform subdomain.

whatsapp_numberRequirednullablestring
phoneRequirednullablestring
addressRequirednullablestring
accent_colorRequirednullablestring

Published theme accent, or the store's primary colour.

localeRequiredstring
timezoneRequiredstring
countryRequirednullablestring
pricing_currencyRequiredobject

The currency catalog prices are stored in.

codeRequiredstring
decimalsRequiredinteger
storefront_currenciesRequiredobject

Currencies a customer may pay in; POST /orders accepts these only.

allowedRequiredstring[]
defaultRequiredstring
fxRequirednullableobject

Store-adjusted rates from the pricing currency, exactly what checkout applies; includes the base at identity. Null when no rate table is available.

baseRequiredstring
as_ofRequiredstring
ratesRequiredobject
payment_methodsRequiredobject[]

Enabled manual payment methods.

idRequiredstring
Values:codshamcash_manual
shamcash_idstring

Present for shamcash_manual: the pay-to id shown at checkout.

provincesRequiredobject[]

Accepted shipping_address.province values with labels.

valueRequiredstring
arRequiredstring
enRequiredstring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "slug": "string",
  "name": "Olive oil 1 L",
  "description": "string",
  "logo_url": "string",
  "banner_urls": [
    "string"
  ],
  "storefront_url": "string",
  "whatsapp_number": "string",
  "phone": "string",
  "address": "string",
  "accent_color": "string",
  "locale": "string",
  "timezone": "string",
  "country": "string",
  "pricing_currency": {
    "code": "invalid_request",
    "decimals": 0
  },
  "storefront_currencies": {
    "allowed": [
      "string"
    ],
    "default": "string"
  },
  "fx": {
    "base": "string",
    "as_of": "2026-08-18T16:00:00Z",
    "rates": {}
  },
  "payment_methods": [
    {
      "id": "cod",
      "shamcash_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
    }
  ],
  "provinces": [
    {
      "value": "string",
      "ar": "string",
      "en": "string"
    }
  ]
}

Discount#

Read-only view of a discount. Redemption accounting stays first-party.

NameTypeDescription
idRequiredstring
methodRequiredstring
Values:codeautomatic
codeRequirednullablestring
titleRequirednullablestring
value_typeRequiredstring
Values:percentagefixed_amountfree_shippingbuy_x_get_y
targetRequiredstring
Values:orderproductscategories
percentRequirednullablenumber

Set only for percentage discounts; amount only for fixed_amount.

amountRequirednullableMoney

Integer minor units plus the exponent that scales them. Never a float.

is_activeRequiredboolean
usage_limit_totalRequirednullableinteger
used_countRequiredinteger
applies_to_posRequiredboolean
applies_to_onlineRequiredboolean
starts_atRequirednullablestring
ends_atRequirednullablestring
created_atRequiredstring
updated_atRequirednullablestring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "method": "code",
  "code": "invalid_request",
  "title": "Summer sale",
  "value_type": "percentage",
  "target": "order",
  "percent": 15,
  "amount": {
    "amount_minor": 275000,
    "currency": "SYP",
    "decimals": 0
  },
  "is_active": true,
  "usage_limit_total": 100,
  "used_count": 12,
  "applies_to_pos": true,
  "applies_to_online": true,
  "starts_at": "2026-08-18T16:00:00Z",
  "ends_at": "2026-08-18T16:00:00Z",
  "created_at": "2026-08-18T16:00:00Z",
  "updated_at": "2026-08-18T16:00:00Z"
}

Movement#

One append-only stock movement.

NameTypeDescription
idRequiredstring
sequenceRequiredinteger

Monotonic insert sequence; the stable sort key for what happened in which order.

variant_idRequirednullablestring
location_idRequiredstring
deltaRequiredinteger
stock_afterRequiredinteger
reasonRequiredstring
occurred_atRequiredstring
Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "sequence": 1661,
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "location_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "delta": -2,
  "stock_after": 38,
  "reason": "correction",
  "occurred_at": "2026-08-18T16:00:00Z"
}

WebhookSubscription#

One subscription per install; PUT is a full replace.

NameTypeDescription
idRequiredstring
endpoint_urlRequiredstring
topicsRequiredWebhookTopic[]
statusRequiredstring

disabled = quarantined after sustained delivery failures; re-PUT the subscription to resume.

Values:activedisabled
consecutive_failuresRequiredinteger
activated_atRequiredstring

Events that occurred before this instant are never delivered to this subscription.

disabled_atRequirednullablestring
secretstring

Present only on the PUT response that minted or rotated it. Store it immediately; it can never be read back.

Example
{
  "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "endpoint_url": "string",
  "topics": [
    "order.created"
  ],
  "status": "active",
  "consecutive_failures": 1,
  "activated_at": "2026-08-18T16:00:00Z",
  "disabled_at": "2026-08-18T16:00:00Z",
  "secret": "string"
}

Installation#

The install and the store it is bound to, as the platform sees them.

NameTypeDescription
installRequiredobject
idRequiredstring
app_idRequiredstring
statusRequiredstring

A token only resolves for an active install; suspended is reserved for billing holds surfaced through this document.

Values:activesuspended
granted_scopesRequiredstring[]

Scopes the merchant consented to.

effective_scopesRequiredstring[]

Granted scopes intersected with the grantor's live permissions. This is what every request is checked against.

distribution_channelRequiredstring
Values:developmentprivatepublic
installed_atRequiredstring
api_versionRequiredstring

Dated v1 revision this server speaks (same value as X-Dukkan-Api-Version).

webhookRequirednullableobject

The active subscription, or null when none is configured.

idRequiredstring
endpoint_urlRequiredstring
topicsRequiredWebhookTopic[]
statusRequiredstring

disabled = quarantined after sustained delivery failures; re-PUT the subscription to resume.

Values:activedisabled
consecutive_failuresRequiredinteger
activated_atRequiredstring

Events that occurred before this instant are never delivered to this subscription.

disabled_atRequirednullablestring
storeRequiredobject
idRequiredstring
slugRequiredstring
nameRequiredstring
currencyRequiredstring
decimalsRequiredinteger

Minor-unit exponent of the store currency.

localeRequiredstring

Storefront locale (ar or en).

timezoneRequiredstring

IANA zone derived from the store country; use it for day boundaries in reports.

countryRequirednullablestring

ISO 3166-1 alpha-2 when the merchant set one.

is_developmentRequiredboolean

True for sandbox stores. Test deliveries and dev sessions exist only here.

Example
{
  "install": {
    "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
    "app_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
    "status": "active",
    "granted_scopes": [
      "string"
    ],
    "effective_scopes": [
      "string"
    ],
    "distribution_channel": "development",
    "installed_at": "2026-08-18T16:00:00Z",
    "api_version": "string",
    "webhook": {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "endpoint_url": "string",
      "topics": [
        "order.created"
      ],
      "status": "active",
      "consecutive_failures": 1,
      "activated_at": "2026-08-18T16:00:00Z",
      "disabled_at": "2026-08-18T16:00:00Z"
    }
  },
  "store": {
    "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
    "slug": "string",
    "name": "Olive oil 1 L",
    "currency": "SYP",
    "decimals": 0,
    "locale": "string",
    "timezone": "string",
    "country": "string",
    "is_development": true
  }
}

WebhookTestEvent#

The accepted test event and its queued deliveries.

NameTypeDescription
event_idRequiredstring
topicRequiredWebhookTopic

Webhook topic. Subscribing needs the read scope that governs the payload; app.uninstalled needs none and still delivers after revocation.

Values:order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled
sequenceRequiredinteger
occurred_atRequiredstring
testRequired"true"
dataRequiredobject

The payload that was written, after overrides and validation.

deliveriesRequiredobject[]

One row per subscription the event fanned out to; the worker sends within about a minute.

idRequiredstring

Delivery id; also sent as X-Dukkan-Delivery-Id.

statusRequiredstring
Values:pendingdeliveringretry_scheduledsucceededdead
endpoint_urlRequiredstring
Example
{
  "event_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "topic": "order.created",
  "sequence": 1661,
  "occurred_at": "2026-08-18T16:00:00Z",
  "test": true,
  "data": {},
  "deliveries": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "status": "pending",
      "endpoint_url": "string"
    }
  ]
}

OrderPage#

Cursor page of PII-free orders.

NameTypeDescription
dataRequiredOrder[]
next_cursorRequirednullablestring

Pass back as cursor to fetch the next page; null on the last page.

Example
{
  "data": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "order_number": "1042",
      "status": "placed",
      "payment_status": "not_required",
      "source": "online",
      "line_pricing": "net",
      "subtotal": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "discount": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "shipping": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "tax": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "total": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "paid": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "refunded": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "exchange_rate": {
        "scaled": 1300000,
        "scale": 4
      },
      "tags": [
        "string"
      ],
      "created_at": "2026-08-18T16:00:00Z",
      "updated_at": "2026-08-18T16:00:00Z"
    }
  ],
  "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wOC0xOFQxNjowMDowMFoifQ"
}

ProductPage#

Cursor page of products with variants.

NameTypeDescription
dataRequiredProduct[]
next_cursorRequirednullablestring

Pass back as cursor to fetch the next page; null on the last page.

Example
{
  "data": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "dsin": "D7Q2K9",
      "name": "Olive oil 1 L",
      "status": "placed",
      "updated_at": "2026-08-18T16:00:00Z",
      "image_url": "string",
      "image_color": "string",
      "brand": "string",
      "category": {
        "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
        "name": "Olive oil 1 L"
      },
      "description": "string",
      "images": [
        "string"
      ],
      "variants": [
        {
          "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
          "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
          "sku": "OIL-1L",
          "price": {
            "amount_minor": 275000,
            "currency": "SYP",
            "decimals": 0
          },
          "status": "placed",
          "name": "Olive oil 1 L",
          "attributes": {},
          "barcode": "string",
          "compare_at_price": {
            "amount_minor": 275000,
            "currency": "SYP",
            "decimals": 0
          },
          "image_url": "string",
          "weight_gram": 1,
          "available_quantity": 1
        }
      ]
    }
  ],
  "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wOC0xOFQxNjowMDowMFoifQ"
}

DiscountPage#

Cursor page of discounts.

NameTypeDescription
dataRequiredDiscount[]
next_cursorRequirednullablestring

Pass back as cursor to fetch the next page; null on the last page.

Example
{
  "data": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "method": "code",
      "code": "invalid_request",
      "title": "Summer sale",
      "value_type": "percentage",
      "target": "order",
      "percent": 15,
      "amount": {
        "amount_minor": 275000,
        "currency": "SYP",
        "decimals": 0
      },
      "is_active": true,
      "usage_limit_total": 100,
      "used_count": 12,
      "applies_to_pos": true,
      "applies_to_online": true,
      "starts_at": "2026-08-18T16:00:00Z",
      "ends_at": "2026-08-18T16:00:00Z",
      "created_at": "2026-08-18T16:00:00Z",
      "updated_at": "2026-08-18T16:00:00Z"
    }
  ],
  "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wOC0xOFQxNjowMDowMFoifQ"
}

MovementPage#

Cursor page of append-only inventory movements.

NameTypeDescription
dataRequiredMovement[]
next_cursorRequirednullablestring

Pass back as cursor to fetch the next page; null on the last page.

Example
{
  "data": [
    {
      "id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "sequence": 1661,
      "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "location_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "delta": -2,
      "stock_after": 38,
      "reason": "correction",
      "occurred_at": "2026-08-18T16:00:00Z"
    }
  ],
  "next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wOC0xOFQxNjowMDowMFoifQ"
}

CreateOrderItem#

One order line with the price the merchant agreed.

NameTypeDescription
variant_idRequirednullablestring

Catalog variant, or null for a custom line.

namestring

Line label. Required when variant_id is null; ignored otherwise (the catalog name is snapshotted).

quantityRequiredinteger
unit_price_minorRequiredinteger

Agreed unit price in minor units of the order currency. Zero is allowed.

Example
{
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "name": "Olive oil 1 L",
  "quantity": 2,
  "unit_price_minor": 1
}

CreateOrderRequest#

Create an order with app-set prices. Totals are recomputed server-side: subtotal = Σ quantity × unit_price_minor, total = subtotal − discount + shipping, tax 0.

NameTypeDescription
currencyRequiredstring

One of the store's allowed storefront currencies; otherwise 422 currency_not_allowed.

statusstring

placed (default) lets the merchant review; approved records an explicit customer acceptance the app collected.

Values:placedapproved
Default:"placed"
itemsRequiredCreateOrderItem[]
discountnullableobject

Order-level discount; must not exceed the sum of the lines.

Default:null
amount_minorRequiredinteger
titlenullablestring
Default:null
shippingRequiredobject
amount_minorRequiredinteger
methodRequiredstring
Values:deliverypickup
customerRequiredobject
nameRequiredstring
phoneRequiredstring

Full international number with country code; stored normalised.

emailnullablestring

Optional. Never invented when absent.

Default:null
shipping_addressnullableobject

Required when shipping.method is delivery.

Default:null
addressRequiredstring
provinceRequiredstring

Syrian province value, e.g. damascus (see GET /store provinces).

citynullablestring
Default:null
notesnullablestring
Default:null
payment_methodRequiredstring

Must be enabled in the store; otherwise 409 payment_method_disabled.

Values:codshamcash_manual
exchange_ratenullableobject

Required when currency differs from the store's pricing currency, forbidden otherwise. rate = scaled / 10^scale, oriented 1 pricing-currency unit = rate order-currency units (same as GET /store fx).

Default:null
scaledRequiredinteger
scaleRequiredinteger
notenullablestring
Default:null
tagsstring[]

At most 10 tags after case-insensitive dedupe.

attributesOrderAttributes

Up to 20 keys ([a-z0-9_.-]{1,64}), scalar values up to 1000 UTF-8 bytes, 8192 bytes in total. Private to the calling app.

Default:{}
inventorystring
Values:decrementskip
Default:"decrement"
Example
{
  "currency": "SYP",
  "status": "placed",
  "items": [
    {
      "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "name": "Olive oil 1 L",
      "quantity": 2,
      "unit_price_minor": 1
    }
  ],
  "discount": {
    "amount_minor": 275000,
    "title": null
  },
  "shipping": {
    "amount_minor": 275000,
    "method": "delivery"
  },
  "customer": {
    "name": "Olive oil 1 L",
    "phone": "string",
    "email": null
  },
  "shipping_address": {
    "address": "string",
    "province": "string",
    "city": null,
    "notes": null
  },
  "payment_method": "cod",
  "exchange_rate": {
    "scaled": 1300000,
    "scale": 4
  },
  "note": null,
  "tags": [
    "string"
  ],
  "attributes": {},
  "inventory": "decrement"
}

UpdateOrderRequest#

Update the note, add/remove tags, or merge the app's own attributes. Money, lines, customer and address are immutable after creation.

NameTypeDescription
notenullablestring

Replace the order note; null clears it.

tagsobject

Set operations, never a replace: the merchant's and other apps' tags survive.

addstring[]

At most 10 tags after case-insensitive dedupe.

removestring[]

Removed case-insensitively.

attributesOrderAttributesPatch

Merged into the app's namespace; a null value deletes that key.

Example
{
  "note": "Stock count 2026-08-18",
  "tags": {
    "add": [
      "string"
    ],
    "remove": [
      "string"
    ]
  },
  "attributes": {}
}

UpdateOrderStatusRequest#

Transition an order through the server matrix.

NameTypeDescription
statusRequiredSettableOrderStatus

Statuses an app may set through PATCH /orders/{id}/status. Money-bearing statuses are reachable only through refunds.

Values:placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelled
Example
{
  "status": "placed"
}

CreateFulfillmentRequest#

Fulfill selected line quantities. Each order item may appear once.

NameTypeDescription
providernullablestring
tracking_numbernullablestring
statusstring

"pending" reserves the quantities without auto-shipping the order (carrier booked, pickup not yet made); move to "shipped" via PATCH when the parcel leaves.

Values:pendingshipped
Default:"shipped"
linesRequiredobject[]
order_item_idRequiredstring
quantityRequiredinteger
Example
{
  "provider": "Aramex",
  "tracking_number": "RX123456789SY",
  "status": "shipped",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2
    }
  ]
}

UpdateFulfillmentRequest#

Update tracking, mark delivered, cancel, or propose a COD remittance. At least one field is required.

NameTypeDescription
tracking_numbernullablestring
statusstring
Values:shippeddeliveredcancelled
cod_collected_minorinteger

COD remittance PROPOSAL: the cash the courier reports collecting (minor units; may be less than the order total). Moves no money. The merchant confirms in admin, and that confirmation writes the cod_collection ledger row which updates payment status and fires order.paid. One open proposal per order; re-sending updates it.

cod_collected_notestring
Example
{
  "tracking_number": "RX123456789SY",
  "status": "shipped",
  "cod_collected_minor": 275000,
  "cod_collected_note": "string"
}

CreateRefundRequest#

Append a refund against captured funds.

NameTypeDescription
amount_minorRequiredinteger
currencystring

Optional confirmation guard; 409 when it differs from the order's currency.

reasonnullablestring
linesobject[]

Optional line breakdown; amounts must sum to amount_minor.

order_item_idRequiredstring
quantityRequiredinteger
amount_minorRequiredinteger
restockobject

Return the refunded quantities to stock. Requires lines and the inventory:write scope. Untracked products are skipped.

location_idRequiredstring
Example
{
  "amount_minor": 275000,
  "currency": "SYP",
  "reason": "correction",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2,
      "amount_minor": 275000
    }
  ],
  "restock": {
    "location_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
  }
}

CreateInventoryMovementRequest#

Append an inventory movement.

NameTypeDescription
variant_idRequiredstring
location_idRequiredstring
deltaRequiredinteger

Signed quantity change. Absolute stock writes are forbidden.

reasonRequiredstring
Values:correctioninitialreturndamage
notenullablestring
Example
{
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "location_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "delta": -2,
  "reason": "correction",
  "note": "Stock count 2026-08-18"
}

UpsertWebhookSubscriptionRequest#

Create or replace the install's single subscription.

NameTypeDescription
endpoint_urlRequiredstring

Public HTTPS URL. Private, loopback and IP-literal hosts are refused.

topicsRequiredWebhookTopic[]
rotate_secretboolean

Mint a new signing secret and return it once in the response.

Example
{
  "endpoint_url": "https://app.example.com/webhooks/dukkan",
  "topics": [
    "order.created"
  ],
  "rotate_secret": false
}

CreateWebhookTestEventRequest#

Fire one signed test delivery (sandbox stores only).

NameTypeDescription
topicRequiredWebhookTopic

Webhook topic. Subscribing needs the read scope that governs the payload; app.uninstalled needs none and still delivers after revocation.

Values:order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled
dataobject

Optional overrides merged over the platform-built sample payload for the topic (at most 16 KB).

Example
{
  "topic": "order.created",
  "data": {}
}

OrderCreatedEventData#

NameTypeDescription
order_idRequiredstring
order_numberRequiredstring
statusRequiredstring

Order status at creation (usually placed).

total_minorRequiredinteger

Integer minor units of currency (scale by the store's decimals).

currencyRequiredstring
sourcenullablestring

Sales channel (storefront, pos, admin, app). Emitted since revision 2026-09-10.

Example
{
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_number": "1042",
  "status": "placed",
  "total_minor": 1,
  "currency": "SYP",
  "source": "online"
}

OrderStatusChangedEventData#

NameTypeDescription
order_idRequiredstring
from_statusRequiredstring
statusRequiredstring

The status the order moved to.

Example
{
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "from_status": "string",
  "status": "placed"
}

OrderPaidEventData#

Fires when captured funds reach the order total, from the payments ledger only. COD orders reach it when the merchant confirms the courier's remittance, never on delivery.

NameTypeDescription
order_idRequiredstring
amount_minorRequiredinteger

Captured funds at the moment they crossed the order total.

currencyRequiredstring
Example
{
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "amount_minor": 275000,
  "currency": "SYP"
}

ProductCreatedEventData#

NameTypeDescription
product_idRequiredstring
Example
{
  "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}

ProductUpdatedEventData#

NameTypeDescription
product_idRequiredstring
variant_idstring

Set when a variant row changed rather than the product itself.

operationstring

Present on variant changes: which write on the variant fired the event.

Values:insertupdatedelete
Example
{
  "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "operation": "insert"
}

ProductDeletedEventData#

NameTypeDescription
product_idRequiredstring
Example
{
  "product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}

InventoryMovementCreatedEventData#

NameTypeDescription
movement_idRequiredstring
variant_idRequirednullablestring
location_idRequiredstring
deltaRequiredinteger
stock_afterRequiredinteger
reasonRequiredstring
Example
{
  "movement_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "location_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "delta": -2,
  "stock_after": 38,
  "reason": "correction"
}

FulfillmentRequestedEventData#

A fulfillment was created as pending: a pickup is waiting to be booked by a carrier app.

NameTypeDescription
fulfillment_idRequiredstring
order_idRequiredstring
linesRequiredobject[]
order_item_idRequiredstring
quantityRequiredinteger
Example
{
  "fulfillment_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2
    }
  ]
}

FulfillmentCreatedEventData#

NameTypeDescription
fulfillment_idRequiredstring
order_idRequiredstring
statusRequiredstring
Values:pendingshipped
tracking_numberRequirednullablestring
linesRequiredobject[]
order_item_idRequiredstring
quantityRequiredinteger
order_fully_fulfilledRequiredboolean

True when every line of the order is now covered by a fulfillment.

Example
{
  "fulfillment_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "status": "pending",
  "tracking_number": "RX123456789SY",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2
    }
  ],
  "order_fully_fulfilled": true
}

FulfillmentUpdatedEventData#

NameTypeDescription
fulfillment_idRequiredstring
order_idRequiredstring
statusRequiredstring
Values:pendingshippeddeliveredcancelled
previous_statusRequiredstring
tracking_numberRequirednullablestring
Example
{
  "fulfillment_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "status": "pending",
  "previous_status": "string",
  "tracking_number": "RX123456789SY"
}

RefundCreatedEventData#

NameTypeDescription
refund_idRequiredstring
order_idRequiredstring
amount_minorRequiredinteger

Integer minor units of currency (scale by the store's decimals).

currencyRequiredstring
linesobject[]

Line breakdown when the refund carried one. Absent on POS refunds.

order_item_idRequirednullablestring
quantityRequiredinteger
amount_minorRequiredinteger

Integer minor units of currency (scale by the store's decimals).

source"pos"

Present when the refund was written at the point of sale.

Example
{
  "refund_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "amount_minor": 275000,
  "currency": "SYP",
  "lines": [
    {
      "order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
      "quantity": 2,
      "amount_minor": 275000
    }
  ],
  "source": "pos"
}

AppUninstalledEventData#

Farewell notice: the merchant removed the app. Tokens are already dead; delete what the DPA requires and stop calling the API for this install.

NameTypeDescription
app_idRequiredstring
install_idRequiredstring
Example
{
  "app_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
  "install_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}