Sign and submit order
/v1/orders/{orderId}/sign-and-submitRequires orders:sign, Idempotency-Key, signatureAttestation, and expectedRevision from the reviewed order. Existing integrations may send expectedVersions instead; supply exactly one. A stale revision returns 409 and requires renewed clinician review. Select prescriber by npi, provider id, or externalId, or inherit the draft's prescriber. First-use registration requires team:write. Actor headers are optional with prescriber; legacy userId requires matching clinician actor headers. Signs the complete order, then attempts each submission. Signing remains committed if submission fails. Replay the same key after an uncertain response; retry reported submission failures through Submit order with a new key. Submitted means queued, not pharmacy acceptance.
Request example
Replace example values with your Test data. Check the field rules below before you send a request.
"<string>"curl -X POST 'https://api.affinityrx.com/v1/orders/{orderId}/sign-and-submit' \
-H "Authorization: Bearer $AFFINITY_API_KEY" \
-H 'Affinity-Version: 2026-09-28' \
-H 'Idempotency-Key: <Idempotency-Key>' \
-H 'Content-Type: application/json' \
--data @request.jsonResponse example
These examples show the body structure. Values can differ. Select a status code to see its response.
{
"object": "order_sign_and_submission",
"orderId": "ord_01j2y8m6jcc9tt24af5pw9x1bc",
"signedAt": "<string>",
"status": "submitted",
"prescriptions": [
{
"prescriptionId": "rx_01j2y8m6jcc9tt24af5pw9x1bc",
"status": "submitted",
"fulfillmentOrderId": "ord_01j2y8m6jcc9tt24af5pw9x1bc",
"error": {
"code": "<string>",
"detail": "<string>",
"status": 0
}
}
]
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 400,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 401,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 403,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 404,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 409,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 422,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 429,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}{
"code": "<string>",
"data": "<string>",
"detail": "<string>",
"instance": "<string>",
"requestId": "<string>",
"status": 503,
"title": "<string>",
"traceId": "<string>",
"type": "<string>"
}Implementation specification
Use these field types and limits to build your integration. Download the OpenAPI document for the complete contract.
Path parameters
orderIdstringrequiredPattern: ^ord_[0-7][0-9a-hjkmnp-tv-z]{25}$
Headers
Affinity-VersionstringSelects the HTTP API contract for this request only. When omitted, API-key requests use their service account’s stored version. Does not change the stored default.
Pin requests to 2026-09-28.
Idempotency-KeystringrequiredRequest body specification application/json
practiceIdstringrequiredPattern: ^prac_[0-7][0-9a-hjkmnp-tv-z]{25}$
userIdstring | nullShow userId fields
Any of · 1: string
string
Pattern: ^user_[0-7][0-9a-hjkmnp-tv-z]{25}$
Any of · 2: null
null
prescriberobject | nullShow prescriber fields
Any of · 1: object
idstring | nullShow id fields
Any of · 1: string
string
Pattern: ^prov_[0-7][0-9a-hjkmnp-tv-z]{25}$
Any of · 2: null
null
npistring | nullShow npi fields
Any of · 1: string
string
Any of · 2: null
null
externalIdstring | nullShow externalId fields
Any of · 1: string
string
Any of · 2: null
null
profileobject | nullShow profile fields
Any of · 1: object
emailstring | nullShow email fields
Any of · 1: string
string
Pattern: ^[^\s@]+@[^\s@]+\.[^\s@]+$
Any of · 2: null
null
phonestring | nullShow phone fields
Any of · 1: string
string
Any of · 2: null
null
Any of · 2: null
null
Any of · 2: null
null
signatureAttestationbooleanrequiredAllowed: true
expectedRevisionstring | nullShow expectedRevision fields
Any of · 1: string
Opaque revision of the complete order prescription set. Send the revision you reviewed as expectedRevision; never replace it automatically after a conflict.
Pattern: ^rev_[a-f0-9]{64}$
Any of · 2: null
null
expectedVersionsobject[] | nullShow expectedVersions fields
Any of · 1: object[]
Array items · object
prescriptionIdstringrequiredPattern: ^rx_[0-7][0-9a-hjkmnp-tv-z]{25}$
versionintegerrequiredMinimum: 1
Any of · 2: null
null
All of · 1: any
One of · 1: any
any
One of · 2: any
any
Response specifications
202Successful response
application/json
objectstringrequiredAllowed: "order_sign_and_submission"
orderIdstringrequiredPattern: ^ord_[0-7][0-9a-hjkmnp-tv-z]{25}$
signedAtstringrequiredstatusstringrequiredAllowed: "submitted", "partially_submitted", "not_submitted"
prescriptionsobject[]requiredShow prescriptions fields
Array items · object
prescriptionIdstringrequiredPattern: ^rx_[0-7][0-9a-hjkmnp-tv-z]{25}$
statusstringrequiredAllowed: "submitted", "failed"
fulfillmentOrderIdstring | nullrequiredShow fulfillmentOrderId fields
Any of · 1: string
string
Pattern: ^ord_[0-7][0-9a-hjkmnp-tv-z]{25}$
Any of · 2: null
null
errorobject | nullrequiredShow error fields
Any of · 1: object
codestringrequireddetailstringrequiredstatusnumber | stringrequiredShow status fields
Any of · 1: number
number
Any of · 2: string
string
Allowed: "Infinity", "-Infinity", "NaN"
Any of · 2: null
null
400HTTP 400
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
401Unauthorized
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
403Forbidden
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
404Not found
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
409Conflict
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
422Validation error
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
429Too many requests
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri
503HTTP 503
application/json
codestringrequireddataobjectdetailstringrequiredinstancestringrequiredrequestIdstringrequiredstatusintegerrequiredMinimum: 400
Maximum: 599
titlestringrequiredtraceIdstringtypestringrequiredFormat: uri