TANITARDevelopers
WebhooksEvent catalogShop

shop.order.fulfilled

Version 1 of the shop.order.fulfilled webhook event.

A manual Shop order was closed by an attributed operator action: the goods were delivered outside the platform and the order left in-progress for its terminal fulfilled state. Only a manual order reaches this event; award and code lines settle inside the placement transaction and are reported by shop.order.settled.

Event typeshop.order.fulfilled
Schema version1
Routing keyevent.shop.order.fulfilled.v1
Produced byReward Management
Schemaurn:defendr:contract:shop:order-fulfilled:1

data fields

FieldTypeRequiredDescription
orderIdstringyes
playerIdstringyes
listingKeystringyes
listingRevisionintegeryes
quantityintegeryes
fulfillmentKind"manual"yes
actorIdstringyes
notestring or nullyesThe operator's fulfilment note, if one was recorded.
fulfilledAtstring (date-time)yes

Some fields are required only in particular states. The JSON Schema below is authoritative.

Example delivery

Signed with the example secret whsec_placeholder_example_webhooks_signing_secret, so you can check your verifier against it. See Verifying signatures.

POST /your/webhook/endpoint HTTP/1.1
content-type: application/json
webhook-id: whd_00000000-0000-4000-8000-000000000029
webhook-timestamp: 1800000000
webhook-signature: v1,LclhDO+q7xP2xRDTzOXkxNsBCQ/3G2raEhkWaf96VkI=
tanitar-event-type: shop.order.fulfilled
tanitar-schema-version: 1
tanitar-delivery-attempt: 1

{"messageId":"evt_00000000-0000-4000-8000-000000000029","kind":"event","type":"shop.order.fulfilled","schemaVersion":1,"occurredAt":"2027-01-15T10:00:00.000Z","producer":"reward-management-service","accountId":"acc_11111111-1111-4111-8111-111111111111","correlationId":"corr_00000000-0000-4000-8000-000000000029","data":{"orderId":"ord_0123456789abcdef0123456789abcdef","playerId":"player_demo","listingKey":"signed-jersey","listingRevision":2,"quantity":1,"fulfillmentKind":"manual","actorId":"operator_demo","note":"Shipped 2026-09-27, tracking shared in the player's inbox.","fulfilledAt":"2026-09-27T00:00:00.000Z"}}

The same body, formatted:

{
  "messageId": "evt_00000000-0000-4000-8000-000000000029",
  "kind": "event",
  "type": "shop.order.fulfilled",
  "schemaVersion": 1,
  "occurredAt": "2027-01-15T10:00:00.000Z",
  "producer": "reward-management-service",
  "accountId": "acc_11111111-1111-4111-8111-111111111111",
  "correlationId": "corr_00000000-0000-4000-8000-000000000029",
  "data": {
    "orderId": "ord_0123456789abcdef0123456789abcdef",
    "playerId": "player_demo",
    "listingKey": "signed-jersey",
    "listingRevision": 2,
    "quantity": 1,
    "fulfillmentKind": "manual",
    "actorId": "operator_demo",
    "note": "Shipped 2026-09-27, tracking shared in the player's inbox.",
    "fulfilledAt": "2026-09-27T00:00:00.000Z"
  }
}

JSON Schema

urn:defendr:contract:shop:order-fulfilled:1
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:defendr:contract:shop:order-fulfilled:1",
  "title": "Shop order fulfilled",
  "description": "A manual Shop order was closed by an attributed operator action: the goods were delivered outside the platform and the order left `in-progress` for its terminal `fulfilled` state. Only a `manual` order reaches this event; `award` and `code` lines settle inside the placement transaction and are reported by `shop.order.settled`.",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "orderId",
    "playerId",
    "listingKey",
    "listingRevision",
    "quantity",
    "fulfillmentKind",
    "actorId",
    "note",
    "fulfilledAt"
  ],
  "properties": {
    "orderId": {
      "type": "string",
      "pattern": "^ord_[a-f0-9]{32}$"
    },
    "playerId": {
      "type": "string",
      "minLength": 1
    },
    "listingKey": {
      "type": "string",
      "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
    },
    "listingRevision": {
      "type": "integer",
      "minimum": 1
    },
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "fulfillmentKind": {
      "const": "manual"
    },
    "actorId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": [
        "string",
        "null"
      ],
      "description": "The operator's fulfilment note, if one was recorded."
    },
    "fulfilledAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}

On this page