AvrixDocumentation
API referenceStatusAvrix.ioConsole
Seller API

Welcome

  • Home
  • Getting started
  • Topic index
  • Glossary

Get started

  • Overview
  • How Avrix works
  • Architecture patterns
  • Quickstart
  • Integration tutorial
  • Authentication
  • OAuth tokens
  • Environments
  • Sandbox

Connect a partner

  • Partner onboarding
  • Sellable SKU readiness
  • Territory enforcement
  • AI assistants (MCP)
  • Connect your AI client
  • Sign-in and permissions

Catalog

  • Catalog & allocations
  • Product field matrix
  • Pricing authority
  • Currency and FX
  • Promotions
  • Caching & fairness

Sell an order

  • Store integration profiles
  • Order preview
  • Creating orders
  • Idempotency
  • Order context
  • Checkout holds
  • Hot drop
  • Fulfillment & keys
  • Keyless fulfilment
  • Order lifecycle
  • Refunds & returns

Stay in sync

  • Webhooks
  • Event reference
  • Polling & reconciliation
  • Reconciliation
  • Finance & settlement

Operate

  • Error reference
  • Troubleshooting
  • Key recovery
  • Rate limits
  • Security
  • Secrets & config
  • API key management
  • IP allowlist
  • Monitoring & support
  • Data handling
  • Partner runbook

Go live

  • Testing
  • Certification
  • Integration checklist
  • Sandbox to production
  • Go-live
  • Deployment targets

Reference

  • Integration recipes
  • Scope matrix
  • Commerce platforms
  • API clients
  • Client & helpers
  • Versioning
  • Changelog
  • FAQ
  • API reference
  1. Home
  2. /Stay in sync
  3. /Event reference

Event reference

All Seller API webhook events with triggers and payload shapes.

TopicsStay in sync

Every webhook event the Seller API can deliver. Subscribe only to events you handle. Delivery is at-least-once — dedupe on eventId / X-Avrix-Event-Id.

Example#

# Verification is server-side in your webhook handler — not a curl call.
# Header: X-Avrix-Signature: t=<unix>,v1=<hex>
# Signed payload: "{t}.{rawBody}" with HMAC-SHA256 and your endpoint secret.

Warning: Webhook payloads never include plaintext game keys. Persist entitlements from the synchronous POST /orders (or pull/export) response. Treat webhooks as lifecycle and correlation signals.

Note: GET /api/seller/v1/orders returns order aggregates (counts, references, allocation ids) — not a top-level status enum. Infer lifecycle from aggregates plus the events below.

Envelope shape (all events):

JSON
{
  "eventId": "evt_01J8XYZ...",
  "eventType": "order.fulfilled",
  "eventVersion": 1,
  "createdAt": "2026-08-05T09:14:22.108Z",
  "data": {}
}

test.ping#

TriggerYou called POST /api/seller/v1/webhooks/{id}/test
Seller actionVerify signature, reject a corrupted signature, acknowledge 2xx
DuplicationSafe to ignore duplicates; use for connectivity only
RelatedWebhook endpoint configuration
JSON
{
  "eventType": "test.ping",
  "data": {
    "ok": true,
    "webhookId": "wh_7d3f..."
  }
}

order.fulfilled#

TriggerOrder committed; entitlements issued
Seller actionCorrelate on orderReference; confirm your vault already has entitlements from the HTTP response
DuplicationCommon on retries; dedupe by eventId. May arrive before the HTTP response
RelatedPOST /api/seller/v1/orders, GET /api/seller/v1/orders?orderReference=
JSON
{
  "eventType": "order.fulfilled",
  "data": {
    "orderReference": "store-order-10432",
    "skuCode": "SANDBOX-ALWAYS-001",
    "quantity": 1,
    "pulled": 1,
    "fulfilledAt": "2026-08-05T09:14:22.108Z"
  }
}

Webhook payloads never include key plaintext.


order.failed#

