Endpoints

Services

GET/api/v1/services

Services in the active organization, paginated, newest-name-first.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Query Parameters

page?Page

Page number

Range1 <= value
Default1
per_page?Per Page

Items per page

Range1 <= value <= 100
Default20
status?|

Filter by status

tier?|

Filter by tier

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/services"
{  "items": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b",      "name": "string",      "first_seen_at": "2019-08-24T14:15:22Z",      "last_seen_at": "2019-08-24T14:15:22Z",      "status": "active",      "owner": "string",      "tier": "string",      "environment": "string",      "repo_url": "string",      "runbook_url": "string",      "dashboard_url": "string",      "created_at": "2019-08-24T14:15:22Z",      "updated_at": "2019-08-24T14:15:22Z",      "last_applied_config": {}    }  ],  "total": 0,  "page": 0,  "per_page": 0}
GET/api/v1/services/{name}

One service by its natural key, within the active organization.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

name*Name

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/services/string"
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b",  "name": "string",  "first_seen_at": "2019-08-24T14:15:22Z",  "last_seen_at": "2019-08-24T14:15:22Z",  "status": "active",  "owner": "string",  "tier": "string",  "environment": "string",  "repo_url": "string",  "runbook_url": "string",  "dashboard_url": "string",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z",  "last_applied_config": {}}
PATCH/api/v1/services/{name}

Patches annotations only. name, first_seen_at, last_seen_at and status have no field on ServiceAnnotationUpdate at all, so FastAPI's extra="forbid" turns an attempt to set any of them into a 422 before this handler runs.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

name*Name

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

PATCH /api/v1/services/{name} body. Annotations only.

No name, first_seen_at, last_seen_at or status field exists here — attempting to set any of them is an unknown field under extra="forbid" and FastAPI turns that into a 422, which is the guard the acceptance criteria ask for.

Response Body

application/json

application/json

curl -X PATCH "https://example.com/api/v1/services/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "org_id": "a40f5d1f-d889-42e9-94ea-b9b33585fc6b",  "name": "string",  "first_seen_at": "2019-08-24T14:15:22Z",  "last_seen_at": "2019-08-24T14:15:22Z",  "status": "active",  "owner": "string",  "tier": "string",  "environment": "string",  "repo_url": "string",  "runbook_url": "string",  "dashboard_url": "string",  "created_at": "2019-08-24T14:15:22Z",  "updated_at": "2019-08-24T14:15:22Z",  "last_applied_config": {}}
GET/api/v1/services/{name}/signals

Request rate, error rate and latency percentiles from spans, bucketed server-side. No saturation or availability fields — see this module's docstring and app/schemas/service.py's: those need M02's metrics range query and #535's probe metrics, neither of which exists yet, so this response simply does not carry them.

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

name*Name

Query Parameters

from*From

Range start (inclusive)

Formatdate-time
to*To

Range end (inclusive)

Formatdate-time

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/services/string/signals?from=2019-08-24T14%3A15%3A22Z&to=2019-08-24T14%3A15%3A22Z"
{  "service": "string",  "bucket_width_seconds": 0,  "buckets": [    {      "bucket_start": "2019-08-24T14:15:22Z",      "bucket_end": "2019-08-24T14:15:22Z",      "request_count": 0,      "error_count": 0,      "error_rate": 0,      "p50_ms": 0,      "p95_ms": 0,      "p99_ms": 0    }  ]}
GET/api/v1/services/{name}/edges

Inbound and outbound edges from otel.service_edges, with count, error rate and p95 — one service's neighbourhood, not the whole graph (see GET /api/v1/topology for that).

Authorization

HTTPBearer
AuthorizationBearer <token>

In: header

Path Parameters

name*Name

Query Parameters

from*From

Range start (inclusive)

Formatdate-time
to*To

Range end (inclusive)

Formatdate-time

Response Body

application/json

application/json

curl -X GET "https://example.com/api/v1/services/string/edges?from=2019-08-24T14%3A15%3A22Z&to=2019-08-24T14%3A15%3A22Z"
{  "service": "string",  "inbound": [    {      "service": "string",      "request_count": 0,      "error_count": 0,      "error_rate": 0,      "p95_ms": 0    }  ],  "outbound": [    {      "service": "string",      "request_count": 0,      "error_count": 0,      "error_rate": 0,      "p95_ms": 0    }  ]}