AperioFlow Start free

Docs API reference

API: errors, issues and push

22 endpoints. Send your API key as Authorization: Bearer <key> on each request; see The API and AI assistants for keys, errors, idempotency and the conventions every endpoint shares.

GET /api/coolify-notifications

Admins and owners. The one address to paste into Coolify (Notifications > Webhook), the project for other alerts, the Coolify project names that route an alert, and the projects to choose from.

The address is /ingest/{key}/coolify on this host, made from the ingest key of the project for other alerts, so it holds a secret. It is null until a project is chosen. Each Coolify notification is filed by the project name it carries - a name set below, else a project with the same name - and otherwise in the project for other alerts.

Responses:

StatusMeaning
200url, catchall_project, aliases [{name, project_id, project_name}], max_aliases, projects
403Not an admin or owner

PUT /api/coolify-notifications

Admins and owners. Choose the project for other alerts. The address changes, because it is made from that project's key.

Request body (application/json, required).

FieldTypeRequiredDescription
project_idintegerYes

Responses:

StatusMeaning
200The same answer as GET
400Not a project of this organisation
403Not an admin or owner

PUT /api/coolify-notifications/names

Admins and owners. Alerts from the Coolify project with this name go to this AperioFlow project. Capital letters and extra spaces are ignored; setting a name again replaces it.

Request body (application/json, required).

FieldTypeRequiredDescription
namestringYesUp to 200 characters.
project_idintegerYes

Responses:

StatusMeaning
200The same answer as GET
400A bad name
403Not an admin or owner
409At most 100 names

DELETE /api/coolify-notifications/names

Admins and owners. Remove a name.

Request body (application/json, required).

FieldTypeRequiredDescription
namestringYes

Responses:

StatusMeaning
200The same answer as GET
404That name is not set

POST /api/coolify-notifications/test

Admins and owners. Send a harmless test notification (an info issue titled "Coolify: Test notification from AperioFlow") by the same route as a real one, and say where it landed.

Request body (application/json).

FieldTypeRequiredDescription
projectstringNoOptional. Pretend the alert comes from this Coolify project. Up to 200 characters.

Responses:

StatusMeaning
202project {id, name}, routed_by ("name you set", "same name" or "project for other alerts") and the issue
409Choose the project for other alerts first

GET /api/issues

Issues across every project, most recently seen first (or by sort)

Parameters:

NameInTypeRequiredDescription
project_idqueryintegerNoOnly issues in this project. From 1 to ....
statusquerystringNoOne status, or several separated by commas (open,ignored).
levelquerystringNoOne level, or several separated by commas (fatal,error).
environmentquerystringNoExact environment, such as production.
platformquerystringNoExact platform, such as web.
qquerystringNoCase-insensitive text to find in the title, error type or route.
sincequerystring (date-time)NoOnly issues last seen at or after this time.
sortquerystringNolast_seen (default), first_seen or event_count, largest or newest first. One of: last_seen, first_seen, event_count. Default "last_seen".
limitqueryintegerNoDefault 100. From 1 to 500.
offsetqueryintegerNoSkip this many results (for paging). Default 0. From 0 to ....

Responses:

StatusMeaning
200Issues, each with its project name and a summary of its latest event (array of IssueListItem)
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)

PATCH /api/issues

Resolve, ignore or reopen several issues at once

All or nothing. If any id does not exist the request fails with a 404 and nothing changes.

Parameters:

NameInTypeRequiredDescription
X-ActorheaderstringNoName recorded in the activity log (up to 200 characters, URI-encoded if not ASCII).

Request body (application/json, required).

FieldTypeRequiredDescription
idsarray of integerYesUp to 500 items.
statusIssueStatusYesOne of: open, resolved, ignored.

Example:

{
  "ids": [
    12,
    15,
    19
  ],
  "status": "resolved"
}

Responses:

StatusMeaning
200The issues after the change
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

GET /api/issues/summary

Issue counts overall and per project

Parameters:

NameInTypeRequiredDescription
project_idqueryintegerNoOnly count this project. From 1 to ....

Responses:

StatusMeaning
200Counts
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

GET /api/projects/{id}/issues

Issues for a project, most recently seen first (or by sort)

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.
statusquerystringNoOne status, or several separated by commas (open,ignored).
levelquerystringNoOne level, or several separated by commas (fatal,error).
environmentquerystringNoExact environment, such as production.
platformquerystringNoExact platform, such as web.
qquerystringNoCase-insensitive text to find in the title, error type or route.
sincequerystring (date-time)NoOnly issues last seen at or after this time.
sortquerystringNolast_seen (default), first_seen or event_count, largest or newest first. One of: last_seen, first_seen, event_count. Default "last_seen".
limitqueryintegerNoDefault 100. From 1 to 500.
offsetqueryintegerNoSkip this many results (for paging). Default 0. From 0 to ....

Responses:

