This page covers the third hop: what an OSF actually sees receives when it uses using the REST API in pull mode — i.e. submitting a request and , then calling GET endpoints to check its status. This is the model used by our Postman collections (c.- WIPO DAS REST API V2 Validation Test, c.- WIPO DAS REST API V2 Registration process Hosted OFF).
There are two unrelated situations here, with two different response shapes. Don't confuse them.
...
A. Synchronous validation errors (the request itself was rejected)
This happens Returned immediately, on the call that submits the request (e.g. POST /requests/registrations, POST /requests/retrievals, POST /requests/files/url-uploads), when the input is malformed, mismatched, or unauthorized. It returns a 4xx HTTP status with this body shapeHTTP status is 4xx.
Example request:
| Code Block | ||||
|---|---|---|---|---|
| ||||
POST /requests/registrations
{
"operationCategory": "registration",
"documentKindCategory": "patent",
"documentNumber": "IB PCT/IB2026/098496",
"documentDate": "2026-02-08",
"dasAccessCode": "1234",
"email": "jjduffy@example.com",
"fileId": "US-bf5f35ff-2a94-4082-8c1c-02e321178232"
} |
Example response (HTTP 400):
| Code Block | ||||
|---|---|---|---|---|
| ||||
{
"code": "INVALID_INPUT_DATA",
"message": "Invalid input data or document",
"details": [
{ "code": -4, "message": "Mismatched access code: dasAccessCode: expected dasAccessCode=AB46" }
]
} |
code is one of the 6 top-level DASSystemCodes the error category (SUCCESS, INVALID_INPUT_DATA, OPERATION_FORBIDDEN, DAS_SYSTEM_ERROR, OPERATION_IN_PROGRESS, INVALID_TOKEN). details[].message is built by a single shared formatter (gererateErrorDetail in app/utils.ts):
| Code Block | ||||
|---|---|---|---|---|
| ||||
<ErrorMessage text>[: <attributeName>[=<attributeValue>]][: expected <attributeName>=<expectedValue>] |
This section is about OSF input validation, unrelated to the OFF's protocol (TDA/PDX vs REST) — it does not change when an OFF migrates.
Common message templates
lists one or more specific reasons.
Message you will receive, per situation
| Situation | Message you will receive | Situation | DASErrorMessages | Resulting message (example) |
|---|---|---|---|---|
| Priority date doesn't match the registered one | MISMATCHED_PRIORITY_FILING_DATE | "Mismatched priority filing date: documentDate: expected documentDate=2022-10-01" | ||
| Access code doesn't match | MISMATCHED_ACCESS_CODE | "Mismatched access code: dasAccessCode: expected dasAccessCode=AB46" | ||
| Both date and access code wrong | MISMATCHED_ACCESS_CODE_AND_PRIORITY_FILING_DATE | "Mismatched access code and priority filing date: dasAccessCode, documentDate: expected dasAccessCode=AB46, documentDate=2022-10-01" | ||
documentKindCategory wrong (alone or combined)MISMATCHED_DOCUMENT_KIND_CATEGORY (+ combos) | "Mismatched document kind category: documentKindCategory=design: expected documentKindCategory=patent" | |||
| Priority date missing | MISSING_PRIORITY_FILING_DATE | "Missing priority filing date: documentDate" | ||
| Access code missing | MISSING_ACCESS_CODE | "Missing access code: dasAccessCode" | ||
Access code fails format/checksum checkINVALID_ACCESS_CODE | "Invalid access code: dasAccessCode: expected dasAccessCode=AB46" | |||
| documentDate not a valid date | INVALID_PRIORITY_FILING_DATE | "Invalid priority filing date: documentDate: expected documentDate=2022-10-01" | ||
Document not registeredDOCUMENT_NOT_FOUND | "The requested document is not registered in the system: documentNumber=US64/282,001, documentKindCategory=patent" | |||
| Other field mismatch (generic) | MISMATCHED_INPUT_VALUE | "Mismatched input value: documentKindCategory: expected documentKindCategory=patent" | ||
| Invalid file format on upload | INVALID_DOCUMENT_FILE_FORMAT | "Invalid document file format: fileFormatCategory=jpg: expected fileFormatCategory=pdf,zip" | ||
| Required field missing on upload | MISSING_REQUIRED_FIELD | "Missing required field: fileChecksum" |
The illustrative comments in the OpenAPI yaml (
"...received fileFormatCategory=jpg -> expected fileFormatCategory=[pdf, zip]") are paraphrased, not literal strings — the real formatter always produces the colon/"expected" pattern above.
⚠️ Security redaction: the "expected" value can be hidden
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
return isDasSupportUser(authInfo) || !isAccessCodeValid
? dasErrors
: filterErrorsForExpectedValue(dasErrors); |
...
Note: when the access code you supplied is incorrect, the response will not reveal the correct value, for security reasons — you will only see the field name, not the "expected" value.
...
B. Asynchronous status polling (the request was accepted; you're checking what happened to it)
This covers Covers GET .../requests/retrievals/statuses, GET .../requests/registrations (record), and the bulk recordedDocumentRequestBag recorded-requests list. These return HTTP 200 even when the underlying operation failed or is still pending — the failure result is only visible in the body, via requestStatusCategory and requestStatusMessage. There is no numeric error code on this channel.
Example request:
| Code Block | ||||
|---|---|---|---|---|
| ||||
GET /requests/ |
...
retrievals/statuses?requestAckId=USIB20260101010101 |
Example response — pending:
| Code Block | ||||
|---|---|---|---|---|
| ||||
{
"requestAckId": "USIB20260101010101",
"requestStatusCategory": "pending",
"requestStatusMessage": "awaiting off response"
} |
Example response — error:
| Code Block | ||||
|---|---|---|---|---|
| ||||
{
"requestAckId": "USIB20260101010101",
"requestStatusCategory": "error",
"requestStatusMessage": "unmatched access code"
} |
Values you
There is no numeric errorCode field anywhere in the polling responses. The only channel that carries one is the push notification webhook (see 5.1.2). What you do get is a free-text requestStatusMessage, sourced from das-status.ts.
...
may see (retrieval)
requestStatusCategory (SERVICE_STATUS) | requestStatusMessage (UI_MESSAGE, when set) | |
|---|---|---|
success | — | |
error | — | |
pending | pending | |
success | delivered | — |
success | file retrieval - ready for download | File is ready for download |
pending | awaiting off response | |
—error | document awaiting security clearance | |
—error | document number not available | |
—error | document incomplete | |
—error | unmatched document date | |
—error | unmatched access code | |
—error | unmatched document date and access code | |
—error | invalid document details | — |
...
Values you may see (registration)
requestStatusCategory (SERVICE_STATUS) | requestStatusMessage (UI_MESSAGE, when set) | ||
|---|---|---|---|
document registered | document registered successfully | ||
document not registered | document not registered | ||
registration - recorded | registration - recorded | successful | successful |
success | success | ||
pending | — | ||
registration - withdrawn | registration - withdrawn |
...
Retrieval failures from a hosted OFF
...
: legacy TDA/PDX
...
code vs. the message you will actually receive
When If the failure originated comes from a hosted OFF answering over TDA/PDX → requestStatusMessage is overwritten with the EDI-translated text documented on 5.1.2 (e.g. "ACCESS NOT AUTHORIZED" for TDA code 5), because OSF_LAST_MESSAGE is set to that EDI string regardless of which channel (push or pull) ends up reading it.
If the failure was raised by DAS's own validator instead (e.g. an OSF polls a retrieval it submitted with a mismatched access code, unrelated to any OFF) → you'll see the literal strings in the tables above directly (e.g. unmatched access code).
So the same underlying TDA failure can appear as "ACCESS NOT AUTHORIZED" to a polling OSF, and as errorCode: -6, statusMessage: "ACCESS NOT AUTHORIZED" to a webhook-registered OSF — same text, but only the webhook gets the numeric code.
🆕 What changes once this OFF migrates from TDA/PDX to REST
Just like on the notification channel (5.1.2), OSF_LAST_MESSAGE (which becomes requestStatusMessage here) is only EDI-translated when event.respondingProtocol == 'tda'. Once the OFF answers over the draft REST interface instead (5.1.1), the raw statusMessage the OFF sent is stored and returned as-is — no EDI translation step runs at all.
...
Office of First Filing, the requestStatusMessage you see on this poll depends on which protocol that office uses to answer. The table below matches each legacy TDA/PDX code to the message you receive today (office still on TDA/PDX) and the message you can expect once that office migrates to the newer REST interface (see 5.1.1.- Responses from OFF to DAS (TDA/PDX codes) for the full legacy-code reference, and 5.1.2.- Responses from DAS to OSF via notification endpoint for the equivalent on the push-notification channel).
| TDA/PDX code | Legacy meaning | requestStatusMessage today (office on TDA/PDX) | requestStatusMessage after the office migrates to REST |
|---|---|---|---|
| 0 / 14 / 15 | Successful / Registered / Updated | (none — requestStatusCategory: success) | ready for download → delivered |
| 1 | Application number provided was not found | APPLICATION NUMBER NOT FOUND | document number not available |
| 2 | File is not available (security clearance not granted) | FILE WAS NOT AVAILABLE (REQUESTED APPLICATION EXISTS BUT IS NOT CLEARED FOR DISSEMINATION, e.g. security) | document awaiting security clearance |
| 3 | Documents was not found (incomplete set) | DOCUMENT(S) WAS NOT AVAILABLE (COMPLETE SET OF REQUIRED DOCUMENTS FOR CERTIFIED COPY IS NOT AVAILABLE) | document incomplete |
| 5 | Not published, no authorization to permit access filed | ACCESS NOT AUTHORIZED | document awaiting security clearance |
| 7 | Oversize document, CD will be mailed | (no message available today) | (no longer applicable — large files use presigned-URL upload/download) |
| 11 | Das Access Code invalid | INVALID DATA | unmatched access code |
| 12 | Request under processing, response sent later | (no message available today) | awaiting off response |
| 16 | Das Access Code and Priority Date did not match | MISMATCH ACCESS CODE AND PRIORITY FILING DATE | unmatched document date and access code |
| 17 | Priority Date did not match | MISMATCH PRIORITY FILING DATE OR ACCESS CODE | unmatched document date |
| 18 | Das Access Code did not match | MISMATCH ACCESS CODE | unmatched access code |
| 19 | Priority Date was not provided by OFF | MISSING PRIORITY FILING DATE | invalid document details |
| -1 | System not available, scheduled downtime | (no message available today) | Reported as a system error rather than a status message |
| -2 | System not available, back-end problem | (no message available today) | Reported as a system error rather than a status message |
Quick reference
Worked example — same underlying failure (TDA code 5 equivalent), polled via GET: - Today: {"requestStatusCategory": "error", "requestStatusMessage": "ACCESS NOT AUTHORIZED"} - After migration: {"requestStatusCategory": "error", "requestStatusMessage": "document awaiting security clearance"} (assuming the OFF implements the draft vocabulary as documented on 5.1.1)
...
| Field you see | Where it's documented |
|---|---|
code, details[].code, details[].message (HTTP 4xx on submission) | This page, section A |
requestStatusCategory, requestStatusMessage (HTTP 200 on poll) | This page, section B |
errorCode, statusMessage (push notification body) | 5.1.2.- Responses from DAS to OSF via notification endpoint |
| Legacy TDA/PDX numeric code, and its REST migration mapping (OFF→DAS only, never seen by the OSF directly) | 5.1.1.- Responses from OFF to DAS (TDA/PDX codes) |