TriggerFulfilment failed after commit was attempted (async failure path)
Seller actionMark the store order failed; refund the buyer at your PSP if you already charged
DuplicationDedupe by eventId; reconcile with GET /orders
RelatedOrder lifecycle, your PSP refunds
JSON
{
  "eventType": "order.failed",
  "data": {
    "orderReference": "store-order-10432",
    "skuCode": "SANDBOX-ALWAYS-001",
    "reasonCode": "NO_AVAILABLE_KEYS"
  }
}

order.reserved#

TriggerPreorder or hot-drop reservation accepted; keys not yet delivered
Seller actionShow “reserved / shipping later” to the buyer; wait for order.preorder_fulfilled or commit path
DuplicationDedupe by eventId
RelatedPOST /orders, POST /orders/reserve
JSON
{
  "eventType": "order.reserved",
  "data": {
    "orderReference": "store-order-10432",
    "skuCode": "SANDBOX-ALWAYS-001",
    "quantity": 1,
    "expectedReleaseAt": "2026-12-12T00:00:00.000Z"
  }
}

order.preorder_fulfilled#

TriggerPreorder converted to fulfilled delivery at release
Seller actionDeliver entitlements if your sync path obtained them; update store order to fulfilled
DuplicationDedupe; may pair with aggregate changes on GET /orders
RelatedPreorder reservations
JSON
{
  "eventType": "order.preorder_fulfilled",
  "data": {
    "orderReference": "store-order-10432",
    "skuCode": "SANDBOX-ALWAYS-001",
    "quantity": 1,
    "fulfilledAt": "2026-12-12T00:05:00.000Z"
  }
}

order.returned#

TriggerPreorder / reservation cancel recorded against a prior order
Seller actionReflect cancellation in your OMS; do not expect key quarantine events
DuplicationDedupe by eventId
RelatedPOST /api/seller/v1/orders/cancel
JSON
{
  "eventType": "order.returned",
  "data": {
    "orderReference": "store-order-10432",
    "quantity": 1
  }
}

order.keys_returned#

TriggerSuccessful post-fulfilment key return / quarantine
Seller actionMark keys returned in your vault; stop delivering those keyIds
DuplicationOften paired with refund.completed on the same return — handle both
RelatedPOST /keys/return, POST /refunds
JSON
{
  "eventType": "order.keys_returned",
  "data": {
    "orderReference": "store-order-10432",
    "keyIds": ["k_8f21...", "k_9a02..."],
    "returned": 2,
    "reason": "buyer_refund"
  }
}

Note: On a successful return, both order.keys_returned and refund.completed may fire. order.keys_returned carries keyIds; refund.completed carries optional adjustmentType.


refund.completed#

TriggerRefund / chargeback adjustment finalised for a sale line
Seller actionAlign finance ledger; confirm buyer was refunded at your PSP separately
DuplicationMay accompany order.keys_returned; dedupe each event independently
RelatedPOST /api/seller/v1/refunds, GET /api/seller/v1/refunds
JSON
{
  "eventType": "refund.completed",
  "data": {
    "orderReference": "store-order-10432",
    "refundId": "rf_01J8...",
    "adjustmentType": "refund",
    "adjustmentStatus": "completed"
  }
}

keys.pulled#

TriggerKeys pulled via POST /api/seller/v1/keys/pull (non-order path)
Seller actionPersist keys from the HTTP response; use webhook for ops correlation only
DuplicationDedupe by eventId
RelatedKey pull API
JSON
{
  "eventType": "keys.pulled",
  "data": {
    "orderReference": "store-order-10432",
    "skuCode": "SANDBOX-ALWAYS-001",
    "pulled": 1
  }
}

redemption.expiring#

TriggerA keyless redemption URL enters its expiry notice window (~24 hours before expiresAt)
Seller actionNudge the buyer to redeem; after expiry, follow the keyless re-issue path
DuplicationFires once per fulfillment
RelatedKeyless fulfillment, order.activated

Payload carries ids only — never the redemption URL or token.

