Developer platform

QrX - API

Create pay-at-the-door transactions, manage products and returns, and receive webhooks. Everything on this page is generated live from the QrX API.

Base URLhttps://api.qr-x.net

Overview

The QrX Public API lets merchants create and manage pay-at-the-door transactions, products, returns and webhooks. Authenticate by exchanging your merchant channel API key for a short-lived access token via POST /api/v1/auth/token, then send it as a Bearer token.

Base URL
https://api.qr-x.net
Endpoints
48
Auth
OAuth-style Bearer

Postman collection

Open in Postman

Prefer clicking before coding? Our shared Postman workspace contains ready-made requests for every major flow in this reference, wired to the environment variables below. Use it to explore the API and validate your setup before you deploy a single line of integration code.

How to use it

  1. 1Open the shared workspace in Postman and select the QrX environment that ships with it (or create your own).
  2. 2Set your merchant channel API key in the QrX-MerchantChannel-API-Key variable.
  3. 3Run the Create access token request; the returned Bearer token authenticates all other requests.
  4. 4Fire any request in the collection: transactions, reference data, webhooks, products and returns are all preconfigured against https://api.qr-x.net.

Authentication

Create a merchant channel API key in your QrX portal, exchange it for a short-lived access token, and send that token as a Bearer header on every call.

  1. 1Create an API key per sales channel in Portal → Settings → Merchant channels.
  2. 2Exchange it for an access token via POST /api/v1/auth/token (valid for one hour).
  3. 3Call the API with the Authorization: Bearer header. Refresh the token when it expires.
QrX-MerchantChannel-API-Key

Merchant channel API key. Use this only to call /api/v1/auth/token.

Authorization: Bearer

Short-lived QrX access token returned by /api/v1/auth/token.

curl -X POST "https://api.qr-x.net/api/v1/auth/token" \
  -H "QrX-MerchantChannel-API-Key: YOUR_MERCHANT_API_KEY"

Errors & rate limits

Errors use standard HTTP status codes with an application/problem+json body containing a machine-readable code and a human-readable message.

Rate limits are applied per merchant API key. When exceeded, QrX returns HTTP 429 with Retry-After and RateLimit-Reason headers; wait at least the indicated number of seconds before retrying.

Auth

1 Endpoints

Every integration starts here. Exchange your merchant channel API key for a short-lived Bearer token; every other endpoint requires it. Tokens expire after one hour, so build automatic refresh into your client.

Create access token

60/minMerchant API key
post/api/v1/auth/token

Exchanges a merchant channel API key for a short-lived bearer token. Use this token in the Authorization header for all other Public API calls.

Responses

