Why we care so much about terminal data
We moved containers before we wrote any code. The company started because we were doing drayage for customers out of Oakland and Virginia. That meant refreshing terminal websites at six in the morning to find out if a box had cleared. It meant sending a driver for a container that turned out to be on a customs hold, and eating the trip. It meant finding out about a last free day the day after it passed. Nobody sells you demurrage. You just get a bill. So when we built the API, terminal data was not a feature we added later to look competitive. It was the entire reason. Holds, fees, last free day, whether the box can actually be picked up right now: that is the data that decides whether your week is expensive, and most tracking APIs still do not return it. If you have ever had to explain a demurrage invoice to a customer, you already understand why this page exists.Pick your current provider
SeaRates
Poll-based ocean tracking. Move from
api_key query params and custom JSON to JSON:API and webhooks.project44
Enterprise multi-modal visibility. Focus on the ocean shipments and swap in HMAC-signed webhooks.
FourKites
Multi-modal visibility. Replace the ocean feed with direct carrier and terminal integrations.
Vizion
Reference IDs and webhook events. Map subscriptions onto tracking requests.
OpenTrack
Ocean tracking API with a similar model. Mostly a rename of concepts you already know.
ShipsGo
Ocean tracking and analytics. Swap the polling loop for webhooks and normalize event codes.
GoComet
Shipment-centric multi-modal tracking. Move to JSON:API and per-container events.
Beacon
Supply chain visibility. Replace shipment-level polling with per-container webhooks.
What every migration has in common
1
Self-serve an API key
Create an account at app.terminal49.com and generate a key at app.terminal49.com/developers/api-keys. The free Developer Key tracks up to 10 active containers, enough for a parity test. No call required.
2
Register tracking requests once
POST /v2/tracking_requests per BOL, booking, or container. We poll the carrier, terminal, and rail sources on your behalf.3
Receive updates via webhook
Subscribe to the events you act on. 30+ events, HMAC-signed, delivered as changes happen. Polling stays available if you prefer it.
4
Wire up the operational fields
Holds, fees, last free day, release readiness. These are the reason to migrate rather than port like for like.
The fields that change how your week goes
Terminal holds
holds_at_pod_terminal lists what is actually blocking the box (customs, freight, USDA, VACIS, TMF) with status and the terminal’s own description. Know before you dispatch a truck.Terminal fees
fees_at_pod_terminal returns type, amount, and currency for demurrage, exam, and dwell fees, straight from the terminal. The number on the invoice, before the invoice.Last free day
pickup_lfd, broken out by shipping line, terminal, and rail, because they disagree and the difference is money. Each source has its own webhook event.Release readiness
available_for_pickup plus the holds array answers “can I actually pick this up right now?” in a single call.We are building a network, not a data feed
Visibility on its own does not move a container. The people who move it have to be able to see the same thing you do. That is why the dashboard is free for truckers. Your drayage partner should not need a license to see the last free day on a box they are picking up for you. And it is free for small importers and exporters: a company moving a handful of containers a month should not have to buy enterprise software to avoid a demurrage bill. We do not make money on those accounts. We make money when the whole chain runs better, because that is when the people with volume stay. Most tracking APIs sell one company a window into their own freight. We are trying to get everyone touching the container looking at the same record.We are not stopping at North America
Our terminal-level data (holds, fees, LFD, availability, FIRMS codes) is deepest across the US and Canada. That is honest, and if you are tracking Asia-to-Europe today it is a real limitation you should weigh. The coverage pages tell you exactly which sources return which fields. But North America is where we started, not where we are stopping. Ocean carrier milestones already work globally. Terminal integrations outside North America are in progress right now, and the coverage changelog is where they show up as they go live, not in a press release. The goal has never been a regional product. It is one common record for a container wherever it happens to be.When something breaks, you get someone who has done the job
Support is not a ticket queue that reads your message back to you. The people you reach have chased chassis, argued with terminals, and paid demurrage they did not see coming. When you say the terminal is showing something different from the carrier, you will not have to explain what that means. If a mapping in these guides is wrong or thin, tell us. We would rather fix the page than have you build around it.The core API shape, once
Wherever you are coming from, the request pattern is the same.Create a tracking request
We use
Authorization: Token <key>, not Bearer. Content type is application/vnd.api+json (JSON:API). Responses include data, relationships, and an included array.Migrate with an AI coding agent
Every provider page carries a copyable prompt that walks an AI coding assistant through a side-by-side migration: stand up a Terminal49 client next to your current provider, shadow every call, diff the responses, and cut over only once parity is proven. The prompts are opinionated about small PRs and reference the mappings on each page, so give your agent the page URL as context.Start somewhere
Coverage
Carriers, terminals, rail, and per-field availability, including the gaps
API reference
Every endpoint, with request and response schemas
Test numbers
Simulate success, failure, and edge cases before you cut over
Send us your list
Give us your active containers and BOLs and we will load them, so you skip the backfill