Reliability & trust

What does 99.9% uptime mean for an iMessage API?

99.9% uptime allows about 43 minutes of downtime in a 30-day month, or about 8.8 hours a year. ZeroSettle shows "99.9% uptime" for its iMessage API on its homepage, but that figure is a published stat, not a contractual SLA, and uptime is a different thing from delivery: ZeroSettle's terms state that "delivery of any particular message or feature is not guaranteed". This page covers what the number allows, how ZeroSettle reports failures to your code, and how other providers' published figures compare.

Key takeaways

  • The arithmetic: 99.9% availability leaves 43.2 minutes of downtime per 30-day month and 8.76 hours per 365-day year.
  • ZeroSettle's figure: "99.9% uptime" is a homepage stat with no published measurement period or method. ZeroSettle publishes no SLA and no service credits.
  • Uptime is not delivery: message.sent means a message left the line. No ZeroSettle API event reports that a message reached the recipient or was read.
  • Failures are reported, not hidden: a 503 when the line is temporarily unreachable, 429 line_busy, message.failed, and webhook retries after 1, 5 and 20 seconds.
  • Price: Pro is $49/month for one number and Growth is "From $599/mo"; neither plan comes with an SLA. Enterprise is "Custom pricing": ask founders@zerosettle.io what terms are available.

How much downtime does 99.9% allow?

99.9% uptime allows 43.2 minutes of downtime in a 30-day month and 8.76 hours in a 365-day year. Each extra nine cuts the allowance by a factor of ten.

Downtime each uptime percentage allows (arithmetic, not measurements)
UptimeDowntime per 30-day monthDowntime per 365-day year
99%7.2 hours87.6 hours
99.9%43.2 minutes8.76 hours
99.95%21.6 minutes4.38 hours
99.99%4.32 minutes52.6 minutes

Downtime = (1 − uptime) × minutes in the period: 43,200 in a 30-day month, 525,600 in a 365-day year.

The percentage alone does not say how downtime is counted, so two providers can both say 99.9% and mean different things; what other providers publish shows how the definitions differ.

Availability multiplies along the chain

An inbound text reaches your code through two links: ZeroSettle's line and your webhook receiver. If each is up 99.9% and their outages are independent, the pair is up about 99.8% (0.999 × 0.999): roughly 86 minutes of downtime a month. ZeroSettle's webhook retries after 1, 5 and 20 seconds cover a receiver that is down for seconds, not minutes; a longer outage needs the steps in what to build for critical messages.

Is ZeroSettle's 99.9% an SLA?

No. "99.9% uptime" is a stat on ZeroSettle's homepage, shown beside "10,000+ messages/week", and ZeroSettle publishes no SLA. The homepage gives the figure without a measurement period, a method, or a link to a status page.

A contractual SLA defines four things: the percentage, how and over what period it is measured, what is excluded, and the remedy when it is missed (usually service credits). ZeroSettle publishes only the first, as a stat, and its iMessage API Terms disclaim any warranty of uninterrupted operation:

ZeroSettle does not warrant that the services will meet your requirements or that their operation will be uninterrupted or error-free.

ZeroSettle iMessage API Terms, section 14

If your contract requires an SLA with credits, ZeroSettle is not a fit today. The homepage's Enterprise tier ("Custom pricing", "For high volume and compliance needs") lists no SLA among its inclusions; ask founders@zerosettle.io what terms are available. How reliable ZeroSettle is lists every published figure with its source.

Uptime, delivery and latency are different things

An API can be up while one message fails, and a send can be slow while everything is up. Uptime, delivery and latency are separate measures, and ZeroSettle publishes something different about each.

What ZeroSettle publishes for each measure (docs, homepage and terms, checked October 8, 2026)
MeasureWhat ZeroSettle publishes
Uptime: is the service answering?"99.9% uptime", a homepage stat; no SLA
Send result: did the line hand the message to Apple?The send call returns once it has; then message.sent ("A message left the line") or message.failed ("A send was recorded but not delivered")
Delivery and reads: did it reach the recipient?Not reported by the API
Send latencyNormally 2–5 seconds; at most about 75 for a text, about 105 for a voice message or photo
Inbound latencyAbout 1–2 seconds from the line receiving a text to your webhook

ZeroSettle's terms (section 7) say message status, delivery and read receipts "may be delayed, incomplete, or inaccurate", and: "Delivery of a message does not guarantee that it was read, and the absence of a receipt does not mean a message was not delivered." Even a contractual 99.9% would say nothing about whether one text reached one person. iMessage delivery status, webhook retries and latency covers each event.

How does ZeroSettle keep lines available?

ZeroSettle runs the line for you, pushes inbound so it never delays a send, sends one message at a time per line, limits new contacts to keep the number out of Apple's spam filters, and replaces a flagged number. ZeroSettle publishes nothing about redundancy or failover, so this page claims none.

