API reference

Fleetfully Staging API · v2

Create orders, read their tracking and status history, and hear about them by webhook. Live keys (`ffk_live_…`) act on live data; test keys (`ffk_test_…`) act only in your sandbox, where simulated drivers work each order so webhooks fire. Rate limits per key: 600 requests per 60 s live, 120 in the sandbox; batches also count their lines (50000 an hour live, 1000 in the sandbox). Shippers: a shipper key (`ffs_live_…` / `ffs_test_…`) reads the /shipper routes only — your shipments across your carriers and your status feeds, read-only — with the same rate limits. Fields are added within v2, never renamed or removed.

Base path /api/ext/v2 · revision 2026-12-15 · OpenAPI 3.1 document

Account

GET/mescope orders:read

The calling key: mode, scopes, carrier and customer

  • 200 OK → Me
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/postman.json

A Postman collection of this API, generated from this document

Orders

GET/ordersscope orders:read

List orders, newest first

Page with `cursor` until `nextCursor` is null. For an incremental sync, keep the newest `updatedAt` you have seen and ask for `updatedSince` it.

statusquery
createdSincequeryOrders created at or after
updatedSincequeryOrders changed at or after (incremental sync)
customerIdqueryOne customer's orders (carrier-level keys)
cursorqueryThe previous page's nextCursor
limitqueryPage size, 1–200 (default 50)
  • 200 OK → OrderList
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
POST/ordersscope orders:write· Idempotency-Key required

Create an order

The order goes through the carrier's intake checks. **201**: the order exists with its tracking number (status PENDING_REVIEW until the carrier accepts it — `order.approved` follows). `submission.status` is `processing` while the order is placed in the background (address pins, price, the carrier's auto-dispatch — usually a second or two), then `accepted`; GET /submissions/{id} or GET /orders/{trackingNumber} show it placed. **202**: it needs a dispatcher: it waits in the carrier's review queue and `submission.issues` says why; poll GET /submissions/{id} or listen for `order.created`. **200**: this order was submitted before (same `externalRef` and details) — its current state, nothing new is made. Sending an `externalRef` again with different details puts the new version in review. A body that doesn't match the schema is a 422 and nothing is stored.

Body: CreateOrderRequest

  • 200 OK → SubmissionResponse
  • 201 OK → SubmissionResponse
  • 202 OK → SubmissionResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version, or a missing Idempotency-Key → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 409 The first request with this Idempotency-Key is still running: retry shortly → Error
  • 422 The body doesn't match the schema, or the Idempotency-Key was used for a different request → Error
  • 429 Rate limit exceeded → Error
GET/orders/{trackingNumber}scope orders:read

One order

trackingNumberpath · required
  • 200 OK → OrderResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/orders/{trackingNumber}/trackingscope orders:read

Where an order stands: status, milestones, proof of delivery, the last event

trackingNumberpath · required
  • 200 OK → Tracking
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/orders/{trackingNumber}/historyscope orders:read

An order's status history, oldest first (the webhook event types; undone events are left out)

trackingNumberpath · required
  • 200 OK → History
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/submissions/{id}scope orders:read

What became of a submitted order: being placed, accepted, in review, or rejected with the dispatcher's note

idpath · required
  • 200 OK → SubmissionResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error

Batches

POST/batchesscope orders:write· Idempotency-Key required

Send many orders for one customer

JSON `lines` (each a BatchLine), or multipart/form-data with a CSV or XLSX `file` read with the customer's saved order-feed mapping. **202**: stored and queued — poll GET /batches/{id} (the Location header) or listen for `batch.completed`. **200**: these exact bytes were sent before for this customer — that batch, nothing new. Only the envelope is refused (**422**: unreadable, no lines, over the line or byte cap, a missing or unknown customer, no saved mapping for a file). A line that doesn't match BatchLine is kept and goes to the carrier's review queue with its reason; the rest go ahead. A line with an `externalRef` is the same order whether it comes in a batch or through POST /orders. **429**: too many open batches for the key, or its hourly line budget (Retry-After).

Body: CreateBatchRequest

  • 200 OK → BatchResponse
  • 202 OK → BatchResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version, or a missing Idempotency-Key → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 409 The first request with this Idempotency-Key is still running: retry shortly → Error
  • 422 The body doesn't match the schema, or the Idempotency-Key was used for a different request → Error
  • 429 Rate limit exceeded → Error
GET/batches/{id}scope orders:read

A batch's status and line counts

