---
title: "Capture EPCIS 2.0 events."
method: POST
path: "/api/v1/epcis/capture"
tags: ["EPCIS"]
---

# Capture EPCIS 2.0 events.

`POST /api/v1/epcis/capture`

## Request

- Base URL: `https://app.tracepass.eu`
- URL: `https://app.tracepass.eu/api/v1/epcis/capture`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.tracepass.eu/api/oauth/authorize`, token URL `https://app.tracepass.eu/api/oauth/token`, scopes: `passports:write`)

The EPCIS 2.0 Capture interface. Accepts an `EPCISDocument`,
an `EPCISQueryDocument`, a bare event, or a bare array of
events as JSON-LD. Each event is validated, its EPCs resolved
to passports, and stored.

Responds `202 Accepted` with a `captureJobId` — poll
`GET /api/v1/epcis/capture/{id}` for the per-event outcome.

EPCIS capture is a paid add-on; a tenant without it gets
`403 epcis_capture_not_available`. Counts as one v1 write.
Idempotent: send an `Idempotency-Key` header, and each event's
own EPCIS `eventID` is also deduped.

## Headers

- `Idempotency-Key` string

## Response `202`

Capture job accepted.

- EpcisCaptureResult: The 202 response from the EPCIS Capture interface.
  - `captureJobId` string: Poll GET /api/v1/epcis/capture/{id} with this id.
  - `status` 'success' | 'failed'
  - `eventCount` integer: Events found in the submitted payload.
  - `capturedCount` integer: Events actually stored (after idempotency dedup).
  - `errors` object[]
    - `index` integer
    - `message` string

## Other responses

- `401`: Missing or invalid API key.
- `402`: Billing not in good standing (past due, unpaid or cancelled), or the plan's monthly EPCIS event quota is reached (epcis_events_hard_block / epcis_events_overage_required).
- `403`: EPCIS capture add-on not enabled.

---

[API](https://skmtc.dev/tracepass/apis/tracepass-api.md) · [All operations](https://skmtc.dev/tracepass/apis/tracepass-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracepass/apis/tracepass-api/revisions/60ddeb25638b?raw)