200OKPublicAccessTokenResponse
accessTokenstringnullable
tokenTypestringnullable
expiresIninteger (int32)
merchantChannelNamestringnullable
Example
{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.example-signature",
  "tokenType": "Bearer",
  "expiresIn": 3600,
  "MerchantChannelName": "QrX Store"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/auth/token" \
  -H "QrX-MerchantChannel-API-Key: YOUR_MERCHANT_API_KEY"

Transactions

5 Endpoints

The heart of QrX. Create a transaction for every shipment that should be paid at the door: QrX generates the QR code, handles the payment session and reports the outcome. Follow the lifecycle from creation through shipping to payment, and mark transactions shipped or cancel them as fulfillment progresses.

Create transaction

300/minBearer token
post/api/v1/transactions

Creates a new QrX transaction and starts the payment provider process when a PSP is required. Important: PSP processing is handled asynchronously in the background. A successful response from this endpoint means that the transaction was accepted by QrX and that the PSP process was started. It does not guarantee that the payment provider successfully created the payment session, payment link, or checkout transaction. The PSP process can still fail after the API response has been returned, for example because of missing PSP configuration, invalid merchant credentials, missing required payment data, or a provider-side validation error. If PSP creation fails, QrX marks the transaction as Cancelled and reports the final status through the configured webhook flow. Always listen to transaction webhooks and use the webhook status as the source of truth for the final transaction state. Do not rely only on the immediate API response to decide whether a transaction is payable or ready for fulfillment. Always verify the latest transaction status before printing shipping labels, printing packing slips, shipping goods, or triggering downstream fulfillment.

Request bodyPublicCreateTransactionRequest

transactionTypeTransactionType

Specify what kind of transaction you want to create

One of:PaymentNoPaymentOtpOnlyDataOnly
amountnumber (double)

Total amount to collect from the customer. For Payment transactions this is the amount sent to the payment provider.

≥ 1
orderDetailsPublicOrderDetailsRequestrequired
parcelPublicParcelRequest
billingAddressPublicAddressRequest
localestringnullable

Optional locale used for customer-facing payment and communication content.

xpointsToUsenumber (double)

Optional QrX wallet or points amount to apply to the transaction.

≥ 0
testModeboolean

When true, the transaction is created in QrX test mode. PSP processing uses sandbox or test configuration where available, no real PSP payment or payout is created, and the transaction must not be treated as production fulfillment.

currencystringnullable

Three-letter ISO 4217 currency code for the transaction amount, for example EUR.

≥ 3 characters≤ 3 characters
expiresAtstring (date-time)nullable

Optional UTC date and time after which the payment or transaction should no longer be considered payable.

Responses

201CreatedPublicTransactionResponse
transactionIdstringnullable
qrCodeValuestringnullable
qrCodeImagestringnullable
carrierNamestringnullable
carrierShippingMethodstringnullable
shippingLabelsCarrierLabel[]nullable
shippingDocumentsCarrierDocument[]nullable
carrierLabelTypeCarrierLabelType
One of:ZplPdfGif
pinCodestringnullable
shippingCostnumber (double)
Example
{
  "transactionId": "0a1999dc78dc4cac",
  "qrCodeValue": "https://go.qr-x.app/tr/0a1999dc78dc4cac",
  "qrCodeImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
  "carrierName": "UPS",
  "carrierShippingMethod": "UPS Standard",
  "shippingLabels": [],
  "shippingDocuments": [],
  "carrierLabelType": "Zpl",
  "pinCode": null
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/transactions" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "transactionType": "Payment",
  "amount": 20.27,
  "currency": "EUR",
  "locale": "en_US",
  "testMode": true,
  "orderDetails": {
    "orderId": "SHOP-100045",
    "firstName": "Reyhan",
    "lastName": "Savvy",
    "email": "devlord1@gmail.com",
    "phoneNumber": "+316777298172",
    "company": null,
    "vatNumber": null,
    "shippingAddressType": "Residential",
    "address1": "Max Euweplein",
    "address2": null,
    "houseNumber": "6",
    "zipcode": "1017 MB",
    "city": "Amsterdam",
    "country": "NL",
    "reference": "MyRefInMyWMS99282",
    "shopOrderId": "2128721",
    "customerLocale": "nl_NL",
    "trackingNumber": "1Z999AA10123456784",
    "trackingLink": "https://www.ups.com/track?tracknum=1Z999AA10123456784",
    "orderlines": [
      {
        "name": "43 inch FHD Smart TV",
        "productId": 13882,
        "variantId": 212212121,
        "sku": "FN43GE320",
        "ean": "978020137962",
        "quantity": 1,
        "weight": 1,
        "tax": 1.74,
        "pricePerItem": 20.27,
        "totalPrice": 20.27,
        "countryOfOrigin": "NL",
        "hsCode": "852872"
      }
    ]
  },
  "parcel": {
    "shippingMethodCode": "ups-standard",
    "senderCode": "main-warehouse-nl",
    "createCarrierLabel": true,
    "applyShippingRules": true,
    "colliCount": 1,
    "colliDetails": [
      {
        "colliNumber": 1,
        "description": "43 inch FHD Smart TV",
        "currency": "EUR",
        "customsValue": 20.27,
        "weight": 1,
        "length": 20,
        "width": 20,
        "height": 10
      }
    ],
    "destinationAddress": {
      "firstName": "Reyhan",
      "lastName": "Savvy",
      "company": null,
      "address1": "Max Euweplein",
      "address2": null,
      "houseNumber": "6",
      "zipcode": "1017 MB",
      "city": "Amsterdam",
      "shippingAddressType": "Residential",
      "countryCode": "NL",
      "phoneNumber": "+316777298172",
      "email": "devlord1@gmail.com"
    },
    "returnLabel": true,
    "carrierLabelType": "Zpl"
  }
}'
Example request body
{
  "transactionType": "Payment",
  "amount": 20.27,
  "currency": "EUR",
  "locale": "en_US",
  "testMode": true,
  "orderDetails": {
    "orderId": "SHOP-100045",
    "firstName": "Reyhan",
    "lastName": "Savvy",
    "email": "devlord1@gmail.com",
    "phoneNumber": "+316777298172",
    "company": null,
    "vatNumber": null,
    "shippingAddressType": "Residential",
    "address1": "Max Euweplein",
    "address2": null,
    "houseNumber": "6",
    "zipcode": "1017 MB",
    "city": "Amsterdam",
    "country": "NL",
    "reference": "MyRefInMyWMS99282",
    "shopOrderId": "2128721",
    "customerLocale": "nl_NL",
    "trackingNumber": "1Z999AA10123456784",
    "trackingLink": "https://www.ups.com/track?tracknum=1Z999AA10123456784",
    "orderlines": [
      {
        "name": "43 inch FHD Smart TV",
        "productId": 13882,
        "variantId": 212212121,
        "sku": "FN43GE320",
        "ean": "978020137962",
        "quantity": 1,
        "weight": 1,
        "tax": 1.74,
        "pricePerItem": 20.27,
        "totalPrice": 20.27,
        "countryOfOrigin": "NL",
        "hsCode": "852872"
      }
    ]
  },
  "parcel": {
    "shippingMethodCode": "ups-standard",
    "senderCode": "main-warehouse-nl",
    "createCarrierLabel": true,
    "applyShippingRules": true,
    "colliCount": 1,
    "colliDetails": [
      {
        "colliNumber": 1,
        "description": "43 inch FHD Smart TV",
        "currency": "EUR",
        "customsValue": 20.27,
        "weight": 1,
        "length": 20,
        "width": 20,
        "height": 10
      }
    ],
    "destinationAddress": {
      "firstName": "Reyhan",
      "lastName": "Savvy",
      "company": null,
      "address1": "Max Euweplein",
      "address2": null,
      "houseNumber": "6",
      "zipcode": "1017 MB",
      "city": "Amsterdam",
      "shippingAddressType": "Residential",
      "countryCode": "NL",
      "phoneNumber": "+316777298172",
      "email": "devlord1@gmail.com"
    },
    "returnLabel": true,
    "carrierLabelType": "Zpl"
  }
}

Get transaction

1200/minBearer token
get/api/v1/transactions/{transactionId}

Returns the current transaction details for a transaction that belongs to the authenticated merchant channel. Use this call for lookup and reconciliation, but use webhooks as the primary source of truth for status changes.

Path parameters

transactionIdstringrequired

Responses

200OKPublicTransactionDetailsResponse
isTestModeboolean
transactionIdstringnullable
statusstringnullable
createdAtstring (date-time)
paidAtstring (date-time)nullable
transactionPayoutProcessedDatestring (date-time)nullable
merchantChannelIdinteger (int32)
paymentProviderIdinteger (int32)
carrierIdinteger (int32)
orderIdstringnullable
shopOrderIdstringnullable
orderCountrystringnullable
descriptionstringnullable
currencystringnullable
localestringnullable
amountnumber (double)
xpointsUsednumber (double)
paymentMethodstringnullable
isRefundedboolean
consumerNamestringnullable
consumerAccountstringnullable
consumerBicstringnullable
consumerCountrystringnullable
consumerEmailstringnullable
transactionVerificationNumberinteger (int32)nullable
Example
{
  "isTestMode": true,
  "transactionId": "0a1999dc78dc4cac",
  "status": "open",
  "createdAt": "2026-04-22T12:00:00Z",
  "paidAt": null,
  "transactionPayoutProcessedDate": null,
  "merchantChannelId": 2,
  "paymentProviderId": 1,
  "carrierId": 1,
  "orderId": "SHOP-100045",
  "shopOrderId": "2128721",
  "orderCountry": "NL",
  "description": "SHOP-100045",
  "currency": "EUR",
  "locale": "en_US",
  "amount": 20.27,
  "xpointsUsed": 0,
  "paymentMethod": "",
  "isRefunded": false,
  "consumerName": "Reyhan Savvy",
  "consumerEmail": "devlord1@gmail.com",
  "transactionVerificationNumber": 4827
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/transactions/{transactionId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Get transaction status

1200/minBearer token
get/api/v1/transactions/{transactionId}/status

Returns the latest lightweight transaction status fields. Use this to verify a transaction before fulfillment when you need an on-demand check in addition to webhook processing.

Path parameters

transactionIdstringrequired

Responses

200OKPublicTransactionStatusResponse
statusstringnullable
transactionPayoutProcessedDatestring (date-time)nullable
transactionVerificationNumberinteger (int32)nullable
Example
{
  "status": "open",
  "transactionPayoutProcessedDate": null,
  "transactionVerificationNumber": 4827
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/transactions/{transactionId}/status" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Mark transaction as shipped

300/minBearer token
post/api/v1/transactions/{transactionId}/ship

Marks an eligible transaction as shipped and stores the carrier tracking details supplied by your system. Only call this after you have verified that the transaction is valid for fulfillment.

Path parameters

transactionIdstringrequired

Request bodyPublicMarkShippedRequest

trackAndTraceNumberstringnullable

Carrier tracking number for the shipped transaction.

trackAndTraceUrlstringnullable

Carrier tracking URL that customers or merchants can use to follow the shipment.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/transactions/{transactionId}/ship" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "trackAndTraceNumber": "1Z999AA10123456784",
  "trackAndTraceUrl": "https://www.ups.com/track?tracknum=1Z999AA10123456784"
}'
Example request body
{
  "trackAndTraceNumber": "1Z999AA10123456784",
  "trackAndTraceUrl": "https://www.ups.com/track?tracknum=1Z999AA10123456784"
}

Cancel transaction

300/minBearer token
post/api/v1/transactions/{transactionId}/cancel

Cancels an eligible open transaction with a merchant-provided reason. Cancelled transactions are no longer valid for payment, label printing, packing slips, or fulfillment.

Path parameters

transactionIdstringrequired

Request bodyPublicCancelTransactionRequest

reasonstringrequired

Human-readable reason for cancelling the transaction.

≥ 1 characters

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/transactions/{transactionId}/cancel" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "Customer cancelled the order before shipment"
}'
Example request body
{
  "reason": "Customer cancelled the order before shipment"
}

Webhooks

13 Endpoints

Know the moment something happens: a payment confirmed at the door, a transaction shipped, a return updated. Register webhook endpoints, choose event types, verify signed deliveries, inspect and redeliver failed ones, and rotate signing secrets without downtime. Webhooks are the source of truth for final transaction state.

List webhooks

1200/minBearer token
get/api/v1/webhooks

Returns configured webhooks for the authenticated merchant channel, including health and recent delivery state.

Query parameters

pageNumberinteger (int32)optional
pageSizeinteger (int32)optional
searchstringoptional

Responses

200OK
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
Example
{
  "data": [
    {
      "webhookId": 18,
      "name": "Order Events",
      "targetUrl": "https://merchant.example.com/webhooks/qrx",
      "eventTypes": [
        "transaction/created",
        "transaction/paid"
      ],
      "apiVersion": "2026-04-23",
      "isActive": true,
      "healthStatus": "healthy",
      "consecutiveFailures": 0,
      "lastSuccessAt": null,
      "lastFailureAt": null,
      "failureSince": null,
      "createdAt": "2026-04-23T09:00:00Z",
      "updatedAt": "2026-04-23T09:00:00Z",
      "version": 1
    }
  ],
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20,
    "totalItemCount": 1,
    "pageCount": 1,
    "hasNextPage": false,
    "hasPreviousPage": false
  }
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/webhooks" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Create webhook

300/minBearer token
post/api/v1/webhooks

Creates a webhook endpoint for transaction and order events. Webhooks are required for reliable status synchronization because payment and provider processing can complete or fail asynchronously.

Request bodyPublicWebhookUpsertRequest

namestringrequired

Internal name for this webhook endpoint.

≥ 1 characters≤ 120 characters
targetUrlstring (uri)required

Absolute HTTPS URL that receives webhook POST requests from QrX.

≥ 1 characters
eventTypesstring[]required

Event types this webhook should receive. Use the event types endpoint to retrieve supported values.

apiVersionstringnullable

Optional webhook API version. Leave empty to use the current default version.

isActiveboolean

Whether QrX should actively deliver events to this webhook endpoint.

xmininteger (int32)nullable

Optional optimistic concurrency token returned by existing webhook records.

Responses

201CreatedPublicWebhookResponse
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
signingSecretstringnullable
Example
{
  "webhookId": 18,
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true,
  "healthStatus": "healthy",
  "consecutiveFailures": 0,
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "failureSince": null,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:00:00Z",
  "version": 1,
  "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true
}'
Example request body
{
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true
}

List webhook event types

1200/minBearer token
get/api/v1/webhooks/event-types

Returns the event types and API versions supported by the webhook system.

Responses

200OKPublicWebhookEventTypesResponse
eventTypesstring[]nullable
groupsobjectnullable
apiVersionsstring[]nullable
currentApiVersionstringnullable
Example
{
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "groups": {
    "transaction": [
      "transaction/created",
      "transaction/paid"
    ]
  },
  "apiVersions": [
    "2026-04-23"
  ],
  "currentApiVersion": "2026-04-23"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/webhooks/event-types" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Get webhook

1200/minBearer token
get/api/v1/webhooks/{webhookId}

Returns the configuration and health state for one webhook owned by the authenticated merchant channel.

Path parameters

webhookIdinteger (int32)required

Responses

200OKPublicWebhookResponse
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
signingSecretstringnullable
Example
{
  "webhookId": 18,
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true,
  "healthStatus": "healthy",
  "consecutiveFailures": 0,
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "failureSince": null,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:00:00Z",
  "version": 1,
  "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/webhooks/{webhookId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Update webhook

300/minBearer token
patch/api/v1/webhooks/{webhookId}

Updates the configuration, target URL, event types, version, active state, or concurrency version for one webhook owned by the authenticated merchant channel.

Path parameters

webhookIdinteger (int32)required

Request bodyPublicWebhookUpsertRequest

namestringrequired

Internal name for this webhook endpoint.

≥ 1 characters≤ 120 characters
targetUrlstring (uri)required

Absolute HTTPS URL that receives webhook POST requests from QrX.

≥ 1 characters
eventTypesstring[]required

Event types this webhook should receive. Use the event types endpoint to retrieve supported values.

apiVersionstringnullable

Optional webhook API version. Leave empty to use the current default version.

isActiveboolean

Whether QrX should actively deliver events to this webhook endpoint.

xmininteger (int32)nullable

Optional optimistic concurrency token returned by existing webhook records.

Responses

200OKPublicWebhookResponse
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
signingSecretstringnullable
Example
{
  "webhookId": 18,
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true,
  "healthStatus": "healthy",
  "consecutiveFailures": 0,
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "failureSince": null,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:00:00Z",
  "version": 1,
  "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X PATCH "https://api.qr-x.net/api/v1/webhooks/{webhookId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string",
  "targetUrl": "string",
  "eventTypes": [
    "string"
  ],
  "apiVersion": "string",
  "isActive": true,
  "xmin": 0
}'
Example request body
{
  "name": "string",
  "targetUrl": "string",
  "eventTypes": [
    "string"
  ],
  "apiVersion": "string",
  "isActive": true,
  "xmin": 0
}

Delete webhook

300/minBearer token
DEL/api/v1/webhooks/{webhookId}

Deletes a webhook endpoint. After deletion, QrX will no longer deliver events to that target URL.

Path parameters

webhookIdinteger (int32)required

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X DELETE "https://api.qr-x.net/api/v1/webhooks/{webhookId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Send test webhook

60/minBearer token
post/api/v1/webhooks/{webhookId}/test

Queues a test delivery to the selected webhook so you can verify connectivity, authentication, and payload handling in your integration.

Path parameters

webhookIdinteger (int32)required

Request bodyPublicWebhookTestRequest

eventTypestringrequired

Webhook event type to use for the test delivery.

≥ 1 characters

Responses

200OKPublicWebhookTestResponse
successboolean
httpStatusCodeinteger (int32)nullable
responseBodystringnullable
elapsedMsinteger (int64)
errorstringnullable
Example
{
  "success": true,
  "httpStatusCode": 202,
  "responseBody": "Event queued for delivery. Check delivery logs for results.",
  "elapsedMs": 0,
  "error": null
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks/{webhookId}/test" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "eventType": "transaction/created"
}'
Example request body
{
  "eventType": "transaction/created"
}

Enable webhook

300/minBearer token
post/api/v1/webhooks/{webhookId}/enable

Re-enables a webhook endpoint after it was disabled or paused.

Path parameters

webhookIdinteger (int32)required

Responses

200OKPublicWebhookResponse
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
signingSecretstringnullable
Example
{
  "webhookId": 18,
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true,
  "healthStatus": "healthy",
  "consecutiveFailures": 0,
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "failureSince": null,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:00:00Z",
  "version": 1,
  "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks/{webhookId}/enable" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Rotate webhook signing secret

300/minBearer token
post/api/v1/webhooks/{webhookId}/rotate-secret

Generates a new signing secret for the webhook. Update your receiver before relying on signature validation for future deliveries.

Path parameters

webhookIdinteger (int32)required

Responses

200OKPublicWebhookResponse
webhookIdinteger (int32)
namestringnullable
targetUrlstringnullable
eventTypesstring[]nullable
apiVersionstringnullable
isActiveboolean
healthStatusstringnullable
consecutiveFailuresinteger (int32)
lastSuccessAtstring (date-time)nullable
lastFailureAtstring (date-time)nullable
failureSincestring (date-time)nullable
createdAtstring (date-time)
updatedAtstring (date-time)
versioninteger (int32)
signingSecretstringnullable
Example
{
  "webhookId": 18,
  "name": "Order Events",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "eventTypes": [
    "transaction/created",
    "transaction/paid"
  ],
  "apiVersion": "2026-04-23",
  "isActive": true,
  "healthStatus": "healthy",
  "consecutiveFailures": 0,
  "lastSuccessAt": null,
  "lastFailureAt": null,
  "failureSince": null,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:00:00Z",
  "version": 1,
  "signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks/{webhookId}/rotate-secret" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List webhook deliveries

1200/minBearer token
get/api/v1/webhooks/{webhookId}/deliveries

Returns recent delivery attempts for a webhook, including success, failure, response, and retry information.

Path parameters

webhookIdinteger (int32)required

Query parameters

pageNumberinteger (int32)optional
pageSizeinteger (int32)optional
searchstringoptional

Responses

200OK
deliveryIdinteger (int64)
eventTypestringnullable
statusstringnullable
attemptNumberinteger (int32)
successboolean
httpStatusCodeinteger (int32)nullable
transactionIdstringnullable
orderIdstringnullable
errorMessagestringnullable
elapsedMsinteger (int64)
createdAtstring (date-time)
Example
{
  "data": [
    {
      "deliveryId": 991,
      "eventType": "transaction/paid",
      "status": "failed",
      "attemptNumber": 3,
      "success": false,
      "httpStatusCode": 500,
      "transactionId": "0a1999dc78dc4cac",
      "orderId": "SHOP-100045",
      "errorMessage": "Merchant endpoint returned HTTP 500.",
      "elapsedMs": 248,
      "createdAt": "2026-04-23T09:45:00Z"
    }
  ],
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20,
    "totalItemCount": 1,
    "pageCount": 1,
    "hasNextPage": false,
    "hasPreviousPage": false
  }
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/webhooks/{webhookId}/deliveries" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Get webhook delivery

1200/minBearer token
get/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}

Returns detailed request and response information for a single webhook delivery attempt.

Path parameters

webhookIdinteger (int32)required
deliveryIdinteger (int64)required

Responses

200OKPublicWebhookDeliveryResponse
deliveryIdinteger (int64)
eventTypestringnullable
statusstringnullable
attemptNumberinteger (int32)
successboolean
httpStatusCodeinteger (int32)nullable
transactionIdstringnullable
orderIdstringnullable
errorMessagestringnullable
elapsedMsinteger (int64)
createdAtstring (date-time)
targetUrlstringnullable
requestBodystringnullable
responseBodystringnullable
Example
{
  "deliveryId": 991,
  "eventType": "transaction/paid",
  "status": "failed",
  "attemptNumber": 3,
  "success": false,
  "httpStatusCode": 500,
  "transactionId": "0a1999dc78dc4cac",
  "orderId": "SHOP-100045",
  "errorMessage": "Merchant endpoint returned HTTP 500.",
  "elapsedMs": 248,
  "createdAt": "2026-04-23T09:45:00Z",
  "targetUrl": "https://merchant.example.com/webhooks/qrx",
  "requestBody": "{\"eventType\":\"transaction/paid\"}",
  "responseBody": "{\"error\":\"temporary failure\"}"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Redeliver webhook delivery

60/minBearer token
post/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver

Queues a new attempt for a previous webhook delivery. Use this after your endpoint has recovered from a temporary failure.

Path parameters

webhookIdinteger (int32)required
deliveryIdinteger (int64)required

Responses

200OKPublicWebhookTestResponse
successboolean
httpStatusCodeinteger (int32)nullable
responseBodystringnullable
elapsedMsinteger (int64)
errorstringnullable
Example
{
  "success": true,
  "httpStatusCode": 202,
  "responseBody": "Event queued for delivery. Check delivery logs for results.",
  "elapsedMs": 0,
  "error": null
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Cancel webhook delivery

300/minBearer token
post/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}/cancel

Cancels pending retry attempts for a webhook delivery that should no longer be sent.

Path parameters

webhookIdinteger (int32)required
deliveryIdinteger (int64)required

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/webhooks/{webhookId}/deliveries/{deliveryId}/cancel" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Reference

5 Endpoints

The lookup data behind valid requests: supported carriers, countries, locales, sender addresses and shipping methods for your account. Fetch these once, cache them, and refresh periodically instead of hardcoding values.

List carriers

1200/minBearer token
get/api/v1/reference/carriers

Returns the carriers that can be referenced when creating transactions or shipments through the Public API.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/reference/carriers" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List locales

1200/minBearer token
get/api/v1/reference/locales

Returns supported locale codes for localized payment pages, customer communication, and transaction content.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/reference/locales" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List countries

1200/minBearer token
get/api/v1/reference/countries

Returns supported destination country codes and names for transaction and shipment creation.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/reference/countries" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List shipping methods

1200/minBearer token
get/api/v1/reference/shipping-methods

Returns the shipping methods configured for the authenticated merchant channel. Use these codes in create transaction requests when you want QrX to create or prepare carrier labels.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/reference/shipping-methods" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List sender addresses

1200/minBearer token
get/api/v1/reference/senders

Returns sender address references configured for the authenticated merchant channel. Use the sender code in parcel requests when a specific sender location should be used.

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/reference/senders" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Products

7 Endpoints

Maintain the product catalog your order lines reference: SKU, EAN, weight and customs data per product. Archive products you no longer sell; historical transactions keep working.

List products

1200/minBearer token
get/api/v1/products

Returns products available through the authenticated merchant channel, including pagination metadata for catalog synchronization.

Query parameters

pageNumberinteger (int32)optional
pageSizeinteger (int32)optional
searchstringoptional
includeArchivedbooleanoptional

Responses

200OK
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
Example
{
  "data": [
    {
      "productId": 101,
      "sku": "TSHIRT-BASIC",
      "title": "Basic T-Shirt",
      "currency": "EUR",
      "price": 24.9,
      "availableQuantity": 100,
      "isArchived": false,
      "variantCount": 2,
      "optionGroupCount": 1,
      "createdAt": "2026-04-23T09:00:00Z",
      "updatedAt": "2026-04-23T09:05:00Z"
    }
  ],
  "pagination": {
    "pageNumber": 1,
    "pageSize": 20,
    "totalItemCount": 1,
    "pageCount": 1,
    "hasNextPage": false,
    "hasPreviousPage": false
  }
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/products" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Create product

300/minBearer token
post/api/v1/products

Creates a product with optional variants, option groups, tags, images, pricing, and availability information for use in QrX ordering and catalog flows.

Request bodyPublicProductUpsertRequest

defaultLocalestringrequired

Default locale for the product content, for example en or nl.

≥ 2 characters≤ 10 characters
skustringrequired

Unique product SKU within the merchant channel.

≥ 1 characters≤ 128 characters
titlestringrequired

Product title shown in QrX catalog and ordering flows.

≥ 1 characters≤ 256 characters
unitstringnullable

Optional unit label, for example piece, box, or kg.

≥ 0 characters≤ 64 characters
currencystringnullable

Three-letter ISO 4217 currency code for product pricing.

≥ 3 characters≤ 3 characters
pricenumber (double)

Base product price including VAT unless your integration explicitly stores prices differently.

≥ 0
vatPercentnumber (double)nullable

VAT percentage applied to the product price.

≥ 0≤ 100
availableQuantityinteger (int64)

Available stock quantity for catalog and ordering flows.

≥ 0
descriptionstringnullable

Product description shown in catalog and ordering flows.

≥ 0 characters≤ 4000 characters
imageUrlsstring[]nullable

Public image URLs for the product gallery.

tagsstring[]nullable

Optional tags for product filtering, grouping, or synchronization.

variantsPublicProductVariantUpsertRequest[]nullable

Optional product variants such as sizes, colors, or alternate SKUs.

optionGroupsPublicProductOptionGroupUpsertRequest[]nullable

Optional option groups for configurable product choices.

rowVersionstringnullable

Optional row version for optimistic concurrency when updating an existing product.

Responses

201CreatedPublicProductResponse
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
defaultLocalestringnullable
unitstringnullable
vatPercentnumber (double)nullable
descriptionstringnullable
imageUrlsstring[]nullable
tagsstring[]nullable
variantsPublicProductVariantResponse[]nullable
optionGroupsPublicProductOptionGroupResponse[]nullable
rowVersionstringnullable
Example
{
  "productId": 101,
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "currency": "EUR",
  "price": 24.9,
  "availableQuantity": 100,
  "isArchived": false,
  "variantCount": 2,
  "optionGroupCount": 1,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:05:00Z",
  "defaultLocale": "en",
  "unit": "pcs",
  "vatPercent": 21,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "variantId": 2001,
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "variantId": 2002,
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "optionGroupId": 301,
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "optionId": 4001,
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ],
  "rowVersion": "18277"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/products" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "defaultLocale": "en",
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "unit": "pcs",
  "currency": "EUR",
  "price": 24.9,
  "vatPercent": 21,
  "availableQuantity": 100,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ]
}'
Example request body
{
  "defaultLocale": "en",
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "unit": "pcs",
  "currency": "EUR",
  "price": 24.9,
  "vatPercent": 21,
  "availableQuantity": 100,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ]
}

Get product

1200/minBearer token
get/api/v1/products/{productId}

Returns the full product configuration for one product owned by the authenticated merchant channel.

Path parameters

productIdinteger (int32)required

Responses

200OKPublicProductResponse
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
defaultLocalestringnullable
unitstringnullable
vatPercentnumber (double)nullable
descriptionstringnullable
imageUrlsstring[]nullable
tagsstring[]nullable
variantsPublicProductVariantResponse[]nullable
optionGroupsPublicProductOptionGroupResponse[]nullable
rowVersionstringnullable
Example
{
  "productId": 101,
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "currency": "EUR",
  "price": 24.9,
  "availableQuantity": 100,
  "isArchived": false,
  "variantCount": 2,
  "optionGroupCount": 1,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:05:00Z",
  "defaultLocale": "en",
  "unit": "pcs",
  "vatPercent": 21,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "variantId": 2001,
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "variantId": 2002,
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "optionGroupId": 301,
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "optionId": 4001,
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ],
  "rowVersion": "18277"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X GET "https://api.qr-x.net/api/v1/products/{productId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Update product

300/minBearer token
patch/api/v1/products/{productId}

Updates a product, including variants, option groups, tags, images, pricing, availability, and catalog metadata.

Path parameters

productIdinteger (int32)required

Request bodyPublicProductUpsertRequest

defaultLocalestringrequired

Default locale for the product content, for example en or nl.

≥ 2 characters≤ 10 characters
skustringrequired

Unique product SKU within the merchant channel.

≥ 1 characters≤ 128 characters
titlestringrequired

Product title shown in QrX catalog and ordering flows.

≥ 1 characters≤ 256 characters
unitstringnullable

Optional unit label, for example piece, box, or kg.

≥ 0 characters≤ 64 characters
currencystringnullable

Three-letter ISO 4217 currency code for product pricing.

≥ 3 characters≤ 3 characters
pricenumber (double)

Base product price including VAT unless your integration explicitly stores prices differently.

≥ 0
vatPercentnumber (double)nullable

VAT percentage applied to the product price.

≥ 0≤ 100
availableQuantityinteger (int64)

Available stock quantity for catalog and ordering flows.

≥ 0
descriptionstringnullable

Product description shown in catalog and ordering flows.

≥ 0 characters≤ 4000 characters
imageUrlsstring[]nullable

Public image URLs for the product gallery.

tagsstring[]nullable

Optional tags for product filtering, grouping, or synchronization.

variantsPublicProductVariantUpsertRequest[]nullable

Optional product variants such as sizes, colors, or alternate SKUs.

optionGroupsPublicProductOptionGroupUpsertRequest[]nullable

Optional option groups for configurable product choices.

rowVersionstringnullable

Optional row version for optimistic concurrency when updating an existing product.

Responses

200OKPublicProductResponse
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
defaultLocalestringnullable
unitstringnullable
vatPercentnumber (double)nullable
descriptionstringnullable
imageUrlsstring[]nullable
tagsstring[]nullable
variantsPublicProductVariantResponse[]nullable
optionGroupsPublicProductOptionGroupResponse[]nullable
rowVersionstringnullable
Example
{
  "productId": 101,
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "currency": "EUR",
  "price": 24.9,
  "availableQuantity": 100,
  "isArchived": false,
  "variantCount": 2,
  "optionGroupCount": 1,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:05:00Z",
  "defaultLocale": "en",
  "unit": "pcs",
  "vatPercent": 21,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "variantId": 2001,
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "variantId": 2002,
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "optionGroupId": 301,
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "optionId": 4001,
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ],
  "rowVersion": "18277"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X PATCH "https://api.qr-x.net/api/v1/products/{productId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "defaultLocale": "en",
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "unit": "pcs",
  "currency": "EUR",
  "price": 24.9,
  "vatPercent": 21,
  "availableQuantity": 100,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ]
}'
Example request body
{
  "defaultLocale": "en",
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "unit": "pcs",
  "currency": "EUR",
  "price": 24.9,
  "vatPercent": 21,
  "availableQuantity": 100,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ]
}

Delete product

300/minBearer token
DEL/api/v1/products/{productId}

Deletes a product from the authenticated merchant channel when deletion is allowed. Prefer archiving when you need to keep historical catalog context.

Path parameters

productIdinteger (int32)required

Responses

200OK
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X DELETE "https://api.qr-x.net/api/v1/products/{productId}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Archive product

300/minBearer token
post/api/v1/products/{productId}/archive

Archives a product so it is no longer active in catalog and ordering flows while keeping the record available for history and recovery.

Path parameters

productIdinteger (int32)required

Responses

200OKPublicProductResponse
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
defaultLocalestringnullable
unitstringnullable
vatPercentnumber (double)nullable
descriptionstringnullable
imageUrlsstring[]nullable
tagsstring[]nullable
variantsPublicProductVariantResponse[]nullable
optionGroupsPublicProductOptionGroupResponse[]nullable
rowVersionstringnullable
Example
{
  "productId": 101,
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "currency": "EUR",
  "price": 24.9,
  "availableQuantity": 100,
  "isArchived": false,
  "variantCount": 2,
  "optionGroupCount": 1,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:05:00Z",
  "defaultLocale": "en",
  "unit": "pcs",
  "vatPercent": 21,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "variantId": 2001,
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "variantId": 2002,
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "optionGroupId": 301,
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "optionId": 4001,
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ],
  "rowVersion": "18277"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/products/{productId}/archive" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Unarchive product

300/minBearer token
post/api/v1/products/{productId}/unarchive

Restores an archived product so it can be used again in catalog and ordering flows.

Path parameters

productIdinteger (int32)required

Responses

200OKPublicProductResponse
productIdinteger (int32)
skustringnullable
titlestringnullable
currencystringnullable
pricenumber (double)
availableQuantityinteger (int64)
isArchivedboolean
variantCountinteger (int32)
optionGroupCountinteger (int32)
createdAtstring (date-time)
updatedAtstring (date-time)nullable
defaultLocalestringnullable
unitstringnullable
vatPercentnumber (double)nullable
descriptionstringnullable
imageUrlsstring[]nullable
tagsstring[]nullable
variantsPublicProductVariantResponse[]nullable
optionGroupsPublicProductOptionGroupResponse[]nullable
rowVersionstringnullable
Example
{
  "productId": 101,
  "sku": "TSHIRT-BASIC",
  "title": "Basic T-Shirt",
  "currency": "EUR",
  "price": 24.9,
  "availableQuantity": 100,
  "isArchived": false,
  "variantCount": 2,
  "optionGroupCount": 1,
  "createdAt": "2026-04-23T09:00:00Z",
  "updatedAt": "2026-04-23T09:05:00Z",
  "defaultLocale": "en",
  "unit": "pcs",
  "vatPercent": 21,
  "description": "Soft cotton tee",
  "imageUrls": [
    "https://merchant.example.com/images/tshirt-basic.jpg"
  ],
  "tags": [
    "apparel",
    "spring"
  ],
  "variants": [
    {
      "variantId": 2001,
      "sku": "TSHIRT-BASIC-S",
      "name": "Small",
      "description": "Small size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 1,
      "isActive": true
    },
    {
      "variantId": 2002,
      "sku": "TSHIRT-BASIC-M",
      "name": "Medium",
      "description": "Medium size",
      "price": 24.9,
      "imageUrl": null,
      "sortOrder": 2,
      "isActive": true
    }
  ],
  "optionGroups": [
    {
      "optionGroupId": 301,
      "title": "Gift Wrap",
      "description": "Optional wrap",
      "required": false,
      "allowMultiple": false,
      "sortOrder": 1,
      "options": [
        {
          "optionId": 4001,
          "sku": "GIFT-WRAP-RED",
          "name": "Red Wrap",
          "description": "Festive red wrapping",
          "price": 2.5,
          "imageUrl": null,
          "sortOrder": 1,
          "isActive": true
        }
      ]
    }
  ],
  "rowVersion": "18277"
}
429Too many requests. The response includes Retry-After and RateLimit-Reason headers.
curl -X POST "https://api.qr-x.net/api/v1/products/{productId}/unarchive" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Returns

17 Endpoints

Run the full return lifecycle over the API: list and inspect return requests, approve or reject them, ask the consumer for more information, attach evidence and receipt facts, exchange messages, and record the final resolution.

List returns (cursor pagination, newest first). state filters on stored canonical states.

Bearer token
get/api/v1/returns

Query parameters

statestringoptional
updatedSincestring (date-time)optional
includeTestModebooleanoptional
cursorstringoptional
limitinteger (int32)optional

Responses

200OKPublicReturnPageOfPublicReturnSummary
dataPublicReturnSummary[]nullable
nextCursorstringnullable
Example
{
  "data": [
    {
      "id": 0,
      "rmaNumber": "string",
      "canonicalState": "string",
      "resolutionOutcome": "string",
      "aggregateVersion": 0,
      "merchantChannelId": 0,
      "isTestMode": true,
      "requestedAt": "2026-07-30T12:00:00Z",
      "modified": "2026-07-30T12:00:00Z"
    }
  ],
  "nextCursor": "string"
}
curl -X GET "https://api.qr-x.net/api/v1/returns" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Retrieve one return by numeric id or RMA number, with items, receipt facts, shipments, evidence metadata, and allowed actions.

Bearer token
get/api/v1/returns/{idOrRma}

Path parameters

idOrRmastringrequired

Responses

200OKPublicReturnDetail
idinteger (int64)
rmaNumberstringnullable
canonicalStatestringnullable
resolutionOutcomestringnullable
aggregateVersioninteger (int64)
merchantChannelIdinteger (int32)nullable
isTestModeboolean
requestedAtstring (date-time)
modifiedstring (date-time)
allowedActionsstring[]nullable
itemsPublicReturnItem[]nullable
receiptFactsPublicReturnReceiptFact[]nullable
shipmentsPublicReturnShipment[]nullable
evidencePublicReturnEvidence[]nullable
compatibilityWarningstringnullable
Example
{
  "id": 0,
  "rmaNumber": "string",
  "canonicalState": "string",
  "resolutionOutcome": "string",
  "aggregateVersion": 0,
  "merchantChannelId": 0,
  "isTestMode": true,
  "requestedAt": "2026-07-30T12:00:00Z",
  "modified": "2026-07-30T12:00:00Z",
  "allowedActions": [
    "string"
  ],
  "items": [
    {
      "id": 0,
      "sku": "string",
      "description": "string",
      "quantity": 0
    }
  ],
  "receiptFacts": [
    {
      "id": 0,
      "returnRequestItemId": 0,
      "source": "string",
      "factType": "string",
      "receivedQuantity": 0,
      "discrepancyCode": "string",
      "condition": "string",
      "disposition": "string",
      "notes": "string",
      "externalFacilityRef": "string",
      "externalOperatorRef": "string",
      "deviceRef": "string",
      "clientMutationId": "string",
      "evidenceRefsJson": "string",
      "aggregateVersion": 0,
      "supersededById": 0,
      "supersedeReason": "string",
      "actorType": "string",
      "occurredAt": "2026-07-30T12:00:00Z"
    }
  ],
  "shipments": [
    {
      "id": 0,
      "carrierId": 0,
      "trackingNumber": "string",
      "status": "string",
      "voided": true
    }
  ],
  "evidence": [
    {
      "id": 0,
      "fileName": "string",
      "contentType": "string",
      "sizeBytes": 0,
      "state": "string"
    }
  ],
  "compatibilityWarning": "string"
}
curl -X GET "https://api.qr-x.net/api/v1/returns/{idOrRma}" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

List the append-only receipt facts for a return.

Bearer token
get/api/v1/returns/{id}/receipt-facts

Path parameters

idinteger (int64)required

Responses

200OK
idinteger (int64)
returnRequestItemIdinteger (int64)nullable
sourcestringnullable
factTypestringnullable
receivedQuantityinteger (int32)nullable
discrepancyCodestringnullable
conditionstringnullable
dispositionstringnullable
notesstringnullable
externalFacilityRefstringnullable
externalOperatorRefstringnullable
deviceRefstringnullable
clientMutationIdstringnullable
evidenceRefsJsonstringnullable
aggregateVersioninteger (int64)
supersededByIdinteger (int64)nullable
supersedeReasonstringnullable
actorTypestringnullable
occurredAtstring (date-time)
Example
[
  {
    "id": 0,
    "returnRequestItemId": 0,
    "source": "string",
    "factType": "string",
    "receivedQuantity": 0,
    "discrepancyCode": "string",
    "condition": "string",
    "disposition": "string",
    "notes": "string",
    "externalFacilityRef": "string",
    "externalOperatorRef": "string",
    "deviceRef": "string",
    "clientMutationId": "string",
    "evidenceRefsJson": "string",
    "aggregateVersion": 0,
    "supersededById": 0,
    "supersedeReason": "string",
    "actorType": "string",
    "occurredAt": "2026-07-30T12:00:00Z"
  }
]
curl -X GET "https://api.qr-x.net/api/v1/returns/{id}/receipt-facts" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Append a receipt fact (append-only; same contract the future mobile scanner uses).

Bearer token
post/api/v1/returns/{id}/receipt-facts

Path parameters

idinteger (int64)required

Request bodyPublicReceiptFactRequest

sourcestringnullable
factTypestringnullable
returnRequestItemIdinteger (int64)nullable
receivedQuantityinteger (int32)nullable
discrepancyCodestringnullable
conditionstringnullable
dispositionstringnullable
notesstringnullable
externalFacilityRefstringnullable
externalOperatorRefstringnullable
deviceRefstringnullable
clientMutationIdstringnullable
evidenceRefsJsonstringnullable
occurredAtstring (date-time)nullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/receipt-facts" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "source": "string",
  "factType": "string",
  "returnRequestItemId": 0,
  "receivedQuantity": 0,
  "discrepancyCode": "string",
  "condition": "string",
  "disposition": "string",
  "notes": "string",
  "externalFacilityRef": "string",
  "externalOperatorRef": "string",
  "deviceRef": "string",
  "clientMutationId": "string",
  "evidenceRefsJson": "string",
  "occurredAt": "2026-07-30T12:00:00Z"
}'
Example request body
{
  "source": "string",
  "factType": "string",
  "returnRequestItemId": 0,
  "receivedQuantity": 0,
  "discrepancyCode": "string",
  "condition": "string",
  "disposition": "string",
  "notes": "string",
  "externalFacilityRef": "string",
  "externalOperatorRef": "string",
  "deviceRef": "string",
  "clientMutationId": "string",
  "evidenceRefsJson": "string",
  "occurredAt": "2026-07-30T12:00:00Z"
}

