PrepWorx API Documentation

Client integration guide · Updated October 27, 2026

The PrepWorx API lets you read your inventory and shipments, create, update and cancel inbound shipments, and create, update, track and cancel FBA outbound shipments. This page covers every available endpoint, authentication, warehouses, rate limits and errors.

Authentication

All API requests require an API key. Send it in the x-api-key header on every request:

HeaderValue
x-api-keyYour API key (e.g. pw_aa4_abc123...)

Contact PrepWorx to turn on API access for your account. Your API key then appears in the PrepWorx portal under Settings → Integrations, where you can also regenerate or revoke it. Keep it confidential: anyone with the key can act on your account. Use it only from your own server, never in a web page or app your customers can see.

Base URL

https://us-central1-prepworx-app.cloudfunctions.net

GET endpoints take query parameters. POST endpoints take a JSON body with Content-Type: application/json. Times are ISO 8601 in UTC.

curl -H "x-api-key: YOUR_KEY" \
  "https://us-central1-prepworx-app.cloudfunctions.net/v1ListOutbounds?status=pending"

Rate limits

Limits apply per account and per endpoint, counted over a rolling hour. Over the limit, the API returns 429 Too Many Requests.

EndpointLimit
Read (GET) endpoints300 requests per hour
v1GetOutbound600 requests per hour
createInboundShipment100 requests per hour
v1UpdateInbound100 requests per hour
v1CancelInbound100 requests per hour
v1CreateFbaOutbound30 requests per hour
v1UpdateOutbound30 requests per hour
v1CancelOutbound60 requests per hour

Warehouses

PrepWorx has two warehouses. Every inventory record, inbound and outbound belongs to one of them, identified by location:

