Getting started
Scopes
A scope is one question your app may ask. Users grant them individually, so expect to hold fewer than you requested.
Ask for the fewest that make your product work. Every extra scope is another line on the consent screen and another reason to decline.
Choosing a tier
Ask yourself: would an answer do?
If you're drawing a moving dot on a map, you need coordinates, and the sensitive tier is the honest choice. If you're sending a notification, tagging a photo, unlocking something, or checking a transaction, an answer will do.
If you do take the sensitive tier, two things come with it: every call names a registered purpose the user reads, and the access ends on a date the user picks, at most 90 days out. See Two expiries.
Three common mistakes:
- Using
location.latest.readto check proximity. Uselocation.verify.zone. You get inside or outside without holding a position. - Using
location.history.readto build a timeline. Uselocation.visits.read. You get "arrived at the gym 9:15, left 10:40", which is what a timeline shows. - Polling
current-placeevery thirty seconds. Register a rule. Polling burns your budget and still tells you late.
Scopes that involve places
Five scopes ask about the user's named places: location.place.current, location.place.presence, location.visits.read, location.lookup.place and location.rules.place.
For these, the user also picks which places you may ask about. They can change that later without re-minting your token, so your visible set can shrink between two calls.
Design for a user who shares nothing. current-place will answer no_place every time, and that is a valid setup, not an error.
Scopes can narrow later
Review never quietly trims your list. An application is approved as submitted or declined with reasons, and you resubmit once you've made the changes — so what you asked for is what you get, or you're told why not.
The set can still shrink after that. Your effective scopes are the intersection of your app's declared list and each user's grant, a user can narrow what they share at any time, and we can cut an app's declared scopes as an enforcement action against abuse. Both apply to live tokens immediately, so a call that worked yesterday can return 403 today.
Handle 403 by turning the feature off, not by retrying.
Full list
Where you are right now
Answers about the places you shared. Never a position.
| Scope | Tier | Grants |
|---|---|---|
location.place.currentGET /v1/answers/current-place | Standard | Ask which of your shared places you are at right now |
location.place.presenceGET /v1/answers/places/:place_id/presence
GET /v1/answers/places | Standard | Ask whether you are at one specific shared place (yes/no only) |
Zones the app defines
Whether you are inside an area the app names, and nothing else.
| Scope | Tier | Grants |
|---|---|---|
location.verify.zonePOST /v1/answers/verify-zone | Standard | Ask whether you are inside a zone the app names (yes/no only) |
Where you have been
Past visits as place names and time windows.
| Scope | Tier | Grants |
|---|---|---|
location.visits.readGET /v1/visits | Standard | Read your visit history as place labels and time windows |
location.lookup.placeGET /v1/lookup/place?at= | Standard | Look up which shared place you were at, at a specific moment |
Being told when something happens
The app is notified on arrival or departure instead of asking.
| Scope | Tier | Grants |
|---|---|---|
location.rules.placePOST/GET/DELETE /v1/rules/place | Standard | Get notified when you arrive at or leave a shared place |
location.rules.zonePOST/GET/DELETE /v1/rules/zone | Standard | Get notified when you enter or leave a zone the app names |
location.places.watchPOST/GET/DELETE /v1/subscriptions | Standard | Be told when the set of places you share with the app changes |
Your exact coordinates
Real positions, not answers. Only a few products need this.
| Scope | Tier | Grants |
|---|---|---|
location.latest.readGET /v1/locations/latest | Sensitive | Read your exact current coordinates |
location.history.readGET /v1/locations/timerange | Sensitive | Read your exact coordinates over time ranges |
location.lookupGET /v1/locations/lookup?at= | Sensitive | Read your exact coordinates at a specific moment |