Examples
The five requests an integration actually makes
Issue a passport. Append an event. Sign a supplier claim. Verify one. Serve a scan. Most integrations are these five, repeated — everything else is mapping.
- Start with
- Issue + append
- Add later
- Signed claims
- Environment
- Sandbox first
Definition
What does a typical passport integration actually do?
Five operations, repeated. Issue a passport against a GS1 identifier. Append EPCIS 2.0 events as the product moves. Collect signed claims from suppliers. Verify a claim you were presented. And serve the public view when someone scans the data carrier on the product.
The volume is dominated by the first two. The difficulty is dominated by the third, which is a supplier relationship problem rather than a technical one.
01
Issue a passport
curl https://api.circuleid.com/v1/passports \
-H "Authorization: Bearer $CIRCULEID_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"gtin": "09506000134352",
"productGroup": "textiles",
"level": "model",
"record": {
"name": "Merino Crew Knit",
"materials": [
{ "name": "merino wool", "share": 0.82, "certification": "RWS" },
{ "name": "recycled polyamide", "share": 0.18 }
],
"carbonFootprint": { "value": 14.2, "unit": "kgCO2e", "method": "ISO 14067" }
}
}'02
Append a supply chain event
curl https://api.circuleid.com/v1/events \
-H "Authorization: Bearer $CIRCULEID_API_KEY" \
-d '{
"type": "ObjectEvent",
"action": "OBSERVE",
"eventTime": "2026-03-14T09:22:00+01:00",
"epcList": ["urn:epc:id:sgtin:0950600.013435.SN8817403"],
"bizStep": "urn:epcglobal:cbv:bizstep:commissioning",
"disposition": "urn:epcglobal:cbv:disp:active",
"bizLocation": { "id": "urn:epc:id:sgln:0950600.00001.0" }
}'03
Sign a supplier claim
curl https://api.circuleid.com/v1/credentials \
-H "Authorization: Bearer $SUPPLIER_API_KEY" \
-d '{
"type": "RecycledContentCredential",
"issuer": "did:web:mill.example.com",
"subject": "01/09506000134352",
"validUntil": "2027-03-14T00:00:00Z",
"claim": {
"material": "polyamide",
"recycledShare": 0.18,
"basis": "mass",
"chainOfCustody": "mass-balance"
}
}'04
Verify a claim you were presented
curl https://api.circuleid.com/v1/credentials/verify \
-H "Authorization: Bearer $CIRCULEID_API_KEY" \
-d '{ "credential": { /* the credential as presented */ } }'
# {
# "verified": true,
# "issuer": "did:web:mill.example.com",
# "issuedAt": "2026-03-14T09:31:02Z",
# "status": "active" # "revoked" fails verification
# }05
Serve a scan
# What the phone requests when a consumer scans the carrier:
curl https://id.circuleid.com/01/09506000134352 \
-H "Accept: application/json"
# A browser gets the rendered public passport instead.
# A verified recycler presenting a credential gets the treatment tier
# from the same URL — the resolver decides, not the caller.Patterns
Where each one usually lives
Issuing pipeline
A scheduled job reading PLM and issuing passports for the next production run.
Event ingestion
A service translating WMS and MES messages into EPCIS events as they occur.
Supplier portal
Where tier-two suppliers submit and sign the claims you cannot assert yourself.
Storefront
Reading the public tier to show substantiated sustainability data on a listing.
The carrier itself
No code of yours at all — the resolver serves the scan directly.
Take-back intake
Reading the treatment tier at a returns or recycling facility line.
Answers
Frequently asked questions
Which example should I start from?
Issuing a passport, then appending an event. Those two cover the majority of an integration’s traffic and force you to settle the identity model — model, batch or item — which is the decision everything else depends on and the hardest one to change later.
Do I need to handle credentials on day one?
No. A passport with unsigned data is still a working passport; it simply cannot demonstrate who asserted each figure. Most programmes issue first and add signed supplier claims as suppliers onboard, which is also the order supplier engagement realistically allows.
What does the consumer actually receive from a scan?
The public tier of the passport, resolved from the GS1 Digital Link identifier in the carrier, rendered as a page for a browser or returned as JSON to a system that asks for it. No authentication, no account, and no profile of the person scanning.
Can we test without touching production?
Yes. Sandbox keys resolve against a separate hostname, and sandbox passports behave exactly like production ones. Because a production passport is a long-lived public artefact, the separation is enforced rather than conventional — a sandbox key simply cannot reach production.
Next step
Run the first two against a sandbox key
Issue one passport and append one event. That is enough to settle the identity model, which is the decision everything else rests on.