ZeroSettle is an iMessage API: a real phone number on real iMessage, running on Apple hardware we operate for you, that your code texts customers from and hears back on through a bearer token and signed webhooks (what ZeroSettle is explains the product).

  • Nothing for you to host. "We run the Apple hardware and set up the number for you." Keeping the line up is ZeroSettle's job; keeping your webhook receiver up is yours.
  • Inbound never blocks a send. "Inbound is pushed; nothing polls for it, so inbound never delays a send."
  • One send at a time per line. Concurrent sends queue and surface as line_busy after about 12 seconds of waiting.
  • Limits guard against the outage uptime does not measure. "Repeated messages to people who never answer are the fastest way to get a number flagged by Apple: when that happens every send fails, to everyone." The API can be up while a flagged number fails every send.
  • Flagged numbers are replaced. The homepage says: "across more than 10,000 messages a week we have seen it happen only twice", and ZeroSettle replaces the number "right away at no extra charge", with your API token, webhook and code unchanged. Recipients see a new number; what happens when a number is flagged covers the rest.

How do failures show up in your code?

ZeroSettle reports a failed send as an HTTP error with a machine-readable error.code and a stored failed record, and a failed webhook delivery in last_delivery, so downtime is visible to your code instead of silent. "Every attempt, successful or not, is stored (record.status is sent or failed)."

How ZeroSettle reports each failure (API docs, checked October 8, 2026)
SituationWhat your code seesWhat to do
Line temporarily unreachable or too slow to answer503 (line status offline or timeout)Retry with backoff
Another send held the line ~12 s429 line_busyRetry after 2 s
New-contact cap reached429 new_contact_limit with retry_after_sWait that long; with several numbers, it means every number is full (or the one you named)
Send recorded but not deliveredmessage.failed on your webhookTreat it as not sent
Your webhook down or slow3 retries after 1, 5 and 20 s, then the failure is recorded in last_deliveryFix the receiver, then catch up from GET /api/imessage/messages

This helper retries line_busy and the 503s, which the docs say to retry, plus network errors and 5xx responses that carry no ZeroSettle error code (a proxy error page, for example). Anything else, such as new_contact_limit, a 403 opt-out or a 502 send_failed, goes back to the caller.

python
import os, time
import requests

BASE = "https://portal.zerosettle.io"
TOKEN = os.environ["ZEROSETTLE_TOKEN"]

def send(to: str, text: str, attempts: int = 5) -> dict:
    delay, wait = 2, 0
    for _ in range(attempts):
        time.sleep(wait)                            # 0 on the first attempt, then the backoff
        try:
            r = requests.post(f"{BASE}/api/imessage/send",
                              headers={"Authorization": f"Bearer {TOKEN}"},
                              json={"to": to, "text": text},
                              timeout=120)          # a text can take up to about 75 s
        except requests.ConnectionError:
            wait, delay = delay, min(delay * 2, 60)
            continue
        if r.ok:
            return r.json()                         # record.status == "sent"
        try:
            err = r.json().get("error") or {}
        except ValueError:
            err = {}                                # not ZeroSettle's JSON, e.g. a proxy error page
        code = err.get("code")
        if code == "line_busy":                     # 429: another send held the line
            wait = float(r.headers.get("Retry-After", 2))
        elif code in ("phone_offline", "phone_timeout") or (r.status_code >= 500 and not code):
            wait, delay = delay, min(delay * 2, 60)  # 503: back off
        else:
            raise RuntimeError(f"{r.status_code} {code}: {err.get('message')}")
    raise RuntimeError("send still failing after retries: use your second channel")

GET /api/imessage/line returns last_delivery, the newest webhook delivery with ok, status_code, attempts and error, and the live stream reports every attempt as a delivery event. The full error table is in the docs.

What other providers publish

Messaging providers publish a contractual SLA with credits, a marketing number, a status-page measurement, or an explicit disclaimer. Every figure below was read on the provider's own page on October 8, 2026.

Published uptime figures and terms by provider (checked October 8, 2026)
ProviderWhat it publishesKind of figure
ZeroSettle"99.9% uptime"; terms disclaim uninterrupted operationHomepage stat, no SLA
Twilio (Twilio-branded APIs)99.95% per calendar month for its Services APIs (99.99% on Enterprise Edition); measures API availability, not message delivery; excludes telecommunications-provider problems; credits, not refundsContractual SLA
Linq"99.95% uptime backed by the only contractual SLA in the industry"; "Contractual SLAs" listed under Enterprise; status page: "Linq V3 API" 99.93%, Jul–Oct 2026Marketing claim, Enterprise SLA, status page
Blooio"99.9% Uptime" on its pricing page; the page's Markdown version says "99.9% uptime target (a contractual SLA is available only in a signed Enterprise Order Form)"Target; SLA by contract
Sendblue"99.9%" beside "Uptime SLA" on its API page; no uptime commitment in its terms of serviceMarketing figure; no published SLA terms
Project BlueMessaging Gateway "100% uptime" on its status page's 90-day bar; terms: "does not guarantee message delivery"Status page
LoopMessageNo uptime figure found; incidents on May 31–June 1, 2026 (messaging, about 15 hours) and June 4, 2026 (CDN, about 2 hours)Incident history
Apple Messages for Business"Apple makes no guarantees in relation to the availability or uptime of Apple Messages for Business"Disclaimer
WhatsApp Business PlatformThe platform "may be interrupted, including for maintenance, repairs, upgrades, or network or equipment failures"; provided "as is" and without any warranty of any kindDisclaimer

