ARK API

REST API for authorized ARK TMS scripts and integrations.

Developer portal | API docs for agents | OpenAPI 3.1 | MCP docs

API quickstart

The ARK API is in production preview. Access must be enabled for your organization, and an authorized ARK user must issue a restricted API token. The token is shown once. Store it in a secret manager or an environment variable, never in browser code or source control.

Base URL

TEXT
https://arktms.com/api/v1

Make your first request

Set the token in your shell, then request the effective identity and access context:

Shell
export ARK_API_TOKEN="your-token"

curl https://arktms.com/api/v1/me \
  -H "Authorization: Bearer $ARK_API_TOKEN"

A successful response includes ok: true, an API version, a request ID, and the connected actor's effective scopes, permissions, visible teams, and available operations. Keep the request ID when contacting support.

Check available operations

Use GET /api/v1/me before building a workflow. The result reflects the intersection of the current user, organization, team visibility, token restrictions, and rollout tier. A route documented here can still return missing_scope, missing_permission, or team_access_denied for a credential that lacks access.

The reference on this page contains the operations currently enabled for external access. Unavailable and internal operations are intentionally absent.

Authentication and scopes

REST API requests use an ARK API token in the standard bearer header:

HTTP
Authorization: Bearer your-token

API tokens are for server-side scripts and integrations. Do not send an OAuth MCP access token to REST routes, and do not expose an API token in a browser, mobile application, prompt, or client-side bundle.

Effective access is always the intersection of:

TEXT
current user permissions
AND organization membership
AND visible teams and entities
AND token scopes and restrictions
AND operation policy
AND enabled external-access tier

A scope never grants more access than the connected user already has. Team-limited tokens cannot reach records outside their configured teams. Token-specific row limits and rate limits can further reduce access.

Use the narrowest scopes required by the integration. The generated endpoint reference lists every required scope and ARK permission using canonical operation metadata.

Server-to-server automation

API tokens support dashboards, scheduled jobs, and other server-side integrations, but they are currently user-delegated credentials. A token is scoped to one organization and remains bound to its issuing user; it stops working if that user is deactivated or no longer belongs to the organization.

ARK does not currently issue organization service principals or OAuth client-credentials grants. Use a restricted API token with a durable owner for current integrations. MCP OAuth remains user-delegated and is intended for interactive AI clients, not unattended server-to-server authentication.

API concepts

Responses and request IDs

Successful API calls use a versioned JSON envelope with ok, api_version, request_id, and data. Error responses use ok: false and a stable error code. Every response also returns X-ARK-Request-Id; log it with the request outcome.

Use error codes for control flow. Message text is for people and may become more specific without a version change.

Pagination

List and search endpoints that support pagination expose limit and cursor parameters in their generated reference. Pass the returned cursor to the next request. Do not construct, inspect, or persist assumptions about cursor internals.

Page sizes are also constrained by the API token's maxRowsPerRequest policy. A request above that credential cap is rejected instead of silently widening access.

Data boundaries

Published resource shapes are external API contracts, not copies of ARK database tables. The public OpenAPI document includes only components reachable from available operations and omits unused internal schemas.

GET /api/v1/carriers searches carrier records belonging to the authenticated organization, uses cursor pagination, and returns at most 100 rows per request before any lower token policy is applied. It does not provide a bulk export of the FMCSA source dataset. Carrier risk endpoints return curated, record-specific safety context through their documented response contracts.

Preview availability

The reference publishes the complete external preview contract so integrations can be designed and tested before general availability. Runtime access is still the intersection of organization enrollment, the credential's scopes, ARK permissions, and team visibility. Operations marked x-ark-access-tier: full in OpenAPI require expanded-preview enrollment; the core preview remains available to the initial cohort.

Idempotency

Every external mutation marked as idempotent in the reference requires an Idempotency-Key header:

HTTP
Idempotency-Key: a-stable-key-for-this-exact-attempt

Keys may be at most 200 characters and cannot contain control characters. Reuse a key only when retrying the exact same operation and payload. Reusing it with different input returns idempotency_key_conflict. ARK stores terminal outcomes so a retry can return the original result without repeating the write.

REST writes execute directly after authentication, authorization, validation, and idempotency checks. The server-backed human approval workflow described in the MCP guide does not apply to API-token requests.

Rate limits

API tokens default to 600 requests per minute. API and MCP traffic also shares an organization budget that defaults to 3000 requests per minute. Organization or credential policy can set lower or higher limits.

Authenticated responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. A 429 rate_limit_exceeded response also includes Retry-After. Production limits are distributed across application instances.

Errors

Common stable codes include unauthorized, missing_scope, missing_permission, team_access_denied, validation_failed, not_found, conflict, idempotency_key_required, idempotency_key_conflict, rate_limit_exceeded, external_access_disabled, and operation_not_available.

