Developers · API v1.4.1

Start a verification with one request.

Your systems get the same freight record your dispatchers see. A REST API to read and write it, signed webhooks when something changes, and a connector that lets your AI assistant do the work.

Docs: API reference · AI assistants

REST API

Fourteen endpoints. Same rules as the app.

A key acts as the user who created it, inside that user’s company, with the same role and plan limits. A carrier that isn’t bookable in the app isn’t bookable through the API either: the load isn’t created, and you get a 400 with a stable code that says why.

MethodPath under /api/v1What it doesKey needs
GET/pingCheck a key: which company, which user, which scopesread
GET/verificationsList verifications, with status and Trust score filtersread
GET/verifications/{id}One verification in fullread
POST/verificationsCreate and start a verification. Uses one creditverifications:create
GET/carriersYour carrier roster, filter by verdictread
GET/carriers/{id}Authority, insurance on file, history and change logread
GET/customersCustomers, with an updatedAfter filter for incremental syncread
GET/customers/{id}Contacts, addresses and the credit profileread
GET/loadsLoads, with the same filters as the app’s load listread
GET/loads/{id}Stops, charges, references, status history, marginread
POST/loadsCreate a load. Takes an Idempotency-Key for safe retrieswrite
PATCH/loads/{id}/statusMove a load. A 400 lists the allowed next statuseswrite
GET/loads/{id}/check-callsThe load’s check-call timelineread
POST/loads/{id}/check-callsRecord a location, note or ETAwrite
Create a load
curl -X POST "https://api.happytactic.com/api/v1/loads" \
  -H "Authorization: Bearer $HAPPYTACTIC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2a9e-3b7d-4c55-9e0a-1d2f3a4b5c6d" \
  -d '{"partyId":"cmrpgygm900yxqyrjy42el8a3",
       "originCity":"Cleveland","originState":"OH",
       "destinationCity":"Savannah","destinationState":"GA",
       "pickupDate":"2026-08-01","deliveryDate":"2026-08-03",
       "equipmentType":"van","weight":24000,
       "customerRate":1850,"carrierRate":1500}'
201 response, trimmed · sample data
{
  "load": {
    "id": "cmrr6gyru000ld16gducdz4op",
    "loadNumber": "LD-R6GYRA-GIKR",
    "status": "draft",
    "dispatchStage": "pending",
    "customerRate": 1850,
    "carrierRate": 1500,
    "margin": 350,
    "marginPct": 18.92
  },
  "created": true
}

Keys

hkpt_ keys, and how far each one reaches

Create a key under Settings → API Keys and name it for where it will live. The full key is shown once. Send it in an Authorization: Bearer or X-Api-Key header.

  • Read-only by default. Dashboards and reporting syncs never need more.
  • Write is a choice. Only the account owner or an admin can create a write key.
  • Verifications are separate. The verifications:create scope is for company admins, because each one uses a credit and emails the carrier’s owner.
  • Keys expire. One year by default. You choose 30 days, 90 days, 1 year, 2 years or no expiry.
  • Revoking is immediate. A removed or suspended member’s keys are revoked too, so create integration keys from a long-lived account.

Outbound webhooks

We call you, and we sign it

Set a URL and a signing secret under Settings → Company controls → Webhooks & services. Tick the load events you want. Polling is optional.

verification_complete

A final status, or the final decision changed

verification_review_required

Still in progress, and it turned yellow

load.status_changed

Every status move

stop.arrived

A stop’s arrival was recorded, once per stop

stop.departed

A stop’s departure was recorded, once per stop

eta.changed

A stop’s first ETA, then whenever it moves 15 minutes or more

location

The truck’s position, at most one every 15 minutes per load

Each delivery carries X-Happytactic-Signature-V2, an HMAC-SHA256 of the timestamp and the raw body. Reject anything more than 300 seconds old.

A failed delivery retries after 1 minute, 5 minutes and 30 minutes, then every 30 minutes, 5 attempts in all. Answer 2xx quickly. Deduplicate load events on eventId, and verification events on verificationId plus decision.

