Post the event.
The door does the rest.
An EPCIS 2.0 capture gateway that validates every event against GS1's own schema, stamps who captured it, hashes it by the standard, and can only ever append. The same door for people and for agents.
Build state, 29 July 2026. The capture gateway is written and its conformance tests pass against GS1's normative artefacts. Nothing is hosted yet: there is no public endpoint, no key to hold, and no account to open. Everything on this page that is not yet built is written in the future tense, and the full ledger is at What ships today.
The interface, and what the door does to what you send.
You POST an EPCIS 2.0 document. The gateway validates it against GS1's official JSON schema, strips the fields it is going to stamp, stamps them, computes the standard event hash, and appends. A capture that does not validate is refused as problem+json carrying the standard's own exception types.
curl -X POST https://epcis.dev/capture \
-H 'authorization: Bearer <capture-key>' \
-H 'content-type: application/json' \
--data @object-event.json
202 Accepted
location: /capture/{captureID}
{ "eventIDs": [ "ni:///sha-256;abc…?ver=CBV2.0" ] }
Implemented and under test. Today the interface answers on your own machine under wrangler dev; the hosted door is on the roadmap, and the way to be first through it is a capture key.
Eight laws, not eight features.
The gateway underneath epcis.dev is written, and these are the parts that cannot be renegotiated later. The developer contract is that they hold on every capture.
-
01
Conforms to EPCIS 2.0 and CBV 2.0.
Implemented against GS1's official OpenAPI description, pinned by digest and re-checked in CI.
-
02
Validated on every capture.
Each event is machine-checked against the official GS1 EPCIS 2.0 JSON schema before it is accepted. A capture that does not validate is refused as RFC 7807 problem+json, carrying the standard's own exception types — not a vendor error string.
-
03
Stamped by the gateway, not the sender.
recordTime, spine:capturedBy and spine:attestationGrade are applied at the door. Whatever you sent in those fields is stripped. The scriber is not the part being scribed.
-
04
Identified by the standard's own hash.
The standardized EPCIS event hash from CBV 2.0 §8.9, with GS1 Digital Link normalisation, checked against the pinned reference vectors — so the same event captured twice is the same event, and a changed event is a different one.
-
05
Append-only, by construction.
No service identity anywhere holds an UPDATE or DELETE grant; the write path has exactly one writer. You can add an event. You cannot un-write one.
-
06
Minimally scoped on read.
You see your own scope. What is outside it is absent, not greyed out and not redacted — there is no shape left behind to argue about.
-
07
Ten years of vendor XML, translated.
EPCIS 1.1, 1.2 and 2.0 XML in; EPCIS 2.0 JSON-LD out; a round-trip fidelity report per job, so the translation is reviewable rather than trusted.
-
08
One door for people and for agents.
The same interface and the same key over MCP, so a partner's logistics agent captures and queries without a human copying values between two systems.
All of the above is implemented and under test today. None of it is hosted yet. The executive lens on the same spine is visibility.cloud.
Two grains, and the door owns both.
Every event carries two attributions, and neither is the caller's to assert. who is the attested observer — a human, an agent, or an embodied agent. capturedBy is the warrantor: the account whose key opened the door. The party and org grain is derived from grant chains at read time, never stamped in.
"spine:capturedBy": "acct:acme-3pl", // the key that posted
"who": "did:agent:router-7", // attested observer
"spine:attestationGrade": "key", // how strongly, graded
"recordTime": "2026-07-29T14:20:07Z" // the door clock
Whatever you send in those fields is stripped and replaced. Identity resolution and attestation are on the roadmap; the envelope is already shaped for them, but nothing resolves a GS1 Digital Link to a party today, and this page will not pretend otherwise.
$0 per event. It stays that way.
Not a trial. Not a tier. Not a meter you watch. The allowance is abuse governance, never a bill.
Recording an event will never cost money. That is a policy, not an introductory price, and it holds because the cost structure underneath capture is object storage and a catalogue, which is cheap enough to carry permanently. It will never appear in the interface as a counter.
Revenue attaches to answers, at the human door on the executive side: traces, custody evidence, exception review, partner grants, seats, retention. The capture door stays free, because an event stream that charges per event is one you stop feeding the month the bill grows with volume.
Prices are not published yet, because nothing is hosted yet. When they are set they will be published, as numbers, on a page, without a call.
Ten years of vendor XML, translated.
EPCIS 1.1, 1.2 and 2.0 XML goes in; EPCIS 2.0 JSON-LD comes out; and a round-trip fidelity report comes with every job, so the translation is something you review rather than something you trust. CBV migration and extension unwrapping are handled by a zero-dependency, namespace-aware parser.
curl -X POST https://epcis.dev/translate \
-H 'authorization: Bearer <capture-key>' \
-H 'content-type: application/xml' \
--data @legacy-1.2.xml
200 OK → EPCIS 2.0 JSON-LD + a per-job fidelity report
What ships today, and what does not.
Implemented and under test
- EPCIS 2.0 capture and query interfaces, against the pinned official OpenAPI
- Validation against the official GS1 EPCIS 2.0 JSON schema, on every capture
- Gateway stamping, with caller-supplied values stripped
- An MCP door: capture / query / get_event / trace_epc / translate as tools
Not built — future tense everywhere on this site
- A hosted, public endpoint. There is no live door at this domain or any other
- Issued capture keys. There is no key to hold yet
- Identity resolution and attestation (nothing resolves a GS1 Digital Link to a party today)
- Users. There are none, and there are no logos, quotes or numbers on this site
Four lines from each column. The ledger in full, dated, is a page of its own.
Who builds this.
epcis.dev is built by someone who sat on the GS1 EPCIS 2.0 and CBV 2.0 committees while the standard this gateway conforms to was being written, and who commissioned the open-source epcis2.js SDK that a good deal of the ecosystem still uses.
That is stated as background, not as endorsement. GS1 has not reviewed, certified or approved this project, and nothing here should be read as a GS1 position. What it buys you is a straightforward contract: the standard is implemented as written, its exception types and its event hash included, and where we have made a choice the standard leaves open, we will say so.
epcis.dev is stewarded under The Org.AI Foundation.
Get a capture key.
There is no hosted door to open yet, and we would rather say that here than after you have filled in a form. When the first hosted capture is live, the people who asked for a key are told first, and told once.