Event cursor for resynchronization; only externally-contracted topics appear. Pass the returned nextCursor as afterSequence.

Bearer token
get/api/v1/returns/{id}/events

Path parameters

idinteger (int64)required

Query parameters

afterSequenceinteger (int64)optional
limitinteger (int32)optional

Responses

200OKPublicReturnPageOfPublicReturnEvent
dataPublicReturnEvent[]nullable
nextCursorstringnullable
Example
{
  "data": [
    {
      "sequence": 0,
      "topic": "string",
      "returnRequestId": 0,
      "occurredAt": "2026-07-30T12:00:00Z",
      "dataJson": "string"
    }
  ],
  "nextCursor": "string"
}
curl -X GET "https://api.qr-x.net/api/v1/returns/{id}/events" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Approve the return.

Bearer token
post/api/v1/returns/{id}/approve

Path parameters

idinteger (int64)required

Request bodyPublicReturnDecisionRequest

notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/approve" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "note": "string"
}'
Example request body
{
  "note": "string"
}

Reject the return.

Bearer token
post/api/v1/returns/{id}/reject

Path parameters

idinteger (int64)required

Request bodyPublicReturnDecisionRequest

notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/reject" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "note": "string"
}'
Example request body
{
  "note": "string"
}

Cancel the return where allowed.