JSON
{
  "eventType": "redemption.expiring",
  "data": {
    "fulfillmentId": "kf_...",
    "orderReference": "store-order-10432",
    "skuId": "sku_...",
    "platformCode": "steam",
    "provider": "hosted_redemption",
    "expiresAt": "2026-08-13T02:00:00.000Z"
  }
}

allocation.updated#

TriggerAllocation capacity or metadata changed
Seller actionRefresh GET /allocations / availability for the SKU
DuplicationCollapse bursts into one refresh
RelatedAllocations, catalog sync
JSON
{
  "eventType": "allocation.updated",
  "data": {
    "allocationId": "alloc_...",
    "skuCode": "SANDBOX-ALWAYS-001",
    "remaining": 420
  }
}

allocation.depleted#

TriggerAllocation reached zero remaining
Seller actionMark SKU unavailable on the storefront; re-check on next allocation update
DuplicationTreat as authoritative “empty” signal; still re-read allocations
RelatedAvailability
JSON
{
  "eventType": "allocation.depleted",
  "data": {
    "allocationId": "alloc_...",
    "skuCode": "SANDBOX-ALWAYS-001",
    "remaining": 0
  }
}

allocation.low_stock#

TriggerAllocation crossed the configured low-stock threshold
Seller actionAlert merchandising / pause promotions if needed
DuplicationMay fire once per crossing; do not decrement local counters blindly
RelatedAllocations
JSON
{
  "eventType": "allocation.low_stock",
  "data": {
    "allocationId": "alloc_...",
    "skuCode": "SANDBOX-ALWAYS-001",
    "remaining": 25,
    "threshold": 50
  }
}

product.updated#

TriggerProduct metadata changed for a shared product
Seller actionRun incremental catalog sync (GET /catalog/changes or products delta)
DuplicationCoalesce into one sync job
RelatedCatalog
JSON
{
  "eventType": "product.updated",
  "data": {
    "productId": "prod_...",
    "updatedAt": "2026-08-05T09:14:22.108Z"
  }
}

product.announced#

TriggerRelease advanced to announced
Seller actionUpdate storefront presentation / preorder messaging
DuplicationIdempotent presentation update
RelatedProduct lifecycle
JSON
{
  "eventType": "product.announced",
  "data": {
    "productId": "prod_...",
    "releaseId": "rel_..."
  }
}

redemption.expired#

TriggerA keyless redemption URL has passed expiresAt without activation
Seller actionMark the link dead; do not send the buyer to it. Re-issue only if your process allows
DuplicationFires once per fulfillment (expiry_expired_at marker)
Relatedredemption.expiring, keyless fulfillment

Payload carries ids only — never the redemption URL or token.

JSON
{
  "eventType": "redemption.expired",
  "data": {
    "fulfillmentId": "kf_...",
    "orderReference": "store-order-10432",
    "skuId": "sku_...",
    "platformCode": "steam",
    "provider": "hosted_redemption",
    "expiresAt": "2026-08-13T02:00:00.000Z",
    "effectiveAt": "2026-08-13T02:00:00.000Z"
  }
}

product.delisted#

TriggerProduct removed from your visible catalog (tombstone)
Seller actionRemove or hide the product; stop taking new orders
DuplicationTreat as tombstone; confirm via GET /catalog/changes
RelatedCatalog changes
JSON
{
  "eventType": "product.delisted",
  "data": {
    "productId": "prod_...",
    "delistedAt": "2026-08-05T09:14:22.108Z"
  }
}

product.delisting_scheduled#

TriggerProduct has a future archived_at — it will leave the catalog at effectiveAt
Seller actionSchedule delist in your store; do not treat as already gone. Immediate archive still emits product.delisted only
DuplicationTreat as advance notice; confirm via GET /catalog/changes
Relatedproduct.delisted, catalog changes
JSON
{
  "eventType": "product.delisting_scheduled",
  "data": {
    "productId": "prod_...",
    "effectiveAt": "2026-09-01T00:00:00.000Z"
  }
}

