For eksterne systemer og agenter
Send status, trafikk og hendelser til Manager
Manager tar imot telemetri fra nettsteder, apper, API-er, planlagte jobber og AI-agenter, og gjør den om til status, ferskhetsovervåking, terskler og hendelser. Hele integrasjonskontrakten står på denne siden. Du trenger én hemmelighet fra et menneske — resten finner du ut selv.
POST https://monitor.skjldlabs.com/api/v1/ingest/{SOURCE_ID} Authorization: Bearer {SOURCE_TOKEN} Content-Type: application/json { "idempotency_key": "checkout-health-2026-08-08T13:00", "type": "heartbeat", "status": "healthy", "severity": "info", "title": "Checkout health", "message": "p95 over the last five minutes", "latency_ms": 184, "metric": { "name": "http.latency.p95", "value": 184, "unit": "ms" }, "tags": { "environment": "production", "region": "eu-north-1" }, "data": { "requests": 1294, "version": "4.12.0" }, "occurred_at": "2026-08-08T13:00:00Z" }
{
"accepted": true,
"event_id": "01KZ9F3M2V7X0T4B8Q6R1Y5C3D",
"duplicate": false,
"source_status": "healthy",
"received_at": "2026-08-08T13:00:01+00:00"
}
GET /api/v1/ingest/{SOURCE_ID}/status
{
"source": {
"id": "01KZ8SET41J71MQ261V8N8J2Z1",
"name": "Checkout health",
"type": "health",
"status": "healthy",
"last_received_at": "2026-08-08T13:00:01+00:00",
"next_expected_at": "2026-08-08T13:06:01+00:00",
"expected_interval_seconds": 300
}
}
Samme token. Her ser du når neste rapport forventes — bommer du på det vinduet flere kontroller på rad, åpnes en hendelse.
For maskiner
Samme kontrakt, uten HTML. Henter du denne siden med Accept: text/markdown, får du agents.md direkte.
Modellen
Du sender alltid til en datakilde, aldri til en tjeneste.
Tenant
Kunden eller organisasjonen. Eier alt under seg, og all data er isolert per tenant.
Tjeneste
Ett nettsted, én app, ett API eller ett annet digitalt produkt.
Datakilde
Én autentisert strøm med eget token, egen deklarert kontrakt og egen forventet frekvens. Dette er adressen du sender til.
Dette trenger du før du starter
Én registreringsnøkkel, opprettet av en eier eller administrator i dashboardet under «API & MCP». Den er bundet til én tenant og én fast tjenestenøkkel, og er det eneste du ikke kan skaffe selv.
Tre steg
-
01
Deklarer deg selv
POST et versjonert manifest med registreringsnøkkelen. Manifestet beskriver tjenesten og hver eneste datakilde: rapporteringsfrekvens, metrikker, hendelsestyper, tagger og datafelter.
-
02
Ta imot nøklene
Svaret inneholder ett engangs-token per ny datakilde, sammen med REST- og MCP-adressen. Lagre dem med én gang — de vises aldri igjen.
-
03
Send data
Bruk kildens token mot REST eller MCP. Begge lagrer de samme hendelsene og utløser de samme reglene.
Manifestet
Idempotent. Send det på nytt hver gang tjenesten endrer seg: nye kilder opprettes, kilder du slutter å deklarere settes på pause med historikken i behold, og eksisterende tokens røres ikke.
{
"manifest_version": "1.0",
"service": {
"key": "customer-portal-production",
"name": "Customer portal",
"environment": "production",
"url": "https://portal.example.com",
"version": "4.12.0",
"accent": "emerald",
"tags": [
"laravel",
"eu-north-1"
]
},
"sources": [
{
"key": "web-analytics",
"name": "Web analytics",
"type": "analytics",
"description": "Traffic aggregated over five-minute windows.",
"expected_interval_seconds": 300,
"grace_seconds": 300,
"metrics": [
{
"name": "analytics.pageviews",
"unit": "count",
"aggregation": "sum",
"description": "Pageviews in the window."
},
{
"name": "analytics.users",
"unit": "count",
"aggregation": "max",
"description": "Unique visitors in the window."
}
],
"events": [
{
"type": "analytics.top_pages",
"severity": "info",
"description": "Most visited pages in the window."
}
],
"tags": [
"site",
"channel"
],
"data_fields": [
{
"name": "top_path",
"type": "string",
"required": false,
"description": "Most visited path in the window."
}
]
}
]
}
Regler
- manifest_version
- MAJOR.MINOR
- service.key
- Små bokstaver med bindestrek. Må matche nøkkelen registreringstokenet er bundet til.
- service.environment
- production · staging · development
- sources[].key
- Fast identitet for strømmen. Unik i manifestet.
- sources[].type
- health · analytics · contacts · security · laravel-log · performance · custom
- sources[].expected_interval_seconds
- 60 – 2 592 000
- sources[].grace_seconds
- 0 – 86 400
- metrics[].aggregation
- last · sum · avg · min · max · p50 · p95 · p99
- events[].severity
- info · warning · error · critical
Vær ærlig om expected_interval_seconds. Manager åpner en «ingen nye data»-hendelse når en kilde bommer på sitt eget vindu flere kontroller på rad. Å deklarere en frekvens du ikke holder gir støy, ikke trygghet.
{
"registered": true,
"manifest_version": "1.0",
"service": {
"id": "01K…",
"key": "customer-portal-production"
},
"sources": [
{
"key": "web-analytics",
"id": "01KZ8SET41J71MQ261V8N8J2Z1",
"token": "mgr_live_…shown_once",
"ingest_url": "https://monitor.skjldlabs.com/api/v1/ingest/01KZ8SET41J71MQ261V8N8J2Z1",
"mcp_url": "https://monitor.skjldlabs.com/mcp/01KZ8SET41J71MQ261V8N8J2Z1"
}
]
}
REST
HTTPAlle felter er valgfrie. Send det du har.
| Felt | Type | Merknader |
|---|---|---|
| type | string | Free-form kind of report, for example heartbeat, metric, event or log. Max 40 characters. |
| status | string | Service state. down, failed, critical and error open an incident; up, ok, healthy and operational resolve one. Max 40 characters. |
| severity | enum | One of info, warning, error, critical. Defaults to info. |
| title | string | Short headline shown in the event list. Max 255 characters. |
| message | string | Longer context. Max 10 000 characters. |
| latency_ms | integer | Measured latency, 0 to 3 600 000. |
| metric.name | string | Required when metric is present. Stable dot-separated name, max 120 characters. |
| metric.value | number | Required when metric is present. |
| metric.unit | string | For example ms, percent, count or bytes. Max 32 characters. |
| tags | object | Up to 30 string values. Use for dimensions you want to filter on, such as environment or region. |
| data | object | Up to 100 structured values kept with the event. |
| occurred_at | string | ISO 8601. Defaults to now and may not be more than five minutes in the future. |
| idempotency_key | string | Repeating a key for the same source returns the original event instead of storing a duplicate. Max 190 characters. |
Legg til /batch på URL-en og send en events-array for opptil 100 hendelser i én forespørsel.
MCP
Streamable HTTPHver datakilde er også en Streamable HTTP MCP-server, med samme token. Verktøyene oppdages automatisk av klienten.
| Verktøy | Argumenter |
|---|---|
| report_heartbeat Report that the service is alive, with its current status and optional latency. | status, message, latency_ms, idempotency_key |
| report_event Report an operational event such as a deploy, a failure or a signup. | type, title, message, severity, status, tags, data, idempotency_key, occurred_at |
| report_metric Report a numeric metric such as latency, users, errors, conversions or queue depth. | name, value, unit, severity, message, idempotency_key, occurred_at |
| get_source_status Read back the current status of the authenticated source. | ingen |
manager://source/recent-events
— The most recent events already stored for the authenticated source.
{
"mcpServers": {
"manager-production-health": {
"type": "http",
"url": "https://monitor.skjldlabs.com/mcp/{SOURCE_ID}",
"headers": {
"Authorization": "Bearer {SOURCE_TOKEN}"
}
}
}
}
Hvor ofte bør du sende
| Kildetype | Foreslått intervall | Merknad |
|---|---|---|
| health | 60s | A heartbeat every minute gives the fastest possible outage detection. |
| performance | 300s | Aggregate latency and error rates over the window before sending. |
| analytics | 300s | Aggregate first. Never send one event per pageview. |
| security | on event | Send when something happens, and a heartbeat in between so silence is distinguishable from calm. |
| contacts | on event | Send each submission as it arrives. |
| laravel-log | on event | Send warnings and above. Batch to stay inside the rate limit. |
Status og alvorlighet
status styrer hendelser: down, failed, critical og error åpner én, mens up, ok, healthy og operational lukker den tilsvarende. severity styrer bare hvor tydelig en lagret hendelse vises, og åpner ikke noe alene.
Grenser
- Forespørsler per minutt, per kilde
- 120
- Registreringsforespørsler per minutt
- 30
- Hendelser per batch
- 100
- Størrelse på forespørsel
- 1.0 MB
- Kilder per manifest
- 20
- Metrikker per kilde
- 100
- Deklarerte hendelsestyper per kilde
- 50
- Lagringstid for rådata
- 90 dager
Svarkoder
- 202
- Accepted and stored.
- 200
- Accepted, but the idempotency key matched an event already stored. Nothing was duplicated.
- 401
- Missing or wrong bearer token, or an invalid or expired signature.
- 404
- Unknown data source id.
- 413
- Request body larger than 1.0 MB.
- 422
- The payload failed validation. The body names the offending fields.
- 423
- The data source is paused in the dashboard.
- 429
- Rate limit exceeded for this source.
Gjenforsøk og duplikater
Sett idempotency_key til noe stabilt og unikt per logiske rapport. Gjentar du nøkkelen for samme kilde, får du den opprinnelige hendelsen tilbake med HTTP 200 og ingenting lagres på nytt — så et gjenforsøk etter timeout er trygt.
Valgfri signering
En kilde kan settes til å kreve signatur. Da må hver forespørsel også ha:
X-Manager-Timestamp: {unix seconds}
X-Manager-Signature: hex(HMAC-SHA256(
timestamp + "." + raw_body, source_token))
Tidsstempelet må være innenfor 300 sekunder av servertid.
Ikke send dette
Hold hemmeligheter, innlogginger, sesjonstokens og persondata utenfor title, message, tags og data. Telemetri lagres i 90 dager og er synlig for alle med tilgang til tenanten. Aggreger før du sender: antall og persentiler, ikke rader.