This reference lists every response the Orchid eBound™ Transaction API can return, so you can map each one to a handling rule in your POS or ERP integration. It is a companion to the Orchid eBound™ API Documentation, which covers authentication, transaction types, and payload structure.
Which endpoint to use
Important — the asynchronous endpoint is no longer supported.
POST /api/transactions/queue, and the API feedback webhook that reported its outcomes, have been retired. All integrations must use the synchronous endpoint,POST /api/transactions. Everything else in this article describes that endpoint.
| Endpoint | Status | How you learn the outcome |
|---|---|---|
POST /api/transactions | Synchronous — supported | The response body contains a Result object for every transaction you submitted. Nothing else is required. |
POST /api/transactions/queue | Asynchronous — retired | No longer supported. Previously returned an acknowledgement only, with the outcome delivered later to a webhook. |
Authenticate with your API token. The supported endpoint reads the transaction type from a transactionType property on each transaction in the array — no additional headers are required.
The response format
The endpoint returns an array with one element per transaction you submitted. Each element is your original transaction echoed back, with a Result object added:
[{
"...your original submitted fields...": "...",
"transactionIdentifier": "T-099999-4567_1668086463",
"Result": {
"status": "Complete-Sent",
"received": "2026-07-30T09:14:22",
"processed": "2026-07-30T09:14:23",
"Results": "Success",
"transactionType": "Receive"
}
}]
| Field | Meaning |
|---|---|
status | Complete-Sent when the transaction was written to the bound book, Failed-Sent when it was rejected. |
Results | Success on acceptance. On rejection, the reason or reasons — see the response tables below. |
received | When Orchid received the transaction. |
processed | When Orchid finished processing it. |
transactionType | The transaction type Orchid resolved from your payload. |
transactionIdentifier | Your identifier, echoed back. If you do not supply one, Orchid generates a GUID. Send your own so you can reconcile responses to source records. |
Three rules for handling responses
- Do not branch on the HTTP status code. Once your request passes the pre-flight checks, a rejected transaction still returns HTTP 200. Always read
Result.status. - Treat
Resultsas display text, not parseable data. When a transaction fails more than one check, the reasons are joined with commas — and the messages themselves contain commas. Log and display the string; branch onstatusinstead. - Batches are evaluated per transaction. Some elements of an array can succeed while others fail. Check every element, not just the first.
When a transaction is rejected because the serial number is not in an open disposition, the response adds a Result.AdditionalData.OpenDispositions list showing which entries are open for that serial number. Use it to correct and resubmit.
Messages below are reproduced exactly as the API returns them, so you can match on them directly.
Response type 1 — Pre-flight responses
These are returned before any transaction in your payload is examined, and they reject the entire batch — nothing is written. They are the only responses that use meaningful HTTP status codes, so they are worth handling separately from transaction failures.
| Response | HTTP | What it means |
|---|---|---|
The authentication token is required | 400 | No API token was supplied on the request. |
Failed authentication | 403 | The token does not match an active FFL. Check the token and confirm the FFL is still active in your Orchid account. |
No transactions were received, please verify that json data is well formed and not empty | 400 | The request body could not be read as a JSON array of transactions. |
{"HasError": true, "message": "..."} | 200 | An unexpected processing error. Note the message and the transactionIdentifier values in the batch, then raise a support ticket — these are also captured in your API Error Log. |
Response type 2 — Transactional responses
These appear in Result.Results for an individual transaction, always with Result.status set to Failed-Sent and an HTTP status of 200. The “Applies to” column shows which transaction types can produce each message.
Acceptance
| Response | What it means |
|---|---|
Success | The transaction was committed to the bound book. Accompanied by status: "Complete-Sent". |
Missing transaction data
Returned when the transaction object itself, or a required sub-object, could not be read.
| Message returned | Applies to |
|---|---|
Type indicated must be type available within system. | All except Theft, Found, Destroy |
Caliber/Gauge is required. | All transaction types |
Manufacturer is required. | All transaction types |
Model is required. | All transaction types |
No Firearm Data | All transaction types |
Type is required. | All transaction types |
SKU is required. | Found |
FFL Information is required. | Transfer |
FFL Name is required. | Transfer |
FFL Number is required. | Transfer |
Physical Date appears to be incorrect. | Transfer, Theft, Found, Destroy |
Physical Date is required. | Transfer, Theft, Found, Destroy |
serial Number is required. | Transfer, Theft, Found, Destroy |
Firearm identity and specification
Validation of the item being recorded — manufacturer, model, type, calibre, serial number, and the optional NFA and SOT fields. Each message is returned with the SKU and serial number of the item that failed, so you can identify the offending row in a batch.
| Message returned | Applies to |
|---|---|
Caliber/Gauge may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Country Of Manufacture is required when Importer is specified. | All except Theft, Found, Destroy |
Country of Manufacture may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Department may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Importer may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Item No/SKU many not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Location may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Manufacturer may not be over 70 characters, including spaces. | All except Theft, Found, Destroy |
Model may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
NFA Form Control Number many not be over 25 characters, including spaces. | All except Theft, Found, Destroy |
NFA Form Type indicated must be type available within system. | All except Theft, Found, Destroy |
Purpose indicated must be type available within system. | All except Theft, Found, Destroy |
Reportable 3310.12 value has to be value available within system. | All except Theft, Found, Destroy |
Serial Number is required. | All except Theft, Found, Destroy |
Serial Number may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
SOT Control Number many not be over 25 characters, including spaces. | All except Theft, Found, Destroy |
Sublocation may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Type may not be over 50 characters, including spaces. | All except Theft, Found, Destroy |
Acquisition information
Applies to transaction types that bring an item into the bound book.
| Message returned | Applies to |
|---|---|
Acquired FFL may not be over 15 characters | Receive, Serialize, Assemble, Disassemble |
Acquisition Address is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition Address may not be over 250 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Acquisition City is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition City may not be over 50 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Acquisition Country may not be over 50 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Acquisition Date is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition Name is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition Name may not be over 150 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Acquisition State is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition State may not be over 50 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Acquisition Zip is required. | Receive, Serialize, Assemble, Disassemble |
Acquisition Zip may not be over 50 characters, including spaces. | Receive, Serialize, Assemble, Disassemble |
Disposition information
Applies to transaction types that move an item out of the bound book.
| Message returned | Applies to |
|---|---|
Disposition Address is required. | Exempt, Assemble, Disassemble |
Disposition City is required. | Exempt, Assemble, Disassemble |
Disposition State is required. | Exempt, Assemble, Disassemble |
Disposition Zip is required. | Exempt, Assemble, Disassemble |
Disposed SOT may not be over 50 characters, including spaces. | Transfer |
Disposition FFL is required. | Transfer |
Disposed FFL may not be over 15 characters and may not include dashes or spaces. | Transfer, Assemble, Disassemble |
FFL Must be Valid as of Disposition Date. | Transfer, Assemble, Disassemble |
Cannot transfer; Serial number is not an open disposition. | Transfer, Exempt, Assemble, Disassemble |
Disposition Address may not be over 250 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Disposition City may not be over 50 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Disposition Country may not be over 50 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Disposition Date is required. | Transfer, Exempt, Assemble, Disassemble |
Disposition Date may not be before the acquisition date. | Transfer, Exempt, Assemble, Disassemble |
Disposition Name is required. | Transfer, Exempt, Assemble, Disassemble |
Disposition Name may not be over 250 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Disposition State may not be over 50 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Disposition Zip may not be over 50 characters, including spaces. | Transfer, Exempt, Assemble, Disassemble |
Is assigned to a 4473. | Transfer, Exempt, Assemble, Disassemble |
Book state and item availability
Returned when the item’s current state in the bound book does not permit the requested movement. These are the most common failures in live integrations and usually indicate the two systems have drifted out of step.
| Message returned | Applies to |
|---|---|
Cannot assemble the same item. | Assemble |
Disposition Date cannot be before the Acquisition Date. | Destroy |
Firearm is not acquired and can not be disposed | Destroy |
Firearm is already acquired | Found |
This historical transaction already exists in the bound book. | Receive |
Cannot import; serial number already acquired. | Receive, Serialize |
Firearm is not acquired and cannot be marked as lost | Theft |
Is reserved for an online sale. | Transfer, Exempt |
Not all Serial Numbers are in Open Disposition | Transfer, Exempt |
Serial Number <serial number> not found. | Transfer, Exempt |
There was an issue updating disposition information | Transfer, Exempt |
Inventory management location
Returned when the optional imDepartment, imLocation or imSublocation values cannot be matched to your configured hierarchy. The hierarchy resolves top-down, so a department must be valid before a location can be, and a location before a sublocation.
| Message returned | Applies to |
|---|---|
Company Id is invalid | Receive, Serialize, Assemble, Disassemble |
Deparment was not found. | Receive, Serialize, Assemble, Disassemble |
In order to get location, you must provide a valid department. | Receive, Serialize, Assemble, Disassemble |
In order to get sublocation, you must provide a valid location. | Receive, Serialize, Assemble, Disassemble |
Location was not found. | Receive, Serialize, Assemble, Disassemble |
Sublocation was not found. | Receive, Serialize, Assemble, Disassemble |
Related documentation
- Orchid eBound™ API Documentation — authentication, architecture, transaction types, and full payload samples for every ATF-regulated transaction.
- Orchid API — Swagger UI — explore and test the Transaction Queue endpoints interactively.
If a response in your logs is not listed here, or a transaction is rejected in a way you cannot explain, raise a ticket through the Orchid support portal with the transactionIdentifier and the full Result object.