Verify a delivery, Node.js
const crypto = require('crypto');
function verifyHappytactic(secret, headers, rawBody, now = Date.now()) {
  const parts = Object.fromEntries(String(headers['x-happytactic-signature-v2'] || '')
    .split(',').map((p) => p.split('=').map((s) => s.trim())));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Math.floor(now / 1000) - t) > 300) return false;
  const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return /^[a-f0-9]{64}$/.test(parts.v2 || '') &&
    crypto.timingSafeEqual(Buffer.from(expected, 'hex'), Buffer.from(parts.v2, 'hex'));
}

AI assistants connector

Run loads, carriers and invites from your assistant

Claude, ChatGPT, Cursor and Claude Code connect with your API key. 28 tools. Each load, carrier, customer and verification tool matches an API endpoint, with the same validation and limits.

Things you can type

  • Which of my loads deliver today?
  • Create a load for Prairie Harvest Foods, Columbus to Atlanta, Nov 4, dry van, $2,350.
  • Verify MC 1499417. The dispatcher is Angela Doss, (614) 555-0142.
  • Help me set up my account.

ChatGPT’s write tools depend on your ChatGPT plan and workspace settings. Start there with a read-only key.

Set it up: AI assistants guide
Key permissionLets the assistantWho can give it
ReadLook up loads, check calls, customers, carriers, verifications, today’s pickups and deliveriesAnyone
WriteCreate loads, change load statuses, add check callsOwner or admin
Create and start verificationsStart verifications. Each uses a credit and emails the carrier’s ownerOwner or admin
Set up my accountCompany details and defaults, customers and contacts, invite teammatesOwner or admin

Changelog

What changed lately

  1. v1.4.1 Nov 3, 2026

    Load answers no longer include tracking and driver check-in link secrets. Reference expanded with real response samples and more load filters and fields. New AI assistants page.

  2. v1.4.0 Oct 27, 2026

    POST /v1/verifications is back behind its own key permission. It runs the same path as New verification in the app. AI assistants can connect with the same keys.

  3. v1.3.0 Oct 16, 2026

    Idempotency-Key on POST /v1/loads. Webhook signature v2 with a timestamp. Load webhooks. API keys expire, 1 year by default.

Older versions are in the full changelog. Prefer connecting through a named product? See the integrations board.

Questions brokers ask

Answers for whoever writes the code.

What is the base URL?

https://api.happytactic.com/api/v1. JSON over HTTPS. The current version is v1.4.1, and the full reference with its changelog is at app.happytactic.com/docs/api.

How do I get an API key?

In the app, under Settings → API Keys. The full hkpt_ key is shown once, when you create it. Keys are read-only unless you allow write access, and only the account owner or an admin can create a write key. Starting verifications needs its own permission, for company admins only.

Can I start a carrier verification from my own system?

Yes. POST /api/v1/verifications takes an MC or DOT number and the dispatcher’s details, and runs the same path as New verification in the app: credit check, daily limit, checks and the owner’s emails. Each one uses a credit. Read the result with GET /api/v1/verifications/{id} or take the decision webhook.

What are the rate limits?

Each GET endpoint allows 120 requests a minute and each POST or PATCH endpoint 60, counted per user. Creating verifications is limited to 10 a minute. Every response carries X-RateLimit headers, and a 429 adds Retry-After.

How do I verify a webhook is from you?

Use X-Happytactic-Signature-V2. Parse t and v2, reject anything more than 300 seconds old, compute HMAC-SHA256 of the timestamp, a dot and the raw body with your secret, and compare in constant time. Retries are signed again with their own timestamp, 5 attempts in all.

Which AI assistants work with Happy Tactic?

Claude, ChatGPT, Cursor and Claude Code, using your API key. Other assistants that support remote tools can connect too. The AI assistants guide has the steps for each one.

What can’t an AI assistant do?

It can’t delete anything, change billing, your plan, payments or security settings, or make someone an admin. It can’t yet work with drivers, equipment, invoices, bills or settlements, read or upload documents, or send tenders. Starting a verification or inviting a teammate needs your yes first, and every change goes in your audit log with the key’s name.

Does the API work on the Hotshot plan?

Hotshot has no TMS, so load and customer endpoints return 403 for those keys. Verifications and carriers aren’t part of the TMS module. The same plan limits apply through the API as in the app.

Get a key. Make the first call.

API keys are in Settings once you’re in. Verification is on every plan, and the full TMS starts at Regional.