Skip to main content

Emergency Address (E911)

Register an emergency (E911 / PSAP) dispatchable address against each provisioned number so an emergency call carries the correct civic location. The address is stored on the number and gated by org ownership — a sibling subaccount sharing your tenant schema can neither read nor mutate another subaccount’s dispatchable location.
Orbit’s outbound 911 posture is block-and-disclaim (ADR-010). Registering an emergency address records and validates the dispatchable location; it does not by itself enable outbound emergency dialing. Treat E911 as a compliance/record-keeping surface, not a live emergency-calling guarantee.

Lifecycle at a glance

A registered address moves through four statuses, from registered to dispatchable:
  1. Register or update. PUT writes the civic fields and stamps the address registered. An update replaces the previous address and resets the status — any earlier validation or confirmation attached to the old address no longer applies.
  2. Verify locally. POST /verify runs a client-side structural check (required civic fields present, postal-code shape). A clean address moves to valid; a failed check stamps it invalid with per-field issues.
  3. Record the provider confirmation. POST /psap-confirmation ingests the carrier/PSAP MSAG verdict that arrives out-of-band (provider portal, follow-up webhook). confirmed: true flips the address to dispatchable; confirmed: false flips it to invalid with the rejection reason.
  4. Remove. DELETE clears the address entirely. A delete on a number with no address returns 404, not a silent no-op.
Only dispatchable — the provider-confirmed verdict — means the address is a usable emergency location. valid is a structural pre-check, deliberately scoped so it never costs money or touches a provider address-lookup API.

Get the Registered Address

Returns { "id": "...", "address": null } when nothing is registered, and the full address object once one is:

Register or Update the Address

A successful register or update returns 200 with the stored address and the lifecycle reset to registered:
Owner/admin only. An invalid address returns 422 VALIDATION_ERROR with field-level details.

Country coverage

The address shape is country-agnostic: country accepts any ISO-3166 alpha-2 code, and required fields (caller_name, street_line_1, city, region, postal_code) apply everywhere. Postal-code validation is strict for the two NANP countries (US five-digit ZIP, optionally with the four-digit extension; Canada letter-digit-letter form) and length-only everywhere else — a non-US registration never fails on country format. “Dispatchable” means a provider has confirmed the civic address against its MSAG database, so an emergency call routes to the correct PSAP. Orbit records that confirmation; whether a PSAP accepts one depends on the carrier owning the number. For fixed locations register the civic address here; for roaming or hot-desk devices pair it with the per-device dispatchable-location routes under /:id/emergency-address/location (see the emergency-calling policy page for how Orbit blocks the unsupported outbound 911 path and how that interacts with what you register here).

Verify the Address

Runs a local structural dispatch-readiness check and returns a validation_status plus any validation_issues. A clean address comes back valid:
A failed check stamps validation_status: "invalid" and names each issue, for example "postal_code is not a valid US postal code format" — fix the field and re-run before asking the provider for an MSAG confirmation. Verify on a number with no address registered returns 404.
Verification is deliberately local-only — it does not call any provider address-verification API. Upstream PSAP/MSAG confirmation is recorded separately (below).

Verification model

Two distinct verdicts write the validation_status field, and they answer different questions: Keep the roles straight:
  • Replace the address (PUT) and the lifecycle resets to registered — the update invalidates the prior valid or dispatchable verdict because the civic fields changed. Re-verify after every edit.
  • validation_issues on a failed verify or rejected confirmation tells you which field or provider reason to fix.

Record a PSAP/MSAG Confirmation

Ingest the carrier/PSAP MSAG confirmation result to flip the address to dispatchable (confirmed) or invalid (rejected). This records an inbound, out-of-band result — it does not initiate a provider verification call.
A confirmed result flips the status to dispatchable and stores the confirmation detail:
Owner/admin only. When confirmed is false the status flips to invalid and the provider’s reason lands in validation_issues; include rejection_reason in the request — the API returns 422 VALIDATION_ERROR without it. A confirmation on a number with no address registered returns 404.

Remove the Address

Returns 200 with address cleared to null, confirming the removal:

From the dashboard

In the Orbit dashboard, open Numbers, click a number, and use the Emergency address card on the number detail page. It mirrors the API: the status badge reflects the lifecycle (registeredvaliddispatchable); Edit replaces the address; Run validation calls /verify; Record PSAP confirmation flips the verdict when your carrier reports the MSAG result; and removal is gated behind a confirmation dialog. Sibling subaccounts never see the card’s fields from another subaccount — the API gate applies the same way.

Troubleshooting

  • 422 VALIDATION_ERROR on PUT — the body is missing a required field, or a field breaks its shape (empty caller_name, missing country, invalid postal pattern for US/CA, country not ISO alpha-2). The response lists each issue; fix the field and retry. Only owners and admins can write.
  • verify returns invalid with validation_issues — run locally first; the check flags empty civic fields and NANP postal-format mismatches. Fix the address fields and re-run /verify before you ask the provider for an MSAG confirmation.
  • verify seems to do nothing useful — it never calls a provider (deliberate, so verification is free and idempotent). Use it as a pre-check, then rely on psap-confirmation for the actual provider verdict.
  • psap-confirmation rejected your 422 — when confirmed: false the API requires a rejection_reason. Include it.
  • Cannot read or mutate the address from a sibling subaccount — the endpoint is org-scoped by design; each subaccount sees only its own numbers’ dispatchable location. Nothing is shared across subaccounts that share a tenant schema.
  • DELETE returns 404 — no address is registered on the number. The delete is deliberately not a silent no-op so a missing address surfaces.