Quick start
- Create a project in the console, or via the admin API.
- Mint a project key for dev, staging, or prod.
- POST events to /v1/ingest with Authorization: Bearer <key>.
curl -s -X POST https://monitor.egstars.com/v1/ingest \
-H "Authorization: Bearer egm_dev_…" \
-H "Content-Type: application/json" \
-d '{"events":[{"type":"error","level":"error","message":"Payment failed"}]}'
Authentication
Pick one style per request. Do not mix them.
| Who |
How |
Used for |
| Your app |
Authorization: Bearer <project_key> |
Ingest only |
| Platform admin |
X-Admin-Username + X-Admin-Password |
All organization APIs. Optional X-Org-Slug. |
| Organization user |
X-User-Email + X-User-Password |
The same JSON APIs. Optional X-Org-Slug. |
Owners and admins can write. Members are read-only.
Ingest
Accepts a batch of 1–100 events. Auth: project Bearer key. The key’s environment (dev, staging, or prod) is stored on every event.
Request body
{
"events": [
{
"type": "error",
"level": "error",
"message": "Render failed in ChannelScreen",
"platform": "react-native",
"release": "1.0.0",
"fingerprint": "optional-stable-id",
"tags": { "feature": "chat" },
"context": { "route": "/channels/123" }
}
]
}
Response
{ "accepted": 1 }
Event envelope
| Field |
Required |
Notes |
type |
Yes |
log, error, or issue |
message |
Yes |
Human-readable text, up to 16,384 characters |
level |
No |
debug through fatal. Default is info. |
fingerprint |
No |
Groups events into an issue. Derived automatically for error and issue when omitted. |
timestamp |
No |
ISO-8601 time when the event occurred |
release, platform, sdk |
No |
Release and client metadata |
tags, context, user, request, breadcrumbs |
No |
Arbitrary JSON. Sensitive keys are redacted before storage. |
Log events without a fingerprint are stored only as events, not as an issue. A new event on a resolved issue reopens it. Ignored stays ignored.
Projects and keys
List projects in the active organization.
Create a project. Admin or owner.
{ "slug": "chatmode", "name": "Chatmode" }
POST
/v1/projects/{slug}/keys
Mint an ingest key. The plaintext key is returned once. Admin or owner.
{ "env": "dev" }
GET
/v1/projects/{slug}/keys
List key prefixes and status. The full secret is never returned again.
POST
/v1/projects/{slug}/keys/{key_id}/revoke
Revoke a key. Admin or owner.
Events and issues
GET
/v1/projects/{slug}/events
Cursor-paginated events. Query: env, type, level, q, cursor, limit.
GET
/v1/projects/{slug}/issues
List grouped issues. Query: status (open, resolved, ignored), cursor, limit.
GET
/v1/projects/{slug}/issues/{id}
Issue detail plus recent linked events.
PATCH
/v1/projects/{slug}/issues/{id}
Set status. Admin or owner.
{ "status": "resolved" }
Alert webhooks
Per-project HTTPS callbacks when an issue is created or reopened. Network errors, HTTP 429, and 5xx are retried. When a secret is set, requests include X-Monitor-Signature: sha256=<hmac> over the raw body.
GET
/v1/projects/{slug}/alert-webhooks
List webhooks. Any member.
POST
/v1/projects/{slug}/alert-webhooks
Create a webhook. Admin or owner. Returns secret once when with_secret is true.
{ "url": "https://example.com/hooks/monitor", "with_secret": true }
PATCH
/v1/projects/{slug}/alert-webhooks/{id}
Update the URL, enabled, events, or rotate_secret. Admin or owner.
DELETE
/v1/projects/{slug}/alert-webhooks/{id}
Delete a webhook. Admin or owner.
GET
/v1/projects/{slug}/alert-webhooks/{id}/deliveries
The latest 50 delivery attempts.
POST
/v1/projects/{slug}/alert-webhooks/{id}/test
Send a sample issue.created payload. Admin or owner. Test alerts are not retried.
Webhook payload shape
{
"event": "issue.created",
"sent_at": "2026-09-22T12:00:00+00:00",
"project": { "id": "…", "slug": "chatmode", "name": "Chatmode" },
"issue": {
"id": "…",
"fingerprint": "…",
"title": "…",
"status": "open",
"count": 1,
"last_level": "error",
"last_env": "dev",
"url": "https://monitor.egstars.com/projects/chatmode/issues/…"
}
}
Orgs and members
Create a user and an organization. The user is the owner. No auth header.
{
"email": "you@example.com",
"name": "You",
"password": "at-least-8-chars",
"org_name": "Acme",
"org_slug": "acme"
}
Organizations you can access.
GET
/v1/orgs/current/members
Members of the active organization.
POST
/v1/orgs/current/members
Invite or create a member. Owner or admin. May return temporary_password.
Errors and limits
| Code |
Meaning |
401 |
Missing or invalid credentials, or an invalid project key |
403 |
Signed in, but this role cannot do that |
404 |
Unknown project, issue, or webhook |
422 |
Invalid JSON body or query |
429 |
Ingest rate limit. Check the Retry-After header. |
Default ingest limits: 120 requests per minute and 2,000 events per minute per project key.
Health check, no auth: GET /health returns {"status":"ok"}.