Objects
Every schema the API returns or accepts, with its properties and a generated example.
On this page
- Error
- Money
- OrderStatus
- SettableOrderStatus
- PaymentStatus
- WebhookTopic
- WebhookEnvelope
- Order
- OrderItem
- OrderCustomer
- FulfillmentLine
- Fulfillment
- RefundLine
- Refund
- OrderReference
- OrderAttributes
- OrderAttributesPatch
- OrderDetail
- Variant
- VariantDetail
- VariantList
- ProductCategory
- Product
- Store
- Discount
- Movement
- WebhookSubscription
- Installation
- WebhookTestEvent
- OrderPage
- ProductPage
- DiscountPage
- MovementPage
- CreateOrderItem
- CreateOrderRequest
- UpdateOrderRequest
- UpdateOrderStatusRequest
- CreateFulfillmentRequest
- UpdateFulfillmentRequest
- CreateRefundRequest
- CreateInventoryMovementRequest
- UpsertWebhookSubscriptionRequest
- CreateWebhookTestEventRequest
- OrderCreatedEventData
- OrderStatusChangedEventData
- OrderPaidEventData
- ProductCreatedEventData
- ProductUpdatedEventData
- ProductDeletedEventData
- InventoryMovementCreatedEventData
- FulfillmentRequestedEventData
- FulfillmentCreatedEventData
- FulfillmentUpdatedEventData
- RefundCreatedEventData
- AppUninstalledEventData
Error#
Every non-2xx response. 5xx bodies carry only internal_error and the request id.
| Name | Type | Description |
|---|---|---|
errorRequired | object | |
codeRequired | string | 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. |
messageRequired | string | |
request_id | string | Echo of X-Request-Id; quote it when reporting a problem. |
details | object |
{
"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.
| Name | Type | Description |
|---|---|---|
amount_minorRequired | integer | |
currencyRequired | string | |
decimalsRequired | integer | 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. |
{
"amount_minor": 275000,
"currency": "SYP",
"decimals": 0
}OrderStatus#
Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds.
placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded"placed"SettableOrderStatus#
Statuses an app may set through PATCH /orders/{id}/status. Money-bearing statuses are reachable only through refunds.
placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelled"placed"PaymentStatus#
Ledger-projected payment state. Independent of the delivery status: a delivered COD order is unpaid until the remittance is confirmed.
not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed"not_required"WebhookTopic#
Webhook topic. Subscribing needs the read scope that governs the payload; app.uninstalled needs none and still delivers after revocation.
order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | Event id. Deduplicate on this signed value, never on the delivery header. |
api_versionRequired | "v1" | |
topicRequired | WebhookTopic | Webhook topic. Subscribing needs the read scope that governs the payload; Values: order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled |
store_idRequired | string | |
install_idRequired | string | The install this delivery was fanned out to. Verify the signature with THIS install's secret and refuse a store mismatch. |
sequenceRequired | integer | Strictly increasing per store with gaps. Order by it; never count on contiguity. |
occurred_atRequired | string | |
test | boolean | Present and true only for sandbox test deliveries (POST /webhooks/test). Absent in production traffic. |
dataRequired | object |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
order_numberRequired | string | |
statusRequired | OrderStatus | Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds. Values: placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded |
payment_statusRequired | PaymentStatus | Ledger-projected payment state. Independent of the delivery status: a delivered COD order is Values: not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed |
sourceRequirednullable | string | Sales channel that created the order ( |
line_pricingRequired | string | 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 Values: netgross |
subtotalRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
discountRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
shippingRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
taxRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
totalRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
paidRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
refundedRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
exchange_rateRequirednullable | object | Snapshot of the rate applied when the order was priced in a non-store currency: rate = scaled / 10^scale. |
scaledRequired | integer | |
scaleRequired | integer | |
tagsRequired | string[] | Merchant and app tags (see PATCH /orders/{id}). |
created_atRequired | string | |
updated_atRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
variant_idRequirednullable | string | Null for custom lines. |
kindRequired | string |
Values: variantcustom |
nameRequired | string | Product name snapshot at order time. |
quantityRequired | integer | |
unit_priceRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
totalRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
{
"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.
| Name | Type | Description |
|---|---|---|
first_nameRequirednullable | string | |
last_nameRequirednullable | string | |
emailRequirednullable | string | |
phoneRequirednullable | string |
{
"first_name": "string",
"last_name": "string",
"email": "string",
"phone": "string"
}FulfillmentLine#
| Name | Type | Description |
|---|---|---|
order_item_idRequired | string | |
quantityRequired | integer |
{
"order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"quantity": 2
}Fulfillment#
A shipment covering some or all lines of an order.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
providerRequirednullable | string | |
tracking_numberRequirednullable | string | |
statusRequired | string | Values: pendingshippeddeliveredcancelled |
created_atRequired | string | |
updated_atRequired | string | |
linesRequired | FulfillmentLine[] |
{
"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#
| Name | Type | Description |
|---|---|---|
order_item_idRequirednullable | string | |
quantityRequired | integer | |
amount_minorRequired | integer |
{
"order_item_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"quantity": 2,
"amount_minor": 275000
}Refund#
An append-only refund against captured funds.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
amountRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
reasonRequirednullable | string | |
created_atRequired | string | |
linesRequired | RefundLine[] |
{
"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.
| Name | Type | Description |
|---|---|---|
kindRequired | string | Record type in the app, e.g. |
numberRequired | string | Human-readable record number, e.g. |
urlnullable | string | Deep link into the app. Must be https on the app's registered origin; otherwise 422. Default: null |
{
"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.
{}OrderAttributesPatch#
Merged into the app's namespace; a null value deletes that key.
{}OrderDetail#
Order with its immutable line snapshots and reconciliation collections.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
order_numberRequired | string | |
statusRequired | OrderStatus | Order lifecycle state. Transitions follow the server matrix; money-bearing states are reachable only through refunds. Values: placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelledcompletedpartially_refundedrefunded |
payment_statusRequired | PaymentStatus | Ledger-projected payment state. Independent of the delivery status: a delivered COD order is Values: not_requiredunpaidpendingauthorizedpartially_paidpaidpartially_refundedrefundedfailed |
sourceRequirednullable | string | Sales channel that created the order ( |
line_pricingRequired | string | 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 Values: netgross |
subtotalRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
discountRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
shippingRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
taxRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
totalRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
paidRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
refundedRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
exchange_rateRequirednullable | object | Snapshot of the rate applied when the order was priced in a non-store currency: rate = scaled / 10^scale. |
scaledRequired | integer | |
scaleRequired | integer | |
tagsRequired | string[] | Merchant and app tags (see PATCH /orders/{id}). |
created_atRequired | string | |
updated_atRequired | string | |
itemsRequired | OrderItem[] | |
fulfillmentsRequired | Fulfillment[] | |
refundsRequired | Refund[] | |
noteRequirednullable | string | Order note (merchant or app). |
attributesRequired | OrderAttributes | The CALLING app's own attributes on this order. Other apps' namespaces are never returned. |
customer | OrderCustomer | Present only when the install holds the |
shipping_addressnullable | object | Free-form delivery address snapshot. Present only with the |
{
"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#
| Name | Type | Description |
|---|---|---|
idRequired | string | |
product_idRequired | string | |
skuRequirednullable | string | |
priceRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
statusRequired | string | |
nameRequired | string | Variant label (e.g. |
attributesRequired | object | Option name → value, e.g. { color: 'أحمر', size: 'L' }. |
barcodeRequirednullable | string | |
compare_at_priceRequirednullable | Money | Higher strike-through price when set. |
image_urlRequirednullable | string | Main image for this variant (own image, else the product's). |
weight_gramRequirednullable | integer | |
available_quantityRequirednullable | integer | Stock minus reservations across the store's locations. Null when the product is not inventory-managed or the install lacks inventory:read. |
{
"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).
| Name | Type | Description |
|---|---|---|
idRequired | string | |
product_idRequired | string | |
skuRequirednullable | string | |
priceRequired | Money | Integer minor units plus the exponent that scales them. Never a float. |
statusRequired | string | |
nameRequired | string | Variant label (e.g. |
attributesRequired | object | Option name → value, e.g. { color: 'أحمر', size: 'L' }. |
barcodeRequirednullable | string | |
compare_at_priceRequirednullable | Money | Higher strike-through price when set. |
image_urlRequirednullable | string | Main image for this variant (own image, else the product's). |
weight_gramRequirednullable | integer | |
available_quantityRequirednullable | integer | Stock minus reservations across the store's locations. Null when the product is not inventory-managed or the install lacks inventory:read. |
product_nameRequired | string | |
product_statusRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
dataRequired | VariantDetail[] |
{
"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#
| Name | Type | Description |
|---|---|---|
idRequired | string | |
nameRequired | string |
{
"id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"name": "Olive oil 1 L"
}Product#
| Name | Type | Description |
|---|---|---|
idRequired | string | |
dsinRequired | string | Dukkan store item number: the merchant-facing product code. |
nameRequired | string | |
statusRequired | string | |
updated_atRequirednullable | string | |
image_urlRequirednullable | string | Main product image. |
image_colorRequirednullable | string | Dominant colour of the main image (#rrggbb) for placeholders. |
brandRequirednullable | string | |
categoryRequirednullable | ProductCategory | |
descriptionRequirednullable | string | Plain text, at most 500 characters. |
images | string[] | Gallery, present on GET /products/{id} only. |
variantsRequired | Variant[] |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
slugRequired | string | |
nameRequired | string | |
descriptionRequirednullable | string | |
logo_urlRequirednullable | string | |
banner_urlsRequired | string[] | |
storefront_urlRequired | string | Public https origin; a connected custom domain wins over the platform subdomain. |
whatsapp_numberRequirednullable | string | |
phoneRequirednullable | string | |
addressRequirednullable | string | |
accent_colorRequirednullable | string | Published theme accent, or the store's primary colour. |
localeRequired | string | |
timezoneRequired | string | |
countryRequirednullable | string | |
pricing_currencyRequired | object | The currency catalog prices are stored in. |
codeRequired | string | |
decimalsRequired | integer | |
storefront_currenciesRequired | object | Currencies a customer may pay in; POST /orders accepts these only. |
allowedRequired | string[] | |
defaultRequired | string | |
fxRequirednullable | object | Store-adjusted rates from the pricing currency, exactly what checkout applies; includes the base at identity. Null when no rate table is available. |
baseRequired | string | |
as_ofRequired | string | |
ratesRequired | object | |
payment_methodsRequired | object[] | Enabled manual payment methods. |
idRequired | string | Values: codshamcash_manual |
shamcash_id | string | Present for shamcash_manual: the pay-to id shown at checkout. |
provincesRequired | object[] | Accepted |
valueRequired | string | |
arRequired | string | |
enRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
methodRequired | string | Values: codeautomatic |
codeRequirednullable | string | |
titleRequirednullable | string | |
value_typeRequired | string | Values: percentagefixed_amountfree_shippingbuy_x_get_y |
targetRequired | string | Values: orderproductscategories |
percentRequirednullable | number | Set only for percentage discounts; |
amountRequirednullable | Money | Integer minor units plus the exponent that scales them. Never a float. |
is_activeRequired | boolean | |
usage_limit_totalRequirednullable | integer | |
used_countRequired | integer | |
applies_to_posRequired | boolean | |
applies_to_onlineRequired | boolean | |
starts_atRequirednullable | string | |
ends_atRequirednullable | string | |
created_atRequired | string | |
updated_atRequirednullable | string |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
sequenceRequired | integer | Monotonic insert sequence; the stable sort key for what happened in which order. |
variant_idRequirednullable | string | |
location_idRequired | string | |
deltaRequired | integer | |
stock_afterRequired | integer | |
reasonRequired | string | |
occurred_atRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
idRequired | string | |
endpoint_urlRequired | string | |
topicsRequired | WebhookTopic[] | |
statusRequired | string |
Values: activedisabled |
consecutive_failuresRequired | integer | |
activated_atRequired | string | Events that occurred before this instant are never delivered to this subscription. |
disabled_atRequirednullable | string | |
secret | string | Present only on the PUT response that minted or rotated it. Store it immediately; it can never be read back. |
{
"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.
| Name | Type | Description |
|---|---|---|
installRequired | object | |
idRequired | string | |
app_idRequired | string | |
statusRequired | string | A token only resolves for an active install; Values: activesuspended |
granted_scopesRequired | string[] | Scopes the merchant consented to. |
effective_scopesRequired | string[] | Granted scopes intersected with the grantor's live permissions. This is what every request is checked against. |
distribution_channelRequired | string | Values: developmentprivatepublic |
installed_atRequired | string | |
api_versionRequired | string | Dated v1 revision this server speaks (same value as X-Dukkan-Api-Version). |
webhookRequirednullable | object | The active subscription, or null when none is configured. |
idRequired | string | |
endpoint_urlRequired | string | |
topicsRequired | WebhookTopic[] | |
statusRequired | string |
Values: activedisabled |
consecutive_failuresRequired | integer | |
activated_atRequired | string | Events that occurred before this instant are never delivered to this subscription. |
disabled_atRequirednullable | string | |
storeRequired | object | |
idRequired | string | |
slugRequired | string | |
nameRequired | string | |
currencyRequired | string | |
decimalsRequired | integer | Minor-unit exponent of the store currency. |
localeRequired | string | Storefront locale ( |
timezoneRequired | string | IANA zone derived from the store country; use it for day boundaries in reports. |
countryRequirednullable | string | ISO 3166-1 alpha-2 when the merchant set one. |
is_developmentRequired | boolean | True for sandbox stores. Test deliveries and dev sessions exist only here. |
{
"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.
| Name | Type | Description |
|---|---|---|
event_idRequired | string | |
topicRequired | WebhookTopic | Webhook topic. Subscribing needs the read scope that governs the payload; Values: order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled |
sequenceRequired | integer | |
occurred_atRequired | string | |
testRequired | "true" | |
dataRequired | object | The payload that was written, after overrides and validation. |
deliveriesRequired | object[] | One row per subscription the event fanned out to; the worker sends within about a minute. |
idRequired | string | Delivery id; also sent as X-Dukkan-Delivery-Id. |
statusRequired | string | Values: pendingdeliveringretry_scheduledsucceededdead |
endpoint_urlRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
dataRequired | Order[] | |
next_cursorRequirednullable | string | Pass back as |
{
"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.
| Name | Type | Description |
|---|---|---|
dataRequired | Product[] | |
next_cursorRequirednullable | string | Pass back as |
{
"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.
| Name | Type | Description |
|---|---|---|
dataRequired | Discount[] | |
next_cursorRequirednullable | string | Pass back as |
{
"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.
| Name | Type | Description |
|---|---|---|
dataRequired | Movement[] | |
next_cursorRequirednullable | string | Pass back as |
{
"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.
| Name | Type | Description |
|---|---|---|
variant_idRequirednullable | string | Catalog variant, or null for a custom line. |
name | string | Line label. Required when variant_id is null; ignored otherwise (the catalog name is snapshotted). |
quantityRequired | integer | |
unit_price_minorRequired | integer | Agreed unit price in minor units of the order currency. Zero is allowed. |
{
"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.
| Name | Type | Description |
|---|---|---|
currencyRequired | string | One of the store's allowed storefront currencies; otherwise 422 |
status | string |
Values: placedapprovedDefault: "placed" |
itemsRequired | CreateOrderItem[] | |
discountnullable | object | Order-level discount; must not exceed the sum of the lines. Default: null |
amount_minorRequired | integer | |
titlenullable | string | Default: null |
shippingRequired | object | |
amount_minorRequired | integer | |
methodRequired | string | Values: deliverypickup |
customerRequired | object | |
nameRequired | string | |
phoneRequired | string | Full international number with country code; stored normalised. |
emailnullable | string | Optional. Never invented when absent. Default: null |
shipping_addressnullable | object | Required when shipping.method is Default: null |
addressRequired | string | |
provinceRequired | string | Syrian province value, e.g. |
citynullable | string | Default: null |
notesnullable | string | Default: null |
payment_methodRequired | string | Must be enabled in the store; otherwise 409 Values: codshamcash_manual |
exchange_ratenullable | object | 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 Default: null |
scaledRequired | integer | |
scaleRequired | integer | |
notenullable | string | Default: null |
tags | string[] | At most 10 tags after case-insensitive dedupe. |
attributes | OrderAttributes | Up to 20 keys ( Default: {} |
inventory | string | Values: decrementskipDefault: "decrement" |
{
"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.
| Name | Type | Description |
|---|---|---|
notenullable | string | Replace the order note; null clears it. |
tags | object | Set operations, never a replace: the merchant's and other apps' tags survive. |
add | string[] | At most 10 tags after case-insensitive dedupe. |
remove | string[] | Removed case-insensitively. |
attributes | OrderAttributesPatch | Merged into the app's namespace; a |
{
"note": "Stock count 2026-08-18",
"tags": {
"add": [
"string"
],
"remove": [
"string"
]
},
"attributes": {}
}UpdateOrderStatusRequest#
Transition an order through the server matrix.
| Name | Type | Description |
|---|---|---|
statusRequired | SettableOrderStatus | Statuses an app may set through PATCH /orders/{id}/status. Money-bearing statuses are reachable only through refunds. Values: placedapprovedprocessingshippeddelivereddelivered_failedreturnedcancelled |
{
"status": "placed"
}CreateFulfillmentRequest#
Fulfill selected line quantities. Each order item may appear once.
| Name | Type | Description |
|---|---|---|
providernullable | string | |
tracking_numbernullable | string | |
status | string | "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: pendingshippedDefault: "shipped" |
linesRequired | object[] | |
order_item_idRequired | string | |
quantityRequired | integer |
{
"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.
| Name | Type | Description |
|---|---|---|
tracking_numbernullable | string | |
status | string | Values: shippeddeliveredcancelled |
cod_collected_minor | integer | 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_note | string |
{
"tracking_number": "RX123456789SY",
"status": "shipped",
"cod_collected_minor": 275000,
"cod_collected_note": "string"
}CreateRefundRequest#
Append a refund against captured funds.
| Name | Type | Description |
|---|---|---|
amount_minorRequired | integer | |
currency | string | Optional confirmation guard; 409 when it differs from the order's currency. |
reasonnullable | string | |
lines | object[] | Optional line breakdown; amounts must sum to amount_minor. |
order_item_idRequired | string | |
quantityRequired | integer | |
amount_minorRequired | integer | |
restock | object | Return the refunded quantities to stock. Requires |
location_idRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
variant_idRequired | string | |
location_idRequired | string | |
deltaRequired | integer | Signed quantity change. Absolute stock writes are forbidden. |
reasonRequired | string | Values: correctioninitialreturndamage |
notenullable | string |
{
"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.
| Name | Type | Description |
|---|---|---|
endpoint_urlRequired | string | Public HTTPS URL. Private, loopback and IP-literal hosts are refused. |
topicsRequired | WebhookTopic[] | |
rotate_secret | boolean | Mint a new signing secret and return it once in the response. |
{
"endpoint_url": "https://app.example.com/webhooks/dukkan",
"topics": [
"order.created"
],
"rotate_secret": false
}CreateWebhookTestEventRequest#
Fire one signed test delivery (sandbox stores only).
| Name | Type | Description |
|---|---|---|
topicRequired | WebhookTopic | Webhook topic. Subscribing needs the read scope that governs the payload; Values: order.createdorder.status_changedorder.paidproduct.createdproduct.updatedproduct.deletedinventory.movement_createdfulfillment.requestedfulfillment.createdfulfillment.updatedrefund.createdapp.uninstalled |
data | object | Optional overrides merged over the platform-built sample payload for the topic (at most 16 KB). |
{
"topic": "order.created",
"data": {}
}OrderCreatedEventData#
| Name | Type | Description |
|---|---|---|
order_idRequired | string | |
order_numberRequired | string | |
statusRequired | string | Order status at creation (usually |
total_minorRequired | integer | Integer minor units of |
currencyRequired | string | |
sourcenullable | string | Sales channel ( |
{
"order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"order_number": "1042",
"status": "placed",
"total_minor": 1,
"currency": "SYP",
"source": "online"
}OrderStatusChangedEventData#
| Name | Type | Description |
|---|---|---|
order_idRequired | string | |
from_statusRequired | string | |
statusRequired | string | The status the order moved to. |
{
"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.
| Name | Type | Description |
|---|---|---|
order_idRequired | string | |
amount_minorRequired | integer | Captured funds at the moment they crossed the order total. |
currencyRequired | string |
{
"order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"amount_minor": 275000,
"currency": "SYP"
}ProductCreatedEventData#
| Name | Type | Description |
|---|---|---|
product_idRequired | string |
{
"product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}ProductUpdatedEventData#
| Name | Type | Description |
|---|---|---|
product_idRequired | string | |
variant_id | string | Set when a variant row changed rather than the product itself. |
operation | string | Present on variant changes: which write on the variant fired the event. Values: insertupdatedelete |
{
"product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"variant_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"operation": "insert"
}ProductDeletedEventData#
| Name | Type | Description |
|---|---|---|
product_idRequired | string |
{
"product_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}InventoryMovementCreatedEventData#
| Name | Type | Description |
|---|---|---|
movement_idRequired | string | |
variant_idRequirednullable | string | |
location_idRequired | string | |
deltaRequired | integer | |
stock_afterRequired | integer | |
reasonRequired | string |
{
"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.
| Name | Type | Description |
|---|---|---|
fulfillment_idRequired | string | |
order_idRequired | string | |
linesRequired | object[] | |
order_item_idRequired | string | |
quantityRequired | integer |
{
"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#
| Name | Type | Description |
|---|---|---|
fulfillment_idRequired | string | |
order_idRequired | string | |
statusRequired | string | Values: pendingshipped |
tracking_numberRequirednullable | string | |
linesRequired | object[] | |
order_item_idRequired | string | |
quantityRequired | integer | |
order_fully_fulfilledRequired | boolean | True when every line of the order is now covered by a fulfillment. |
{
"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#
| Name | Type | Description |
|---|---|---|
fulfillment_idRequired | string | |
order_idRequired | string | |
statusRequired | string | Values: pendingshippeddeliveredcancelled |
previous_statusRequired | string | |
tracking_numberRequirednullable | string |
{
"fulfillment_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"order_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"status": "pending",
"previous_status": "string",
"tracking_number": "RX123456789SY"
}RefundCreatedEventData#
| Name | Type | Description |
|---|---|---|
refund_idRequired | string | |
order_idRequired | string | |
amount_minorRequired | integer | Integer minor units of |
currencyRequired | string | |
lines | object[] | Line breakdown when the refund carried one. Absent on POS refunds. |
order_item_idRequirednullable | string | |
quantityRequired | integer | |
amount_minorRequired | integer | Integer minor units of |
source | "pos" | Present when the refund was written at the point of sale. |
{
"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.
| Name | Type | Description |
|---|---|---|
app_idRequired | string | |
install_idRequired | string |
{
"app_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b",
"install_id": "6f1d2c3b-4a59-4e8f-9b70-2d1c3e4f5a6b"
}