Changelog
ITS API
AfCFTA ITS API changes
What changed in the contract an integrator builds against: the eTD API, the notification feed, the public verification and tracking routes, the reference-data reads, the signing keys, the error catalogue, and the partner contract a State Party's own systems implement. Newest first.
1.0.0 (2026-09)
The first published version of the integrator contract.
The eTD API, version 1
POST /api/v1/etdissues an electronic Transit Declaration. The request is grouped by the sections of the adopted TD form, and the serial number and commodity numbers are assigned by ITS, never sent.- Reads:
GET /api/v1/etd/{serial_no}for the current version, or an earlier one withversionoras_of; the paged list atGET /api/v1/etdwithpage-number,page-sizeandfilter; the printed declaration atGET /api/v1/etd/{serial_no}/pdf; andGET /api/v1/etd/scopefor the countries your credential may act for. - Amendment is
POST /api/v1/etd/{serial_no}/versions: a whole-document new version, guarded byIf-Match, with a reason and an idempotency key. - The lifecycle acts
DEPART,EXIT,ARRIVEandDISCHARGEare stamps, atPOST /api/v1/etd/{serial_no}/endorsements/{stamp_type}, by the country whose turn it is.POST /api/v1/etd/{serial_no}/cancelwithdraws a declaration before any exit is stamped. - Supporting documents are uploaded to and downloaded from
/api/v1/etd/{serial_no}/attachments. - Deliveries are acknowledged with
POST /api/v1/etd/{serial_no}/deliveries/ack, andGET /api/v1/etd/reconciliation/digestis the backstop for anything missed. GET /api/v1/notificationsis the notification feed, for an organisation that reads rather than registering an endpoint to be called.GET /api/public/verify/{code}answers whether a printed declaration is genuine, andGET /api/public/track/{serial_no}with theX-Party-Tinheader lets the declarant or the consignee follow a consignment. Neither needs an account.GET /.well-known/jwks.jsonpublishes the public document-signing keys, retired keys included, so a declaration signed before a key rotation stays verifiable.GET /api/v1/error-cataloguelists every error code the service returns, with its English message and HTTP status.
Lifecycle v5
- Every country performs the same three acts. The departure country registers, departs and exits;
a transit country arrives, departs and exits; the destination arrives and discharges. The state
machine loops once per country:
REGISTERED,DEPARTED,IN_TRANSIT,ARRIVED, and the terminalDISCHARGEDandCANCELLED. - v5 adds one step,
IN_TRANSITtoDISCHARGED, which only ITS fires. It closes a transit whose destination is not on ITS once the authorised transit time has run out. That closure is recorded asSYSTEM_DESTINATION_NOT_ONBOARDEDand is not evidence that the goods arrived. Attempting it yourself isBUS-ETD-085. - Coming from lifecycle v4:
RECORD_DEPARTURE_EXITandRECORD_ARRIVALbecameDEPART,EXITandARRIVE, the stateEXITEDbecameDISCHARGED, and every act now fires a transition.
Retired error codes
These numbers are never reused, so an old log holding one still means what it meant.
VAL-ETD-011was an ambiguous customs stamp time. The stamp-time field is gone: ITS records when it received each stamp from its own clock.VAL-ETD-031was an unreadable list cursor. The list pages by number now, andcursorandlimitare no longer read.VAL-ETD-032was more than 100 serials in onePOST /api/v1/etd/batch. That endpoint is gone: filter the list withserial_no@@instead, where more than 100 serials isVAL-ETD-034.
Partner contract v1 to v3
The partner contract is what a State Party's systems expose for ITS to call. Its version is recorded per country, so v1, v2 and v3 peers work side by side and upgrading is one country at a time.
- v1:
GET /v1/tracking/{e_seal_id}for a cargo tracking system, andGET /v1/guarantee/{reference}for a guarantee platform. - v2 adds
POST /v2/etd/notifications: ITS tells a national customs system that a declaration it has an interest in has a new version. - v3 adds two reads for cargo tracking systems, for the corridor-wide live view:
POST /v3/tracking/positionsfor many seals at once, andGET /v3/tracking/{e_seal_id}/historyfor the track over a window. There is deliberately no push: ITS stores no positions, so it asks and you answer.