Treat 401 as an invalid or expired credential, 403 as insufficient scope or access, 404 as an unavailable or invisible resource, 409 as a state or idempotency conflict, and 429 as a signal to wait for Retry-After before retrying.

Broker workflows

Available workflows use normal ARK permissions and team visibility.

Triage the work queue

Call GET /api/v1/work-queue to summarize operational work visible to the connected user. Follow returned identifiers with specific read endpoints instead of downloading broad record sets.

Find and inspect a load

Use GET /api/v1/loads to search by load number, reference, status, or team. Then call GET /api/v1/loads/{loadId} and related stop, dispatch-note, tracking, bid, or billing-readiness endpoints for the selected load.

Review a carrier before assignment

Search carriers, then call GET /api/v1/carriers/{carrierId}/risk-card. The risk card summarizes available safety, authority, insurance, identity, onboarding, and internal eligibility signals. It does not make the booking decision.

Create and cover a load

Resolve customer, team, and locations first. Create the load with POST /api/v1/loads, then assign a carrier with POST /api/v1/loads/{loadId}/assign-carrier. Each write needs its own idempotency key. Use the generated request field tables and examples below; required fields come directly from OpenAPI.

Record dispatch context

Use POST /api/v1/loads/{loadId}/dispatches/{dispatchId}/notes for broker-visible call, exception, and follow-up context. This is an idempotent write and requires a unique key for the exact note attempt.

API reference

Browse 279 external preview operations by resource. Each detail page is generated from the public OpenAPI contract.

Context

MethodPathScope
GET/api/v1/searchcontext:read

Operations

MethodPathScope
GET/api/v1/work-queueoperations:read, loads:read

People

MethodPathScope
GET/api/v1/peoplepeople:read
POST/api/v1/peoplepeople:write
DELETE/api/v1/people/{personId}people:write
GET/api/v1/people/{personId}people:read
PATCH/api/v1/people/{personId}people:write
POST/api/v1/people/drivers/{driverId}/invite-apppeople:write
POST/api/v1/people/importpeople:write, carriers:read

Locations

MethodPathScope
GET/api/v1/locationslocations:read
POST/api/v1/locationslocations:write
DELETE/api/v1/locations/{locationId}locations:write
GET/api/v1/locations/{locationId}locations:read
PATCH/api/v1/locations/{locationId}locations:write
POST/api/v1/locations/importlocations:write

Customers

Carriers

MethodPathScope
GET/api/v1/carrierscarriers:read
POST/api/v1/carrierscarriers:write
DELETE/api/v1/carriers/{carrierId}carriers:write
GET/api/v1/carriers/{carrierId}carriers:read
PATCH/api/v1/carriers/{carrierId}carriers:write
GET/api/v1/carriers/{carrierId}/filescarriers:read
DELETE/api/v1/carriers/{carrierId}/files/{fileId}carriers:write
GET/api/v1/carriers/{carrierId}/files/{fileId}/download-urlcarriers:read
POST/api/v1/carriers/{carrierId}/files/finalize-uploadcarriers:write
POST/api/v1/carriers/{carrierId}/files/prepare-uploadcarriers:write
GET/api/v1/carriers/{carrierId}/fmcsa/authoritycarriers:read
GET/api/v1/carriers/{carrierId}/fmcsa/crashescarriers:read
GET/api/v1/carriers/{carrierId}/fmcsa/fleetcarriers:read
GET/api/v1/carriers/{carrierId}/fmcsa/historycarriers:read
GET/api/v1/carriers/{carrierId}/fmcsa/inspectionscarriers:read
GET/api/v1/carriers/{carrierId}/fmcsa/insurancecarriers:read
GET/api/v1/carriers/{carrierId}/onboarding-profilecarriers:read
POST/api/v1/carriers/{carrierId}/onboarding/approvecarriers:write
POST/api/v1/carriers/{carrierId}/onboarding/rejectcarriers:write
GET/api/v1/carriers/{carrierId}/review-metricscarriers:read
GET/api/v1/carriers/{carrierId}/reviewscarriers:read
POST/api/v1/carriers/{carrierId}/reviewscarriers:write
GET/api/v1/carriers/{carrierId}/risk-cardcarriers:read
GET/api/v1/carriers/{carrierId}/verified-dispatch-emailscarriers:read
POST/api/v1/carriers/importcarriers:write
POST/api/v1/carriers/provider-onboarding/invitecarriers:write
POST/api/v1/carriers/provider-onboarding/previewcarriers:read
POST/api/v1/carriers/provider-synccarriers:write
GET/api/v1/carriers/rmis-registration-stepscarriers:read
POST/api/v1/carriers/rmis-registration-stepscarriers:read