idpath · required
  • 200 OK → BatchResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/batches/{id}/linesscope orders:read

A batch's lines, in batch order: outcome, status now, tracking number and reasons

idpath · required
outcomequeryOnly lines with this outcome
cursorqueryThe previous page's nextCursor
limitqueryPage size, 1–200 (default 50)
  • 200 OK → BatchLineList
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error

Webhooks

GET/webhooksscope webhooks:manage

The key's webhook endpoints

  • 200 OK → WebhookList
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
POST/webhooksscope webhooks:manage· Idempotency-Key required

Add a webhook endpoint

Returns the signing secret once. Each subscribed event is POSTed as a `WebhookPayload` (see `webhooks` below), retried with backoff until your endpoint answers 2xx.

Body: CreateWebhookRequest

  • 201 OK → WebhookCreated
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version, or a missing Idempotency-Key → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 409 The first request with this Idempotency-Key is still running: retry shortly → Error
  • 422 The body doesn't match the schema, or the Idempotency-Key was used for a different request → Error
  • 429 Rate limit exceeded → Error
DELETE/webhooks/{id}scope webhooks:manage· Idempotency-Key required

Stop sending to a webhook endpoint (it is disabled; its delivery log stays with the carrier)

idpath · required
  • 200 OK → WebhookDisabled
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version, or a missing Idempotency-Key → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 404 Not found, or not this key's → Error
  • 409 The first request with this Idempotency-Key is still running: retry shortly → Error
  • 422 The body doesn't match the schema, or the Idempotency-Key was used for a different request → Error
  • 429 Rate limit exceeded → Error
POST/inboxscope webhooks:manage· Idempotency-Key required

The sandbox's webhook inbox URL (test keys only)

Made on first use, the same URL after. Point a sandbox webhook at it (POST /webhooks) to watch signed deliveries arrive in GET /inbox before you host an endpoint. A live key is a 403.

  • 200 OK → InboxResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version, or a missing Idempotency-Key → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 409 The first request with this Idempotency-Key is still running: retry shortly → Error
  • 422 The body doesn't match the schema, or the Idempotency-Key was used for a different request → Error
  • 429 Rate limit exceeded → Error
GET/inboxscope orders:read

The sandbox inbox's newest deliveries (test keys only)

Each delivery with its event, delivery id, whether its signature verified with the sending webhook's secret, and the body as received.

  • 200 OK → InboxMessages
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope, or the carrier's plan doesn't include the API → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error

Shipper

GET/shipper/mescope shipper:read

The calling shipper key: mode, scopes, your org and the carriers it reads now

  • 200 OK → ShipperMe
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/shipper/shipmentsscope shipper:read

Your shipments across every carrier you are linked to, and from your status feeds, newest first

Every carrier that accepted your link request shares the shipments for the account it chose; a paused or ended link shows nothing. Shipments your status feeds name for a carrier not on the platform are merged in (`source: "external"`, id `ext_…`) — one already matched to a linked carrier's order is listed once, as that order. Switch on `source`; `source=carrier` keeps the list to carriers' orders. Page with `cursor` until `nextCursor` is null — keep the filters the same between pages. Drafts and quotes are never shipments.

carrierIdqueryOnly this carrier's shipments (an id from `carrier.id` — a carrier not on the platform's is `ext:<key>`)
sourcequeryOnly carriers' orders (`carrier`) or only shipments from your status files (`external`); both when absent
statusqueryOne status, or several comma-separated (e.g. `PICKED_UP,DELIVERED`): an order status narrows carriers' orders, a status-file status (ExternalStatus) your external shipments; a value in both narrows both. Drafts and quotes are never shipments.
createdSincequeryShipments created at or after
createdBeforequeryShipments created before
cursorqueryThe previous page's nextCursor
limitqueryPage size, 1–200 (default 50)
  • 200 OK → ShipmentList
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error
GET/shipper/shipments/{id}scope shipper:read

One shipment: status, milestones, arrival window, last scan, exceptions and proof on file — or, for an `ext_…` id, its status-file updates

An `ext_…` id that has since matched a linked carrier's order answers that order (`source: "carrier"`, its own id) — use that id from then on.

idpath · required
  • 200 OK → ShipmentResponse
  • 400 A malformed request: bad JSON, an unknown Fleetfully-Version → Error
  • 401 No key, or an unknown or revoked one → Error
  • 403 The key lacks the scope → Error
  • 404 Not found, or not this key's → Error
  • 422 The query doesn't match the schema → Error
  • 429 Rate limit exceeded → Error

