E911
Every calling endpoint has a place 911 can find.
A browser or an SDK app without cellular can only reach 911 through SiteCall, so each endpoint carries a dispatchable location. On a phone, hand 911 to the phone's own dialer instead.
On a phone, always dial 911 with the system dialer (tel:911): it goes over cellular with the handset's own location. SiteCall's VoIP 911 path is for endpoints with no cellular radio.
Is 911 routed through SiteCall yet?
E911 routing is switched on per deployment by SiteCall. GET /api/v1/emergency-locations/resolve tells an endpoint where it stands:
| Field | Meaning |
|---|---|
routingEnabled | 911 and 933 route through SiteCall. False: they are refused (emergency_unavailable); use a phone's dialer. |
outboundEnabled | False only while routing is on and the endpoint has no dispatchable location: outbound calls are refused (emergency_location_required) until it has one. |
location | The location this endpoint resolves to, or null. |
Which location an endpoint uses
The most specific one the carrier has not rejected:
- one device's own location (by its install id);
- a member's or an application user's own location;
- the workspace's location: an address an owner typed, else its registered business address, which SiteCall validates and seeds.
Set a location
PUT /api/v1/emergency-locations (scope devices:*). A token sets its own subject's locations (its user, member or device); your key may set any target in a workspace you manage. The address is validated by the carrier before it is stored; one it cannot validate is a 422 emergency_address_invalid. The stored address is the carrier's normalized one.
PUT /api/v1/emergency-locations
await asUser.emergencyLocations.set({
target: { kind: "device", deviceId: "web_8b1f…" },
address: {
streetAddress: "500 E 5th St", // starts with the house number
extendedAddress: "Suite 210", // optional: suite, floor, room
locality: "Austin",
administrativeArea: "TX",
postalCode: "78701",
countryCode: "US", // US, CA or PR
},
callbackNumber: "+15125550100", // optional: a workspace number
callerName: "Acme Roofing", // optional
});Targets are { kind: "workspace" }, { kind: "member", memberId? }, { kind: "user", userId? } and { kind: "device", deviceId, memberId?, userId? }; an id left out means the token's own subject. The web SDK's setEmergencyLocation and the React Native SDK's do the device form for you. providerStatus follows the carrier: not_provisioned (validated; routing not on yet), pending, activated, rejected or error (retried; never blocks).
GET /api/v1/emergency-locations lists a workspace's stored locations (application keys only); DELETE /api/v1/emergency-locations/{id} removes an override.
When someone dials 911
- With routing on, 911 and 933 (the carrier's test number: it reads the address back and dispatches nobody) are never refused for an endpoint that may call out. They skip the plan, the caller-ID rule and the destination policy, with their own limit of 10 a minute per device.
- The call carries the endpoint's location to the carrier when it is provisioned, and the location's callback number while it is active; otherwise the carrier uses the number's registered address. Emergency calls are never recorded and never use machine detection.
- AI agents never dial 911.
Test with 933, never 911. Show your users where to change their location, and tell them on every surface that a phone's own dialer is the safest way to reach 911.