Bearer token
post/api/v1/returns/{id}/cancel

Path parameters

idinteger (int64)required

Request bodyPublicReturnDecisionRequest

notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/cancel" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "note": "string"
}'
Example request body
{
  "note": "string"
}

Ask the customer for more information (canonical state becomes information_required).

Bearer token
post/api/v1/returns/{id}/request-information

Path parameters

idinteger (int64)required

Request bodyPublicReturnInformationRequest

messagestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/request-information" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "message": "string"
}'
Example request body
{
  "message": "string"
}

Acknowledge the customer's information (clears information_required).

Bearer token
post/api/v1/returns/{id}/acknowledge-information

Path parameters

idinteger (int64)required

Request bodyPublicReturnDecisionRequest

notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/acknowledge-information" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "note": "string"
}'
Example request body
{
  "note": "string"
}

Supersede an incorrect receipt fact with a replacement (the original is stamped, never edited).

Bearer token
post/api/v1/returns/{id}/receipt-facts/{factId}/supersede

Path parameters

idinteger (int64)required
factIdinteger (int64)required

Request bodyPublicReceiptFactSupersedeRequest

reasonstringnullable
replacementPublicReceiptFactRequest

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/receipt-facts/{factId}/supersede" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "string",
  "replacement": {
    "source": "string",
    "factType": "string",
    "returnRequestItemId": 0,
    "receivedQuantity": 0,
    "discrepancyCode": "string",
    "condition": "string",
    "disposition": "string",
    "notes": "string",
    "externalFacilityRef": "string",
    "externalOperatorRef": "string",
    "deviceRef": "string",
    "clientMutationId": "string",
    "evidenceRefsJson": "string",
    "occurredAt": "2026-07-30T12:00:00Z"
  }
}'
Example request body
{
  "reason": "string",
  "replacement": {
    "source": "string",
    "factType": "string",
    "returnRequestItemId": 0,
    "receivedQuantity": 0,
    "discrepancyCode": "string",
    "condition": "string",
    "disposition": "string",
    "notes": "string",
    "externalFacilityRef": "string",
    "externalOperatorRef": "string",
    "deviceRef": "string",
    "clientMutationId": "string",
    "evidenceRefsJson": "string",
    "occurredAt": "2026-07-30T12:00:00Z"
  }
}