Schemas

Address

line1*string | null
line2*string | null
city*string | null
state*string | null
postalCode*string | null
text*string | null

AddressInput

A street address: line1 + city + state, or `text`

line1string
line2string
citystring
statestring
postalCodestring
textstringThe whole address as one line, when you don't have it in parts

Batch

id*string
status*BatchStatus
reference*string | null
customerId*string
source*json | file
fileName*string | null
counts*BatchCounts
notify*combined | per_ordercombined: one batch.completed and no per-order order.created; per_order: every order announced too
error*string | nullWhy a failed batch couldn't be read
receivedAt*Timestamp
startedAt*Timestamp | null
completedAt*Timestamp | null

BatchCounts

lines*integerLines in the batch (a file: known once it is read)
accepted*integerLines that became orders
needsReview*integerLines waiting in the carrier's review queue (each line's reasons are in GET /batches/{id}/lines)
duplicate*integerLines sent before with the same reference and details: nothing new was made
pending*integerLines not worked yet

BatchLine

externalRefstringYour order number. Sending it again with the same details creates nothing; with new details it goes to review.
referencesReference[]
serviceLevelstringA service level code the customer is offered; absent = the customer's default for the priority
priorityUNKNOWN | ROUTINE | SAME_DAY | RUSH | STAT | CRITICAL
pickupStopInput
delivery*StopInput
readyTimestringWhen the goods are ready
deliveryDeadlinestringDeliver by; absent = the service level's clock
itemsItemInput[]
packageDescriptionstring
notesstringSpecial instructions
codCodInput

BatchLineList

lines*BatchLineResult[]
nextCursor*string | null

BatchLineOutcome

What the batch made of the line when it was worked

BatchLineResult

index*integer0-based position in the batch (a file: the order its rows were read in)
path*stringWhere it was: "lines[37]" or "row 12"
externalRef*string | null
outcome*BatchLineOutcome
submissionId*string | nullGET /submissions/{id} follows it after the batch (a dispatcher may approve or reject it later)
status*SubmissionStatus | nullThe line's status now
trackingNumber*string | null
issues*Issue[]Why it is in review (errors) or what was adjusted (warnings)

BatchResponse

batch*Batch

BatchStatus

queued = stored, waiting its turn; processing = lines being made into orders; completed = every line worked; failed = the payload couldn't be read (nothing was made — see `error`)

BatchWebhookPayload

event*string
eventId*string
label*string
occurredAt*Timestamp
batch*object

CarrierShipment

id*stringThe shipment's id (GET /shipper/shipments/{id}) — the carrier's order id
source*stringA linked carrier's order
carrier*objectThe carrier delivering it
trackingNumber*string
status*OrderStatus
statusLabel*stringThe status in plain words
createdAt*Timestamp
deliveredAt*Timestamp | null
expectedBy*Timestamp | nullThe delivery deadline while it is open
from*string | nullCity, state of the pickup
to*string | nullCity, state of the delivery
account*objectYour account at this carrier that the shipment is billed to
references*Reference[]The shipment's non-sensitive references (PO, BOL, ASN …)

CarrierShipmentDetail

id*stringThe shipment's id (GET /shipper/shipments/{id}) — the carrier's order id
source*stringA linked carrier's order
carrier*objectThe carrier delivering it
trackingNumber*string
status*OrderStatus
statusLabel*stringThe status in plain words
createdAt*Timestamp | null
deliveredAt*Timestamp | null
expectedBy*Timestamp | nullThe delivery deadline while it is open
from*string | nullCity, state of the pickup
to*string | nullCity, state of the delivery
account*objectYour account at this carrier that the shipment is billed to
references*Reference[]The shipment's non-sensitive references (PO, BOL, ASN …)
cancelled*boolean
milestones*object[]The tracking page's milestones, in order; `at` is null until reached
arrivalWindow*object | nullThe carrier's current arrival window, while one is known
lastScan*object | nullThe latest custody scan point
exceptions*object[]Exceptions at a stop, by the carrier's label
proof*objectProof of delivery on file: a signature, and how many photos

Cod

Collect on delivery: the amount the driver collects at the door

amountDueCents*integer
currency*stringISO 4217 code of the amount, e.g. USD

CodInput

Collect on delivery: the driver collects this amount when delivering

amountDueCents*integerWhat the driver collects at the door, in cents
currencystringISO 4217; the carrier's currency (USD) when absent