locationWarehouse
1Independence, Oregon
2Salem, Oregon
  • Your home warehouse is set on your account by PrepWorx. If you use one warehouse, you never need to send location: everything goes to and ships from your home warehouse.
  • More than one warehouse: PrepWorx turns on each extra warehouse for your account. Then send location on createInboundShipment (where you're shipping to) and on v1CreateFbaOutbound (where it ships from). Only the stock at that warehouse counts toward an outbound.
  • Leaving location out always means your home warehouse.
  • A warehouse you don't use is refused with 400 and code UNKNOWN_LOCATION. The message lists the warehouses you can use.
  • Every record you read includes location (the number) and warehouse (its name). Records saved before warehouses were added report your home warehouse.
  • List endpoints accept ?location=1 or ?location=2 to return one warehouse only.
  • The warehouse can't be changed on an existing inbound or outbound. Cancel it and create a new one instead.

Inventory

GET /getInventory

Returns all inventory items on your account. Optional ?location=1 or 2.

{
  "success": true,
  "count": 42,
  "data": [
    { "id": "abc123", "asin": "B08N5WRWNW", "name": "Product Name",
      "quantity": 100, "quantity_pending": 12, "total_on_hand": 112,
      "location": 1, "warehouse": "Independence", "owner": "AA4" }
  ]
}
FieldDescription
quantityUnits available to send
quantity_pendingUnits reserved by open outbound shipments (still in the warehouse)
total_on_handquantity + quantity_pending: every unit physically at that warehouse
location, warehouseWhich warehouse the stock is at

Stock is kept per warehouse. If you use both, an ASIN stocked at both appears twice, once per warehouse; add them up for your total.

Inbound shipments

Inbound shipments are shipments you send to PrepWorx.

List inbound shipments

GET /getInboundShipments

ParameterRequiredDescription
statusOptionalFilter by status (pending, processing, completed)
locationOptional1 or 2: one warehouse only

Get one inbound shipment

GET /getInboundShipment?id=<shipment id>

Each item includes units (expected) and units_received (counted so far by PrepWorx), so you can follow partial receiving. units minus units_received is what is still to arrive. The shipment includes location and warehouse.

Create an inbound shipment

POST /createInboundShipment

{
  "reference": "PO-12345",
  "origin": "Supplier Name",
  "arrival": "2026-02-01",
  "packages": 5,
  "location": 2,
  "shipment_notes": "Handle with care",
  "tracking_numbers": ["1Z999AA10123456784"],
  "items": [
    { "name": "Product Name", "asin": "B08N5WRWNW", "upc": "012345678901",
      "units": 100, "purchase_price": 12.99, "notes": "Fragile" }
  ]
}
FieldRequiredDescription
referenceYesYour internal reference (e.g. PO number)
originYesWhere the shipment is coming from
arrivalYesExpected arrival date (YYYY-MM-DD)
packagesYesNumber of packages/boxes, at least 1
itemsYesUp to 500 items: name, asin and units required; upc, purchase_price, notes optional
locationOptionalWarehouse you're shipping to: 1 or 2. Left out = your home warehouse
tracking_numbersOptionalList of carrier tracking numbers
shipment_notesOptionalNotes for the warehouse

If an item's upc is blank, PrepWorx fills it in automatically where it can. Returns status 201; keep the id to look the shipment up later.

{ "success": true, "message": "Inbound shipment created",
  "id": "Xy12AbC3dE4fGh5IjK6l", "shipment_id": "Xy12AbC3dE4fGh5IjK6l" }

Update an inbound shipment

POST /v1UpdateInbound

Changes an inbound shipment before PrepWorx starts receiving it. Send the id plus only the fields you want to change; anything you leave out stays as it is.

{
  "id": "Xy12AbC3dE4fGh5IjK6l",
  "packages": 6,
  "tracking_numbers": ["1Z999AA10123456784", "1Z999AA10123456785"],
  "items": [
    { "name": "Product Name", "asin": "B08N5WRWNW", "units": 120 },
    { "name": "Second Product", "asin": "B07XJ8C8F5", "units": 24 }
  ]
}
FieldRequiredDescription
idYesThe inbound shipment ID
referenceOptionalYour internal reference
originOptionalWhere the shipment is coming from
arrivalOptionalExpected arrival date (YYYY-MM-DD)
packagesOptionalNumber of packages/boxes, at least 1
shipment_notesOptionalNotes, up to 1,000 characters
tracking_numbersOptionalThe full list of tracking numbers (replaces the old list)
itemsOptionalThe FULL new item list, same format as create. Include every item you are still sending; an item left out is removed. Each ASIN once.

Works only while the shipment's status is draft or pending and no units have been received. After that the API returns 409 and changes go through PrepWorx. Status, received counts and the warehouse can't be changed through the API. Returns the updated shipment in data.

Cancel an inbound shipment

POST /v1CancelInbound

Cancels an inbound shipment PrepWorx hasn't started receiving (status draft or pending, no units received). The shipment is removed. After receiving starts, the API returns 409; contact PrepWorx instead.

Request:  { "id": "Xy12AbC3dE4fGh5IjK6l" }
Response: { "success": true, "id": "Xy12AbC3dE4fGh5IjK6l", "cancelled": true }

The outbound object

The v1 outbound endpoints create FBA outbounds, change or cancel them before the warehouse starts work, and follow them through to shipment. All of them return outbounds in this shape. Fields with no value yet are null.

FieldTypeDescription
idstringPrepWorx outbound ID
referencestringYour reference
workflowstringWorkflow name shown in the PrepWorx portal
statusstringSee Statuses below
typestringfba, fbm or standard
locationnumberWarehouse it ships from: 1 or 2
warehousestringIndependence or Salem
cancellablebooleantrue while the warehouse hasn't started, so cancel and update will succeed
items[].mskustringYour seller SKU
items[].asinstringASIN
items[].fnskustringFNSKU
items[].namestringProduct name
items[].units_requestednumberUnits on the outbound
items[].units_sentnumberUnits shipped and billed
amazon.inbound_plan_idstringAmazon inbound plan ID (wf…). amazon is null for non-FBA outbounds
amazon.shipments[]listOne entry per Amazon shipment, filled in once Amazon assigns destinations
.amazon_shipment_idstringShipment ID as Seller Central shows it (FBA15…)
.amazon_internal_shipment_idstringAmazon's API shipment ID (sh…)
.destination_fulfillment_centerstringAmazon warehouse code, e.g. SMF3
.box_countnumberBoxes in that shipment
.carrierstringCarrier name
.amazon_partnered_carrierbooleantrue for Amazon's partnered carrier
.tracking_numberslistTracking numbers
timestamps.created_atstringCreated
timestamps.updated_atstringLast changed
timestamps.processing_atstringPacking finished, moved to shipping
timestamps.shipped_atstringLeft the warehouse
timestamps.finalized_atstringShipped and billed

Statuses

StatusMeaning
pendingWaiting for, or in, picking and packing
processingPacked; Amazon placement, carrier and labels in progress
finalShipped and billed
holdPaused by PrepWorx; we'll contact you
voidCancelled by PrepWorx

For receiving progress at Amazon (units checked in, discrepancies), use the amazon_shipment_id in Seller Central or with Amazon's Selling Partner API.

Outbound shipments (v1)

List outbound shipments

GET /v1ListOutbounds

Returns your outbound shipments, newest first.

ParameterRequiredDescription
statusOptionalOnly this status, e.g. pending
locationOptional1 or 2: one warehouse only
updated_sinceOptionalOnly outbounds changed at or after this time, e.g. 2026-10-01T00:00:00Z
limitOptionalHow many to return: default 100, maximum 500
{
  "success": true,
  "count": 1,
  "total": 1,
  "data": [ { "id": "lT5CoV3gB07nqp7ONTbM", "reference": "PO-2001", "status": "pending",
              "location": 1, "warehouse": "Independence", ... } ]
}

count is how many are in data; total is how many matched before limit.

Get one outbound shipment

GET /v1GetOutbound?id=<outbound id>

Returns one outbound shipment. An ID that doesn't exist, or isn't yours, returns 404.

{
  "success": true,
  "data": {
    "id": "lT5CoV3gB07nqp7ONTbM",
    "reference": "PO-2001",
    "workflow": "PO-2001",
    "status": "processing",
    "type": "fba",
    "location": 1,
    "warehouse": "Independence",
    "cancellable": false,
    "items": [
      { "msku": "1066366763", "asin": "B083RTRBZ6", "fnsku": "X004DG3LS1",
        "name": "On Women's Cloud X Sneakers", "units_requested": 12, "units_sent": 0 }
    ],
    "amazon": {
      "inbound_plan_id": "wf52047ba8-4a53-4c9e-a7b6-91e34fafbd62",
      "shipments": [
        { "amazon_shipment_id": "FBA15XXXXXXX", "amazon_internal_shipment_id": "sh8f2c...",
          "destination_fulfillment_center": "SMF3", "box_count": 2, "carrier": "UPS",
          "amazon_partnered_carrier": true, "tracking_numbers": ["1Z999AA10123456784"] }
      ]
    },
    "timestamps": {
      "created_at": "2026-10-06T21:07:13.614Z", "updated_at": "2026-10-07T18:02:40.100Z",
      "processing_at": "2026-10-07T17:55:12.000Z", "shipped_at": null, "finalized_at": null
    }
  }
}

Create an FBA outbound shipment

POST /v1CreateFbaOutbound

Creates an FBA outbound at PrepWorx and its inbound plan in your Seller Central, in one call. The SKUs must already exist as FBA listings in your Seller Central; create new listings in the PrepWorx portal or Seller Central first. Stock is reserved for the outbound as soon as it's created.

{
  "reference": "PO-2001",
  "location": 1,
  "items": [
    { "msku": "1066366763", "quantity": 12 },
    { "msku": "SKU-ABC", "quantity": 4, "expiration": "2027-06-30" }
  ]
}
FieldRequiredDescription
referenceYesYour reference, up to 100 characters. Also used as the Amazon plan name
items[].mskuYesYour seller SKU, exactly as in Seller Central. Each SKU once per request; up to 200 SKUs
items[].quantityYesWhole number, at least 1
items[].expirationOptionalYYYY-MM-DD, at least 120 days out. If Amazon requires a date for a product and you don't send one, PrepWorx uses a date two years out
locationOptionalWarehouse it ships from: 1 or 2. Left out = your home warehouse

PrepWorx checks these in order. The first problem stops the request, and nothing is created at Amazon:

  1. The request is complete and valid, including location if sent.
  2. You have no other open outbound with the same reference. This makes a retry after a timeout safe.
  3. Each SKU exists in your Seller Central and has an FNSKU.
  4. You have enough available stock at the warehouse it ships from. SKUs that share an ASIN draw from the same stock.
  5. Ship-from is set to that PrepWorx warehouse's address automatically.
  6. The Amazon inbound plan is created. Prep and labeling settings are worked out with Amazon automatically.

Timing. Amazon takes 30 seconds to a few minutes to build a plan; keep the request open for up to 9 minutes. If your connection drops, retry with the same reference: if the first request went through, you receive DUPLICATE_REFERENCE with its existing_id instead of a second plan.

Returns status 201. data is a list: when Amazon requires some items to ship separately (often hazmat), split is true and data holds one outbound per group.

{
  "success": true,
  "split": false,
  "message": "FBA outbound created.",
  "data": [ { "id": "lT5CoV3gB07nqp7ONTbM", "reference": "PO-2001", "status": "pending",
              "location": 1, "warehouse": "Independence", "cancellable": true,
              "amazon": { "inbound_plan_id": "wf52047ba8-...", "shipments": [] }, ... } ]
}

Update an FBA outbound shipment

POST /v1UpdateOutbound

Changes the items on an FBA outbound the warehouse hasn't started: add SKUs, change quantities or remove SKUs. PrepWorx then builds a new Amazon inbound plan with the new items, automatically. items is the FULL new list, in the same format as create: to add a SKU, send the current lines plus the new one; to change a quantity, send that line with the new quantity; leave a line out to remove it.

{
  "id": "lT5CoV3gB07nqp7ONTbM",
  "items": [
    { "msku": "1066366763", "quantity": 15 },
    { "msku": "SKU-ABC", "quantity": 4, "expiration": "2027-06-30" },
    { "msku": "SKU-NEW", "quantity": 6 }
  ]
}
FieldRequiredDescription
idYesThe outbound ID
items[].mskuYesYour seller SKU, exactly as in Seller Central. Each SKU once; up to 200 SKUs. Each product (ASIN) may appear on one line only
items[].quantityYesWhole number, at least 1
items[].expirationOptionalYYYY-MM-DD, at least 120 days out. If Amazon requires a date and you don't send one, PrepWorx uses a date two years out
  1. Works only while cancellable is true (nothing picked, packed, shipped or billed). After that the API returns 409; contact PrepWorx.
  2. Each SKU must exist in your Seller Central and have an FNSKU, the same check as create.
  3. Only the extra units need to be available, at the outbound's warehouse: units already on this outbound are already reserved. Added units are reserved, and removed units go back to available, automatically.
  4. If PrepWorx is building this outbound's Amazon plan at that moment, the API returns 409 with AMAZON_BUSY; try again in 2 minutes.
  5. The warehouse can't be changed. To ship from the other warehouse, cancel and create a new outbound.

Returns status 200. The new Amazon plan takes about 2 minutes. Until then amazon is null; call v1GetOutbound afterwards to get the new inbound_plan_id. The previous plan stays unused in your Send to Amazon list. If the items you send match what is already on the outbound, nothing changes and changed is false.

{
  "success": true,
  "changed": true,
  "message": "Outbound updated. A new Amazon plan is being built ...",
  "amazon_status": "queued",
  "data": { "id": "lT5CoV3gB07nqp7ONTbM", "status": "pending", "amazon": null, ... }
}

Cancel an outbound shipment

POST /v1CancelOutbound

Cancels an outbound the warehouse hasn't started. Its reserved stock goes back to available immediately. It works only while cancellable is true: status pending, nothing picked, no packing or shipping started, nothing billed. After that, contact PrepWorx.

Request:  { "id": "lT5CoV3gB07nqp7ONTbM" }
Response: { "success": true, "id": "lT5CoV3gB07nqp7ONTbM", "cancelled": true }

The Amazon inbound plan isn't cancelled; it stays unused in your Send to Amazon list, and you can cancel it in Seller Central. To change the items instead of cancelling, use v1UpdateOutbound.

Older outbound endpoints

GET /getOutboundShipments (optional status, location) and GET /getOutboundShipment?id= still work for existing integrations, and include location and warehouse. For new integrations use v1ListOutbounds and v1GetOutbound: they return the stable, documented fields above, including Amazon shipment IDs and tracking.

Checking for updates

There are no webhooks. Call v1ListOutbounds?updated_since=<time of your last check> every few minutes; one call returns every outbound that changed.

Errors

Errors include an error message written for people. v1 endpoints and warehouse checks also include a code your integration can act on.

StatusMeaning
400 Bad RequestMissing or invalid parameters
401 UnauthorizedInvalid or missing API key
403 ForbiddenYou do not have access to this resource
404 Not FoundResource not found
405 Method Not AllowedWrong method (GET instead of POST, or the reverse)
409 ConflictDuplicate reference, not enough stock, or a shipment that can no longer be changed or cancelled
422 UnprocessableA SKU isn't in your Seller Central or has no FNSKU yet
429 Too Many RequestsRate limit exceeded
500 Server ErrorInternal server error; contact support
CodeStatusMeaning
UNKNOWN_LOCATION400location isn't one of your warehouses; the message lists the ones you can use
AMAZON_NOT_CONNECTED400Your Amazon account isn't connected to PrepWorx
LOCATION_NOT_CONFIGURED400Your PrepWorx warehouse isn't set; contact PrepWorx
PREP_DETAILS_FAILED, PLAN_FAILED400Amazon refused the plan; error gives Amazon's reason, suggestions may follow
AMAZON_REAUTH_REQUIRED401Amazon no longer accepts our authorization; reconnect in Settings → Integrations
DUPLICATE_REFERENCE409An open outbound already uses this reference; existing_id is its ID
INSUFFICIENT_STOCK409Not enough stock at that warehouse; shortfalls lists msku, asin, requested (extra_requested for v1UpdateOutbound) and available
SKU_NOT_READY422not_found lists SKUs missing from your Seller Central; no_fnsku lists SKUs without an FNSKU
DUPLICATE_ASIN400 / 409v1UpdateOutbound: the same product (ASIN) is on two lines. Put it on one line
AMAZON_BUSY409v1UpdateOutbound: the Amazon plan is being built right now. Try again in 2 minutes
CHANGED409v1UpdateOutbound: the outbound changed while your request was running. Fetch it and resend

Changelog

DateChange
Oct 22, 2026Multiple warehouses: optional location on createInboundShipment and v1CreateFbaOutbound; location and warehouse on every record you read; ?location= filter on list endpoints and getInventory; new error UNKNOWN_LOCATION. Integrations that don't send location work exactly as before.
Oct 8, 2026Added v1UpdateInbound, v1CancelInbound and v1UpdateOutbound
Oct 6, 2026Added v1ListOutbounds, v1GetOutbound, v1CancelOutbound and v1CreateFbaOutbound

Support

For API support, contact us at [email protected] or through Discord.