Monthly SLA and availability report
The monthly SLA report is the availability attestation for your organization: one response per calendar month that shows, per channel, the measured availability, the declared incidents that caused any downtime, and your delivery success rate. It answers three questions at once — was the channel measured up, why was it down, and did my messages actually get delivered. The same report powers the Settings → Reliability page in the dashboard and is exportable as CSV, so the number you read, the number you attach to a claim, and the number support quotes are always the same figure.Access and role gates
The report endpoint is restricted to the owner and admin roles. An availability attestation is an org-level document a customer may share with their own customers or procurement team, so it is scoped to roles trusted to export org data. Other roles get a403.
period is a calendar month in YYYY-MM form. Omit it to get the current
month. A malformed value (2026-4, 04-2026, 2026-13) returns
400 INVALID_PERIOD.
The endpoint is GET /api/v1/organizations/sla-report. Export the same
report as CSV with ?format=csv:
complete or month-to-date, and the report’s refresh time on
every row. A metric-definitions block is appended below the table so the file
still states how every figure was derived when it is detached from the
dashboard — useful when you attach it to a claim.
Owner/admin are also the only roles that can open Settings → Reliability
in the dashboard, which renders this same report with a month picker and an
export button.
What the report is a read-model of
The report does not maintain its own telemetry store. It is a read-model — a deterministic assembly — over two inputs you already have other views of:- The public incident feed. The same declared incidents Orbit publishes on the status page. Availability, downtime minutes, and the incident windows in the report are all derived from this feed.
- Your own outbound message records. Delivery success is aggregated from your organization’s message log over the period — the same outbound-scoped view the analytics dashboard reads.
Reading per-channel availability
Each channel row carries:
The formula, per channel, is one line:
period_minutesis the reporting window in minutes — the full calendar month in UTC for a complete month, or elapsed month-to-date minutes for the current month.downtime_minutesis the union of all incident windows attributed to the channel, clamped to the period. Overlapping incidents are counted once — two incidents affecting SMS at the same hour deduct that hour once.- Incidents are attributed per channel from their declared affected component. A platform-wide incident is attributed to every channel; an unrecognised component is conservatively treated as platform-wide so it is never silently dropped from the math.
- Scheduled maintenance and informational notices do not count against availability; minor, major, and critical incidents do.
availability_pct: null
and measured: false — rendered as Not measured in the dashboard and
"not measured" in the CSV. There is no evidence it was up, so the report
does not attest to it; reading 100% would turn “nothing observed” into
“verified up.” Unmeasured channels are also excluded from the overall
availability mean, so a quiet month on one channel cannot mask a real
incident on another.
Overall availability is the unweighted mean of the measured channels’
percentages — each measured channel counts equally, so a single-channel
incident moves the mean less than a platform-wide one.
Reading delivery success and delivery health
Availability and delivery success measure different things. Availability covers declared platform incidents; delivery success is the end-to-end outcome of your outbound traffic:messages_terminal) counts your outbound messages that
reached a final state in the period — delivered, failed, undelivered, or
rejected. Messages still in flight are excluded. The numerator
(messages_delivered) counts messages the recipient side confirmed. The
same status sets power the analytics dashboard, so the figure here matches
there: an unknown or in-flight outcome drags the rate down rather than
reading as success.
Delivery success can be low even at 100% availability — invalid recipients,
an unregistered sender, filtered content, carrier rejection, or insufficient
balance are not platform incidents. To make that signal visible instead of
silent, each channel row also carries a delivery_health tier:
Below 10 terminal messages the rate is intentionally not tiered — a single
failed test send is not a Degraded alert. No channel with real volume and a
collapsing delivery rate goes unflagged just because no incident was
declared.
Operator playbook
Pull a complete month and sanity-check the headline.incidents
array — each window names the incident, its affected channels, and the
minutes it overlaps the month. The WhatsApp dip will line up with exactly
one window, say a 25-minute WhatsApp outage on April 12:
GET /api/v1/organizations/sla-report/credit:
&monthlySpendCents=… to also get the credit amount, &plan= to assess a
different tier, or &uptimeTargetPct= for an explicit target. It computes
an entitlement — it does not post to your wallet.
Export for the claim. Attach the CSV (?format=csv) — the appended
methodology block lets the reviewer validate every figure without access to
your dashboard.
Boundary conditions
- Month-boundary incidents are pro-rated. An incident from April 30 23:00 to May 1 02:00 deducts 60 minutes from April and 120 from May — the split lands on whichever month each minute of the outage overlaps. An incident that starts before the period start (or resolves after the period end) is included only for the portion inside the period.
- Current month is month-to-date. When you request the month in progress
(or omit
period), the reporting window ends at the refresh time, the response is flaggedpartial: true, andas_ofmarks the effective cut-off (the CSV showsmonth-to-dateas the period status). Wait for the month to close before using it as an attestation. - Still-open incidents. For a complete month an open incident’s end is clamped to the period end — not to the time you generated the report — so the figure stays stable regardless of when you regenerate.
- Months before incident publication began simply show those months with fewer (or zero) incident windows; channels with traffic still read as measured on their delivery rows.
See also
- 10DLC registration — sender registration and carrier trust directly affect deliverability, which reads here as delivery success
- Scheduled reports — email a metrics digest on a daily/weekly/monthly cadence instead of pulling on demand
- Cost intelligence — pair availability figures with unit costs when deciding where to route traffic