CreateBatchFileRequest

file*stringA CSV or XLSX file (at most 25 MB), read with the customer's saved order-feed mapping
customerIdstringThe customer every line is for (a carrier-level key). Ignored for a customer-scoped key.
customerCodestringOr the carrier's code for the customer
referencestringYour own id for this batch (shown back in its status and webhook)

CreateBatchRequest

customerIdstringThe customer every line is for (a carrier-level key). Ignored for a customer-scoped key.
customerCodestringOr the carrier's code for the customer
referencestringYour own id for this batch (shown back in its status and webhook)
serviceLevelstringA service level code for every line that doesn't name one
serviceDatestringThe day the lines should ride (YYYY-MM-DD), when it is later than the next cut-off
lines*BatchLine[]The order lines (at most 5,000 unless your carrier set otherwise)

CreateOrderRequest

customerIdstringThe customer the order is for (a carrier-level key). Ignored for a client-scoped key.
customerCodestringOr the carrier's code for the customer
externalRefstringYour order number. Sending it again with the same details creates nothing; with new details it goes to review.
referencesReference[]
serviceLevelstringA service level code the customer is offered; absent = the customer's default for the priority
priorityUNKNOWN | ROUTINE | SAME_DAY | RUSH | STAT | CRITICAL
pickupStopInput
delivery*StopInput
readyTimestringWhen the goods are ready
deliveryDeadlinestringDeliver by; absent = the service level's clock
itemsItemInput[]
packageDescriptionstring
notesstringSpecial instructions
codCodInput

CreateWebhookRequest

name*string
url*stringAn https URL that answers 2xx
events*order.created | order.approved | order.rejected | order.cancelled | order.dispatched | stop.en_route | stop.arrived | order.picked_up | order.delivered | order.completed | order.escalated | exception.raised | batch.completed[]
customerIdstring | nullOnly this customer's orders (carrier-level keys); absent = every customer. A client-scoped key always gets its own customer.

Customer

id*string
code*string | null
name*string

Error

error*object

ExternalShipment

id*string`ext_…` — a shipment your status files name (GET /shipper/shipments/{id})
source*stringA shipment from your own status feeds, for a carrier not on the platform
carrier*objectThe carrier as its status files name it
trackingNumber*stringYour reference for it, as the status files give it
status*ExternalStatus
statusLabel*stringThe status in plain words
createdAt*Timestamp
deliveredAt*Timestamp | null
expectedBy*Timestamp | nullThe latest delivery estimate the files gave, while it isn't delivered
from*nullA status file doesn't name the pickup
to*nullA status file doesn't name the delivery address
account*nullNot billed to an account here
references*object[]Every reference the status files named
lastEventAt*Timestamp | nullWhen the latest status happened
lastPlace*string | nullCity, state of the latest status

ExternalShipmentDetail

id*string`ext_…` — a shipment your status files name (GET /shipper/shipments/{id})
source*stringA shipment from your own status feeds, for a carrier not on the platform
carrier*objectThe carrier as its status files name it
trackingNumber*stringYour reference for it, as the status files give it
status*ExternalStatus
statusLabel*stringThe status in plain words
createdAt*Timestamp
deliveredAt*Timestamp | null
expectedBy*Timestamp | nullThe latest delivery estimate the files gave, while it isn't delivered
from*nullA status file doesn't name the pickup
to*nullA status file doesn't name the delivery address
account*nullNot billed to an account here
references*object[]Every reference the status files named
lastEventAt*Timestamp | nullWhen the latest status happened
lastPlace*string | nullCity, state of the latest status
events*object[]The status files' updates, newest first

ExternalStatus

History

trackingNumber*string
events*StatusEvent[]

Inbox

id*string
url*stringPoint a sandbox webhook at this URL; its deliveries appear in GET /inbox
createdAt*string

InboxMessage

id*string
receivedAt*string
event*string | nullX-Fleetfully-Event
deliveryId*string | nullX-Fleetfully-Delivery
signatureValid*booleanThe X-Fleetfully-Signature verified with the sending webhook's secret
body*anyThe delivery body as received (a WebhookPayload for a webhook delivery)

InboxMessages

messages*InboxMessage[]Newest first, at most 50

InboxResponse

inbox*Inbox

Issue

Why a submission is in review (errors) or what was adjusted (warnings)

severity*error | warning
path*string
code*string
message*string

Item

sku*string | null
description*string | null
quantity*integer
unit*EACH | SET | CASE | PALLET
externalLineId*string | null

