Ingest usage events

Send usage events for billing. Accepts a single event or a batch of up to 1000 events. **Single event:** Send the event object directly in the request body. **Batch:** Wrap events in an `events` array. Events are matched to meters by `name` (event name) or `meter_id`. At least one of `customer_id`, `external_customer_id`, or `subscription_id` is required. **Idempotency:** provide `idempotency_key` per event. The key is unique per merchant forever; repeats return `duplicate` and do not create another billable event. **Attribution:** prefer `external_customer_id` when your system owns customer identifiers. Unknown external IDs fail fast instead of creating orphan usage. **Currency:** each subscription has one currency. Usage attributed to that subscription is interpreted in that currency; RevKeen does not perform FX conversion in the metering layer. --- **Related endpoints** - `GET /usage-events` — Query usage events - `POST /usage-events/dry-run` — Dry-run usage events - `GET /usage-events/aggregate/{meterId}` — Get aggregated usage **Common errors** - `400 invalid_request` — malformed payload or failed validation. - `401 authentication_error` — missing, invalid, expired, or revoked credential. Codes: `authentication_failed`, `invalid_api_key`, `expired_api_key`, `api_key_revoked`, `session_invalid`, `merchant_required`. Carries a `WWW-Authenticate: Bearer` challenge. **Idempotency** Pass an `Idempotency-Key` header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see [the idempotency guide](/docs/fundamentals/idempotency).

POST
/usage-events

Send usage events for billing. Accepts a single event or a batch of up to 1000 events.

Single event: Send the event object directly in the request body. Batch: Wrap events in an events array.

Events are matched to meters by name (event name) or meter_id. At least one of customer_id, external_customer_id, or subscription_id is required.

Idempotency: provide idempotency_key per event. The key is unique per merchant forever; repeats return duplicate and do not create another billable event.

Attribution: prefer external_customer_id when your system owns customer identifiers. Unknown external IDs fail fast instead of creating orphan usage.

Currency: each subscription has one currency. Usage attributed to that subscription is interpreted in that currency; RevKeen does not perform FX conversion in the metering layer.


Related endpoints

  • GET /usage-events — Query usage events
  • POST /usage-events/dry-run — Dry-run usage events
  • GET /usage-events/aggregate/{meterId} — Get aggregated usage

Common errors

  • 400 invalid_request — malformed payload or failed validation.
  • 401 authentication_error — missing, invalid, expired, or revoked credential. Codes: authentication_failed, invalid_api_key, expired_api_key, api_key_revoked, session_invalid, merchant_required. Carries a WWW-Authenticate: Bearer challenge.

Idempotency

Pass an Idempotency-Key header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see the idempotency guide.

x-api-key<token>

Your RevKeen merchant API key. Create and manage keys in Dashboard → Settings → Developer. Use rk_sandbox_* for staging/test and rk_live_* for production. The same key may be sent as Authorization: Bearer <key> if that suits your HTTP client better. A missing, invalid, expired, or revoked key returns 401 with a WWW-Authenticate: Bearer challenge; a valid key without the required scope returns 403.

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Usage event ingest request. Send either one usage event object directly, or wrap up to 1000 events in an events array.

A single usage event representing customer consumption of a metered resource. Provide one of customer_id, external_customer_id, or subscription_id. Idempotency is permanent per merchant via the usage_events merchant/idempotency unique index. Each subscription has one currency; usage events attributed to it are interpreted in that currency with no metering-layer FX conversion.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

Stuck on an error response? Ask the RevKeen assistant to explain it.
curl -X POST "https://api.revkeen.com/v2/usage-events" \
  -H "x-api-key: $REVKEEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "api_call",
    "customer_id": "string",
    "external_customer_id": "usr_123",
    "subscription_id": "string",
    "meter_id": "string",
    "quantity": 1,
    "timestamp": "2026-03-14T10:30:00Z",
    "idempotency_key": "evt_unique_123",
    "metadata": {}
  }'
{  "object": "usage_event_batch_result",  "summary": {    "ingested": 0,    "duplicate": 0,    "skipped": 0,    "failed": 0  },  "data": [    {      "index": 0,      "status": "ingested",      "id": "string",      "reason": "string"    }  ]}

Dry-run usage events POST

Validate usage events without persisting them. Returns acceptance/rejection reasons that mirror real ingestion rules. --- **Related endpoints** - `POST /usage-events` — Ingest usage events - `GET /usage-events` — Query usage events - `GET /usage-events/aggregate/{meterId}` — Get aggregated usage **Common errors** - `400 invalid_request` — malformed payload or failed validation. - `401 authentication_error` — missing, invalid, expired, or revoked credential. Codes: `authentication_failed`, `invalid_api_key`, `expired_api_key`, `api_key_revoked`, `session_invalid`, `merchant_required`. Carries a `WWW-Authenticate: Bearer` challenge. **Idempotency** Pass an `Idempotency-Key` header (UUID v4 recommended) to make retries safe. Keys are valid for 24 hours; see [the idempotency guide](/docs/fundamentals/idempotency).

Query usage events GET

List usage events with optional filters. Returns up to 100 events per request. --- **Related endpoints** - `POST /usage-events` — Ingest usage events - `POST /usage-events/dry-run` — Dry-run usage events - `GET /usage-events/aggregate/{meterId}` — Get aggregated usage **Common errors** - `401 authentication_error` — missing, invalid, expired, or revoked credential. Codes: `authentication_failed`, `invalid_api_key`, `expired_api_key`, `api_key_revoked`, `session_invalid`, `merchant_required`. Carries a `WWW-Authenticate: Bearer` challenge. **Pagination** Offset-based with `limit` (default 25, max 100) and `offset`. The response `pagination` block includes `total` and `hasMore`. See [the pagination guide](/docs/fundamentals/pagination) for SDK auto-paging helpers.