Tracking API
SeaRates-compatible Container Tracking
A drop-in for the SeaRates Container Tracking API. Same URL shape, same response body — change the host and the key, and nothing else in your client.
- Base URL
https://traqocontainer.com/api/searates- Transport
- HTTPS only
- Content type
application/json- Spec
- OpenAPI 3.1.0 · API v3.0
curl "https://traqocontainer.com/api/searates/tracking?number=CAIU7227174&type=CT&api_key=YOUR_API_KEY"Specification and collection
These are SeaRates' own documents with the server URL swapped, so an existing SDK, Postman collection or Swagger client re-points and works unchanged.
Authentication
Your existing Traqo API key, from Dashboard → Developer. Nothing new is issued. Send it whichever way your client already sends it — all three are accepted.
A key in a query string is logged by proxies and kept in browser history. It is accepted so a SeaRates client needs no code change; prefer a header where you can choose.
# 1. query parameter — what SeaRates clients send by default
curl "https://traqocontainer.com/api/searates/tracking?number=CAIU7227174&type=CT&api_key=YOUR_API_KEY"
# 2. header
curl -H "X-API-KEY: YOUR_API_KEY" "https://traqocontainer.com/api/searates/tracking?number=CAIU7227174"
# 3. bearer — what /developer documents for the v1 API
curl -H "Authorization: Bearer YOUR_API_KEY" "https://traqocontainer.com/api/searates/tracking?number=CAIU7227174"Rate limits and allowance
These endpoints are the same product as the v1 API, reached a different way. The same key, plan, shipment allowance, cache and per-key rate limit — tracking the same box on both surfaces spends one slot, not two.
api_calls.used is your calls this calendar month. total and remaining are null: there is no monthly call allowance to report here. What is enforced is a per-minute rate limit — 120 a minute unless your plan says otherwise — and your own number rides every response as X-RateLimit-Limit, -Remaining and -Reset. Every endpoint spends from it, /info/sealines and /history included, and every endpoint needs developer mode enabled on your account. unique_shipments is your real shipment allowance, add-ons included.
A stored document is served for 12 hours before we re-fetch. force_update=true goes to the carrier inside that window — it skips the wait, not the limits. The daily cap on live re-fetches of one reference still applies, and if the daily upstream allowance is spent we return what we hold with from_cache: true rather than an error over data we already have. updated_at is always the time of the fetch the body came from.
When we could not reach the carrier at all and served a document we already held, data.metadata gains two more keys beside from_cache: true: stale_reason — why we could not fetch — and last_synced_at, when we really did last get it from the line. They are absent on an ordinary cache hit, which is what from_cache on its own already means.
"metadata": {
"api_calls": { "total": null, "used": 312, "remaining": null },
"unique_shipments": { "total": 100, "used": 41, "remaining": 59 },
"from_cache": true,
"updated_at": "2026-09-08 21:00:25",
"cache_expires": "2026-09-09 09:00:25"
}/trackingTracking by any number
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Container number, Bill of Lading or Booking number. For certain sealines, tracking is supported using a combined number in the format `Bill of Lading Number/Container Number` or `Booking Number/Container Number` (e.g., `BL12345678/ABCU1234567` or `BK12345678/ABCU1234567`). |
sealine | string | optional | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines If this parameter is empty or equal to auto or not represented at all in the query, we will try to determine the shipping line automatically. |
type | string | optional | Type of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number If this parameter will be empty or not presented at all in the query, we will try to determine the type of shipment number. |
force_update | boolean | optional | Obtaining data directly from the shipping line or from a cache with minimal retention time. If this parameter is set to true, the execution time of the request may be longer! |
route | boolean | optional | If you need detailed route data, then set this parameter to true. If this parameter is set to true, the execution time of the request may be longer! |
ais | boolean | optional | If you need AIS data by vessel - set this parameter to true. This parameter is taken into account only when the "route" parameter in the query parameters is true. If this parameter is set to true, the execution time of the request may be longer! Accepted and ignored here — we hold no AIS, and route_data.ais is never returned. |
curl "https://traqocontainer.com/api/searates/tracking?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"/containerdeprecated upstreamTracking by container
SeaRates marked this deprecated in favour of GET /tracking. It works here because long-standing clients still call it.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Container number |
sealine | string | optional | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines If this parameter is empty or equal to auto or not represented at all in the query, we will try to determine the shipping line automatically. |
force_update | boolean | optional | Obtaining data directly from the shipping line or from a cache with minimal retention time. If this parameter is set to true, the execution time of the request may be longer! |
route | boolean | optional | If you need detailed route data, then set this parameter to true. If this parameter is set to true, the execution time of the request may be longer! |
ais | boolean | optional | If you need AIS data by vessel - set this parameter to true. This parameter is taken into account only when the "route" parameter in the query parameters is true. If this parameter is set to true, the execution time of the request may be longer! Accepted and ignored here — we hold no AIS, and route_data.ais is never returned. |
curl "https://traqocontainer.com/api/searates/container?api_key=YOUR_API_KEY&number=MRKU7181100"/referencedeprecated upstreamTracking by B/L
SeaRates marked this deprecated in favour of GET /tracking. It works here because long-standing clients still call it.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Bill of lading or booking number |
type | string | optional | Type of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number If this parameter will be empty or not presented at all in the query, we will try to determine the type of shipment number. |
sealine | string | optional | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines If this parameter is empty or equal to auto or not represented at all in the query, we will try to determine the shipping line automatically. |
force_update | boolean | optional | Obtaining data directly from the shipping line or from a cache with minimal retention time. If this parameter is set to true, the execution time of the request may be longer! |
route | boolean | optional | If you need detailed route data, then set this parameter to true. If this parameter is set to true, the execution time of the request may be longer! |
ais | boolean | optional | If you need AIS data by vessel - set this parameter to true. This parameter is taken into account only when the "route" parameter in the query parameters is true. If this parameter is set to true, the execution time of the request may be longer! Accepted and ignored here — we hold no AIS, and route_data.ais is never returned. |
curl "https://traqocontainer.com/api/searates/reference?api_key=YOUR_API_KEY&number=HLCUXM1230445340&type=BL"/routeRoute information
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Container number, Bill of Lading or Booking number. For certain sealines, tracking is supported using a combined number in the format `Bill of Lading Number/Container Number` or `Booking Number/Container Number` (e.g., `BL12345678/ABCU1234567` or `BK12345678/ABCU1234567`). |
type | string | required | Type of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number |
sealine | string | required | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines |
curl "https://traqocontainer.com/api/searates/route?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL&sealine=maeu"/info/sealinesShipping lines info
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
curl "https://traqocontainer.com/api/searates/info/sealines?api_key=YOUR_API_KEY"/historyHistorical data
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Container number, Bill of Lading or Booking number. For certain sealines, tracking is supported using a combined number in the format `Bill of Lading Number/Container Number` or `Booking Number/Container Number` (e.g., `BL12345678/ABCU1234567` or `BK12345678/ABCU1234567`). |
type | string | required | Type of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number |
sealine | string | optional | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines If this parameter is empty or equal to auto or not represented at all in the query, we will try to determine the shipping line automatically. |
curl "https://traqocontainer.com/api/searates/history?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"/historyHistorical data by id
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | integer | required | Unique request ID. Use GET /history to get a list of request id for the required shipping |
api_key | string | required | Your API key. Create one in Dashboard → Developer. |
number | string | required | Container number, Bill of Lading or Booking number. For certain sealines, tracking is supported using a combined number in the format `Bill of Lading Number/Container Number` or `Booking Number/Container Number` (e.g., `BL12345678/ABCU1234567` or `BK12345678/ABCU1234567`). |
type | string | required | Type of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number |
sealine | string | optional | Standard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines If this parameter is empty or equal to auto or not represented at all in the query, we will try to determine the shipping line automatically. |
curl "https://traqocontainer.com/api/searates/history?id=63242703&api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"Response statuses
Every response is HTTP 200, including every refusal — SeaRates answer this way and their OpenAPI document declares exactly one response on all seven operations. message is the enum you branch on. Four values ride on status: "success": they are real answers about a real shipment, not failures. Every error also carries detail, our own sentence about the cause, in a field SeaRates do not define and any client will ignore.
The means column is what the refusal would be on a REST-shaped API. We do not send it — it is what we record, and it tells you whose problem a refusal is: the 4xx rows are yours to fix, the 5xx rows are ours or a carrier's. The one status that is not 200 is 405, for a verb other than GET, which never reaches an endpoint at all.
| message | status | HTTP | means |
|---|---|---|---|
OK | success | 200 | 200 |
NO_CONTAINERS | success | 200 | 200 |
NO_EVENTS | success | 200 | 200 |
SEALINE_CANCELED_SHIPMENT | success | 200 | 200 |
WRONG_NUMBER | error | 200 | 400 |
WRONG_TYPE | error | 200 | 400 |
WRONG_PARAMETERS | error | 200 | 400 |
WRONG_SEALINE | error | 200 | 400 |
SEALINE_HASNT_PROVIDE_INFO | error | 200 | 404 |
SEALINE_NO_RESPONSE | error | 200 | 502 |
SEALINE_NOT_SUPPORTED | error | 200 | 400 |
API_KEY_WRONG | error | 200 | 401 |
API_KEY_ACCESS_DENIED | error | 200 | 403 |
API_KEY_EXPIRED | error | 200 | 402 |
API_KEY_LIMIT_REACHED | error | 200 | 402 |
API_KEY_RATE_LIMIT | error | 200 | 429 |
UNEXPECTED_ERROR | error | 200 | 500 |
Retry-After is sent, in seconds, on the four refusals worth waiting out — a 200 may carry the header. API_KEY_LIMIT_REACHED and API_KEY_EXPIRED send 3600, and both mean stop retrying and fix billing: the call cannot succeed until you do. API_KEY_RATE_LIMIT and SEALINE_NO_RESPONSE send a real number of seconds. API_KEY_ACCESS_DENIED means developer mode is off on your account — turn it on in your dashboard settings.
SEALINE_NO_RESPONSE is the carrier, not us. When one line is down rather than the whole provider, data.metadata.sealine names it and detail says so — track the reference with a different carrier, or wait.
Differences from SeaRates
Everything else is their shape. These are not, and each is deliberate:
GET /history— one entry per call, as SeaRates count them, and?id=returns the document that call was answered with. It starts where our request logging does: calls made before this surface began writing access-log rows were never recorded, so an older reference has a list shorter than its age. The documents are all still there — the early calls are not countable, and dating them by guesswork would be worse than a short list.type=BK— accepted, and answered asBK. A booking is looked up through the bill-of-lading path, which is what our carrier feed accepts, so a line that resolves bookings only on a booking-typed lookup may report nothing found.- AIS — we hold no vessel positions from AIS.
aisis accepted and ignored, androute_data.aisis never present. vessel.call_signandvessel.flag— present, alwaysnull. Our carrier feed does not send them, and an empty field beats a guess./info/sealinesoptional fields — each line carriesnameandscac_codes.active,active_types,maintenanceandprefixesare absent: we do not hold them per carrier, and a key we omit says "unknown" wherefalsewould say something we never learned. Filter on presence in the list, not onactive.
Not a difference: absent is not null
A truck leg has no vessel key and an event the carrier never dated has no date key. SeaRates send the same — their published examples omit vessel on every leg without one. It is written down here because it disagrees with their SCHEMA, which types both as non-nullable, not because it disagrees with them. A field they always send and we cannot fill is null instead, as above. Nothing is invented either way.
Which carriers
GET https://traqocontainer.com/api/searates/info/sealines returns the live list. It is the same list the rest of the product answers carrier questions from, so it is never out of step with what we can actually track.