| CARVIEW |
Geolocation
More details about this document
- This version:
- https://w3c.github.io/geolocation/
- Latest published version:
- https://www.w3.org/TR/geolocation/
- Latest editor's draft:
- https://w3c.github.io/geolocation/
- History:
- https://www.w3.org/standards/history/geolocation/
- Commit history
- Test suite:
- https://wpt.live/geolocation/
- Implementation report:
- https://w3c.github.io/geolocation/reports/implementation.html
- Editors:
- Marcos Cáceres (Apple Inc.)
- Reilly Grant (Google)
- Former editor:
- Andrei Popescu (Google Inc.)
- Feedback:
- GitHub w3c/geolocation (pull requests, new issue, open issues)
- Errata:
- Errata exists.
- Browser support:
- caniuse.com
Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Abstract
Geolocation provides access to geographical location information associated with the hosting device.
Status of This Document
This section describes the status of this document at the time of its publication. A list of current W3C publications and the latest revision of this technical report can be found in the W3C standards and drafts index.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Since this specification became a W3C Recommendation on 01 September 2022, the following substantive additions and/or corrections have been proposed:
- Correction: Clarify that only the emulated error code is used (#187)
- Addition: support geolocation emulation (#183)
- Correction: Use null instead of NaN when stationary (#173)
- Correction: Update acquisition algorithm to define data types and han…
- Addition: Define units for accuracy (#162)
- Correction: check for non-secure contexts (#157)
- Addition: expose .toJSON() on GeolocationCoordinates + GeolocationPos…
- Correction: Clarify units and reference geodetic system for latitude …
A more detailed list of changes can be found in section D. Change log. Reviewers of the document can identify candidate additions and/or corrections by their distinctive styling in the document.
This document was published by the Devices and Sensors Working Group and the Web Applications Working Group as an Editor's Draft.
Publication as an Editor's Draft does not imply endorsement by W3C and its Members.
This is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to cite this document as other than a work in progress. Future updates to this upcoming Recommendation may incorporate new features.
This document was produced by groups operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures (Devices and Sensors Working Group) and a public list of any patent disclosures (Web Applications Working Group) made in connection with the deliverables of each group; these pages also include instructions for disclosing a patent. An individual who has actual knowledge of a patent that the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 18 August 2025 W3C Process Document.
This section is non-normative.
Geolocation defines a high-level interface to location information associated only with the device hosting the implementation. Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs, as well as user input. The API itself is agnostic of the underlying location information sources, and no guarantee is given that the API returns the device's actual location.
If an end user grants permission, Geolocation:
- Provides location data as latitude, longitude, altitude, speed, and
heading, as well as the accuracy of the acquired location data, and the
approximate time for when the position was acquired via the
GeolocationPositioninterface. - Supports "one-shot" position updates via the
getCurrentPosition()method and the ability to receive updates for when the position of the hosting device significantly changes via thewatchPosition()method. - Using the
PositionOptions'smaximumAge, allows an application to request a cached position whose age is no greater than a specified value (only the last position is cached). - Provides a way for the application to receive updates about errors,
as a
GeolocationPositionError, that have occurred while acquiring a position. - And through
enableHighAccuracy, supports requesting "high accuracy" position data, though the request can be ignored by the user agent.
This section is non-normative.
This specification is limited to providing a scripting API for retrieving geographic position information associated with a hosting device. The geographic position information is provided in terms of World Geodetic System coordinates [WGS84]. It does not include providing a markup language of any kind, nor does it include defining a new URL scheme for building URLs that identify geographic locations.
This section is non-normative.
The API is designed to enable both "one-shot" position requests and repeated position updates. The following examples illustrate common use cases.
This section is non-normative.
Request the user's current location. If the user allows it, you will get back a position object.
This section is non-normative.
Request the ability to watch user's current location. If the user allows it, you will get back continuous updates of the user's position.
This section is non-normative.
Stop watching for position changes by calling the
clearWatch() method.
This section is non-normative.
When an error occurs, the second argument of the
watchPosition() or
getCurrentPosition() method gets called with a
GeolocationPositionError error, which can help you figure out
what might have gone wrong.
This section is non-normative.
By default, the API always attempts to return a cached position so long as it has a previously acquired position. In this example, we accept a position whose age is no greater than 10 minutes. If the user agent does not have a fresh enough cached position object, it automatically acquires a new position.
This section is non-normative.
If you require location information in a time sensitive manner, you
can use the PositionOptions timeout member to
limit the amount of time you are willing to wait to acquire a position.
This section is non-normative.
The default allowlist of 'self'
allows API usage in same-origin nested frames but prevents
third-party content from using the API.
Third-party usage can be selectively enabled by adding the
allow="geolocation" attribute to an iframe element:
Alternatively, the API can be disabled in a first-party context by specifying an HTTP response header:
See Permissions Policy for more details about the
Permissions-Policy HTTP header.
This section is non-normative.
The API defined in this specification is used to retrieve the geographic location of a hosting device. In almost all cases, this information also discloses the location of the user of the device, thereby potentially compromising the user's privacy.
This section is non-normative.
Geolocation is a powerful feature that requires
express permission from an end-user before any location data is
shared with a web application. This requirement is normatively
enforced by the check permission steps on which the
getCurrentPosition() and
watchPosition() methods rely.
An end-user will generally give express permission through a user interface, which usually presents a range of permission lifetimes that the end-user can choose from. The choice of lifetimes vary across user agents, but they are typically time-based (e.g., "a day"), or until browser is closed, or the user might even be given the choice for the permission to be granted indefinitely. The permission lifetimes dictate how long a user agent grants a permission before that permission is automatically reverted back to its default permission state, prompting the end-user to make a new choice upon subsequent use.
Although the granularity of the permission lifetime varies across user-agents, this specification urges user agents to limit the lifetime to a single browsing session by default (see 3.4 Checking permission to use the API for normative requirements).
This section is non-normative.
This section applies to "recipients", which generally means developers utilizing Geolocation. Although it's impossible for the user agent, or this specification, to enforce these requirements, developers need to read this section carefully and do their best to adhere to the suggestions below. Developers need to be aware that there might be privacy laws in their jurisdictions that can govern the usage and access to users' location data.
Recipients ought to only request position information when necessary, and only use the location information for the task for which it was provided to them. Recipients ought to dispose of location information once that task is completed, unless expressly permitted to retain it by the user. Recipients need to also take measures to protect this information against unauthorized access. If location information is stored, users need to be allowed to update and delete this information.
The recipients of location information need to refrain from retransmitting the location information without the user’s express permission. Care needs to be taken when retransmitting and the use of encryption is encouraged.
Recipients ought to clearly and conspicuously disclose the fact that they are collecting location data, the purpose for the collection, how long the data is retained, how the data is secured, how the data is shared if it is shared, how users can access, update and delete the data, and any other choices that users have with respect to the data. This disclosure needs to include an explanation of any exceptions to the guidelines listed above.
This section is non-normative.
Implementers are advised to consider the following aspects that can negatively affect the privacy of their users: in certain cases, users can inadvertently grant permission to the user agent to disclose their location to websites. In other cases, the content hosted at a certain URL changes in such a way that the previously granted location permissions no longer apply as far as the user is concerned. Or the users might simply change their minds.
Predicting or preventing these situations is inherently difficult. Mitigation and in-depth defensive measures are an implementation responsibility and not prescribed by this specification. However, in designing these measures, implementers are advised to enable user awareness of location sharing, and to provide access to user interfaces that enable revocation of permissions.
Geolocation is a default powerful feature identified
by the name "geolocation".
When checking permission to use the API, a user agent MAY suggest time-based permission lifetimes, such as "24 hours", "1 week", or choose to remember the permission grant indefinitely. However, it is RECOMMENDED that a user agent prioritize restricting the permission lifetime to a single session: This can be, for example, until the realm is destroyed, the end-user navigates away from the origin, or the relevant browser tab is closed.
There are no security considerations associated with Geolocation at the time of publication. However, readers are advised to read the 3. Privacy considerations.
WebIDLpartial interface Navigator {
[SameObject] readonly attribute Geolocation geolocation;
};
The geolocation attribute provides the entry point for
accessing the Geolocation API.
WebIDL[Exposed=Window]
interface Geolocation {
undefined getCurrentPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
long watchPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
undefined clearWatch (long watchId);
};
callback PositionCallback = undefined (
GeolocationPosition position
);
callback PositionErrorCallback = undefined (
GeolocationPositionError positionError
);
Instances of Geolocation are created with the internal slots in
the following table:
| Internal slot | Description |
|---|---|
| [[cachedPosition]] |
A GeolocationPosition, initialized to null. It's a reference
to the last acquired position and serves as a cache. A user agent
MAY evict [[cachedPosition]] by resetting it to
null at any time for any reason.
|
| [[watchIDs]] |
Initialized as an empty list of unsigned long
items.
|
The getCurrentPosition(successCallback,
errorCallback, options)
method steps are:
-
If the current settings object's relevant global object's associatedIf this's relevant global object's associatedDocumentis not fully active:Documentis not fully active:- Call back with error errorCallback and
POSITION_UNAVAILABLE. - Terminate this algorithm.
- Call back with error errorCallback and
- Request a position passing this, successCallback, errorCallback, and options.
The watchPosition(successCallback,
errorCallback, options)
method steps are:
-
If the current settings object's relevant global object's associatedIf this's relevant global object's associatedDocumentis not fully active:Documentis not fully active:- Call back with error passing errorCallback and
POSITION_UNAVAILABLE. - Return 0.
- Call back with error passing errorCallback and
- Let watchId be an implementation-defined
unsigned longthat is greater than zero. - Append watchId to this's
[[watchIDs]]. - Request a position passing this, successCallback, errorCallback, options, and watchId.
- Return watchId.
When clearWatch() is invoked, the user agent MUST:
- Remove watchId from this's
[[watchIDs]].
To request a position, pass a Geolocation
geolocation, a PositionCallback
successCallback, a PositionErrorCallback?
errorCallback, a PositionOptions
options, and an optional watchId:
- Let watchIDs be geolocation's
[[watchIDs]]. - Let document be the geolocation's relevant global object's associated
Document. - If document is not allowed to use the
"geolocation" feature:
- If watchId was passed, remove watchId from watchIDs.
- Call back with error passing errorCallback and
PERMISSION_DENIED. - Terminate this algorithm.
-
If geolocation's environment settings object
is a non-secure context:
- If watchId was passed, remove watchId from watchIDs.
- Call back with error passing errorCallback and
PERMISSION_DENIED. - Terminate this algorithm.
- If document's visibility state is
"hidden", wait for the following page visibility change steps to
run:
- Assert: document's visibility state is "visible".
- Continue to the next steps below.
- Let descriptor be a new
PermissionDescriptorwhosenameis"geolocation". -
In parallel:
- Set permission to request permission to use descriptor.
-
If permission is "denied", then:
- If watchId was passed, remove watchId from watchIDs.
- Call back with error passing errorCallback and
PERMISSION_DENIED. - Terminate this algorithm.
- Wait to acquire a position passing successCallback, errorCallback, options, and watchId.
- If watchId was not passed, terminate this algorithm.
- While watchIDs contains watchId:
- Wait for a significant change of geographic position. What constitutes a significant change of geographic position is left to the implementation. User agents MAY impose a rate limit on how frequently position changes are reported. User agents MUST consider invoking set emulated position data as a significant change.
- If document is not fully active or
visibility state is not "visible", go back to
the previous step and again wait
for a significant change of geographic position.
Note: Position updates are exclusively for fully-active visible documents
- Wait to acquire a position passing successCallback, errorCallback, options, and watchId.
To acquire a position,
passing PositionCallback successCallback, a
PositionErrorCallback? errorCallback,
PositionOptions options, and an optional
watchId.
- If watchId was passed and this's
[[watchIDs]]does not contain watchId, terminate this algorithm. - Let acquisitionTime be a new
EpochTimeStampthat represents now. - Let timeoutTime be the sum of acquisitionTime and
options.
timeout. - Let cachedPosition be this's
[[cachedPosition]]. - Create an implementation-specific timeout task that elapses at
timeoutTime, during which it tries to acquire the device's position
by running the following steps:
- Let permission be get the current permission state of
"geolocation". - If permission is "denied":
- Stop timeout.
- Do the user or system denied permission failure case step.
- If permission is "granted":
-
Check if an emulated position should be
used by running the following steps:
- Let emulatedPositionData be get emulated position data passing this.
- If emulatedPositionData is not null:
- If emulatedPositionData is a
GeolocationPositionError:- Call back with error passing
errorCallback and
emulatedPositionData.
code. - Terminate this algorithm.
- Call back with error passing
errorCallback and
emulatedPositionData.
- Let position be a new
GeolocationPositionpassing emulatedPositionData, acquisitionTime and options.enableHighAccuracy. - Queue a task on the geolocation task source with a step that invokes
successCallback with « position » and "
report". - Terminate this algorithm.
- If emulatedPositionData is a
- Let position be null.
- If cachedPosition is not null, and
options.
maximumAgeis greater than 0:- Let cacheTime be acquisitionTime minus the
value of the options.
maximumAgemember. -
If cachedPosition's
timestamp's value is greater than cacheTime, and cachedPosition.[[isHighAccuracy]]equals options.enableHighAccuracy, set position to cachedPosition.:- Queue a task on the geolocation task source with a step that invokes
successCallback with « cachedPosition » and
"
report". - Terminate this algorithm.
- Queue a task on the geolocation task source with a step that invokes
successCallback with « cachedPosition » and
"
- Let cacheTime be acquisitionTime minus the
value of the options.
- Otherwise, if position is not cachedPosition, try to
acquire position data from the underlying system, optionally
taking into consideration the value of
options.
enableHighAccuracyduring acquisition. - If the timeout elapses during acquisition, or acquiring
the device's position results in failure:
- Stop the timeout.
- Go to dealing with failures.
- Terminate this algorithm.
- If acquiring the position data from the
system succeeds:
- Let positionData be a map with the following
name/value pairs based on the acquired position data:
- "accuracy"
-
A non-negative
doublethat represents the accuracy value indicating the 95% confidence level in meters. Accuracy measures how close the measured coordinates are to the true position. - "altitude"
-
A
double?that represents the altitude in meters above the [WGS84] ellipsoid, ornullif not available. Altitude measures the height above sea level. - "altitudeAccuracy"
-
A non-negative
double?that represents the altitude accuracy, ornullif not available, indicating the 95% confidence level in meters. Altitude accuracy measures how close the measured altitude is to the true altitude. - "heading"
-
A
double?that represents the heading in degrees, ornullif not available or the device is stationary. Heading measures the direction in which the device is moving relative to true north. - "latitude"
-
A
doublethat represents the latitude coordinates on the Earth's surface in degrees, using the [WGS84] coordinate system. Latitude measures how far north or south a point is from the Equator. - "longitude"
-
A
doublethat represents the longitude coordinates on the Earth's surface in degrees, using the [WGS84] coordinate system. Longitude measures how far east or west a point is from the Prime Meridian. - "speed"
-
A non-negative
double?that represents the speed in meters per second, ornullif not available. Speed measures how fast the device is moving.
- Set position to a new
GeolocationPositionpassing positionData, acquisitionTime and options.enableHighAccuracy. - Set this's
[[cachedPosition]]to position.
- Set position to a new
GeolocationPositionpassing acquisitionTime and options.enableHighAccuracy. - Set this's
[[cachedPosition]]to position.
- Let positionData be a map with the following
name/value pairs based on the acquired position data:
- Stop the timeout.
- Queue a task on the geolocation task source with
a step that invokes successCallback with « position »
and "
report".
-
Check if an emulated position should be
used by running the following steps:
- Dealing with failures:
-
- If acquiring a position fails, do one of the following
based on the condition that matches the failure:
- User or system denied permission:
-
Call back with error passing errorCallback and
PERMISSION_DENIED.Note: Browser permission VS OS permission - Timeout elapsed:
-
Call back with error with errorCallback and
TIMEOUT. - Data acquisition error or any other reason:
-
Call back with error passing errorCallback and
POSITION_UNAVAILABLE.
- If acquiring a position fails, do one of the following
based on the condition that matches the failure:
- Let permission be get the current permission state of
When instructed to call back with error, given an
PositionErrorCallback? callback and an
unsigned short code:
- If callback is null, return.
- Let error be a newly created
GeolocationPositionErrorinstance whosecodeattribute is initialized to code. - Queue a task on the geolocation task source with a step
that invokes callback with « error » and "
report".
WebIDLdictionary PositionOptions {
boolean enableHighAccuracy = false;
[Clamp] unsigned long timeout = 0xFFFFFFFF;
[Clamp] unsigned long maximumAge = 0;
};
The enableHighAccuracy member provides a hint that the
application would like to receive the most accurate location data.
The intended purpose of this member is to allow applications to
inform the implementation that they do not require high accuracy
geolocation fixes and, therefore, the implementation MAY avoid using
geolocation providers that consume a significant amount of power
(e.g., GPS).
The timeout member denotes the maximum length of time,
expressed in milliseconds, before acquiring a position expires.
The time spent waiting for the document to become visible and for
obtaining permission to use the API is not
included in the period covered by the timeout
member. The timeout member only applies when
acquiring a position begins.
The maximumAge member indicates that the web application
is willing to accept a cached position whose age is no greater than
the specified time in milliseconds.
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute EpochTimeStamp timestamp;
[Default] object toJSON();
};
The coords attribute contains geographic coordinates.
The timestamp attribute represents the time when the
geographic position of the device was acquired.
The toJSON() method returns a JSON
representation of the GeolocationPosition object.
Instances of GeolocationPosition are created with the internal
slots in the following table:
| Internal slot | Description |
|---|---|
| [[isHighAccuracy]] |
A boolean that records the value of the
enableHighAccuracy member when this
GeolocationPosition is created.
|
The following task source is defined by this specification.
- The geolocation task source
-
Used by this specification to queue up non-blocking
PositionCallbackandPositionErrorCallbackwhen performing position requests.
WebIDL[Exposed=Window, SecureContext]
interface GeolocationCoordinates {
readonly attribute double accuracy;
readonly attribute double latitude;
readonly attribute double longitude;
readonly attribute double? altitude;
readonly attribute double? altitudeAccuracy;
readonly attribute double? heading;
readonly attribute double? speed;
[Default] object toJSON();
};
The latitude and
longitude attributes are geographic coordinates
specified in decimal degrees. The
latitude and longitude attributes denote the
position, specified as a real number of degrees, in the [WGS84]
coordinate system.
The accuracy attribute denotes the
accuracy level of the latitude and longitude coordinates in meters
(e.g., The 65 meters).accuracy
attribute denotes the position accuracy radius in meters.
The altitude attribute denotes the height of the position,
specified in meters above the [WGS84] ellipsoid.
The altitudeAccuracy attribute represents the altitude
accuracy in meters (e.g., 10 meters).
The heading attribute denotes the direction of travel of
the hosting device and is specified in degrees, where 0° ≤ heading
< 360°, counting clockwise relative to the true north.
The speed attribute denotes the magnitude of the
horizontal component of the hosting device's current velocity in
meters per second.
The toJSON() method returns a JSON
representation of the GeolocationCoordinates object.
A new GeolocationPosition is constructed with map
positionData, EpochTimeStamp timestamp and
boolean isHighAccuracy by performing the following steps:
- Let coords be a newly created
GeolocationCoordinatesinstance. - For each key → value in positionData:
- Set coords's attribute named key to value.
- Return a newly created
GeolocationPositioninstance with itscoordsattribute initialized to coords andtimestampattribute initialized to timestamp, and its[[isHighAccuracy]]internal slot set to isHighAccuracy.
A new GeolocationPosition is constructed with
EpochTimeStamp timestamp and boolean
isHighAccuracy by performing the following steps:
- Let coords be a newly created
GeolocationCoordinatesinstance:- Initialize coord's
latitudeattribute to a geographic coordinate in decimal degrees. - Initialize coord's
longitudeattribute to a geographic coordinate in decimal degrees. - Initialize coord's
accuracyattribute to a non-negative real number. The value SHOULD correspond to a 95% confidence level with respect to the longitude and latitude values. - Initialize coord's
altitudeattribute in meters above the [WGS84] ellipsoid, ornullif the implementation cannot provide altitude information. - Initialize coord's
altitudeAccuracyattribute as non-negative real number, or tonullif the implementation cannot provide altitude information. If the altitude accuracy information is provided, it SHOULD correspond to a 95% confidence level. - Initialize coord's
speedattribute to a non-negative real number, or asnullif the implementation cannot provide speed information. - Initialize coord's
headingattribute in degrees, ornullif the implementation cannot provide heading information. If the hosting device is stationary (i.e., the value of thespeedattribute is 0), then initialize theheadingtoNaN.
- Initialize coord's
- Return a newly created
GeolocationPositioninstance with itscoordsattribute initialized to coords andtimestampattribute initialized to timestamp, and its[[isHighAccuracy]]internal slot set to isHighAccuracy.
WebIDL[Exposed=Window]
interface GeolocationPositionError {
const unsigned short PERMISSION_DENIED = 1;
const unsigned short POSITION_UNAVAILABLE = 2;
const unsigned short TIMEOUT = 3;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};
-
PERMISSION_DENIED(numeric value 1) - Request a position failed because the user denied permission to use the API or the request was made from an non-secure context.
-
POSITION_UNAVAILABLE(numeric value 2) - Acquire a position failed.
-
TIMEOUT(numeric value 3) -
The length of time specified by the
timeoutmember has elapsed before the user agent could successfully acquire a position.
The code attribute returns the value it was initialized to (see 10.1
Constants for possible
values).
The message attribute is a developer-friendly textual
description of the code attribute.
This specification defines a policy-controlled feature identified
by the token string "geolocation". Its default allowlist is 'self'.
For the purposes of user-agent automation and application testing, this document defines geolocation emulations.
Each top-level traversable has an associated emulated position
data, which is data representing GeolocationCoordinates,
GeolocationPositionError or null, initially null.
To set emulated position data, given navigable navigable and an emulatedPositionData:
- Assert emulatedPositionData is either null, a
GeolocationCoordinates, or aGeolocationPositionError. - Let traversable be navigable’s top-level traversable.
- If traversable is not null:
- Set traversable's associated emulated position data to emulatedPositionData.
- User agents MUST consider this as a "significant change" in the wait for a significant change of geographic position step.
To get emulated position data, given Geolocation
geolocation:
- Let navigable be geolocation's relevant global object's
associated
Document's node navigable. - If navigable is null, return null.
- Let traversable be navigable’s top-level traversable.
- If traversable is null, return null.
- Return traversable's associated emulated position data.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, RECOMMENDED, and SHOULD in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
WebIDLpartial interface Navigator {
[SameObject] readonly attribute Geolocation geolocation;
};
[Exposed=Window]
interface Geolocation {
undefined getCurrentPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
long watchPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
undefined clearWatch (long watchId);
};
callback PositionCallback = undefined (
GeolocationPosition position
);
callback PositionErrorCallback = undefined (
GeolocationPositionError positionError
);
dictionary PositionOptions {
boolean enableHighAccuracy = false;
[Clamp] unsigned long timeout = 0xFFFFFFFF;
[Clamp] unsigned long maximumAge = 0;
};
[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute EpochTimeStamp timestamp;
[Default] object toJSON();
};
[Exposed=Window, SecureContext]
interface GeolocationCoordinates {
readonly attribute double accuracy;
readonly attribute double latitude;
readonly attribute double longitude;
readonly attribute double? altitude;
readonly attribute double? altitudeAccuracy;
readonly attribute double? heading;
readonly attribute double? speed;
[Default] object toJSON();
};
[Exposed=Window]
interface GeolocationPositionError {
const unsigned short PERMISSION_DENIED = 1;
const unsigned short POSITION_UNAVAILABLE = 2;
const unsigned short TIMEOUT = 3;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};- A new GeolocationPosition §9.6
-
accuracyattribute forGeolocationCoordinates§9.1 - acquire a position §6.6
-
altitudeattribute forGeolocationCoordinates§9.2 -
altitudeAccuracyattribute forGeolocationCoordinates§9.2 -
[[cachedPosition]]internal slot forGeolocation§6.1 - call back with error §6.7
- checking permission §3.4
-
clearWatch()method forGeolocation§6.4 -
codeattribute forGeolocationPositionError§10.2 -
coordsattribute forGeolocationPosition§8.1 - emulated position data §12.
-
enableHighAccuracymember forPositionOptions§7.1 -
geolocationattribute forNavigator§5.1 -
Geolocationinterface §6. - geolocation task source §8.5
-
"geolocation"§3.4 -
GeolocationCoordinatesinterface §9. -
GeolocationPositioninterface §8. -
GeolocationPositionErrorinterface §10. - get emulated position data §12.
-
getCurrentPositionmethod forGeolocation§6.2 -
headingattribute forGeolocationCoordinates§9.3 -
[[isHighAccuracy]]internal slot forGeolocationPosition§8.4 -
latitudeattribute forGeolocationCoordinates§9.1 -
longitudeattribute forGeolocationCoordinates§9.1 -
maximumAgemember forPositionOptions§7.3 -
messageattribute forGeolocationPositionError§10.3 -
PERMISSION_DENIED§10.1 -
POSITION_UNAVAILABLE§10.1 -
PositionCallback§6. -
PositionErrorCallback§6. -
PositionOptionsdictionary §7. - request a position §6.5
- set emulated position data §12.
-
speedattribute forGeolocationCoordinates§9.4 -
timeoutmember forPositionOptions§7.2 -
TIMEOUT§10.1 -
timestampattribute forGeolocationPosition§8.2 - toJSON()
-
[[watchIDs]]internal slot forGeolocation§6.1 -
watchPositionmethod forGeolocation§6.3
-
[HR-TIME] defines the following:
-
EpochTimeStamp
-
-
[HTML] defines the following:
-
allowattribute (foriframeelement) - allowed to use
- associated Document
- current settings object
- environment settings object
-
fully active (for
Document) -
iframeelement - In parallel
- navigable
- navigates
-
Navigatorinterface - node navigable
- non-secure contexts
- origin
- page visibility change steps
- Queue a task
- realm (for environment settings object)
- relevant global object
- task source
- top-level traversable
-
top-level traversable (for
navigable) -
visibility state (for
Document)
-
-
[INFRA] defines the following:
-
Append (for
list) -
contains (for
list) -
For each (for
map) - implementation-defined
-
item (for
list) - list
- map
-
Remove (for
list)
-
Append (for
-
[PERMISSIONS] defines the following:
- default powerful feature
- express permission
- get the current permission state
-
granted (for
permission) -
lifetimes (for
permission) - name (for powerful feature)
-
name(forPermissionDescriptor) - permission
- permission state
-
PermissionDescriptor - powerful feature
- request permission to use
-
[PERMISSIONS-POLICY] defines the following:
- 'self' (for default allowlist)
- default allowlist (for policy-controlled feature)
- policy-controlled feature
-
[WEBIDL] defines the following:
-
booleantype -
[Clamp]extended attribute -
[Default]extended attribute -
DOMStringinterface -
doubletype -
[Exposed]extended attribute - invokes
-
longtype -
objecttype -
[SameObject]extended attribute -
[SecureContext]extended attribute - this
-
undefinedtype -
unsigned longtype -
unsigned shorttype
-
This section is non-normative.
This specification builds upon earlier work in the industry, including research by Aza Raskin, Google Gears Geolocation API, and LocationAware.org.
Thanks also to Alec Berntson, Alissa Cooper, Steve Block, Greg Bolsinga, Lars Erik Bolstad, Aaron Boodman, Dave Burke, Chris Butler, Max Froumentin, Shyam Habarakada, Marcin Hanclik, Ian Hickson, Brad Lassey, Angel Machin, Cameron McCormack, Daniel Park, Stuart Parmenter, Olli Pettay, Chris Prince, Arun Ranganathan, Carl Reed, Thomas Roessler, Dirk Segers, Allan Thomson, Martin Thomson, Doug Turner, Erik Wilde, Matt Womer, and Mohamed Zergaoui.
This section is non-normative.
Since publication as a W3C Recommendation in 2022, Geolocation has received the following normative changes:
- Correction: Clarify that only the emulated error code is used (#187)
- Addition: support geolocation emulation (#183)
- Correction: Use null instead of NaN when stationary (#173)
- Correction: Update acquisition algorithm to define data types and han…
- Addition: Define units for accuracy (#162)
- Correction: check for non-secure contexts (#157)
- Addition: expose .toJSON() on GeolocationCoordinates + GeolocationPos…
- Correction: Clarify units and reference geodetic system for latitude …
- Add missing latitude definition (#208)
Since First Public Working Draft in 2021, until it was published as a W3C Recommendation in 2022, Geolocation received the following normative changes:
- fix "Queue a task" / "in parallel" usage (#118)
- Suggest permission lifetime (#108)
- Handle OS-level permission change (#109)
- Switch DOMTimeStamp to EpochTimeStamp (#104)
- Return 0 when watchPosition() errors (#100)
- Callback with error if doc is not fully active (#97)
- Gracefully handle documents that are not fully active (#90)
- Add "geolocation task queue" (#87)
Since publication of the Second Edition in 2016, this specification received the following substantive changes:
- Request a position only proceeds when a document is visible, or the document becomes visible.
- Clarified how caching works as part of acquiring a position: only last position is cached, and can be evicted at any time.
- Now relies on the Permissions specification to handle permission grants, and user interface requirements.
- The
errorCallbackis now nullable. - The API can be controlled by Permissions Policy, which restricts how/where the API is exposed to web pages.
- The
callbacksare no longer treated as "EventHandler" objects (i.e., objects that have a.handleEvent()method), but are now exclusively treated as IDL callback functions. - The API is now only exposed in Secure Contexts (i.e., only available in HTTPS).
- The interfaces no longer use [WebIDL]'s legacy
[NoInterfaceObject], soGeolocationand other interface of this spec are now in the global scope. Also, the interfaces were renamed fromNavigatorGeolocation*to justGeolocation*.
See the commit history for a complete list of changes.
- [hr-time]
- High Resolution Time. Yoav Weiss. W3C. 7 November 2024. W3C Working Draft. URL: https://www.w3.org/TR/hr-time-3/
- [html]
- HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
- [infra]
- Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
- [Permissions]
- Permissions. Marcos Caceres; Mike Taylor. W3C. 6 October 2025. W3C Working Draft. URL: https://www.w3.org/TR/permissions/
- [permissions-policy]
- Permissions Policy. Ian Clelland. W3C. 6 October 2025. W3C Working Draft. URL: https://www.w3.org/TR/permissions-policy-1/
- [RFC2119]
- Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
- [RFC8174]
- Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
- [webidl]
- Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
- [WGS84]
- World Geodetic System 1984 (WGS 84). Office of Geomatics, National Geospatial Intelligence Agency. 2008. URL: https://earth-info.nga.mil/index.php?dir=wgs84&action=wgs84