Sources are listed at the end of the page. Competitor figures change; check each provider's page before relying on one.

Compare definitions, not digits: Twilio's 99.95% is measured per calendar month, ignores outages shorter than five continuous minutes and scheduled maintenance, and pays credits; Linq's status page shows 99.93% for its V3 API from July to October 2026; and ZeroSettle's 99.9% is a reported stat with no stated method. ZeroSettle vs Linq compares those two iMessage providers in depth.

What to build for critical messages

Design for the minutes a 99.9% figure allows: retry the right errors, make your webhook receiver idempotent, watch last_delivery, and send anything that must arrive over a second channel too.

  1. Retry with backoff, then hand off. Cap the attempts, as the helper above does, and never retry 403 recipient_opted_out.
  2. Make the receiver idempotent. Answer 2xx within 10 seconds and queue the work. Retries carry the same message.id and event, so dedupe on that pair, and order by message.id if order matters.
  3. Alert on last_delivery. Check GET /api/imessage/line on a schedule and page your team when last_delivery.ok is false.
  4. Count message.failed as not sent. Never mark an alert or reminder delivered on a failed record.
  5. Keep a second channel for messages that must arrive. On-call alerts over iMessage shows a relay that falls back to another pager when a send fails.

The webhook steps in the ZeroSettle docs cover signature checks and a signed test event. Plans are on the homepage pricing section, you can get a number from the console, and the reliability and trust hub collects related pages.

Frequently asked questions

Does 99.9% uptime mean 99.9% of messages are delivered?

No. Uptime describes whether the service is available, not what happens to each message. ZeroSettle publishes no delivery rate, and the API reports failures as message.failed.

Does a flagged number count against ZeroSettle's 99.9% figure?

ZeroSettle doesn't say what the 99.9% figure counts. A flagged number makes every send fail while the API itself answers, until ZeroSettle replaces the number at no extra charge.

Are messages lost if my webhook is down longer than the retries?

No. ZeroSettle stores every message (kept indefinitely for now) and records the failed delivery. To catch up, page forward with GET /api/imessage/messages?after_id= from the last id your server stored.

Do failed sends use up my new-contact limit or AI credits?

No. Failed sends never count as new contacts, and on the hosted AI agent a text that is refused or fails gives its credit back.

Does ZeroSettle pay service credits for downtime?

No credits are published, because ZeroSettle publishes no SLA. The 30-day money-back guarantee covers the subscription: ask within 30 days and you are refunded in full and the subscription is cancelled.

Sources

  1. ZeroSettle homepage: the "99.9% uptime" and "10,000+ messages/week" stats, plans, and the FAQ on spam flags and number replacement. Checked October 8, 2026.
  2. ZeroSettle iMessage API docs: "Your iMessage number" (pricing), "Send a message", "Read messages", "AI agent" (AI credits), "Webhooks, step by step" and "Errors, limits, and compliance". Checked October 8, 2026.
  3. ZeroSettle iMessage API Terms, sections 2, 7 and 14. Last modified September 28, 2026.
  4. Twilio APIs Service Level Agreement, Twilio. Updated April 9, 2026; checked October 8, 2026.
  5. Linq iMessage API, Linq pricing and Linq status page, Linq. Checked October 8, 2026.
  6. Blooio pricing and its Markdown version, Blooio. Checked October 8, 2026.
  7. Sendblue iMessage API and Sendblue Terms of Service, Sendblue. Checked October 8, 2026.
  8. Project Blue status page and Project Blue Terms of Use, Project Blue. Checked October 8, 2026.
  9. LoopMessage incident reports: "Messaging performance issue" (May 31–June 1, 2026) and "Issue with CDN provider" (June 4, 2026), LoopMessage status page. Checked October 8, 2026.
  10. Service Terms for Messages for Business, Apple, section 4.2. Last updated December 17, 2024; checked October 8, 2026.
  11. Meta Terms for WhatsApp Business Platform, Meta, sections 4.3 and 7.8. Last modified September 23, 2026; checked October 8, 2026.

Changelog

  • First published.

Written by the ZeroSettle team. ZeroSettle is an iMessage API: a real phone number on real iMessage, running on Apple hardware we operate for you, that your code texts customers from and hears back on through a bearer token and signed webhooks.

Text your customers from your own iMessage number

ZeroSettle gives your business its own phone number on real iMessage, running on Apple hardware we operate for you in a server facility. Your code sends with one API call and hears every reply on a signed webhook.

Pro is $49 a month with a 30-day money-back guarantee. Growth, for several numbers working as one, is from $599/mo.