ProfitGuard is here. AI repricing for Amazon, fully protected and on autopilot. Try it free
API reference · OpenAPI 3.1.0api_version 2026-11-01https://api.profitpath.app

ProfitDesk Prep API · API reference

Connect your own warehouse software to ProfitDesk as a prep center.

Overview

  • Base URL: https://api.profitpath.app
  • API version: 2026-11-01
  • Authentication: Bearer ppk_…

A webhook prep-center connection links a ProfitDesk account to warehouse software you run yourself. Building software for many sellers? See prep-providers-v1.openapi.yaml (external prep providers).

  • ProfitDesk → you: announcements, cancellations and updates arrive as signed webhook events at the URL you configured (see webhooks below). Missed events can be replayed with GET /v1/prep/events.
  • You → ProfitDesk: report goods received (POST /v1/prep/inbounds/{id}/receipts) and what you ship out (POST /v1/prep/outbounds), and pull inbounds, items and events.

Identifiers

Every id carries a type prefix: pur_ purchase, itm_ item (one per SKU), inb_ inbound, inl_ inbound line (one per purchase in an inbound), out_ outbound, pcn_ connection, wh_ warehouse, evt_ event. Wherever a path takes an inbound or outbound {id}, you may pass ext:<external_id> instead to address it by your own reference.

A seller can hold several webhook connections, for example one per warehouse setup; each has its own pcn_ id, signing secret and API key, and a key only sees its own connection.

Authentication

Authorization: Bearer ppk_… with the API key shown once when the connection was created or its key rotated. Missing, unknown or revoked keys get 401.

Rate limit

2 requests per second per key, bursts up to 10. Beyond that: 429 with Retry-After: 1.

Idempotency

Every POST/PUT may carry an idempotency key, either event_id in the body or the Idempotency-Key header (the body wins). It is required for receipts and outbounds. Repeating a request with the same key and the identical method, path and body returns the stored response with "duplicate": true and has no further effect. The same key with a different request is 409 idempotency_conflict. Failed requests are not stored, so a key that got a 4xx can be retried after fixing the request. Keys are scoped to the connection and kept for 30 days.

Ordering

Receipts and outbounds carry occurred_at (RFC 3339, default: now). A line or outbound is only changed by an event newer than the last one applied to it; older events are reported as stale and change nothing, so out-of-order delivery is safe.

Webhook events

ProfitDesk POSTs a signed JSON envelope to your endpoint URL. The full request and response definition of every event is in the Webhooks section at the bottom of this page; the schemas are under Schemas.

EventSent whendataDefault
inbound.announcedGoods are on their way to youinbound, traceson
inbound.updatedTracking numbers added, an FNSKU became known, your external_id changed, or lines of a shared inbound were cancelled/restoredinbound, traces, changes (+ reason when a line was cancelled)on
inbound.cancelledThe whole inbound is cancelled (purchase cancelled or deactivated, warehouse changed, re-announced)inbound, traces, reason, replaced_by_inbound_id?on
inbound.restoredA cancelled inbound is active again (if you never received the inbound, a reactivation arrives as inbound.announced)inbound, traceson
inbound.receivedEcho of a receipt you reportedinbound, tracesoff
outbound.recordedEcho of an outbound you reportedoutbound, tracesoff
ping"Send test" in ProfitDeskmessagealways

The seller picks the events in the connection settings; the echo events are off by default because they only repeat what you reported yourself. GET /v1/prep/events returns every event type regardless of the subscription.

Your response: any 2xx within 10 s counts as delivered; for inbound.announced the body may be {"external_id": "<your id>"}; it is stored without an inbound.updated event. Timeouts, 408, 429 and 5xx are retried until 72 h after the event was queued, 3xx and other 4xx (410 included) fail immediately; only a failed attempt after 72 h without any successful delivery disables the endpoint. A purchase counts as announced only once its inbound.announced was delivered.

Order and skips: events of the same inbound are delivered in order, one at a time. If an inbound is cancelled before you received any of its events, all its open deliveries, the cancel included, are skipped; a later reactivation then arrives as inbound.announced. An event is never delivered after an inbound.cancelled of its inbound that you already received. Skipped events stay in GET /v1/prep/events, which is ordered so that a cursor never skips an event.

Errors

Every non-2xx response has the body {"error": {"code", "message", "details"}}. Codes: unauthorized (401), rate_limited (429), invalid_request / invalid_json / idempotency_key_required (400), payload_too_large (413), inbound_not_found / outbound_not_found (404), inbound_cancelled / idempotency_conflict / external_id_conflict (409), line_not_found (422), internal_error (500). Request bodies are limited to 1 MB; unknown JSON fields are ignored.

Inbounds

List inbounds announced to the connection

GET/v1/prep/inbounds

Parameters

NameInTypeRequiredDescription
statusquerystringNoOne of: open, received, cancelled.
updated_sincequerystring (date-time)NoOnly inbounds changed after this instant (including tracking and FNSKU updates).
cursorquerystringNonext_cursor of the previous page.
limitqueryintegerNoDefault: 50. Minimum 1. Maximum 100.

Responses

StatusDescriptionBody
200Inbounds ordered by id. An inbound whose lines were all removed (the purchase moved to another warehouse or was re-announced) is not listed; find it through GET /v1/prep/events.object
defaultErrorError

Response 200

FieldTypeRequiredDescription
dataarray of InboundViewYes
next_cursorstring | nullYesPass as cursor for the next page; null on the last page.
Example response
{
  "data": [
    {
      "connection_id": "pcn_812",
      "inbound": {
        "id": "inb_2000000123",
        "external_id": "WMS-IN-5521",
        "batch_id": null,
        "status": "open",
        "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
        "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
        "fulfillment": "FBA",
        "warehouse": {
          "id": "wh_12",
          "name": "Warehouse South"
        },
        "order": {
          "numbers": [
            "302-1234567-1234567"
          ],
          "supplier_host": "amazon.de",
          "purchased_at": "2026-11-02"
        },
        "tracking_numbers": [
          "1Z999AA10123456784"
        ],
        "lines": [
          {
            "id": "inl_99",
            "purchase_id": "pur_4711",
            "item": {
              "id": "itm_17",
              "sku": "AB-123",
              "fnsku": "X00ABCDEFG",
              "asin": "B0ABCDEFGH",
              "ean": "4006381333931",
              "title": "Bosch GSR 18V-55 Drill Driver",
              "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
            },
            "quantity_expected": 6,
            "quantity_received": 0,
            "quantity_damaged": 0,
            "status": "open"
          }
        ],
        "created_at": "2026-11-03T10:15:00Z"
      },
      "traces": [
        {
          "purchase_id": "pur_4711",
          "inbound_id": "inb_2000000123",
          "inbound_line_id": "inl_99",
          "item_id": "itm_17",
          "sku": "AB-123",
          "fnsku": "X00ABCDEFG",
          "asin": "B0ABCDEFGH",
          "order_number": "302-1234567-1234567",
          "batch_id": null,
          "outbound_ids": [],
          "amazon_shipment_ids": []
        }
      ]
    }
  ],
  "next_cursor": "inb_2000000123"
}