Factoring

Billing

MethodPathScope
GET/api/v1/billing/carrier-ach-filesloads:read, billing:read
GET/api/v1/billing/carrier-ach-files/{nachaFileId}loads:read, billing:read
PATCH/api/v1/billing/carrier-ach-files/{nachaFileId}loads:read, billing:write
POST/api/v1/billing/carrier-ach-files/generateloads:read, billing:write
POST/api/v1/billing/carrier-ach-files/regenerateloads:read, billing:write
GET/api/v1/billing/carrier-paymentsloads:read, billing:read
POST/api/v1/billing/carrier-payments/back-to-deliveredloads:read, billing:write
POST/api/v1/billing/carrier-payments/readyloads:read, billing:write
POST/api/v1/billing/carrier-payments/recordloads:read, billing:write
PATCH/api/v1/billing/carrier-payments/vendor-invoice-numbersloads:read, billing:write
POST/api/v1/billing/carrier-remittance-emails/preflightloads:read, billing:read
POST/api/v1/billing/carrier-remittance-emails/sendloads:read, billing:write
GET/api/v1/billing/carrier-settlementsloads:read, billing:read
GET/api/v1/billing/carrier-settlements/{settlementNumber}loads:read, billing:read
POST/api/v1/billing/carrier-settlements/recordloads:read, billing:write
GET/api/v1/billing/customer-paymentsloads:read, billing:read
POST/api/v1/billing/customer-payments/back-to-deliveredloads:read, billing:write
POST/api/v1/billing/customer-payments/recordloads:read, billing:write
POST/api/v1/billing/customer-payments/send-invoicesloads:read, billing:write
GET/api/v1/billing/invoice-remit-profilesbilling:read
POST/api/v1/billing/invoice-remit-profilesbilling:write
DELETE/api/v1/billing/invoice-remit-profiles/{profileId}billing:write
PATCH/api/v1/billing/invoice-remit-profiles/{profileId}billing:write
POST/api/v1/billing/invoice-remit-profiles/{profileId}/defaultbilling:write
GET/api/v1/billing/organization-achbilling:read
GET/api/v1/billing/pay-holdsloads:read, billing:read
POST/api/v1/billing/pay-holds/bulk-resolveloads:read, billing:write
GET/api/v1/billing/payment-destinationsbilling:read
GET/api/v1/billing/payment-termsbilling:read
POST/api/v1/billing/payment-termsbilling:write
DELETE/api/v1/billing/payment-terms/{paymentTermId}billing:write
GET/api/v1/compliance/pod-reviewsloads:read, billing:read
POST/api/v1/compliance/pod-reviews/bulk-reviewloads:read, billing:write
POST/api/v1/compliance/pod-reviews/reviewloads:read, billing:write

Loads