catalog.export_ready#

TriggerAn async POST /catalog/exports job finished building the gzip NDJSON artifact
Seller actionGET /catalog/exports/{exportId} for the short-lived signed URL
DuplicationOnce per export job
RelatedCatalog snapshot
JSON
{
  "eventType": "catalog.export_ready",
  "data": {
    "exportId": "…",
    "checksum": "…",
    "bytes": 1048576,
    "expiresAt": "2026-08-18T12:00:00.000Z",
    "totalProducts": 1200
  }
}

release.available#

TriggerRelease advanced to available
Seller actionRefresh catalog and sellability; enable purchase UI when allocations allow
DuplicationIdempotent
RelatedProduct lifecycle, allocations
JSON
{
  "eventType": "release.available",
  "data": {
    "productId": "prod_...",
    "releaseId": "rel_..."
  }
}

release.date_changed#

TriggerPublisher moved a release date (pre-order slip signal)
Seller actionUpdate listing dates; notify pre-order buyers; re-check pre-order windows
DuplicationLatest date wins; compare newDate against your stored value
RelatedPre-orders, order.reserved, product lifecycle
JSON
{
  "eventType": "release.date_changed",
  "data": {
    "productId": "prod_...",
    "releaseId": "rel_...",
    "skuIds": ["sku_..."],
    "oldDate": "2026-11-14T00:00:00Z",
    "newDate": "2027-02-06T00:00:00Z"
  }
}

sku.pricing_updated#

TriggerTerritory catalog list price changed for a SKU
Seller actionRefresh pricing; re-preview before next charge
DuplicationLatest price wins; do not apply deltas blindly
RelatedGET /products/{id}/pricing, order preview
JSON
{
  "eventType": "sku.pricing_updated",
  "data": {
    "skuCode": "SANDBOX-ALWAYS-001",
    "countryCode": "US",
    "currencyCode": "USD",
    "unitPriceCents": 1999,
    "effectiveAt": "2026-08-12T09:00:00Z",
    "previousPricing": { "priceCents": 2499, "currencyCode": "USD" },
    "newPricing": { "priceCents": 1999, "currencyCode": "USD" }
  }
}

effectiveAt states when the new price takes effect. For immediate changes it equals the event's updatedAt; scheduled price changes stamp a future instant — apply the new price at that boundary rather than on receipt. previousPricing / newPricing carry the explicit old→new pair (previousPricing is null when no prior price existed for the country).


sku.sellability_changed#

TriggerA shared SKU crossed the sellable boundary (any of the four gates flipped)
Seller actionEnable/disable the Buy button; confirm with GET /allocations before checkout
DuplicationState event — apply the latest sellable value
RelatedFour sellability gates, GET /allocations, readinessBlockers
JSON
{
  "eventType": "sku.sellability_changed",
  "data": {
    "skuId": "sku_...",
    "skuCode": "SANDBOX-ALWAYS-001",
    "productId": "prod_...",
    "sellable": false,
    "reasons": ["NO_SKU_SHARE"]
  }
}

contract.activated#

TriggerBMA or MCA became active
Seller actionRe-sync partners / catalog; SKUs under the contract may become sellable
DuplicationIdempotent commercial refresh
RelatedPartners, four sellability gates
JSON
{
  "eventType": "contract.activated",
  "data": {
    "contractId": "ctr_...",
    "partnerCompanyId": "..."
  }
}

contract.superseded#

TriggerPrior active contract term was superseded
Seller actionRefresh commercial terms; stop relying on the old term id
DuplicationIdempotent
RelatedContract lifecycle
JSON
{
  "eventType": "contract.superseded",
  "data": {
    "contractId": "ctr_...",
    "supersededBy": "ctr_..."
  }
}

contract.amendment_accepted#