Get one inbound with its lines and traces

GET/v1/prep/inbounds/{id}

For an inbound whose lines were removed (the purchase moved to another warehouse or was re-announced), returns the inbound as of its latest event with status: cancelled and every line cancelled. 404 inbound_not_found means the id was never announced to this connection.

Parameters

NameInTypeRequiredDescription
idpathstringYesinb_… or ext:<external_id>

Responses

StatusDescriptionBody
200The inbound.InboundView
defaultErrorError
Example response
{
  "connection_id": "pcn_812",
  "inbound": {
    "id": "inb_2000000123",
    "external_id": "WMS-IN-5521",
    "batch_id": null,
    "status": "open",
    "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
    "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
    "fulfillment": "FBA",
    "warehouse": {
      "id": "wh_12",
      "name": "Warehouse South"
    },
    "order": {
      "numbers": [
        "302-1234567-1234567"
      ],
      "supplier_host": "amazon.de",
      "purchased_at": "2026-11-02"
    },
    "tracking_numbers": [
      "1Z999AA10123456784"
    ],
    "lines": [
      {
        "id": "inl_99",
        "purchase_id": "pur_4711",
        "item": {
          "id": "itm_17",
          "sku": "AB-123",
          "fnsku": "X00ABCDEFG",
          "asin": "B0ABCDEFGH",
          "ean": "4006381333931",
          "title": "Bosch GSR 18V-55 Drill Driver",
          "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
        },
        "quantity_expected": 6,
        "quantity_received": 0,
        "quantity_damaged": 0,
        "status": "open"
      }
    ],
    "created_at": "2026-11-03T10:15:00Z"
  },
  "traces": [
    {
      "purchase_id": "pur_4711",
      "inbound_id": "inb_2000000123",
      "inbound_line_id": "inl_99",
      "item_id": "itm_17",
      "sku": "AB-123",
      "fnsku": "X00ABCDEFG",
      "asin": "B0ABCDEFGH",
      "order_number": "302-1234567-1234567",
      "batch_id": null,
      "outbound_ids": [],
      "amazon_shipment_ids": []
    }
  ]
}

Set your own reference on an inbound

PUT/v1/prep/inbounds/{id}/external-id

Unique per connection (409 external_id_conflict); afterwards the inbound is addressable as ext:<external_id>. A changed value emits inbound.updated with changes: ["external_id"]. A cancelled inbound answers 409 inbound_cancelled. The idempotency key is optional here; without one, event_id is null in the response.

Parameters

NameInTypeRequiredDescription
idpathstringYesinb_… or ext:<external_id>
Idempotency-KeyheaderstringNoUsed when the body carries no event_id. Max length 200.

Request body

FieldTypeRequiredDescription
event_idstringNoMax length 200.
external_idstringYesMin length 1. Max length 200.
Example request
{
  "external_id": "WMS-IN-5521"
}

Responses

StatusDescriptionBody
200The inbound after the change.ExternalIdResponse
defaultErrorError
Example response
{
  "event_id": null,
  "duplicate": false,
  "connection_id": "pcn_812",
  "inbound": {
    "id": "inb_2000000123",
    "external_id": "WMS-IN-5521",
    "batch_id": null,
    "status": "open",
    "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
    "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
    "fulfillment": "FBA",
    "warehouse": {
      "id": "wh_12",
      "name": "Warehouse South"
    },
    "order": {
      "numbers": [
        "302-1234567-1234567"
      ],
      "supplier_host": "amazon.de",
      "purchased_at": "2026-11-02"
    },
    "tracking_numbers": [
      "1Z999AA10123456784"
    ],
    "lines": [
      {
        "id": "inl_99",
        "purchase_id": "pur_4711",
        "item": {
          "id": "itm_17",
          "sku": "AB-123",
          "fnsku": "X00ABCDEFG",
          "asin": "B0ABCDEFGH",
          "ean": "4006381333931",
          "title": "Bosch GSR 18V-55 Drill Driver",
          "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
        },
        "quantity_expected": 6,
        "quantity_received": 0,
        "quantity_damaged": 0,
        "status": "open"
      }
    ],
    "created_at": "2026-11-03T10:15:00Z"
  },
  "traces": [
    {
      "purchase_id": "pur_4711",
      "inbound_id": "inb_2000000123",
      "inbound_line_id": "inl_99",
      "item_id": "itm_17",
      "sku": "AB-123",
      "fnsku": "X00ABCDEFG",
      "asin": "B0ABCDEFGH",
      "order_number": "302-1234567-1234567",
      "batch_id": null,
      "outbound_ids": [],
      "amazon_shipment_ids": []
    }
  ]
}

Report goods received for an announced inbound

POST/v1/prep/inbounds/{id}/receipts

quantity_received is the absolute count for the line, so a correction downwards is just a smaller number. Address a line by line_id (exact) or by sku within this inbound; several lines of the same SKU are filled in order up to their expected quantity, any surplus goes to the last. status is required. receiving is the count so far: a line closes when it reaches its expected quantity and opens again if a later receiving count is lower. status: received closes every line of the inbound, also lines counted short or not at all. Only announced goods are accepted: an inbound never announced to the key's connections is 404 inbound_not_found, a line or SKU that is not part of the inbound is 422 line_not_found, a cancelled inbound (also one whose lines were removed because the purchase moved or was re-announced) is 409 inbound_cancelled. A receipt that changed anything emits inbound.received.

Parameters

NameInTypeRequiredDescription
idpathstringYesinb_… or ext:<external_id>
Idempotency-KeyheaderstringNoUsed when the body carries no event_id. Max length 200.

Request body

Schema: ReceiptRequest