StatusMeaning
200Issues, each with a summary of its latest event (array of IssueListItem)
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

POST /api/projects/{id}/issues

Report one event, or an array of up to 100

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.
X-ActorheaderstringNoName recorded in the activity log (up to 200 characters, URI-encoded if not ASCII).

Request body (application/json, required): IssueEventBatch

Responses:

StatusMeaning
202Events recorded
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

GET /api/projects/{id}/ingest-key

The project's current ingest key and the path to post events to

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.

Responses:

StatusMeaning
200The key (IngestKey)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

POST /api/projects/{id}/ingest-key

Replace the project's ingest key (the old one stops working immediately)

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.

Responses:

StatusMeaning
200The new key (IngestKey)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

GET /api/push

Whether push is configured, the VAPID public key and how many devices are subscribed

Responses:

StatusMeaning
200Push settings
401Missing or invalid API key (Error)

POST /api/push/subscriptions

Register a device (the browser's PushSubscription JSON); idempotent

Request body (application/json, required): PushSubscription.

FieldTypeRequiredDescription
endpointstring (uri)Yeshttps URL from the browser push service.
keysobjectYes

Responses:

StatusMeaning
201Subscribed
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
503Push is not configured on the server

DELETE /api/push/subscriptions

Remove a device

Request body (application/json, required).

FieldTypeRequiredDescription
endpointstringYes

Responses:

StatusMeaning
204Removed
401Missing or invalid API key (Error)

POST /api/push/test

Send a test notification to one subscribed device

Request body (application/json, required).

FieldTypeRequiredDescription
endpointstringYes

Responses:

StatusMeaning
200Sent
401Missing or invalid API key (Error)
404The device is not subscribed
502The push service rejected the notification

GET /api/issues/{id}

An issue with its latest events (up to 50, newest first)

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.

Responses:

StatusMeaning
200The issue (IssueDetail)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

PATCH /api/issues/{id}

Resolve, ignore or reopen an issue

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.
X-ActorheaderstringNoName recorded in the activity log (up to 200 characters, URI-encoded if not ASCII).

Request body (application/json, required).

FieldTypeRequiredDescription
statusIssueStatusNoOne of: open, resolved, ignored.

Responses:

StatusMeaning
200The updated issue (Issue)
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

DELETE /api/issues/{id}

Delete an issue and its events (it is recreated if the error happens again)

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.

Responses:

StatusMeaning
204Deleted
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

GET /api/issues/{id}/events

An issue's stored events (the latest 50 are kept), newest first

Parameters:

NameInTypeRequiredDescription
idpathintegerYesFrom 1 to 2147483647.
limitqueryintegerNoDefault 50. From 1 to 50.
beforequeryintegerNoReturn entries with an id lower than this (for paging). From 1 to ....

Responses:

StatusMeaning
200Events, with full stack and context (array of IssueEvent)
400The request body is invalid or is not valid JSON (Error)
401Missing or invalid API key (Error)
404Item (or its parent) does not exist (Error)

POST /ingest/{key}

Report events with a project ingest key (no API key)

For browsers and mobile apps. CORS is open, and any content type is parsed as JSON, so navigator.sendBeacon(url, JSON.stringify(event)) works. user_agent defaults to the request's User-Agent header. Limited to 300 events per minute per key.

Parameters:

NameInTypeRequiredDescription
keypathstringYesThe project's ingest_key.

Request body (application/json, required): IssueEventBatch

Responses:

StatusMeaning
202Events recorded
400The request body is invalid or is not valid JSON (Error)
404Unknown ingest key (Error)
429Rate limit reached. See the Retry-After header. (Error)

POST /webhooks/gitguardian

GitGuardian custom webhook (signed, no API key)

GitGuardian posts its incident events here. The request must carry Timestamp and Gitguardian-Signature: sha256=<hex> (or the deprecated X-GitGuardian-Signature): an HMAC-SHA256 of the raw body keyed with the timestamp followed by a token from GITGUARDIAN_WEBHOOK_SECRET. Requests more than 5 minutes from the server's clock are refused. Each incident becomes one Security issue (fingerprint gitguardian:<incident id>) in the project whose repo_url matches the repository, or in the fallback project. The secret value is never stored. The GitGuardian test message gets a 200 and stores nothing. Limited to 120 requests per minute per client IP.

Parameters:

NameInTypeRequiredDescription
TimestampheaderstringYes
Gitguardian-SignatureheaderstringYes

Request body (application/json, required)

Responses:

StatusMeaning
200Test message
202The incident's issue was created or updated
400Body is not JSON or the incident has no id
401Missing or invalid signature
429Rate limit reached. See the Retry-After header.
503GITGUARDIAN_WEBHOOK_SECRET is not set

Start free All the docs Video guides

Built for the people who write the code and answer the phone when it breaks.

Run from the UK. Hosted in France.

UK time --:--

Already in?Open the app Start free today
View our policies