TriggerAmendment accepted by the counterparty
Seller actionRefresh terms that affect pricing, territory, or scope
DuplicationIdempotent
RelatedContract amendments
JSON
{
  "eventType": "contract.amendment_accepted",
  "data": {
    "contractId": "ctr_...",
    "amendmentId": "amd_..."
  }
}

invoice.created#

TriggerSeller invoice document created
Seller actionFetch finance / invoice surfaces; notify accounting
DuplicationDedupe by invoice id in data
RelatedFinance endpoints
JSON
{
  "eventType": "invoice.created",
  "data": {
    "invoiceId": "inv_...",
    "periodStart": "2026-07-01",
    "periodEnd": "2026-07-31"
  }
}

report.ready#

TriggerReport export is ready to download
Seller actionDownload via the finance / reports API referenced in the payload
DuplicationDedupe by report id
RelatedFinance and settlement
JSON
{
  "eventType": "report.ready",
  "data": {
    "reportId": "rpt_...",
    "reportType": "api_sales",
    "readyAt": "2026-08-05T09:14:22.108Z"
  }
}

system.webhook_endpoint_disabled#

TriggerThe delivery circuit breaker auto-disabled one of your endpoints
Seller actionFix the failing receiver, then POST /webhooks/{id}/enable — buffered events flush automatically
DuplicationFires once per active → disabled transition
RelatedWebhooks — retries, buffering, circuit breaker

Delivered to your company's other endpoints; the disabled endpoint's own copy is buffered and arrives after re-enable. Paired with an in-app console notification and an email to company admins.

JSON
{
  "eventType": "system.webhook_endpoint_disabled",
  "data": {
    "endpointId": "wh_...",
    "endpointHost": "store.example.com",
    "reason": "consecutive_delivery_failures",
    "consecutiveFailures": 10,
    "disabledAt": "2026-08-12T02:15:00.000Z"
  }
}

Related#

  • Webhooks — registration, signatures, retries
  • Polling and reconciliation — missed-delivery recovery
  • Creating orders — where entitlements are first delivered

What links here

Published guides that link to this page.

  • Fulfillment & keysKey custody, deferred reveal, and why GET /orders never returns plaintext.
  • GlossaryCanonical terms for sellers, SKUs, allocations, orders, and fulfillment.
  • Keyless fulfilmentHosted redemption links instead of raw keys — issue, revoke, regenerate, and the order.activated signal when the buyer redeems.
  • Polling & reconciliationRecover from missed webhooks with deliveries replay and order reads.
  • Refunds & returnsKey quarantine, refunds API, and why Avrix never refunds your PSP.
  • WebhooksSigned delivery, event types, retries, and verification.
PreviousWebhooksNextPolling & reconciliation

Need help with this page?

Contact support

AI tools

  • Ask ChatGPT
  • Ask Claude

On this page

  • Example
  • `test.ping`
  • `order.fulfilled`
  • `order.failed`
  • `order.reserved`
  • `order.preorder_fulfilled`
  • `order.returned`
  • `order.keys_returned`
  • `refund.completed`
  • `keys.pulled`
  • `redemption.expiring`
  • `allocation.updated`
  • `allocation.depleted`
  • `allocation.low_stock`
  • `product.updated`
  • `product.announced`
  • `redemption.expired`
  • `product.delisted`
  • `product.delisting_scheduled`
  • `catalog.export_ready`
  • `release.available`
  • `release.date_changed`
  • `sku.pricing_updated`
  • `sku.sellability_changed`
  • `contract.activated`
  • `contract.superseded`
  • `contract.amendment_accepted`
  • `invoice.created`
  • `report.ready`
  • `system.webhook_endpoint_disabled`
  • Related

Search docs

Search documentation…

Related pages

  • WebhooksSigned delivery, event types, retries, and verification.
  • Polling & reconciliationRecover from missed webhooks with deliveries replay and order reads.
  • Order lifecycleStates, transitions, and recovery from preview to fulfillment.
  • Creating ordersPOST /orders fields, safe creation pattern, and unknown-outcome recovery.