FieldTypeRequiredDescription
event_idstringNoIdempotency key; or send the Idempotency-Key header. Max length 200.
occurred_atstring (date-time)No
statusstringYesOne of: receiving, received.
linesarray of objectNoMay be empty only with status: received. Each line may be addressed once per request.
lines[].line_idstringNoinl_…; takes precedence over sku.
lines[].skustringNo
lines[].quantity_receivedintegerYesAbsolute count. Minimum 0.
lines[].quantity_damagedintegerNoStored and returned; omitted keeps the previous value. Minimum 0.
Example request
{
  "event_id": "rcpt-8812",
  "occurred_at": "2026-11-05T08:01:00Z",
  "status": "receiving",
  "lines": [
    {
      "line_id": "inl_120",
      "quantity_received": 5,
      "quantity_damaged": 1
    },
    {
      "sku": "CD-456",
      "quantity_received": 2
    }
  ]
}

Responses

StatusDescriptionBody
200Applied, or replayed with duplicate: true.ReceiptResponse
defaultErrorError
Example response
{
  "event_id": "rcpt-8812",
  "duplicate": false,
  "connection_id": "pcn_812",
  "inbound": {
    "id": "inb_2000000131",
    "external_id": "WMS-IN-5530",
    "batch_id": "0d1f6a2e-4b7c-4c11-9a3e-5f2b8c7d9e10",
    "status": "open",
    "name": "amazon.de | Bosch GSR 18V-55 Drill Driver +1 | 302-1234567-1234567, 302-7654321-7654321",
    "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
    "fulfillment": "FBA",
    "warehouse": {
      "id": "wh_12",
      "name": "Warehouse South"
    },
    "order": {
      "numbers": [
        "302-1234567-1234567",
        "302-7654321-7654321"
      ],
      "supplier_host": "amazon.de",
      "purchased_at": "2026-11-02"
    },
    "tracking_numbers": [
      "1Z999AA10123456784"
    ],
    "lines": [
      {
        "id": "inl_120",
        "purchase_id": "pur_4720",
        "item": {
          "id": "itm_17",
          "sku": "AB-123",
          "fnsku": "X00ABCDEFG",
          "asin": "B0ABCDEFGH",
          "ean": "4006381333931",
          "title": "Bosch GSR 18V-55 Drill Driver",
          "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
        },
        "quantity_expected": 6,
        "quantity_received": 5,
        "quantity_damaged": 1,
        "status": "open"
      },
      {
        "id": "inl_121",
        "purchase_id": "pur_4721",
        "item": {
          "id": "itm_18",
          "sku": "CD-456",
          "fnsku": "X00BCDEFGH",
          "asin": "B0BCDEFGHI",
          "ean": "4059952513164",
          "title": "Bosch GBA 18V 4.0Ah Battery",
          "image_url": "https://m.media-amazon.com/images/I/51Zk2mN8pRL.jpg"
        },
        "quantity_expected": 2,
        "quantity_received": 2,
        "quantity_damaged": 0,
        "status": "received"
      }
    ],
    "created_at": "2026-11-03T10:15:00Z"
  },
  "traces": [
    {
      "purchase_id": "pur_4720",
      "inbound_id": "inb_2000000131",
      "inbound_line_id": "inl_120",
      "item_id": "itm_17",
      "sku": "AB-123",
      "fnsku": "X00ABCDEFG",
      "asin": "B0ABCDEFGH",
      "order_number": "302-1234567-1234567",
      "batch_id": "0d1f6a2e-4b7c-4c11-9a3e-5f2b8c7d9e10",
      "outbound_ids": [],
      "amazon_shipment_ids": []
    },
    {
      "purchase_id": "pur_4721",
      "inbound_id": "inb_2000000131",
      "inbound_line_id": "inl_121",
      "item_id": "itm_18",
      "sku": "CD-456",
      "fnsku": "X00BCDEFGH",
      "asin": "B0BCDEFGHI",
      "order_number": "302-7654321-7654321",
      "batch_id": "0d1f6a2e-4b7c-4c11-9a3e-5f2b8c7d9e10",
      "outbound_ids": [],
      "amazon_shipment_ids": []
    }
  ],
  "lines": [
    {
      "line_id": "inl_120",
      "result": "applied"
    },
    {
      "line_id": "inl_121",
      "result": "applied"
    }
  ]
}

Outbounds

Create, update, ship or cancel an outbound

POST/v1/prep/outbounds

