Sendry Docs
API Reference

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

ParameterTypeDefaultDescription
limitnumber20Results per page (1-100).
cursorstringnext_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

ParameterTypeDefaultDescription
componentstringapi-gatewayComponent slug.
hoursnumber24Hours 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

FieldTypeRequiredDescription
namestringYesSubmitter name (1-200 chars).
emailstringYesValid email address (max 320 chars).
messagestringYesMessage body (1-5000 chars).
company_websitestringNoHoneypot 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.

On this page