Epure
ProductEvents

Events

An event is one occurrence of an issue. Open issue detail, then the occurrences tab (keys 1–4 cycle tabs).

What is an event?

One occurrence: stack, breadcrumbs, tags, optional user.

Until the first event lands, Setup (/p/:projectId/setup) waits for ingest. Throw from the SDK, or POST store/envelope (Try ingest). Read path: Events API. Write path: Ingest.

How do I send one occurrence?

Store JSON is the smallest wire. The seed DSN matches ./scripts/seed.sh.

Try ingest

Paste your own host and key if you are not on seed.sh. Copy store curl, run it in a terminal, then refresh Issues.

store curl

curl -sS -D - -o /tmp/epure-ingest.json -X POST
  "http://localhost:8080/api/550e8400-e29b-41d4-a716-446655440000/store/"
  -H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=a1b2c3d4e5f6g7h8i9j0"
  -H "Content-Type: application/json"
  -d '{
  "platform": "javascript",
  "exception": {
    "values": [{ "type": "Error", "value": "Epure try-it" }]
  }
}'

Expected

HTTP/1.1 202 Accepted

{ "id": "<event-uuid>" }

Then open Issues. This panel does not POST from the browser. CORS and your DSN stay on your machine.

Envelope fixture from the repo root (after seed):

Post envelope fixture

Run from the product repo root so the fixture path resolves.

command

curl -sS -D - -o /tmp/epure-envelope.json -X POST \
"http://localhost:8080/api/550e8400-e29b-41d4-a716-446655440000/envelope/" \
-H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=a1b2c3d4e5f6g7h8i9j0" \
-H "Content-Type: application/x-sentry-envelope" \
--data-binary @fixtures/sentry/browser/envelope.txt

Expected

HTTP/1.1 202 Accepted

{ "id": "<event-uuid>" }

Read occurrences with a session

Login returns 204 and a cookie. Then list events for an issue.

List events for an issue

command

curl -sS -c cookies.txt -D - -o /dev/null -X POST \
"http://localhost:8080/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"your-password"}'

curl -sS -b cookies.txt \
"http://localhost:8080/api/v1/issues/${ISSUE_ID}/events?limit=50&offset=0"

Expected

HTTP/1.1 204 No Content

{ "events": [ { "id": "<event-uuid>", "issue_id": "<issue-uuid>", "environment": "local", "release": "my-app@0.0.0", "stack_frames": [], "breadcrumbs": [] } ], "total": 1, "has_more": false }

DSN headers on /api/v1/* return 401. Use the cookie.

What is on an event

SurfaceContent
StackDemangled when JS/TS .map files exist for the event release; otherwise raw frames
BreadcrumbsFilter All, HTTP, console, errors
OccurrencesRecent events; pick two for a payload diff
Release diffSame fingerprint across two versions
Useruser.id / user.email when the SDK sent them
FeedbackCrash-dialog comments linked to event_id

How long are events retained?

Raw events live in monthly partitions events_YYYY_MM. Project retention of 14 / 30 / 90 days drops old partitions.

Issue aggregates remain after TTL. Change retention on Projects.

Spike valve and events

About 100 raw events per minute per fingerprint still return 202, and extra bodies may drop while the counter increments.

The occurrence list then has fewer rows than event_count. Expected under a tight loop.

Why is payload_json empty?

Spike-valve counter-only accepts increment the issue and discard bodies. Send a slower unique exception, or wait a minute. The occurrence list then has fewer rows than event_count. The hourly project cap is the path that returns 403: API errors.

202 but no row in Issues?

Match the environment chip to the event tag (local in the examples) and confirm the project that owns the DSN. Accept is non-blocking, so wait about a second, then check docker compose logs epure. See Verify.

Can I GET an event with the DSN?

No. The DSN authenticates ingest only. List occurrences with a session cookie: GET /api/v1/issues/{id}/events. DSN headers on /api/v1/* return 401, and a cookie on envelope or store is ignored. See Authentication.

Next