MethodPathScope
GET/api/v1/loadsloads:read
POST/api/v1/loadsloads:write
DELETE/api/v1/loads/{loadId}loads:delete
GET/api/v1/loads/{loadId}loads:read
PATCH/api/v1/loads/{loadId}loads:write
POST/api/v1/loads/{loadId}/archiveloads:delete
POST/api/v1/loads/{loadId}/assign-carrierloads:dispatch
GET/api/v1/loads/{loadId}/bidsloads:read
POST/api/v1/loads/{loadId}/bids/{bidId}/rejectloads:dispatch
POST/api/v1/loads/{loadId}/bids/manualloads:dispatch
POST/api/v1/loads/{loadId}/bill-of-lading/generateloads:write
POST/api/v1/loads/{loadId}/billing-adjustmentloads:read, loads:write, billing:write
GET/api/v1/loads/{loadId}/billing-readinessloads:read, billing:read
POST/api/v1/loads/{loadId}/billing/customer-payment/deliveredloads:read, billing:write
POST/api/v1/loads/{loadId}/billing/customer-payment/recordloads:read, billing:write
POST/api/v1/loads/{loadId}/billing/invoice/generateloads:read, billing:write
POST/api/v1/loads/{loadId}/billing/invoice/sendloads:read, billing:write
POST/api/v1/loads/{loadId}/billing/packet/generateloads:read, billing:write
POST/api/v1/loads/{loadId}/billing/undeliverloads:read, billing:write
POST/api/v1/loads/{loadId}/deliverloads:write
PATCH/api/v1/loads/{loadId}/dispatches/{dispatchId}loads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/carrier-payment/recordloads:read, billing:write
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/deliveredloads:read, billing:write
PATCH/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/due-dateloads:read, billing:write
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/packet/generateloads:read, billing:write
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/readyloads:read, billing:write
PATCH/api/v1/loads/{loadId}/dispatches/{dispatchId}/billing/vendor-invoice-numberloads:read, billing:write
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/cancelloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/locationsloads:write
GET/api/v1/loads/{loadId}/dispatches/{dispatchId}/notesloads:read
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/notesloads:write
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/rate-confirmation/create-and-sendloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/rate-confirmation/generateloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/rate-confirmation/sendloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/repowerloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/tonu-deliverloads:dispatch
POST/api/v1/loads/{loadId}/dispatches/{dispatchId}/tonu-recoverloads:dispatch
GET/api/v1/loads/{loadId}/filesloads:read
DELETE/api/v1/loads/{loadId}/files/{fileId}loads:write
GET/api/v1/loads/{loadId}/files/{fileId}/download-urlloads:read
POST/api/v1/loads/{loadId}/files/finalize-uploadloads:write
POST/api/v1/loads/{loadId}/files/prepare-uploadloads:write
POST/api/v1/loads/{loadId}/lockloads:write
POST/api/v1/loads/{loadId}/miles/calculateloads:write
DELETE/api/v1/loads/{loadId}/notificationsloads:write
GET/api/v1/loads/{loadId}/notificationsloads:read
PUT/api/v1/loads/{loadId}/notificationsloads:write
POST/api/v1/loads/{loadId}/pay-holdsloads:read, billing:write
POST/api/v1/loads/{loadId}/pay-holds/resolveloads:read, billing:write
POST/api/v1/loads/{loadId}/restoreloads:write
PUT/api/v1/loads/{loadId}/route-segmentsloads:write
POST/api/v1/loads/{loadId}/statusloads:write
GET/api/v1/loads/{loadId}/stopsloads:read
PATCH/api/v1/loads/{loadId}/stops/{stopId}loads:write
POST/api/v1/loads/{loadId}/stops/{stopId}/eventloads:write
GET/api/v1/loads/{loadId}/trackingloads:read
PATCH/api/v1/loads/{loadId}/trackingloads:dispatch
POST/api/v1/loads/{loadId}/tracking/driver-conflict/resolveloads:dispatch
POST/api/v1/loads/{loadId}/tracking/emailloads:dispatch
GET/api/v1/loads/{loadId}/tracking/internalloads:read
POST/api/v1/loads/{loadId}/tracking/linkloads:dispatch
POST/api/v1/loads/{loadId}/tracking/notifyloads:write
POST/api/v1/loads/{loadId}/tracking/startloads:dispatch
POST/api/v1/loads/{loadId}/tracking/stoploads:dispatch
POST/api/v1/loads/{loadId}/tracking/stop-inactive-dispatchloads:dispatch
GET/api/v1/loads/{loadId}/tracking/update-paramsloads:read
POST/api/v1/loads/{loadId}/unlockloads:write
POST/api/v1/loads/{loadId}/vendor-expensesloads:read, loads:write, billing:write
DELETE/api/v1/loads/{loadId}/vendor-expenses/{vendorExpenseId}loads:read, loads:write, billing:write
POST/api/v1/loads/{loadId}/vendor-expenses/batchloads:read, loads:write, billing:write
GET/api/v1/loads/{loadId}/vendor-expenses/rebill-stateloads:read, billing:read
POST/api/v1/loads/bulkloads:dispatch

Reports

MethodPathScope
GET/api/v1/reports/agingreports:read
GET/api/v1/reports/aging/detailsreports:read
GET/api/v1/reports/aging/summaryreports:read
GET/api/v1/reports/cash-flowreports:read
GET/api/v1/reports/commissionsreports:read
GET/api/v1/reports/loadsreports:read
GET/api/v1/reports/revenuereports:read

Documentation

MethodPathScope
GET/api/v1/docs/searchdocs:read

Reference

MethodPathScope
GET/api/v1/openapi.jsonNone

Agent Sessions

MethodPathScope
GET/api/v1/agent-sessionsagents:read
POST/api/v1/agent-sessionsagents:write
POST/api/v1/agent-sessions/{sessionId}/stopagents:write

Approvals

MethodPathScope
GET/api/v1/approvalsagents:read

Audit

Carrier Invites

MethodPathScope
GET/api/v1/carrier-invitescarriers:read
POST/api/v1/carrier-invitescarriers:write
DELETE/api/v1/carrier-invites/{inviteId}carriers:write
POST/api/v1/carrier-invites/{inviteId}/resendcarriers:write
POST/api/v1/carrier-invites/previewcarriers:read

Edi

Email

MethodPathScope
POST/api/v1/email/customloads:write

Integrations

Load Board

Notifications

MethodPathScope
GET/api/v1/notificationsnotifications:read
POST/api/v1/notifications/{notificationId}/readnotifications:write
POST/api/v1/notifications/read-allnotifications:write

Organization

Spot Quotes

Tracking