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
Your first call
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.

Three ways, one key
# 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.

Every response reports where you stand
"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"
}
GET/tracking

Tracking by any number

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredContainer 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`).
sealinestringoptionalStandard 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.
typestringoptionalType 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_updatebooleanoptionalObtaining 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!
routebooleanoptionalIf 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!
aisbooleanoptionalIf 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.
Request
curl "https://traqocontainer.com/api/searates/tracking?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"
Response 200
GET/containerdeprecated upstream

Tracking by container

SeaRates marked this deprecated in favour of GET /tracking. It works here because long-standing clients still call it.

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredContainer number
sealinestringoptionalStandard 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_updatebooleanoptionalObtaining 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!
routebooleanoptionalIf 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!
aisbooleanoptionalIf 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.
Request
curl "https://traqocontainer.com/api/searates/container?api_key=YOUR_API_KEY&number=MRKU7181100"
Response 200
GET/referencedeprecated upstream

Tracking by B/L

SeaRates marked this deprecated in favour of GET /tracking. It works here because long-standing clients still call it.

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredBill of lading or booking number
typestringoptionalType 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.
sealinestringoptionalStandard 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_updatebooleanoptionalObtaining 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!
routebooleanoptionalIf 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!
aisbooleanoptionalIf 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.
Request
curl "https://traqocontainer.com/api/searates/reference?api_key=YOUR_API_KEY&number=HLCUXM1230445340&type=BL"
Response 200
GET/route

Route information

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredContainer 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`).
typestringrequiredType of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number
sealinestringrequiredStandard Carrier Alpha Code (SCAC). A list of supported lines can be obtained from the following API - see GET /info/sealines
Request
curl "https://traqocontainer.com/api/searates/route?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL&sealine=maeu"
Response 200
GET/info/sealines

Shipping lines info

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
Request
curl "https://traqocontainer.com/api/searates/info/sealines?api_key=YOUR_API_KEY"
Response 200
GET/history

Historical data

Query parameters

ParameterTypeRequiredDescription
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredContainer 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`).
typestringrequiredType of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number
sealinestringoptionalStandard 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.
Request
curl "https://traqocontainer.com/api/searates/history?api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"
Response 200
GET/history

Historical data by id

Query parameters

ParameterTypeRequiredDescription
idintegerrequiredUnique request ID. Use GET /history to get a list of request id for the required shipping
api_keystringrequiredYour API key. Create one in Dashboard → Developer.
numberstringrequiredContainer 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`).
typestringrequiredType of shipment number `CT` - Container number `BL` - Bill of lading number `BK` - Booking number
sealinestringoptionalStandard 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.
Request
curl "https://traqocontainer.com/api/searates/history?id=63242703&api_key=YOUR_API_KEY&number=MRKU7181100&type=BL"
Response 200

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.

messagestatusHTTPmeans
OKsuccess200200
NO_CONTAINERSsuccess200200
NO_EVENTSsuccess200200
SEALINE_CANCELED_SHIPMENTsuccess200200
WRONG_NUMBERerror200400
WRONG_TYPEerror200400
WRONG_PARAMETERSerror200400
WRONG_SEALINEerror200400
SEALINE_HASNT_PROVIDE_INFOerror200404
SEALINE_NO_RESPONSEerror200502
SEALINE_NOT_SUPPORTEDerror200400
API_KEY_WRONGerror200401
API_KEY_ACCESS_DENIEDerror200403
API_KEY_EXPIREDerror200402
API_KEY_LIMIT_REACHEDerror200402
API_KEY_RATE_LIMITerror200429
UNEXPECTED_ERRORerror200500

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 as BK. 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. ais is accepted and ignored, and route_data.ais is never present.
  • vessel.call_sign and vessel.flag — present, always null. Our carrier feed does not send them, and an empty field beats a guess.
  • /info/sealines optional fields — each line carries name and scac_codes. active, active_types, maintenance and prefixes are absent: we do not hold them per carrier, and a key we omit says "unknown" where false would say something we never learned. Filter on presence in the list, not on active.

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.