Order Cancellation APIs
Operations related to OrderCancellations
Get incoming OrderCancellations [transaction-type: OrderCancellation]
The response, in JSON, will always include the three latest messages, per default. Using XML you always only get one (as there's no "array" function for XML).
With JSON, use the limit parameter to change the number of returned messages and combine it with offset to traverse through your available messages.
To get new messages only, use the "Read" endpoint instead!
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
No Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/incoming HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "text",
"ANY_ADDITIONAL_PROPERTY": {}
}
]
}Create incoming OrderCancellations [transaction-type: OrderCancellation]
The request can be either JSON or XML. Each individual message must be POST'ed as an object, JSON Array is not suported!
Account registration number issued by Qvalia
""For POST requests, chose to overwrite upon a 409 Conflict response to reprocess the message with the same document ID and receiver (i.e. send the same message again)
falseExample: falseOptional. Send a unique value you generate per submission (a UUID is recommended!)
and a repeat of the same request returns the original response, with the original
integrationId, instead of creating a second document.
This is what makes a submission safe to retry after a timeout: if the connection
breaks after we accept the POST but before the response reaches you, repeating it
with the same key tells you whether the document was created, without a
reconciling GET.
- Same key, same body, request finished: the original response is replayed.
- Same key, same body, original still in flight:
409. - Same key, different body:
400. - Key older than 24 hours: treated as new.
A request that fails releases its key, so you can retry the same key after an error. Keys are scoped to your account.
b7f3a1c2-9d4e-4f5a-8b6c-1d2e3f4a5b6cPattern: ^[\w.:@+-]+$OK
successNo Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
POST /transaction/{accountRegNo}/order-cancellations/incoming HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 24
{
"OrderCancellation": {}
}{
"status": "success",
"data": {
"message": "Invoice 100-1000 sent",
"integrationId": "4725a033-e501-4e2f-afa5-3a5c24eb5e28",
"ANY_ADDITIONAL_PROPERTY": "100-1000"
}
}Read incoming OrderCancellations [transaction-type: OrderCancellation]
Through this endpoint you will get any unread (=previously fetched) message(s). After you have fetched through this request the message will be automatically marked as read
The response, in JSON, will always include the three latest messages, per default. Using XML you always only get one (as there's no "array" function for XML).
With JSON, use the limit parameter to change the number of returned messages and combine it with offset to traverse through your available messages.
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseRelease previously read documents back to the unread pool: selects documents that HAVE been read, clears their read mark, and returns them. The next call to this endpoint will hand them out again.
Use it to recover when a document was read but the hand-off downstream failed — there is one read mark per document per account, not a per-consumer cursor, so without this a document is delivered exactly once and cannot be re-requested.
Must be scoped. Combine it with at least one of integrationId, documentId,
from or updatedAtFrom; an unscoped call is rejected with 400, because it
would clear the account's entire read state and re-deliver its full history on the
next read. limit and offset do not count as scoping.
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
No Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/incoming/readordercancellations HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "text",
"ANY_ADDITIONAL_PROPERTY": {}
}
]
}Get outgoing OrderCancellations [transaction-type: OrderCancellation]
The response, in JSON, will always include the three latest messages, per default. Using XML you always only get one (as there's no "array" function for XML).
With JSON, use the limit parameter to change the number of returned messages and combine it with offset to traverse through your available messages.
To get new messages only, use the "Read" endpoint instead!
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
No Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/outgoing HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "text",
"ANY_ADDITIONAL_PROPERTY": {}
}
]
}Create outgoing OrderCancellations [transaction-type: OrderCancellation]
The response, in JSON, will always include the three latest messages, per default. Using XML you always only get one (as there's no "array" function for XML).
With JSON, use the limit parameter to change the number of returned messages and combine it with offset to traverse through your available messages.
To get new messages only, use the "Read" endpoint instead!
Account registration number issued by Qvalia
""For POST requests, chose to overwrite upon a 409 Conflict response to reprocess the message with the same document ID and receiver (i.e. send the same message again)
falseExample: falseOptional. Send a unique value you generate per submission (a UUID is recommended!)
and a repeat of the same request returns the original response, with the original
integrationId, instead of creating a second document.
This is what makes a submission safe to retry after a timeout: if the connection
breaks after we accept the POST but before the response reaches you, repeating it
with the same key tells you whether the document was created, without a
reconciling GET.
- Same key, same body, request finished: the original response is replayed.
- Same key, same body, original still in flight:
409. - Same key, different body:
400. - Key older than 24 hours: treated as new.
A request that fails releases its key, so you can retry the same key after an error. Keys are scoped to your account.
b7f3a1c2-9d4e-4f5a-8b6c-1d2e3f4a5b6cPattern: ^[\w.:@+-]+$OK
successNo Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
POST /transaction/{accountRegNo}/order-cancellations/outgoing HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Content-Type: application/json
Accept: */*
Content-Length: 24
{
"OrderCancellation": {}
}{
"status": "success",
"data": {
"message": "Invoice 100-1000 sent",
"integrationId": "4725a033-e501-4e2f-afa5-3a5c24eb5e28",
"ANY_ADDITIONAL_PROPERTY": "100-1000"
}
}Read outgoing OrderCancellations [transaction-type: OrderCancellation]
Through this endpoint you will get any unread (=previously fetched) message(s). After you have fetched through this request the message will be automatically marked as read
The response, in JSON, will always include the three latest messages, per default. Using XML you always only get one (as there's no "array" function for XML).
With JSON, use the limit parameter to change the number of returned messages and combine it with offset to traverse through your available messages.
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseRelease previously read documents back to the unread pool: selects documents that HAVE been read, clears their read mark, and returns them. The next call to this endpoint will hand them out again.
Use it to recover when a document was read but the hand-off downstream failed — there is one read mark per document per account, not a per-consumer cursor, so without this a document is delivered exactly once and cannot be re-requested.
Must be scoped. Combine it with at least one of integrationId, documentId,
from or updatedAtFrom; an unscoped call is rejected with 400, because it
would clear the account's entire read state and re-deliver its full history on the
next read. limit and offset do not count as scoping.
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
No Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Conflict
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/outgoing/readordercancellations HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "text",
"ANY_ADDITIONAL_PROPERTY": {}
}
]
}Get incoming order cancellation statuses [transaction-type: OrderCancellation]
Returns lightweight delivery/processing status metadata for the matching messages — the message integrationId and globalTransactionId, the incoming readAt timestamp and a metadata object whose status reflects the latest message-log status and whose webhooks_dispatched lists every webhook delivery attempt — WITHOUT the heavy document payload.
A delivery that failed can be fetched again, for 30 days, by the eventId listed for it — see GET /account/{accountRegNo}/webhook/{eventId} in the Account API.
Uses the same query-string filters as the resource's GET on /incoming and /outgoing. By default only unread messages are returned; set includeRead=true to also include previously read messages.
The response is always JSON (an array of status objects); there is no XML representation for this endpoint.
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
successNo Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/incoming/status HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "29cca64f-a7dd-49fa-a5f4-29f157d9fbc0",
"globalTransactionId": "9b0896ae-e18f-442b-8378-bd445298c7e8",
"readAt": null,
"metadata": {
"status": {
"event": "message-log/update",
"status": "processed",
"deliveryMethod": "peppol",
"updatedAt": "2026-09-29T06:36:42.622Z"
},
"webhooks_dispatched": [
{
"eventId": "f455a5d6-b94f-5908-b835-7a1cf67d438f",
"eventType": "new_document",
"success": false,
"status": 502,
"statusText": "Bad Gateway",
"signed": false,
"occurredAt": "2026-09-29T06:36:11.997Z",
"dispatchedAt": "2026-09-29T06:36:12.579Z"
},
{
"eventId": "fd69b5eb-4386-5cce-a478-6e3dd1d85857",
"eventType": "document_delivery",
"success": true,
"status": 200,
"statusText": "OK",
"signed": true,
"occurredAt": "2026-09-29T06:36:42.458Z",
"dispatchedAt": "2026-09-29T06:36:43.043Z"
}
]
}
}
]
}Get outgoing order cancellation statuses [transaction-type: OrderCancellation]
Returns lightweight delivery/processing status metadata for the matching messages — the message integrationId and globalTransactionId, the incoming readAt timestamp and a metadata object whose status reflects the latest message-log status and whose webhooks_dispatched lists every webhook delivery attempt — WITHOUT the heavy document payload.
A delivery that failed can be fetched again, for 30 days, by the eventId listed for it — see GET /account/{accountRegNo}/webhook/{eventId} in the Account API.
Uses the same query-string filters as the resource's GET on /incoming and /outgoing. By default only unread messages are returned; set includeRead=true to also include previously read messages.
The response is always JSON (an array of status objects); there is no XML representation for this endpoint.
Account registration number issued by Qvalia
""How many messages to return in Array (XML is always one!)
3Example: 5Where to start index for using limit/offset listing
0Example: 0If you are using the "read" enpoints, make it include previously read messages
falseExample: falseQvalia unique identifier for the transaction/message
""The document identifier of teh message, e.g. Invoice number
""Filter on creation date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form; any unambiguous date string the server can
parse is accepted, but only YYYY-MM-DD is guaranteed to keep working.
The whole day is included.
2024-01-01Filter on creation date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
2024-01-31Filter on last-updated date, from this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
NB! If you send updatedAtFrom without updatedAtTo, updatedAtTo
defaults to today — the range is not open-ended. Send updatedAtTo
explicitly if you need a different end date.
2024-01-01Filter on last-updated date, to this date inclusive. YYYY-MM-DD is the
documented and recommended form. The whole day is included.
Defaults to today when updatedAtFrom is supplied without it.
2024-01-31OK
successNo Content. The request succeeded and there is no body to return.
Bad Request
Unauthorized. Returned when the API key or Bearer token is missing, malformed or not valid for the account in the URI.
Forbidden. The credentials are valid, but the account is not permitted to perform this action — typically because the required integration feature or scope is not enabled on the account.
Not Found
Unprocessable Entity
Too Many Requests. The account has exceeded its request budget, which is counted per account across all Qvalia APIs.
Read Retry-After and wait at least that many seconds before retrying — retrying
immediately is simply rejected again. RateLimit-Remaining on every response tells
you how much of the budget is left, so a well-behaved client need not hit this at
all. Contact Qvalia Helpdesk if your integration needs
a higher limit.
Internal Server Error. metadata is deliberately omitted on a 500 — no
internal detail is returned. Try again; if the problem persists contact
help@qvalia.com.
GET /transaction/{accountRegNo}/order-cancellations/outgoing/status HTTP/1.1
Host: api-test.qvalia.com
Authorization: YOUR_API_KEY
Accept: */*
{
"status": "success",
"data": [
{
"integrationId": "29cca64f-a7dd-49fa-a5f4-29f157d9fbc0",
"globalTransactionId": "9b0896ae-e18f-442b-8378-bd445298c7e8",
"readAt": null,
"metadata": {
"status": {
"event": "message-log/update",
"status": "processed",
"deliveryMethod": "peppol",
"updatedAt": "2026-09-29T06:36:42.622Z"
},
"webhooks_dispatched": [
{
"eventId": "f455a5d6-b94f-5908-b835-7a1cf67d438f",
"eventType": "new_document",
"success": false,
"status": 502,
"statusText": "Bad Gateway",
"signed": false,
"occurredAt": "2026-09-29T06:36:11.997Z",
"dispatchedAt": "2026-09-29T06:36:12.579Z"
},
{
"eventId": "fd69b5eb-4386-5cce-a478-6e3dd1d85857",
"eventType": "document_delivery",
"success": true,
"status": 200,
"statusText": "OK",
"signed": true,
"occurredAt": "2026-09-29T06:36:42.458Z",
"dispatchedAt": "2026-09-29T06:36:43.043Z"
}
]
}
}
]
}Last updated
Was this helpful?

