Acceptances
Every operation below is generated from the OpenAPI v2 specification and includes parameters, request fields, response fields, errors, and examples.
Documents, lots and physical stock
| stocks.physical / stocks.aggregate | Arrays of warehouse totals: warehouse_id, warehouse_name, stockTotal, stockReserved, stockAvailable. stocks.available_by_warehouse is an object keyed by warehouse ID; these are not identical shapes. |
|---|---|
| GET /api/v2/products/{id}/stock-lots | Physically placed quantities by lot and dates. An unassigned reservation cannot be subtracted from an arbitrary lot. Check quantity units and warehouse in the response. |
| accepted_lots | Actual receipt lots. Expected, accepted and placed quantities are distinct measures; a difference does not itself indicate an API error. |
| requested_lot / fulfillment_lots | Order requested_lot expresses a requirement; fulfillment_lots records actual picking and picked_quantity the picked amount. Multiple actual lots cannot be reduced to one date. |
| movement_type / operation | Picking can emit a reservation-release and physical-issue pair. Distinguish operation instead of counting two physical issues. Transfers correlate through movement_group_id; transfer_kind specifies the kind. |
| GET /api/v2/closed-boxes | Actual sealed boxes with a unique SSCC: balance=1 and balance_unit=box. A packaging-type barcode from products is not a unique SSCC. Opened, shipped and expected-only boxes are excluded. |
| acceptance_date | For standard/return creation (type_id=1/2), the current handler assigns server now() even when acceptance_date is supplied. Updating an existing acceptance accepts the date. Type 3 uses a separate cross-dock service. created_at/updated_at are technical timestamps, not the document date. |
| Lifecycle | Acceptance cancellation is a separate cancel command with state checks, not deletion. Prefer /lines; deprecated /offers remain for compatibility. See operation-specific constraints. |
type_id=1 is a standard acceptance, type_id=2 is a return, and type_id=3 is cross-dock. The type is selected at creation and is immutable. For type 3, POST /api/v2/acceptances atomically creates the draft case and supply rows; continue with the Cross-docking operations.Acceptances
List acceptances
| operationId | listAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Returns acceptances visible to the authenticated account. Use documented query parameters for filtering, sorting, and pagination.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/acceptances" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
page |
query | no | integer:int64 |
form | true | min: 1 | Page number. The same filter may also be sent as filter[page] where supported by the Laravel query adapter. |
1 |
per_page |
query | no | integer:int64 |
form | true | min: 1 max: 250 |
Number of records per page. Default is 50; maximum is 250. The same filter may also be sent as filter[per_page] where supported by the Laravel query adapter. |
50 |
sort |
query | no | string |
form | false | pattern: ^-?[A-Za-z0-9_]+(,-?[A-Za-z0-9_]+)*$ | Comma-separated sort fields. Prefix with - for descending order. Allowed fields: id, acceptance_date, external_id, created_at, updated_at. Default: -id. The same filter may also be sent as filter[sort] where supported by the Laravel query adapter. |
"-id" |
include |
query | no | string |
form | false | Comma-separated optional relations. Allowed values: offers. The same filter may also be sent as filter[include] where supported by the Laravel query adapter. |
"offers" |
|
id |
query | no | integer:int64 |
form | true | min: 1 | Filter by id using exact matching. The same filter may also be sent as filter[id] where supported by the Laravel query adapter. |
1001 |
external_id |
query | no | string |
form | true | Filter by external_id using exact matching. The same filter may also be sent as filter[external_id] where supported by the Laravel query adapter. |
"EXT-10045" |
|
status_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by status_id using exact matching. The same filter may also be sent as filter[status_id] where supported by the Laravel query adapter. |
1 |
warehouse_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by warehouse_id using exact matching. The same filter may also be sent as filter[warehouse_id] where supported by the Laravel query adapter. |
42 |
shop_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by shop_id using exact matching. The same filter may also be sent as filter[shop_id] where supported by the Laravel query adapter. |
12 |
type_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by type_id using exact matching. The same filter may also be sent as filter[type_id] where supported by the Laravel query adapter. |
1 |
user_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by user_id using exact matching. The same filter may also be sent as filter[user_id] where supported by the Laravel query adapter. |
15 |
document_barcode |
query | no | string |
form | true | Filter by document_barcode using partial text matching. The same filter may also be sent as filter[document_barcode] where supported by the Laravel query adapter. |
"ASN-100245-BARCODE" |
|
comment |
query | no | string |
form | true | Filter by comment using partial text matching. The same filter may also be sent as filter[comment] where supported by the Laravel query adapter. |
"Priority" |
|
acceptance_date_from |
query | no | string:date |
form | true | Lower inclusive date boundary for acceptance_date. The same filter may also be sent as filter[acceptance_date_from] where supported by the Laravel query adapter. |
"2026-07-14" |
|
acceptance_date_to |
query | no | string:date |
form | true | Upper inclusive date boundary for acceptance_date. The same filter may also be sent as filter[acceptance_date_to] where supported by the Laravel query adapter. |
"2026-07-14" |
|
created_at_from |
query | no | string:date |
form | true | Lower inclusive date boundary for created_at. The same filter may also be sent as filter[created_at_from] where supported by the Laravel query adapter. |
"2026-07-14" |
|
created_at_to |
query | no | string:date |
form | true | Upper inclusive date boundary for created_at. The same filter may also be sent as filter[created_at_to] where supported by the Laravel query adapter. |
"2026-07-14" |
|
updated_at_from |
query | no | string:date |
form | true | Lower inclusive date boundary for updated_at. The same filter may also be sent as filter[updated_at_from] where supported by the Laravel query adapter. |
"2026-07-14" |
|
updated_at_to |
query | no | string:date |
form | true | Upper inclusive date boundary for updated_at. The same filter may also be sent as filter[updated_at_to] where supported by the Laravel query adapter. |
"2026-07-14" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | array<Acceptance> |
|
|||
data[] |
no | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].external_id |
no | string | null |
"ASN-100245" |
|||
data[].document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data[].domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data[].status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data[].user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data[].warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data[].shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data[].type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data[].type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data[].comment |
no | string | null |
"Inbound from supplier" |
|||
data[].counts |
yes | AcceptanceCounts |
|
|||
data[].counts.expected |
yes | number:float |
10 |
|||
data[].counts.accepted |
yes | number:float |
0 |
|||
data[].counts.placed |
yes | number:float |
0 |
|||
data[].acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data[].offers |
no | array<AcceptanceLine> |
|
|||
data[].offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data[].offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data[].offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data[].offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data[].offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].offers[].price |
no | number:float | null |
4.99 |
|||
data[].offers[].batch |
no | string | null |
"LOT-2026" |
|||
data[].offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data[].offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data[].offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data[].offers[].product |
no | object | null |
|
|||
data[].offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data[].offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data[].offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data[].offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data[].offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data[].offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data[].offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data[].offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data[].offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data[].crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data[].crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data[].crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data[].crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data[].crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data[].crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
links |
yes | PaginationLinks |
|
|||
links.first |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=1" |
|||
links.last |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
links.prev |
yes | string:uri | null |
|
|||
links.next |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
meta |
yes | PaginationMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.current_page |
yes | integer:int32 |
min: 1 | 1 |
||
meta.from |
yes | integer:int32 | null |
min: 1 | 1 |
||
meta.last_page |
yes | integer:int32 |
min: 1 | 2 |
||
meta.path |
yes | string:uri |
"https://betawms.ffcdek.ru/api/v2/orders" |
|||
meta.per_page |
yes | integer:int32 |
min: 1 | 50 |
||
meta.to |
yes | integer:int32 | null |
min: 1 | 50 |
||
meta.total |
yes | integer:int32 |
min: 0 | 73 |
Response examples
success
{
"data": [
{
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"links": {
"first": "https://betawms.ffcdek.ru/api/v2/acceptances?page=1",
"last": "https://betawms.ffcdek.ru/api/v2/acceptances?page=2",
"prev": null,
"next": "https://betawms.ffcdek.ru/api/v2/acceptances?page=2"
},
"meta": {
"api_version": "v2",
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://betawms.ffcdek.ru/api/v2/acceptances",
"per_page": 50,
"to": 50,
"total": 73
}
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Create standard, return, or cross-dock acceptance
| operationId | createAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Creates one of the three visible acceptance types. type_id=1 creates a standard acceptance, type_id=2 creates a return acceptance, and type_id=3 enters the isolated cross-dock workflow.
For type_id=3, send a transport Idempotency-Key, a UUID data.command_id, at least one line, and the optional data.crossdock schedule fields. The client warehouse and shop are resolved in tenant scope. Before any insert, NWMS checks that cross-docking is enabled on the selected client warehouse. The acceptance, draft case, supplies, command, and initial audit event are committed atomically.
If cross-docking is disabled on the selected client warehouse, the request returns the API v2 validation envelope and leaves no partial acceptance. The response includes type_code=crossdock, crossdock_case, meta.crossdock_configuration, and meta.command_replayed.
The acceptance type is immutable. Continue the process through the Cross-docking operations: create orders/targets, plan, release, execute source and target scans, load, and close.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/acceptances" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
CreateAcceptanceRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | CreateAcceptancePayload |
|
Request examples
standard
{
"data": {
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"external_id": "ASN-100245",
"lines": [
{
"product_id": 1201,
"expected_quantity": 10,
"barcode": "4601234567890"
}
]
}
}
crossDock
{
"data": {
"command_id": "4fe557e8-70f7-4b36-a124-d3afad4041d4",
"warehouse_id": 43,
"shop_id": 12,
"type_id": 3,
"external_id": "ASN-XD-100245",
"acceptance_date": "2026-08-03",
"crossdock": {
"external_id": "XD-2026-001",
"planned_arrival_at": "2026-08-03T08:00:00Z",
"cutoff_at": "2026-08-03T12:00:00Z",
"planned_departure_at": "2026-08-03T14:00:00Z"
},
"lines": [
{
"product_id": 1201,
"expected_quantity": 35,
"external_line_id": "ASN-XD-LINE-1",
"barcode": "4601234567890"
}
]
}
}
Responses
201 Created.
Created.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data.status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data.user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data.warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data.shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data.type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data.type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.counts |
yes | AcceptanceCounts |
|
|||
data.counts.expected |
yes | number:float |
10 |
|||
data.counts.accepted |
yes | number:float |
0 |
|||
data.counts.placed |
yes | number:float |
0 |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.offers |
no | array<AcceptanceLine> |
|
|||
data.offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].price |
no | number:float | null |
4.99 |
|||
data.offers[].batch |
no | string | null |
"LOT-2026" |
|||
data.offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data.offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.offers[].product |
no | object | null |
|
|||
data.offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data.offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data.offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data.crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data.crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data.crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data.crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data.crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data.crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
crossDockCreated
{
"data": {
"id": 5101,
"external_id": "ASN-XD-100245",
"domain_id": 3,
"status_id": 1,
"warehouse_id": 43,
"shop_id": 12,
"type_id": 3,
"type_code": "crossdock",
"counts": {
"expected": 35,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-08-03",
"crossdock_case": {
"id": 1001,
"public_id": "01J2CROSSDOCKCASE000000001",
"status": "draft",
"process_version": "direct_order_v1",
"version": 1
}
},
"meta": {
"api_version": "v2",
"command_replayed": false,
"crossdock_configuration": {
"physical_warehouse_id": 42,
"enabled": true,
"process_version": "direct_order_v1"
}
}
}
400 Bad request
AcceptanceCreateBadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
(root) |
no | ErrorResponse |
Standard and return acceptances retain the existing API v2 error adapter. Cross-dock creation uses the strict validation envelope with meta.error_code and no top-level error field. |
|
||
message |
yes | string |
"Cross-docking is disabled for the selected client warehouse." |
|||
errors |
yes | object |
{"warehouse_id":["Enable cross-docking in the client warehouse settings."]} |
|||
meta |
yes | CrossDockErrorMeta |
API v2 error metadata for the isolated cross-dock command contract. | |
||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.error_code |
yes | string |
"CROSSDOCK_WAREHOUSE_DISABLED" |
|||
meta.correlation_id |
no | string:uuid | null |
"4fe557e8-70f7-4b36-a124-d3afad4041d4" |
|||
meta.details |
no | object |
{"physical_warehouse_id":42,"client_warehouse_id":43,"shop_id":12} |
Response examples
IDEMPOTENCY_KEY_REQUIRED
{
"message": "Bad request.",
"errors": {
},
"meta": {
"api_version": "v2",
"error_code": "IDEMPOTENCY_KEY_REQUIRED",
"correlation_id": "4fe557e8-70f7-4b36-a124-d3afad4041d4",
"details": {
}
}
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
409 Conflict
AcceptanceCreateConflict
The request conflicts with the current resource or command state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
(root) |
no | ErrorResponse |
Standard and return acceptances retain the existing API v2 error adapter. Cross-dock creation uses the strict validation envelope with meta.error_code and no top-level error field. |
|
||
message |
yes | string |
"Cross-docking is disabled for the selected client warehouse." |
|||
errors |
yes | object |
{"warehouse_id":["Enable cross-docking in the client warehouse settings."]} |
|||
meta |
yes | CrossDockErrorMeta |
API v2 error metadata for the isolated cross-dock command contract. | |
||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.error_code |
yes | string |
"CROSSDOCK_WAREHOUSE_DISABLED" |
|||
meta.correlation_id |
no | string:uuid | null |
"4fe557e8-70f7-4b36-a124-d3afad4041d4" |
|||
meta.details |
no | object |
{"physical_warehouse_id":42,"client_warehouse_id":43,"shop_id":12} |
Response examples
CROSSDOCK_COMMAND_CONFLICT
{
"message": "The request conflicts with the current resource or command state.",
"errors": {
},
"meta": {
"api_version": "v2",
"error_code": "CROSSDOCK_COMMAND_CONFLICT",
"correlation_id": "4fe557e8-70f7-4b36-a124-d3afad4041d4",
"details": {
}
}
}
422 Validation error
AcceptanceCreateValidationError
The given data was invalid.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
(root) |
no | ValidationErrorResponse |
Standard and return acceptances retain the existing API v2 error adapter. Cross-dock creation uses the strict validation envelope with meta.error_code and no top-level error field. |
|
||
message |
yes | string |
"Cross-docking is disabled for the selected client warehouse." |
|||
errors |
yes | object |
{"warehouse_id":["Enable cross-docking in the client warehouse settings."]} |
|||
meta |
yes | CrossDockErrorMeta |
API v2 error metadata for the isolated cross-dock command contract. | |
||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.error_code |
yes | string |
"CROSSDOCK_WAREHOUSE_DISABLED" |
|||
meta.correlation_id |
no | string:uuid | null |
"4fe557e8-70f7-4b36-a124-d3afad4041d4" |
|||
meta.details |
no | object |
{"physical_warehouse_id":42,"client_warehouse_id":43,"shop_id":12} |
Response examples
CROSSDOCK_WAREHOUSE_DISABLED
{
"message": "The given data was invalid.",
"errors": {
},
"meta": {
"api_version": "v2",
"error_code": "CROSSDOCK_WAREHOUSE_DISABLED",
"correlation_id": "4fe557e8-70f7-4b36-a124-d3afad4041d4",
"details": {
}
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Get acceptance
| operationId | getAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Returns one acceptance when it exists and is visible to the authenticated account.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/acceptances/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data.status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data.user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data.warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data.shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data.type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data.type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.counts |
yes | AcceptanceCounts |
|
|||
data.counts.expected |
yes | number:float |
10 |
|||
data.counts.accepted |
yes | number:float |
0 |
|||
data.counts.placed |
yes | number:float |
0 |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.offers |
no | array<AcceptanceLine> |
|
|||
data.offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].price |
no | number:float | null |
4.99 |
|||
data.offers[].batch |
no | string | null |
"LOT-2026" |
|||
data.offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data.offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.offers[].product |
no | object | null |
|
|||
data.offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data.offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data.offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data.crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data.crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data.crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data.crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data.crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data.crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Update acceptance
| operationId | replaceAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Updates an editable acceptance header and may upsert or delete lines. Closed or already processed documents reject changes with validation or lifecycle errors.
Current backend behavior is legacy partial-update semantics: omitted fields are left unchanged.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/acceptances/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
ReplaceAcceptanceRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | ReplaceAcceptancePayload |
Legacy PUT payload. Current backend applies partial-update semantics and may upsert or delete lines. | |
||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.allow_add_offers_during_acceptance |
no | boolean |
false |
|||
data.lines |
no | array<AcceptanceLineUpsertPayload> |
|
|||
data.lines[] |
no | AcceptanceLineUpsertPayload |
Acceptance line payload. The product is resolved by product_id or product_external_id. |
|
||
data.lines[] |
no | object |
|
|||
data.lines[] |
no | object |
|
|||
data.lines_delete |
no | array<integer:int64> |
|
|||
data.lines_delete[] |
no | integer:int64 |
min: 1 | 7101 |
Request examples
default
{
"data": {
"comment": "Updated supplier note",
"lines_delete": [
7102
]
}
}
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data.status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data.user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data.warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data.shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data.type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data.type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.counts |
yes | AcceptanceCounts |
|
|||
data.counts.expected |
yes | number:float |
10 |
|||
data.counts.accepted |
yes | number:float |
0 |
|||
data.counts.placed |
yes | number:float |
0 |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.offers |
no | array<AcceptanceLine> |
|
|||
data.offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].price |
no | number:float | null |
4.99 |
|||
data.offers[].batch |
no | string | null |
"LOT-2026" |
|||
data.offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data.offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.offers[].product |
no | object | null |
|
|||
data.offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data.offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data.offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data.crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data.crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data.crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data.crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data.crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data.crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Update acceptance
| operationId | patchAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Partially updates an editable acceptance. Omitted fields are not changed.
Current backend behavior is legacy partial-update semantics: omitted fields are left unchanged.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request PATCH "${NWMS_BASE_URL}/api/v2/acceptances/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
PatchAcceptanceRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | PatchAcceptancePayload |
Partial acceptance update payload. Omitted fields are unchanged. | |
||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.allow_add_offers_during_acceptance |
no | boolean |
false |
|||
data.lines |
no | array<AcceptanceLineUpsertPayload> |
|
|||
data.lines[] |
no | AcceptanceLineUpsertPayload |
Acceptance line payload. The product is resolved by product_id or product_external_id. |
|
||
data.lines[] |
no | object |
|
|||
data.lines[] |
no | object |
|
|||
data.lines_delete |
no | array<integer:int64> |
|
|||
data.lines_delete[] |
no | integer:int64 |
min: 1 | 7101 |
Request examples
default
{
"data": {
"comment": "Updated supplier note"
}
}
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data.status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data.user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data.warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data.shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data.type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data.type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.counts |
yes | AcceptanceCounts |
|
|||
data.counts.expected |
yes | number:float |
10 |
|||
data.counts.accepted |
yes | number:float |
0 |
|||
data.counts.placed |
yes | number:float |
0 |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.offers |
no | array<AcceptanceLine> |
|
|||
data.offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].price |
no | number:float | null |
4.99 |
|||
data.offers[].batch |
no | string | null |
"LOT-2026" |
|||
data.offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data.offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.offers[].product |
no | object | null |
|
|||
data.offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data.offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data.offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data.crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data.crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data.crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data.crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data.crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data.crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Delete acceptance
| operationId | deleteAcceptances |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/acceptances/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | object | null |
|
|||
meta |
yes | object |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
yes | boolean |
true |
|||
meta.id |
yes | integer:int64 |
min: 1 | 1001 |
Response examples
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Cancel acceptance
| operationId | cancelAcceptance |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Cancels a standard or return acceptance in status 1 (new) or 7 (arrived). Cancellation is rejected when stock is already bound to a storage place. Cross-dock acceptances must use POST /api/v2/crossdock/cases/{case}/cancel.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/acceptances/1001/cancel" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | Acceptance |
Inbound receiving document. Relation fields are present when loaded by the controller or requested through include. |
|
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.external_id |
no | string | null |
"ASN-100245" |
|||
data.document_barcode |
no | string | null |
"ASN-100245-BARCODE" |
|||
data.domain_id |
no | integer:int64 | null |
min: 1 | 3 |
||
data.status_id |
no | enum:int64 | null |
enum: 1, 2, 3, 4, 5, 6, 7 | 1 - new; 2 - accepting; 3 - checking; 4 - closed; 5 - deleted; 6 - cancelled; 7 - arrived at warehouse. |
1 |
|
data.user_id |
no | integer:int64 | null |
min: 1 | 9 |
||
data.warehouse_id |
no | integer:int64 | null |
min: 1 | 42 |
||
data.shop_id |
no | integer:int64 | null |
min: 1 | 12 |
||
data.type_id |
no | enum:int64 | null |
enum: 1, 2, 3 | 1 - standard acceptance; 2 - return acceptance; 3 - cross-dock acceptance. The type is immutable after creation. |
1 |
|
data.type_code |
no | enum | null |
enum: acceptance, return, crossdock | "acceptance" |
||
data.comment |
no | string | null |
"Inbound from supplier" |
|||
data.counts |
yes | AcceptanceCounts |
|
|||
data.counts.expected |
yes | number:float |
10 |
|||
data.counts.accepted |
yes | number:float |
0 |
|||
data.counts.placed |
yes | number:float |
0 |
|||
data.acceptance_date |
no | string:date | null |
"2026-07-14" |
|||
data.offers |
no | array<AcceptanceLine> |
|
|||
data.offers[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.offers[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.offers[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.offers[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.offers[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.offers[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.offers[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.offers[].price |
no | number:float | null |
4.99 |
|||
data.offers[].batch |
no | string | null |
"LOT-2026" |
|||
data.offers[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data.offers[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.offers[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.offers[].product |
no | object | null |
|
|||
data.offers[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.offers[].product.name |
yes | string |
"Coffee 250g" |
|||
data.offers[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data.offers[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.offers[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data.offers[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.offers[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.offers[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.offers[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.offers[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
data.crossdock_case |
no | object | null |
Cross-dock case created atomically with an acceptance of type 3. | |
||
data.crossdock_case.id |
yes | integer:int64 |
min: 1 | 1001 |
||
data.crossdock_case.public_id |
yes | string |
"01J2CROSSDOCKCASE000000001" |
|||
data.crossdock_case.status |
yes | enum |
enum: draft, planned, released, in_progress, exception, completed, cancelled | "draft" |
||
data.crossdock_case.process_version |
yes | string |
"direct_order_v1" |
|||
data.crossdock_case.version |
yes | integer:int64 |
min: 1 | 1 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 5101,
"external_id": "ASN-100245",
"document_barcode": "ASN-100245-BARCODE",
"domain_id": 3,
"status_id": 1,
"user_id": 9,
"warehouse_id": 42,
"shop_id": 12,
"type_id": 1,
"comment": "Inbound from supplier",
"counts": {
"expected": 10,
"accepted": 0,
"placed": 0
},
"acceptance_date": "2026-07-14",
"offers": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
List acceptances
| operationId | listAcceptancesLines |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Returns acceptances visible to the authenticated account. Use documented query parameters for filtering, sorting, and pagination.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Unknown read parameters are ignored. per_page is silently capped; use meta.per_page. Date-only boundaries follow the installation's stored calendar dates; ISO timestamps are serialized in UTC. The default general API limit is 600/minute; a user-specific override may apply. Its bucket is shared by authenticated user, not by shop/domain; Retry-After is returned on throttling.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request GET "${NWMS_BASE_URL}/api/v2/acceptances/1001/lines" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
page |
query | no | integer:int64 |
form | true | min: 1 | Page number. The same filter may also be sent as filter[page] where supported by the Laravel query adapter. |
1 |
per_page |
query | no | integer:int64 |
form | true | min: 1 max: 500 |
Number of records per page. Default is 100; maximum is 500. The same filter may also be sent as filter[per_page] where supported by the Laravel query adapter. |
100 |
sort |
query | no | string |
form | false | pattern: ^-?[A-Za-z0-9_]+(,-?[A-Za-z0-9_]+)*$ | Comma-separated sort fields. Prefix with - for descending order. Allowed fields: id, product_id, expected_quantity, price, expiration_date, created_at. Default: -id. The same filter may also be sent as filter[sort] where supported by the Laravel query adapter. |
"-id" |
id |
query | no | integer:int64 |
form | true | min: 1 | Filter by id using exact matching. The same filter may also be sent as filter[id] where supported by the Laravel query adapter. |
1001 |
product_id |
query | no | integer:int64 |
form | true | min: 1 | Filter by product_id using exact matching. The same filter may also be sent as filter[product_id] where supported by the Laravel query adapter. |
1201 |
barcode |
query | no | string |
form | true | Filter by barcode using partial text matching. The same filter may also be sent as filter[barcode] where supported by the Laravel query adapter. |
"4601234567890" |
|
batch |
query | no | string |
form | true | Filter by batch using partial text matching. The same filter may also be sent as filter[batch] where supported by the Laravel query adapter. |
"LOT-2026" |
|
expiration_date_from |
query | no | string:date |
form | true | Lower inclusive date boundary for expiration_date. The same filter may also be sent as filter[expiration_date_from] where supported by the Laravel query adapter. |
"2026-07-14" |
|
expiration_date_to |
query | no | string:date |
form | true | Upper inclusive date boundary for expiration_date. The same filter may also be sent as filter[expiration_date_to] where supported by the Laravel query adapter. |
"2026-07-14" |
|
created_at_from |
query | no | string:date |
form | true | Lower inclusive date boundary for created_at. The same filter may also be sent as filter[created_at_from] where supported by the Laravel query adapter. |
"2026-07-14" |
|
created_at_to |
query | no | string:date |
form | true | Upper inclusive date boundary for created_at. The same filter may also be sent as filter[created_at_to] where supported by the Laravel query adapter. |
"2026-07-14" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | array<AcceptanceLine> |
|
|||
data[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].price |
no | number:float | null |
4.99 |
|||
data[].batch |
no | string | null |
"LOT-2026" |
|||
data[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data[].product |
no | object | null |
|
|||
data[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].product.name |
yes | string |
"Coffee 250g" |
|||
data[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
links |
yes | PaginationLinks |
|
|||
links.first |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=1" |
|||
links.last |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
links.prev |
yes | string:uri | null |
|
|||
links.next |
yes | string:uri | null |
"https://betawms.ffcdek.ru/api/v2/orders?page=2" |
|||
meta |
yes | PaginationMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.current_page |
yes | integer:int32 |
min: 1 | 1 |
||
meta.from |
yes | integer:int32 | null |
min: 1 | 1 |
||
meta.last_page |
yes | integer:int32 |
min: 1 | 2 |
||
meta.path |
yes | string:uri |
"https://betawms.ffcdek.ru/api/v2/orders" |
|||
meta.per_page |
yes | integer:int32 |
min: 1 | 50 |
||
meta.to |
yes | integer:int32 | null |
min: 1 | 50 |
||
meta.total |
yes | integer:int32 |
min: 0 | 73 |
Response examples
success
{
"data": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"links": {
"first": "https://betawms.ffcdek.ru/api/v2/acceptances/5101/lines?page=1",
"last": "https://betawms.ffcdek.ru/api/v2/acceptances/5101/lines?page=2",
"prev": null,
"next": "https://betawms.ffcdek.ru/api/v2/acceptances/5101/lines?page=2"
},
"meta": {
"api_version": "v2",
"current_page": 1,
"from": 1,
"last_page": 2,
"path": "https://betawms.ffcdek.ru/api/v2/acceptances/5101/lines",
"per_page": 100,
"to": 100,
"total": 123
}
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Create acceptance
| operationId | createAcceptancesLines |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Create acceptance. The request uses the documented payload schema, validates tenant visibility, and returns a normalized API envelope.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/acceptances/1001/lines" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
AddAcceptanceLinesRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | object |
|
|||
data.lines |
yes | array<AcceptanceLineCreatePayload> |
minItems: 1 | |
||
data.lines[] |
no | AcceptanceLineCreatePayload |
Acceptance line payload. The product is resolved by product_id or product_external_id. |
|
||
data.lines[] |
no | object |
|
|||
data.lines[] |
no | object |
|
Request examples
default
{
"data": {
"lines": [
{
"product_external_id": "EXT-10045",
"expected_quantity": 10
}
]
}
}
Responses
201 Created.
Created.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | array<AcceptanceLine> |
|
|||
data[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].price |
no | number:float | null |
4.99 |
|||
data[].batch |
no | string | null |
"LOT-2026" |
|||
data[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data[].product |
no | object | null |
|
|||
data[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].product.name |
yes | string |
"Coffee 250g" |
|||
data[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Update acceptance
| operationId | replaceAcceptancesLines |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Update acceptance. The request uses the documented payload schema, validates tenant visibility, and returns a normalized API envelope.
Current backend behavior is legacy partial-update semantics: omitted fields are left unchanged.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/acceptances/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
lineId |
path | yes | integer:int64 |
min: 1 | Document line ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
ReplaceAcceptanceLineRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLineReplacePayload |
Legacy PUT line update payload. Current backend treats PUT as partial update. | |
||
data.expected_quantity |
no | number:float | null |
min: 0 | 10 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
Request examples
default
{
"data": {
"expected_quantity": 12,
"batch": "LOT-2026"
}
}
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.product |
no | object | null |
|
|||
data.product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
yes | string |
"Coffee 250g" |
|||
data.product.external_id |
no | string | null |
"EXT-10045" |
|||
data.accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.accepted_lots[] |
no | AcceptanceLot |
|
|||
data.accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Update acceptance
| operationId | patchAcceptancesLines |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Update acceptance. The request uses the documented payload schema, validates tenant visibility, and returns a normalized API envelope.
Current backend behavior is legacy partial-update semantics: omitted fields are left unchanged.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request PATCH "${NWMS_BASE_URL}/api/v2/acceptances/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
lineId |
path | yes | integer:int64 |
min: 1 | Document line ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
PatchAcceptanceLineRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLinePatchPayload |
Editable acceptance line fields. The line ID is taken from the path and must not be repeated in the body. | |
||
data.expected_quantity |
no | number:float | null |
min: 0 | 10 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
Request examples
default
{
"data": {
"expected_quantity": 12
}
}
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.product |
no | object | null |
|
|||
data.product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
yes | string |
"Coffee 250g" |
|||
data.product.external_id |
no | string | null |
"EXT-10045" |
|||
data.accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.accepted_lots[] |
no | AcceptanceLot |
|
|||
data.accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Delete acceptance
| operationId | deleteAcceptancesLines |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/acceptances/1001/lines/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
lineId |
path | yes | integer:int64 |
min: 1 | Document line ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | object | null |
|
|||
meta |
yes | object |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
yes | boolean |
true |
|||
meta.id |
yes | integer:int64 |
min: 1 | 1001 |
Response examples
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Create acceptance
| operationId | createAcceptancesOffers |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Create acceptance. The request uses the documented payload schema, validates tenant visibility, and returns a normalized API envelope.
This /offers route is a compatibility alias for /lines; use the /lines route in new integrations.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request POST "${NWMS_BASE_URL}/api/v2/acceptances/1001/offers" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
AddAcceptanceLinesRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | object |
|
|||
data.lines |
yes | array<AcceptanceLineCreatePayload> |
minItems: 1 | |
||
data.lines[] |
no | AcceptanceLineCreatePayload |
Acceptance line payload. The product is resolved by product_id or product_external_id. |
|
||
data.lines[] |
no | object |
|
|||
data.lines[] |
no | object |
|
Request examples
default
{
"data": {
"lines": [
{
"product_external_id": "EXT-10045",
"expected_quantity": 10
}
]
}
}
Responses
201 Created.
Created.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | array<AcceptanceLine> |
|
|||
data[] |
no | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data[].id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data[].created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data[].acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data[].product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data[].expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data[].accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data[].price |
no | number:float | null |
4.99 |
|||
data[].batch |
no | string | null |
"LOT-2026" |
|||
data[].production_date |
no | string:date | null |
"2026-01-15" |
|||
data[].expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data[].barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data[].product |
no | object | null |
|
|||
data[].product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data[].product.name |
yes | string |
"Coffee 250g" |
|||
data[].product.external_id |
no | string | null |
"EXT-10045" |
|||
data[].accepted_lots |
no | array<AcceptanceLot> |
|
|||
data[].accepted_lots[] |
no | AcceptanceLot |
|
|||
data[].accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data[].accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data[].accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data[].accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data[].accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": [
{
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
}
],
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Update acceptance
| operationId | replaceAcceptancesOffers |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Update acceptance. The request uses the documented payload schema, validates tenant visibility, and returns a normalized API envelope.
This /offers route is a compatibility alias for /lines; use the /lines route in new integrations.
Current backend behavior is legacy partial-update semantics: omitted fields are left unchanged.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
Response quantities are computed from active acceptance lines and warehouse facts, including pre-existing documents. Accepted and placed quantities differ until put-away. accepted_lots describes actual batches; top-level line lot fields remain the declared document data.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request PUT "${NWMS_BASE_URL}/api/v2/acceptances/1001/offers/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}" \
--header "Content-Type: application/json" \
--data-binary @request.jsonParameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
lineId |
path | yes | integer:int64 |
min: 1 | Document line ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
ReplaceAcceptanceLineRequest required
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLineReplacePayload |
Legacy PUT line update payload. Current backend treats PUT as partial update. | |
||
data.expected_quantity |
no | number:float | null |
min: 0 | 10 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
Request examples
default
{
"data": {
"expected_quantity": 12,
"batch": "LOT-2026"
}
}
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | AcceptanceLine |
Declared acceptance line plus live accepted/placed quantities and actual lot allocations. Placement requires a positive storage-place ID. Deleted warehouse rows are excluded. | |
||
data.id |
yes | integer:int64 |
readOnly | min: 1 | 1001 |
|
data.created_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.updated_at |
no | string:date-time | null |
"2026-07-14T10:30:00Z" |
|||
data.acceptance_id |
yes | integer:int64 |
min: 1 | 5101 |
||
data.product_id |
yes | integer:int64 |
min: 1 | 1201 |
||
data.expected_quantity |
yes | number:float |
min: 0 | 10 |
||
data.accepted_quantity |
yes | number:float |
min: 0 | 0 |
||
data.placed_quantity |
yes | number:float |
min: 0 | 0 |
||
data.price |
no | number:float | null |
4.99 |
|||
data.batch |
no | string | null |
"LOT-2026" |
|||
data.production_date |
no | string:date | null |
"2026-01-15" |
|||
data.expiration_date |
no | string:date | null |
"2027-01-15" |
|||
data.barcode |
no | string | null |
maxLength: 64 | "4601234567890" |
||
data.product |
no | object | null |
|
|||
data.product.id |
yes | integer:int64 |
readOnly | min: 1 | 1201 |
|
data.product.name |
yes | string |
"Coffee 250g" |
|||
data.product.external_id |
no | string | null |
"EXT-10045" |
|||
data.accepted_lots |
no | array<AcceptanceLot> |
|
|||
data.accepted_lots[] |
no | AcceptanceLot |
|
|||
data.accepted_lots[].batch |
yes | string | null |
"LOT-2026" |
|||
data.accepted_lots[].production_date |
yes | string:date | null |
"2026-01-15" |
|||
data.accepted_lots[].expiration_date |
yes | string:date | null |
"2027-01-15" |
|||
data.accepted_lots[].accepted_quantity |
yes | number:float |
min: 0 | 5 |
||
data.accepted_lots[].placed_quantity |
yes | number:float |
min: 0 | 3 |
||
meta |
yes | ResponseMeta |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
no | boolean |
true |
|||
meta.id |
no | integer:int64 | null |
min: 1 | 1001 |
||
meta.command_replayed |
no | boolean |
True when an idempotent cross-dock command returned the original successful result. | false |
||
meta.crossdock_configuration |
no | object | null |
|
|||
meta.crossdock_configuration.physical_warehouse_id |
yes | integer:int64 |
min: 1 | 42 |
||
meta.crossdock_configuration.enabled |
yes | boolean |
true |
|||
meta.crossdock_configuration.process_version |
yes | string |
"direct_order_v1" |
Response examples
success
{
"data": {
"id": 7101,
"acceptance_id": 5101,
"product_id": 1201,
"expected_quantity": 10,
"accepted_quantity": 0,
"placed_quantity": 0,
"price": 4.99,
"batch": "LOT-2026",
"production_date": "2026-01-15",
"expiration_date": "2027-01-15",
"barcode": "4601234567890",
"product": {
"id": 1201,
"name": "Coffee 250g",
"external_id": "EXT-10045"
},
"created_at": "2026-07-14T09:00:00Z",
"updated_at": "2026-07-14T09:30:00Z"
},
"meta": {
"api_version": "v2"
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}
Delete acceptance
| operationId | deleteAcceptancesOffers |
|---|---|
| Tag | Acceptances |
| Security | bearerAuth |
Deletes the resource when the authenticated account has permission and the current lifecycle state allows deletion. If deletion is blocked by related records or document state, the API returns a validation error.
This /offers route is a compatibility alias for /lines; use the /lines route in new integrations.
HTTP request example (cURL)
Set your server and token. Replace sample IDs with accessible IDs. For requests with a body, save the applicable JSON example below as request.json and replace sample values before sending. Idempotency-Key identifies one logical operation.
curl --globoff --request DELETE "${NWMS_BASE_URL}/api/v2/acceptances/1001/offers/1001" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${NWMS_TOKEN}" \
--header "Idempotency-Key: ${NWMS_REQUEST_KEY}"Parameters
| Name | In | Required | Type | Style | Explode | Constraints | Description | Example |
|---|---|---|---|---|---|---|---|---|
id |
path | yes | integer:int64 |
min: 1 | Acceptance ID. | 1001 |
||
lineId |
path | yes | integer:int64 |
min: 1 | Document line ID. | 1001 |
||
Idempotency-Key |
header | no | string |
maxLength: 191 | Optional idempotency key for API v2 write requests. Successful 2xx/3xx responses are replayed for the same key and identical payload for one day. The same key with a different payload returns 409. |
"ord-create-20260714-001" |
Request body
No request body.
Responses
200 Successful response.
Successful response.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
data |
yes | object | null |
|
|||
meta |
yes | object |
|
|||
meta.api_version |
yes | enum |
enum: v2 | "v2" |
||
meta.deleted |
yes | boolean |
true |
|||
meta.id |
yes | integer:int64 |
min: 1 | 1001 |
Response examples
success
{
"data": null,
"meta": {
"api_version": "v2",
"deleted": true,
"id": 1001
}
}
400 Bad request
BadRequest
Bad request.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
BAD_REQUEST
{
"message": "Bad request.",
"error": "BAD_REQUEST"
}
401 Authentication required
Unauthorized
Authentication is required.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
AUTH_REQUIRED
{
"message": "Authentication is required.",
"error": "AUTH_REQUIRED"
}
403 Forbidden
Forbidden
The authenticated account is not allowed to perform this action.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
FORBIDDEN
{
"message": "The authenticated account is not allowed to perform this action.",
"error": "FORBIDDEN"
}
404 Not found
NotFound
The requested resource was not found or is outside the authenticated account scope.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
NOT_FOUND
{
"message": "The requested resource was not found or is outside the authenticated account scope.",
"error": "NOT_FOUND"
}
409 Conflict
Conflict
The request conflicts with the current resource state or idempotency key state.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
idempotencyConflict
{
"message": "The idempotency key is already used with a different payload.",
"error": "IDEMPOTENCY_KEY_CONFLICT"
}
422 Validation error
ValidationError
Validation failed.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The given data was invalid." |
|||
error |
no | string |
"VALIDATION_ERROR" |
|||
errors |
yes | object |
{"warehouse_id":["The selected warehouse is invalid."]} |
Response examples
validationError
{
"message": "The given data was invalid.",
"error": "VALIDATION_ERROR",
"errors": {
"warehouse_id": [
"The selected warehouse is invalid."
]
}
}
429 Rate limit exceeded
TooManyRequests
Rate limit exceeded.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"Too Many Attempts." |
|||
error |
yes | string |
"RATE_LIMITED" |
500 Internal server error
InternalServerError
An unexpected server error occurred.
| Field | Required | Type | Flags | Constraints | Description | Example |
|---|---|---|---|---|---|---|
message |
yes | string |
"The request could not be processed." |
|||
error |
yes | string |
"BAD_REQUEST" |
Response examples
INTERNAL_SERVER_ERROR
{
"message": "An unexpected server error occurred.",
"error": "INTERNAL_SERVER_ERROR"
}