Upserts by external_id; the lines you send replace the stored ones, and cancelled clears them. Each line is matched to a purchase, in this priority: line_id (exact), purchase_id (exact, must belong to an inbound of the outbound's connection), item_id or sku (first received first, capped at what was received minus what other open or shipped outbounds already hold). Quantities that cannot be matched are returned in unresolved; only when nothing at all matches is the request refused with 422 line_not_found.

Outbounds are a trace: they do not change any stock or forwarded quantity (FBA shipments are booked from Amazon). Every request that is not stale emits outbound.recorded.

Parameters

NameInTypeRequiredDescription
Idempotency-KeyheaderstringNoUsed when the body carries no event_id. Max length 200.

Request body

Schema: OutboundRequest

FieldTypeRequiredDescription
event_idstringNoMax length 200.
external_idstringYesYour outbound id. Min length 1. Max length 200.
occurred_atstring (date-time)No
statusstringYesOne of: created, shipped, cancelled.
destinationobjectYes
destination.typestringYesRequired; missing or empty is 400 invalid_request. One of: fba, fbm, other.
destination.amazon_shipment_idstringNoMax length 64. Example: FBA15XYZ.
destination.marketplacestringNoMax length 8. Example: DE.
tracking_numbersarray of stringNo
linesarray of objectNo
lines[].line_idstringNo
lines[].purchase_idstringNo
lines[].item_idstringNo
lines[].skustringNo
lines[].quantityintegerYesMinimum 1.
Example request
{
  "event_id": "out-311-v3",
  "external_id": "OUT-311",
  "occurred_at": "2026-11-06T14:00:00Z",
  "status": "shipped",
  "destination": {
    "type": "fba",
    "amazon_shipment_id": "FBA15XYZ",
    "marketplace": "DE"
  },
  "tracking_numbers": [
    "1Z999AA10123456784"
  ],
  "lines": [
    {
      "line_id": "inl_120",
      "quantity": 4
    },
    {
      "sku": "CD-456",
      "quantity": 2
    }
  ]
}

Responses

StatusDescriptionBody
200Stored (or stale: true when a newer event was already applied), or replayed with duplicate: true.OutboundResponse
defaultErrorError
{
  "event_id": "out-311-v3",
  "duplicate": false,
  "stale": false,
  "connection_id": "pcn_812",
  "outbound": {
    "id": "out_55",
    "external_id": "OUT-311",
    "status": "shipped",
    "destination": {
      "type": "fba",
      "amazon_shipment_id": "FBA15XYZ",
      "marketplace": "DE"
    },
    "tracking_numbers": [
      "1Z999AA10123456784"
    ],
    "shipped_at": "2026-11-06T14:00:00Z",
    "lines": [
      {
        "purchase_id": "pur_4720",
        "inbound_line_id": "inl_120",
        "quantity": 4,
        "resolved_by": "line_id"
      },
      {
        "purchase_id": "pur_4721",
        "inbound_line_id": "inl_121",
        "quantity": 2,
        "resolved_by": "sku_fifo"
      }
    ]
  },
  "unresolved": []
}

Get one outbound with its purchase allocation

GET/v1/prep/outbounds/{id}

Parameters

NameInTypeRequiredDescription
idpathstringYesout_… or ext:<external_id>

Responses

StatusDescriptionBody
200The outbound.object
defaultErrorError

Response 200

FieldTypeRequiredDescription
connection_idstringYesExample: pcn_812.
outboundOutboundYes
Example response
{
  "connection_id": "pcn_812",
  "outbound": {
    "id": "out_55",
    "external_id": "OUT-311",
    "status": "shipped",
    "destination": {
      "type": "fba",
      "amazon_shipment_id": "FBA15XYZ",
      "marketplace": "DE"
    },
    "tracking_numbers": [
      "1Z999AA10123456784"
    ],
    "shipped_at": "2026-11-06T14:00:00Z",
    "lines": [
      {
        "purchase_id": "pur_4720",
        "inbound_line_id": "inl_120",
        "quantity": 4,
        "resolved_by": "line_id"
      },
      {
        "purchase_id": "pur_4721",
        "inbound_line_id": "inl_121",
        "quantity": 2,
        "resolved_by": "sku_fifo"
      }
    ]
  }
}

Items

List the connection's articles (one per SKU)

GET/v1/prep/items

image_url is not filled in this list; the inbound payloads carry it.

Parameters

NameInTypeRequiredDescription
skuquerystringNoExact SKU.
cursorquerystringNonext_cursor of the previous page.
limitqueryintegerNoDefault: 50. Minimum 1. Maximum 100.

Responses

StatusDescriptionBody
200Items ordered by id.object
defaultErrorError

Response 200

FieldTypeRequiredDescription
dataarray of ItemViewYes
next_cursorstring | nullYes
Example response
{
  "data": [
    {
      "id": "itm_17",
      "sku": "AB-123",
      "fnsku": "X00ABCDEFG",
      "asin": "B0ABCDEFGH",
      "ean": "4006381333931",
      "title": "Bosch GSR 18V-55 Drill Driver",
      "image_url": null,
      "connection_id": "pcn_812",
      "created_at": "2026-11-03T10:15:00Z",
      "updated_at": "2026-11-03T10:15:00Z"
    },
    {
      "id": "itm_18",
      "sku": "CD-456",
      "fnsku": "X00BCDEFGH",
      "asin": "B0BCDEFGHI",
      "ean": "4059952513164",
      "title": "Bosch GBA 18V 4.0Ah Battery",
      "image_url": null,
      "connection_id": "pcn_812",
      "created_at": "2026-11-03T10:15:00Z",
      "updated_at": "2026-11-04T07:30:00Z"
    }
  ],
  "next_cursor": null
}

Events

Replay the connection's webhook events

GET/v1/prep/events

Returns the same envelopes that are delivered to your URL, whether or not your endpoint is subscribed to the type and whether the delivery succeeded, failed or was skipped. Events are kept for 90 days.

The feed is ordered by the transaction that created each event, and an event shows up once every transaction that started before it has finished (usually within a second, at most ten minutes), so no event is ever inserted behind a next_cursor you already have. Poll with since set to the last next_cursor you processed and deduplicate by id.

Resume with an evt_… id: that position is exact. An RFC 3339 instant is compared with the time the event was stored, which can differ from the envelope's created_at by milliseconds, so the window starts one second early and can repeat events you already have. Always deduplicate by id.

Parameters

NameInTypeRequiredDescription
sincequerystringNoAn event id of this feed (evt_…, exclusive, recommended; unknown ids are 400) or an RFC 3339 instant (starts one second early; may repeat events).
typesquerystringNoComma-separated event types. Example: inbound.announced,inbound.cancelled.
limitqueryintegerNoDefault: 50. Minimum 1. Maximum 100.

Responses

StatusDescriptionBody
200Events in feed order.object
defaultErrorError

Response 200

FieldTypeRequiredDescription
dataarray of EnvelopeYes
next_cursorstring | nullYesId of the last event returned; null when none was.
has_morebooleanYes
Example response
{
  "data": [
    {
      "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01",
      "type": "inbound.announced",
      "api_version": "2026-11-01",
      "occurred_at": "2026-11-03T10:15:00Z",
      "created_at": "2026-11-03T10:15:01Z",
      "connection_id": "pcn_812",
      "data": {
        "inbound": {
          "id": "inb_2000000123",
          "external_id": null,
          "batch_id": null,
          "status": "open",
          "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
          "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
          "fulfillment": "FBA",
          "warehouse": {
            "id": "wh_12",
            "name": "Warehouse South"
          },
          "order": {
            "numbers": [
              "302-1234567-1234567"
            ],
            "supplier_host": "amazon.de",
            "purchased_at": "2026-11-02"
          },
          "tracking_numbers": [
            "1Z999AA10123456784"
          ],
          "lines": [
            {
              "id": "inl_99",
              "purchase_id": "pur_4711",
              "item": {
                "id": "itm_17",
                "sku": "AB-123",
                "fnsku": null,
                "asin": "B0ABCDEFGH",
                "ean": "4006381333931",
                "title": "Bosch GSR 18V-55 Drill Driver",
                "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
              },
              "quantity_expected": 6,
              "quantity_received": 0,
              "quantity_damaged": 0,
              "status": "open"
            }
          ],
          "created_at": "2026-11-03T10:15:00Z"
        },
        "traces": [
          {
            "purchase_id": "pur_4711",
            "inbound_id": "inb_2000000123",
            "inbound_line_id": "inl_99",
            "item_id": "itm_17",
            "sku": "AB-123",
            "fnsku": null,
            "asin": "B0ABCDEFGH",
            "order_number": "302-1234567-1234567",
            "batch_id": null,
            "outbound_ids": [],
            "amazon_shipment_ids": []
          }
        ],
        "changes": null,
        "reason": null,
        "replaced_by_inbound_id": null
      }
    }
  ],
  "next_cursor": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01",
  "has_more": true
}

Connections

The key's own connection

GET/v1/prep/connections

Returns the key's connection in the list shape shared with prep providers. seller.name is the workspace name, customer_reference is always null for an own-software connection.

Parameters

NameInTypeRequiredDescription
cursorquerystringNonext_cursor of the previous page.
limitqueryintegerNoDefault: 50. Minimum 1. Maximum 100.

Responses

StatusDescriptionBody
200Connections ordered by id.object
defaultErrorError

Response 200

FieldTypeRequiredDescription
dataarray of ConnectionYes
next_cursorstring | nullYes
Example response
{
  "data": [
    {
      "id": "pcn_812",
      "status": "active",
      "seller": {
        "name": "Sample Trading",
        "customer_reference": null,
        "seller_id": "A1B2C3D4E5F6G7"
      },
      "created_at": "2026-11-01T09:00:00Z"
    }
  ],
  "next_cursor": null
}

Webhooks

ProfitDesk sends these events as signed POST requests to the endpoint URL of the connection. Headers, body and the responses ProfitDesk expects from you.

inbound.announced

POSTyour endpoint URL

Goods are on their way to you

Delivered as POST to your endpoint URL with these headers:

HeaderValue
X-Webhook-Eventthe envelope id (evt_…), for deduplication
X-Webhook-Event-Typee.g. inbound.announced
X-Webhook-TimestampUnix seconds of the attempt
X-Webhook-Signaturesha256=<hex>; during a secret rotation two, comma-separated
User-AgentProfitDesk-Webhooks/1

Verify the signature before trusting the body: compute hex(HMAC-SHA256(secret, timestamp + "." + rawBody)) with your signing secret (whsec_…, used as-is as the HMAC key) over the raw request body, and accept the request if it equals any sha256= entry of the header (compare in constant time). Reject timestamps more than five minutes from your clock. After a rotation the previous secret stays valid for 24 hours.

Respond with any 2xx within 10 seconds. Timeouts, 408, 429 and 5xx are retried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h until 72 h after the event was queued; 3xx and other 4xx fail at once (410 included); only 72 h without any success disables the endpoint.

You may answer {"external_id": "<your id>"}; it is stored like PUT …/external-id, but without an inbound.updated event. It must be unique within your connection; a value another inbound already uses is not stored (the delivery still counts). The purchase only counts as announced once you answered 2xx. Events of the same inbound are delivered in order, one at a time. If the inbound is cancelled before you received any of its events, they are all skipped; a reactivation of such an inbound also arrives as inbound.announced.

inbound.received and outbound.recorded echo your own API calls and are off unless you subscribe to them.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: InboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01",
  "type": "inbound.announced",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-03T10:15:00Z",
  "created_at": "2026-11-03T10:15:01Z",
  "connection_id": "pcn_812",
  "data": {
    "inbound": {
      "id": "inb_2000000123",
      "external_id": null,
      "batch_id": null,
      "status": "open",
      "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
      "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
      "fulfillment": "FBA",
      "warehouse": {
        "id": "wh_12",
        "name": "Warehouse South"
      },
      "order": {
        "numbers": [
          "302-1234567-1234567"
        ],
        "supplier_host": "amazon.de",
        "purchased_at": "2026-11-02"
      },
      "tracking_numbers": [
        "1Z999AA10123456784"
      ],
      "lines": [
        {
          "id": "inl_99",
          "purchase_id": "pur_4711",
          "item": {
            "id": "itm_17",
            "sku": "AB-123",
            "fnsku": null,
            "asin": "B0ABCDEFGH",
            "ean": "4006381333931",
            "title": "Bosch GSR 18V-55 Drill Driver",
            "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
          },
          "quantity_expected": 6,
          "quantity_received": 0,
          "quantity_damaged": 0,
          "status": "open"
        }
      ],
      "created_at": "2026-11-03T10:15:00Z"
    },
    "traces": [
      {
        "purchase_id": "pur_4711",
        "inbound_id": "inb_2000000123",
        "inbound_line_id": "inl_99",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": null,
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": null,
        "outbound_ids": [],
        "amazon_shipment_ids": []
      }
    ],
    "changes": null,
    "reason": null,
    "replaced_by_inbound_id": null
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

inbound.updated

POSTyour endpoint URL

Tracking numbers, an FNSKU, your external id or line states changed (see data.changes)

Same headers, signature, response and retry rules as inbound.announced.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: InboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a02",
  "type": "inbound.updated",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-04T07:30:00Z",
  "created_at": "2026-11-04T07:30:01Z",
  "connection_id": "pcn_812",
  "data": {
    "inbound": {
      "id": "inb_2000000123",
      "external_id": "WMS-IN-5521",
      "batch_id": null,
      "status": "open",
      "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
      "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
      "fulfillment": "FBA",
      "warehouse": {
        "id": "wh_12",
        "name": "Warehouse South"
      },
      "order": {
        "numbers": [
          "302-1234567-1234567"
        ],
        "supplier_host": "amazon.de",
        "purchased_at": "2026-11-02"
      },
      "tracking_numbers": [
        "1Z999AA10123456784",
        "JJD000390007754321"
      ],
      "lines": [
        {
          "id": "inl_99",
          "purchase_id": "pur_4711",
          "item": {
            "id": "itm_17",
            "sku": "AB-123",
            "fnsku": "X00ABCDEFG",
            "asin": "B0ABCDEFGH",
            "ean": "4006381333931",
            "title": "Bosch GSR 18V-55 Drill Driver",
            "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
          },
          "quantity_expected": 6,
          "quantity_received": 0,
          "quantity_damaged": 0,
          "status": "open"
        }
      ],
      "created_at": "2026-11-03T10:15:00Z"
    },
    "traces": [
      {
        "purchase_id": "pur_4711",
        "inbound_id": "inb_2000000123",
        "inbound_line_id": "inl_99",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": "X00ABCDEFG",
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": null,
        "outbound_ids": [],
        "amazon_shipment_ids": []
      }
    ],
    "changes": [
      "tracking_numbers",
      "fnsku"
    ],
    "reason": null,
    "replaced_by_inbound_id": null
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

inbound.cancelled

POSTyour endpoint URL

The whole inbound is cancelled (see data.reason)

Same headers, signature, response and retry rules as inbound.announced. Skipped (never sent) if you received none of the inbound's events before.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: InboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a04",
  "type": "inbound.cancelled",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-04T15:00:00Z",
  "created_at": "2026-11-04T15:00:01Z",
  "connection_id": "pcn_812",
  "data": {
    "inbound": {
      "id": "inb_2000000123",
      "external_id": "WMS-IN-5521",
      "batch_id": null,
      "status": "cancelled",
      "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
      "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
      "fulfillment": "FBA",
      "warehouse": {
        "id": "wh_12",
        "name": "Warehouse South"
      },
      "order": {
        "numbers": [
          "302-1234567-1234567"
        ],
        "supplier_host": "amazon.de",
        "purchased_at": "2026-11-02"
      },
      "tracking_numbers": [
        "1Z999AA10123456784"
      ],
      "lines": [
        {
          "id": "inl_99",
          "purchase_id": "pur_4711",
          "item": {
            "id": "itm_17",
            "sku": "AB-123",
            "fnsku": "X00ABCDEFG",
            "asin": "B0ABCDEFGH",
            "ean": "4006381333931",
            "title": "Bosch GSR 18V-55 Drill Driver",
            "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
          },
          "quantity_expected": 6,
          "quantity_received": 0,
          "quantity_damaged": 0,
          "status": "cancelled"
        }
      ],
      "created_at": "2026-11-03T10:15:00Z"
    },
    "traces": [
      {
        "purchase_id": "pur_4711",
        "inbound_id": "inb_2000000123",
        "inbound_line_id": "inl_99",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": "X00ABCDEFG",
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": null,
        "outbound_ids": [],
        "amazon_shipment_ids": []
      }
    ],
    "changes": null,
    "reason": "reannounced",
    "replaced_by_inbound_id": "inb_2000000140"
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

inbound.restored

POSTyour endpoint URL

A cancelled inbound is active again

Same headers, signature, response and retry rules as inbound.announced. If you never received the inbound, a reactivation arrives as inbound.announced instead.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: InboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a05",
  "type": "inbound.restored",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-04T16:00:00Z",
  "created_at": "2026-11-04T16:00:01Z",
  "connection_id": "pcn_812",
  "data": {
    "inbound": {
      "id": "inb_2000000123",
      "external_id": "WMS-IN-5521",
      "batch_id": null,
      "status": "open",
      "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
      "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
      "fulfillment": "FBA",
      "warehouse": {
        "id": "wh_12",
        "name": "Warehouse South"
      },
      "order": {
        "numbers": [
          "302-1234567-1234567"
        ],
        "supplier_host": "amazon.de",
        "purchased_at": "2026-11-02"
      },
      "tracking_numbers": [
        "1Z999AA10123456784"
      ],
      "lines": [
        {
          "id": "inl_99",
          "purchase_id": "pur_4711",
          "item": {
            "id": "itm_17",
            "sku": "AB-123",
            "fnsku": "X00ABCDEFG",
            "asin": "B0ABCDEFGH",
            "ean": "4006381333931",
            "title": "Bosch GSR 18V-55 Drill Driver",
            "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
          },
          "quantity_expected": 6,
          "quantity_received": 0,
          "quantity_damaged": 0,
          "status": "open"
        }
      ],
      "created_at": "2026-11-03T10:15:00Z"
    },
    "traces": [
      {
        "purchase_id": "pur_4711",
        "inbound_id": "inb_2000000123",
        "inbound_line_id": "inl_99",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": "X00ABCDEFG",
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": null,
        "outbound_ids": [],
        "amazon_shipment_ids": []
      }
    ],
    "changes": null,
    "reason": null,
    "replaced_by_inbound_id": null
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

inbound.received

POSTyour endpoint URL

Echo of a receipt you reported (off unless subscribed)

Same headers, signature, response and retry rules as inbound.announced.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: InboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a06",
  "type": "inbound.received",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-05T09:30:00Z",
  "created_at": "2026-11-05T09:30:01Z",
  "connection_id": "pcn_812",
  "data": {
    "inbound": {
      "id": "inb_2000000123",
      "external_id": "WMS-IN-5521",
      "batch_id": null,
      "status": "received",
      "name": "amazon.de | Bosch GSR 18V-55 Drill Driver | 302-1234567-1234567",
      "notes": "Fragile, please bubble-wrap\nFulfillment: FBA",
      "fulfillment": "FBA",
      "warehouse": {
        "id": "wh_12",
        "name": "Warehouse South"
      },
      "order": {
        "numbers": [
          "302-1234567-1234567"
        ],
        "supplier_host": "amazon.de",
        "purchased_at": "2026-11-02"
      },
      "tracking_numbers": [
        "1Z999AA10123456784"
      ],
      "lines": [
        {
          "id": "inl_99",
          "purchase_id": "pur_4711",
          "item": {
            "id": "itm_17",
            "sku": "AB-123",
            "fnsku": "X00ABCDEFG",
            "asin": "B0ABCDEFGH",
            "ean": "4006381333931",
            "title": "Bosch GSR 18V-55 Drill Driver",
            "image_url": "https://m.media-amazon.com/images/I/61Xf3kqcQhL.jpg"
          },
          "quantity_expected": 6,
          "quantity_received": 6,
          "quantity_damaged": 1,
          "status": "received"
        }
      ],
      "created_at": "2026-11-03T10:15:00Z"
    },
    "traces": [
      {
        "purchase_id": "pur_4711",
        "inbound_id": "inb_2000000123",
        "inbound_line_id": "inl_99",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": "X00ABCDEFG",
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": null,
        "outbound_ids": [],
        "amazon_shipment_ids": []
      }
    ],
    "changes": null,
    "reason": null,
    "replaced_by_inbound_id": null
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

outbound.recorded

POSTyour endpoint URL

Echo of an outbound you reported (off unless subscribed)

Same headers, signature, response and retry rules as inbound.announced.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: OutboundEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataOutboundEventDataYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a07",
  "type": "outbound.recorded",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-06T14:00:00Z",
  "created_at": "2026-11-06T14:00:01Z",
  "connection_id": "pcn_812",
  "data": {
    "outbound": {
      "id": "out_55",
      "external_id": "OUT-311",
      "status": "shipped",
      "destination": {
        "type": "fba",
        "amazon_shipment_id": "FBA15XYZ",
        "marketplace": "DE"
      },
      "tracking_numbers": [
        "1Z999AA10123456784"
      ],
      "shipped_at": "2026-11-06T14:00:00Z",
      "lines": [
        {
          "purchase_id": "pur_4720",
          "inbound_line_id": "inl_120",
          "quantity": 4,
          "resolved_by": "line_id"
        },
        {
          "purchase_id": "pur_4721",
          "inbound_line_id": "inl_121",
          "quantity": 2,
          "resolved_by": "sku_fifo"
        }
      ]
    },
    "traces": [
      {
        "purchase_id": "pur_4720",
        "inbound_id": "inb_2000000131",
        "inbound_line_id": "inl_120",
        "item_id": "itm_17",
        "sku": "AB-123",
        "fnsku": "X00ABCDEFG",
        "asin": "B0ABCDEFGH",
        "order_number": "302-1234567-1234567",
        "batch_id": "0d1f6a2e-4b7c-4c11-9a3e-5f2b8c7d9e10",
        "outbound_ids": [
          "out_55"
        ],
        "amazon_shipment_ids": [
          "FBA15XYZ"
        ]
      },
      {
        "purchase_id": "pur_4721",
        "inbound_id": "inb_2000000131",
        "inbound_line_id": "inl_121",
        "item_id": "itm_18",
        "sku": "CD-456",
        "fnsku": "X00BCDEFGH",
        "asin": "B0BCDEFGHI",
        "order_number": "302-7654321-7654321",
        "batch_id": "0d1f6a2e-4b7c-4c11-9a3e-5f2b8c7d9e10",
        "outbound_ids": [
          "out_55"
        ],
        "amazon_shipment_ids": [
          "FBA15XYZ"
        ]
      }
    ]
  }
}

Responses

StatusDescriptionBody
200Delivered. Any 2xx works.object
4XX3xx (redirects are not followed) and any other 4xx except 408/429, 410 included: the delivery fails at once, without retry; the endpoint stays enabled. For inbound.announced the seller sees the announcement as failed.
5XXRetried after 1 min, 5 min, 15 min, 1 h, 3 h, 6 h, then every 12 h, until 72 h after the event was queued. Timeouts (10 s), connection errors, 408 and 429 are treated the same. After 72 h without any successful delivery, a failed attempt disables the endpoint.

ping

POSTyour endpoint URL

"Send test" in ProfitDesk; sent once, not stored, not replayable

Same headers and signature as inbound.announced. Sent once while the seller waits for the result; not retried.

Headers

NameInTypeRequiredDescription
X-Webhook-EventheaderstringYes
X-Webhook-Event-TypeheaderstringYes
X-Webhook-TimestampheaderstringYes
X-Webhook-SignatureheaderstringYes

Request body

Schema: PingEventEnvelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataobjectYes
data.messagestringYes
Example request
{
  "id": "evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a08",
  "type": "ping",
  "api_version": "2026-11-01",
  "occurred_at": "2026-11-03T09:00:00Z",
  "created_at": "2026-11-03T09:00:00Z",
  "connection_id": "pcn_812",
  "data": {
    "message": "Test event from ProfitDesk"
  }
}

Responses

StatusDescriptionBody
200The test succeeded. Any 2xx works.
defaultThe seller sees the status code and the start of your response body.

Schemas

Every object of the API, field by field. Nested fields are listed with their path, e.g. lines[].id.

Error

FieldTypeRequiredDescription
errorobjectYes
error.codestringYesExample: line_not_found.
error.messagestringYes
error.detailsarray of anyYesEmpty unless the code fills it: line_not_found (unknown lines, or the unresolved entries of an outbound), inbound_cancelled for one line.

Envelope

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataobjectYes

InboundEventEnvelope

Body of every inbound.* webhook event.

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataInboundEventDataYes

OutboundEventEnvelope

Body of outbound.recorded.

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataOutboundEventDataYes

Connection

FieldTypeRequiredDescription
idstringYesExample: pcn_812.
statusstringYesOne of: active, removed.
sellerobjectYes
seller.namestring | nullYesThe seller's workspace name; null if none is set.
seller.customer_referencestring | nullYesAlways null for an own-software connection.
seller.seller_idstring | nullYesThe Amazon selling partner id of the account owner; null if no Amazon account is connected.
created_atstring (date-time)Yes

PingEventEnvelope

Body of ping.

FieldTypeRequiredDescription
idstringYesExample: evt_0193a1b2-7c4d-7e8f-9a0b-1c2d3e4f5a01.
typestringYesOne of: inbound.announced, inbound.updated, inbound.cancelled, inbound.restored, inbound.received, outbound.recorded, ping.
api_versionstringYesExample: 2026-11-01.
occurred_atstring (date-time)Yes
created_atstring (date-time)Yes
connection_idstringYesExample: pcn_812.
dataobjectYes
data.messagestringYes

OutboundEventData

FieldTypeRequiredDescription
outboundOutboundYes
tracesarray of TraceYesOne per purchase on the outbound.

InboundEventData

FieldTypeRequiredDescription
inboundInboundYes
tracesarray of TraceYesOne per line, in the order of inbound.lines.
changesarray of string | nullYesnull except on inbound.updated: the fields that changed. lines means some lines of a shared inbound were cancelled or restored while the inbound stays open; read each line's status. external_id is sent only for a changed value set with PUT …/external-id.
reasonstring | nullYesnull except on inbound.cancelled, and on inbound.updated when a line was cancelled. offer_deleted is reserved. One of: purchase_cancelled, purchase_deactivated, warehouse_changed, reannounced, offer_deleted.
replaced_by_inbound_idstring | nullYesnull except on inbound.cancelled / inbound.updated with reason reannounced: the new inbound that takes over the goods.

InboundView

FieldTypeRequiredDescription
connection_idstringYesExample: pcn_812.
inboundInboundYes
tracesarray of TraceYes

ExternalIdResponse

FieldTypeRequiredDescription
connection_idstringYesExample: pcn_812.
inboundInboundYes
tracesarray of TraceYes
event_idstring | nullYesThe idempotency key; null without one.
duplicatebooleanYes

Inbound

FieldTypeRequiredDescription
idstringYesExample: inb_2000000123.
external_idstring | nullYes
batch_idstring | nullYesPurchases announced together arrive together.
statusstringYesreceived once every line is received or cancelled and at least one is received; cancelled once every line is cancelled. One of: open, received, cancelled.
namestringYes<supplier> | <product> | <order numbers>; the product (first 30 characters, +N for more lines) only if the seller transfers product names. If none is known: the inbound id. Max length 255.
notesstringYesSeller notes (if transferred) plus a final line Fulfillment: FBA or Fulfillment: FBM.
fulfillmentstringYesOne of: FBA, FBM.
warehouseobject | nullYesThe seller's warehouse the goods are sent to. A move between warehouses of the same connection sends no event; the next payload carries the new warehouse.
warehouse.idstringYesExample: wh_12.
warehouse.namestringYes
orderobjectYes
order.numbersarray of stringYes
order.supplier_hoststring | nullYesExample: amazon.de.
order.purchased_atstring | null (date)Yes
tracking_numbersarray of stringYesInbound parcel tracking codes known so far, sorted; new ones arrive with inbound.updated. Codes are normalised: the text is split at whitespace (also Unicode spaces) and at , ; : | / \; every character other than A–Z, a–z, 0–9 is removed from each part (DE-LPLV-0GLI → DELPLV0GLI); parts without a digit (carrier labels such as DHL) are dropped; duplicates are compared case-insensitively, the first spelling is kept.
linesarray of InboundLineYesOne line per purchase.
created_atstring (date-time)Yes

InboundLine

FieldTypeRequiredDescription
idstringYesExample: inl_99.
purchase_idstringYesExample: pur_4711.
itemItemYes
quantity_expectedintegerYesUnits announced.
quantity_receivedintegerYesAbsolute count you reported.
quantity_damagedintegerYesDamaged units you reported.
statusstringYesOne of: open, received, cancelled.

Item

FieldTypeRequiredDescription
idstring | nullYesExample: itm_17.
skustringYesThe seller's Amazon SKU; one item per SKU and connection.
fnskustring | nullYesAmazon label barcode; may be null at announcement and follow with inbound.updated (changes contains fnsku).
asinstring | nullYes
eanstring | nullYes
titlestring | nullYes
image_urlstring | nullYes

ItemView

FieldTypeRequiredDescription
idstring | nullYesExample: itm_17.
skustringYesThe seller's Amazon SKU; one item per SKU and connection.
fnskustring | nullYesAmazon label barcode; may be null at announcement and follow with inbound.updated (changes contains fnsku).
asinstring | nullYes
eanstring | nullYes
titlestring | nullYes
image_urlstring | nullYes
connection_idstringYesExample: pcn_812.
created_atstring (date-time)Yes
updated_atstring (date-time)Yes

Trace

Every id known for one inbound line, from purchase to FBA shipment.

FieldTypeRequiredDescription
purchase_idstringYes
inbound_idstring | nullYes
inbound_line_idstring | nullYes
item_idstring | nullYes
skustring | nullYes
fnskustring | nullYes
asinstring | nullYes
order_numberstring | nullYes
batch_idstring | nullYes
outbound_idsarray of stringYesout_… of non-cancelled outbounds that carry units of this purchase.
amazon_shipment_idsarray of stringYes

ReceiptRequest

FieldTypeRequiredDescription
event_idstringNoIdempotency key; or send the Idempotency-Key header. Max length 200.
occurred_atstring (date-time)No
statusstringYesOne of: receiving, received.
linesarray of objectNoMay be empty only with status: received. Each line may be addressed once per request.
lines[].line_idstringNoinl_…; takes precedence over sku.
lines[].skustringNo
lines[].quantity_receivedintegerYesAbsolute count. Minimum 0.
lines[].quantity_damagedintegerNoStored and returned; omitted keeps the previous value. Minimum 0.

ReceiptResponse

FieldTypeRequiredDescription
connection_idstringYesExample: pcn_812.
inboundInboundYes
tracesarray of TraceYes
event_idstringYes
duplicatebooleanYes
linesarray of objectYesEvery line the receipt addressed or closed.
lines[].line_idstringYes
lines[].resultstringYesstale: a receipt at or after occurred_at was already applied to the line. One of: applied, unchanged, stale.

OutboundRequest

FieldTypeRequiredDescription
event_idstringNoMax length 200.
external_idstringYesYour outbound id. Min length 1. Max length 200.
occurred_atstring (date-time)No
statusstringYesOne of: created, shipped, cancelled.
destinationobjectYes
destination.typestringYesRequired; missing or empty is 400 invalid_request. One of: fba, fbm, other.
destination.amazon_shipment_idstringNoMax length 64. Example: FBA15XYZ.
destination.marketplacestringNoMax length 8. Example: DE.
tracking_numbersarray of stringNo
linesarray of objectNo
lines[].line_idstringNo
lines[].purchase_idstringNo
lines[].item_idstringNo
lines[].skustringNo
lines[].quantityintegerYesMinimum 1.

OutboundResponse

FieldTypeRequiredDescription
event_idstringYes
duplicatebooleanYes
stalebooleanYesA newer event was already applied; nothing changed.
connection_idstringYesExample: pcn_812.
outboundOutboundYes
unresolvedarray of objectYes
unresolved[].indexintegerYesPosition in the request's lines.
unresolved[].line_idstring | nullYes
unresolved[].purchase_idstring | nullYes
unresolved[].item_idstring | nullYes
unresolved[].skustring | nullYes
unresolved[].quantityintegerYesThe part that could not be matched.
unresolved[].reasonstringYesOne of: line_not_found, purchase_not_found, item_not_found, sku_not_found, insufficient_received_quantity, invalid_reference.

Destination

FieldTypeRequiredDescription
typestringYesOne of: fba, fbm, other.
amazon_shipment_idstring | nullYesMax length 64. Example: FBA15XYZ.
marketplacestring | nullYesMax length 8. Example: DE.

Outbound

FieldTypeRequiredDescription
idstringYesExample: out_55.
external_idstringYes
statusstringYesOne of: created, shipped, cancelled.
destinationDestinationYes
tracking_numbersarray of stringYes
shipped_atstring | null (date-time)YesSet the first time the status is shipped; kept afterwards.
linesarray of objectYes
lines[].purchase_idstringYes
lines[].inbound_line_idstring | nullYes
lines[].quantityintegerYes
lines[].resolved_bystringYesOne of: line_id, purchase_id, item_id, sku_fifo.