ItemInput

A line: a SKU or a description

skustring
descriptionstring
quantityinteger
unitEACH | SET | CASE | PALLET
externalLineIdstringYour line id

Me

key*object
carrier*object
customer*Customer | nullThe one customer a client-scoped key reads; null = carrier-level

OpenApiDocument

Order

trackingNumber*string
status*OrderStatus
customer*Customer
priority*UNKNOWN | ROUTINE | SAME_DAY | RUSH | STAT | CRITICAL
serviceLevel*string | null
externalRef*string | null
references*Reference[]
stops*Stop[]
items*Item[]
packageDescription*string | null
cod*Cod | nullCollect on delivery; null = nothing to collect
readyTime*Timestamp | null
deliveryDeadline*Timestamp | null
pickedUpAt*Timestamp | null
deliveredAt*Timestamp | null
createdAt*Timestamp
updatedAt*Timestamp
trackingUrl*string | nullThe public tracking page, where the platform has one

OrderList

orders*Order[]
nextCursor*string | null

OrderResponse

order*Order

OrderStatus

PostmanCollection

Reference

kind*CUSTOMER_REF | INTERNAL_REF | PO | BOL | ASN | DEALER_ORDER | SPECIMEN | REQUISITION | PATIENT_ID | PATIENT_NAME | OTHER
value*string

Shipment

ShipmentDetail

ShipmentList

shipments*Shipment[]Newest first, across every carrier
nextCursor*string | null

ShipmentResponse

shipment*ShipmentDetail

ShipmentWebhookPayload

event*string
eventId*stringThe same on every retry of this event
trigger*stringWhat happened: the carrier's event type (order.picked_up, exception.raised …), or for an external shipment `status_file.<status>` (status_file.in_transit …)
label*stringWhat happened, in plain words
occurredAt*Timestamp
shipment*ShipmentDetailThe shipment as it is when the POST is sent

ShipperMe

key*object
shipper*object
carriers*object[]The carriers whose shipments the key reads now (ACTIVE links)

StatusEvent

One status change — the same types and names the webhooks send

id*string
type*order.created | order.approved | order.rejected | order.cancelled | order.dispatched | stop.en_route | stop.arrived | order.picked_up | order.delivered | order.completed | order.escalated | exception.raised
label*string
occurredAt*Timestamp
leg*PICKUP | DELIVERY | null

Stop

type*PICKUP | DELIVERY
sequence*integer
name*string | null
address*Address
window*object
arrivedAt*Timestamp | null
departedAt*Timestamp | null

StopInput

namestringThe business or place
address*AddressInput
contactobject
notesstringFor the driver at this stop
windowWindowInput
locationCodestringYour code for this location (a store or dock number)

Submission

id*string
status*SubmissionStatus
externalRef*string | null
issues*Issue[]
trackingNumber*string | null
resolutionNote*string | nullThe dispatcher's note when it was rejected
receivedAt*Timestamp
updatedAt*Timestamp

SubmissionResponse

submission*Submission
order*Order | null

SubmissionStatus

accepted = an order exists; needs_review = a dispatcher must fix it in Needs you; processing = being created, or created and still being placed (address pins, price, auto-dispatch) — the order and its tracking number are already there; rejected = a dispatcher declined it

Timestamp

ISO 8601 UTC timestamp

Tracking

trackingNumber*string
status*OrderStatus
pickedUpAt*Timestamp | null
deliveredAt*Timestamp | null
deliveryDeadline*Timestamp | null
proofOfDelivery*object
lastEvent*StatusEvent | null
trackingUrl*string | null

Webhook

id*string
name*string
url*string
events*string[]
customerId*string | null
status*ACTIVE | DISABLED
createdAt*Timestamp

WebhookCreated

webhook*Webhook
signingSecret*stringVerify X-Fleetfully-Signature with it. Shown once.

WebhookDisabled

webhook*Webhook

WebhookList

webhooks*Webhook[]

WebhookPayload

event*order.created | order.approved | order.rejected | order.cancelled | order.dispatched | stop.en_route | stop.arrived | order.picked_up | order.delivered | order.completed | order.escalated | exception.raised
eventId*string
label*string
occurredAt*Timestamp
order*object
stop*object | null
reason*string | nullFor exception.raised and order.escalated: the reason

WindowInput

When the stop may be served: earliest and latest arrival

startstringISO 8601 timestamp with an offset
endstringISO 8601 timestamp with an offset