Upload evidence for a return (policy + magic-byte checked; quarantine-aware). Reference the returned objectKey from a receipt fact's evidenceRefs.

Bearer token
post/api/v1/returns/{id}/evidence

Path parameters

idinteger (int64)required

Request body

filestring (binary)

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/evidence" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "file": "string"
}'
Example request body
{
  "file": "string"
}

Current resolution intent and acknowledgement state.

Bearer token
get/api/v1/returns/{id}/resolution

Path parameters

idinteger (int64)required

Responses

200OK
curl -X GET "https://api.qr-x.net/api/v1/returns/{id}/resolution" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Record an intended resolution outcome (no execution in Phase 1; canonical state becomes resolution_pending when received).

Bearer token
post/api/v1/returns/{id}/resolution

Path parameters

idinteger (int64)required

Request bodyPublicReturnResolutionIntentRequest

outcomestringnullable
notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/resolution" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "outcome": "string",
  "note": "string"
}'
Example request body
{
  "outcome": "string",
  "note": "string"
}

Acknowledge an externally executed resolution (finalizes the return).

Bearer token
post/api/v1/returns/{id}/resolution/acknowledge

Path parameters

idinteger (int64)required

Request bodyPublicReturnResolutionAckRequest

referencestringnullable
notestringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/resolution/acknowledge" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reference": "string",
  "note": "string"
}'
Example request body
{
  "reference": "string",
  "note": "string"
}

Public conversation messages for the return.

Bearer token
get/api/v1/returns/{id}/messages

Path parameters

idinteger (int64)required

Responses

200OK
curl -X GET "https://api.qr-x.net/api/v1/returns/{id}/messages" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Post a message on the return conversation.

Bearer token
post/api/v1/returns/{id}/messages

Path parameters

idinteger (int64)required

Request bodyPublicReturnMessageRequest

bodystringnullable
visibilitystringnullable

Responses

200OK
curl -X POST "https://api.qr-x.net/api/v1/returns/{id}/messages" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "body": "string",
  "visibility": "string"
}'
Example request body
{
  "body": "string",
  "visibility": "string"
}

This reference is generated automatically from the live QrX API specification.

Your privacy matters

We use cookies to keep things running smoothly. Some help us understand how the site is used so we can keep improving. You decide what to allow.