System
Public status, version, plans, changelog, and contact endpoints, plus a pointer to API request logs.
These endpoints power the public status page, version and changelog lookups, plan catalogue, and marketing contact form. None of them require authentication; they are served before the API's key/session resolver runs.
Get current system status
GET /v1/status
Public: no authentication required. Returns the current state of every active component, any unresolved incidents, and a rolling 90-day uptime summary.
Response
{
"status": "operational",
"last_checked_at": "2026-05-31T14:22:00Z",
"components": [
{
"id": "sc_api_gateway",
"name": "API Gateway",
"description": "REST API endpoint availability and response time",
"group": "Core",
"slug": "api-gateway",
"status": "operational",
"uptime_90d": 99.98,
"sla_target": 99.95,
"sla_met": true,
"current_response_time_ms": 84
}
],
"active_incidents": [],
"sla_summary": {
"target": 99.95,
"current_uptime": 99.97,
"sla_met": true
}
}
status is one of operational, degraded_performance, partial_outage, major_outage, or under_maintenance.
Get incident history
GET /v1/status/history
Public: no authentication required. Returns resolved incidents newest first, each with its timeline of updates and any affected components.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | number | 20 | Results per page (1-100). |
cursor | string | next_cursor from a previous response. |
Response
{
"data": [
{
"id": "inc_abc123",
"title": "Elevated API latency",
"status": "resolved",
"impact": "degraded_performance",
"starts_at": "2026-05-20T10:00:00Z",
"ends_at": null,
"resolved_at": "2026-05-20T11:12:00Z",
"created_at": "2026-05-20T10:05:00Z",
"updated_at": "2026-05-20T11:12:00Z",
"updates": [
{
"id": "incu_abc123",
"status": "resolved",
"message": "Latency is back to normal.",
"created_at": "2026-05-20T11:12:00Z"
}
],
"affected_components": [
{ "id": "sc_api_gateway", "name": "API Gateway", "slug": "api-gateway" }
]
}
],
"has_more": false,
"next_cursor": null
}
Get API latency statistics
GET /v1/status/latency
Public: no authentication required. Returns hourly P50/P95/P99 latency rollups for a component. Returns 404 with code not_found if the component slug does not exist.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
component | string | api-gateway | Component slug. |
hours | number | 24 | Hours of history to return (1-168). |
Response
{
"component": "api-gateway",
"target_ms": 120,
"current_p50_ms": 84,
"target_met": true,
"hourly": [
{
"hour": "2026-05-31T14:00:00Z",
"p50_ms": 84,
"p95_ms": 190,
"p99_ms": 320,
"sample_count": 14210,
"target_met_pct": 99.4
}
]
}
Get API version info
GET /v1/version
Public: no authentication required.
Response
{
"version": "2.11.0",
"api_version": "v1"
}
List available plans
GET /v1/plans
Public: no authentication required. Returns the plan catalogue keyed by plan id (free, pro, business, enterprise). Each entry carries the plan's pricing and its quota and feature flags. For numeric limits, 0 means unlimited (automationRuns uses -1 for unlimited), and a null price means custom pricing.
Response
{
"plans": {
"free": {
"name": "Free",
"price": 0,
"annualPrice": null,
"emailsPerMonth": 3000,
"contacts": 500,
"support": "community"
},
"pro": {
"name": "Pro",
"price": 18,
"annualPrice": 15,
"emailsPerMonth": 50000,
"contacts": 10000,
"support": "email"
}
}
}
Get public changelog entries
GET /v1/changelog
Public: no authentication required. Entries are ordered newest first.
Response
{
"entries": [
{
"version": "2.11.0",
"date": "2026-05-28",
"changes": [
{ "type": "added", "description": "Segments API for targeting campaigns and automations." },
{ "type": "fixed", "description": "Corrected SLA uptime rounding on the public status page." }
]
}
]
}
Each change type is one of added, improved, or fixed.
Submit the marketing contact form
POST /v1/contact
Public: no authentication required. Delivers the message to the Sendry team with the submitter's address as Reply-To. Throttled to 5 submissions per 10 minutes per IP; exceeding it returns 429 rate_limited with a Retry-After header. Fields with a hidden honeypot filled in are accepted silently and discarded.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Submitter name (1-200 chars). |
email | string | Yes | Valid email address (max 320 chars). |
message | string | Yes | Message body (1-5000 chars). |
company_website | string | No | Honeypot field; leave empty. |
Example request
{
"name": "Stanley Hudson",
"email": "stanley@example.com",
"message": "I'd like to know more about the Business plan."
}
Response
{
"ok": true
}
List API request logs
GET /v1/logs/api-requests
Requires read_only scope (this endpoint is authenticated, unlike the rest of this page). The full endpoint, its query filters, its response shape, and the companion SSE stream are documented on the API Logs page.