EOP API documentation
A description of the Earth orientation data served by gnss.day: fields, units, formats and terms of use. This documentation is open — reading it requires no account.
Access
The data is free. We distinguish browsing from programmatic access.
The whole portal — charts, the epoch table, CSV export from the browser — works without an account and without limits. No personal data is collected.
To use the API, request a key by writing to kontakt@gdansk.ai. Keys are issued by hand — tell us briefly what you need it for. The default limit is 1000 requests per day; if you need more, say so up front.
The API is currently in a trial phase. During this period access is granted at no charge so that we can collect feedback. API access will become chargeable — every key holder will be notified in advance, at the address given when the key was issued. Browsing the data on the site will remain free.
The source data stays public. The key applies to our service only, not to the data itself. The original file is in the public domain and anyone may fetch it straight from USNO, with no account and no involvement from us.
What the key gives you
- queries for single epochs, date ranges and the last N days,
- the full series back to 1973 — the static files cover only the last ~10 years,
- linear interpolation for fractional MJD (e.g.
mjd=61250.5), - responses in JSON and CSV,
- a default limit of 1000 requests per day (negotiable if you need more),
- during the trial phase — no charge; chargeable later.
Authentication
Pass the key in the X-API-Key header:
curl -H "X-API-Key: gd_twoj_klucz" \
"https://gnss.day/api/v1/eop?last=1"
The key identifies you to the service — treat it like a password. Keep it out of published repositories and out of URLs that end up in logs.
| Code | Meaning |
|---|---|
200 | OK |
400 | Malformed query parameters |
401 | Missing, invalid or deactivated key |
404 | Epoch out of range, or unknown endpoint |
429 | Daily request limit exceeded |
Sample response
This is what the API returns. Below, a real response for epoch 2026-07-30.
JSON — a single epoch
$ curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?date=2026-07-30"
{
"count": 1,
"data": [
{
"mjd": 61251,
"date": "2026-07-30",
"type": "final/rapid",
"eop": {
"xp_arcsec": 0.219628,
"yp_arcsec": 0.365836,
"ut1_utc_s": 0.0129614,
"lod_ms": null,
"dX_mas": -0.011,
"dY_mas": -0.028
},
"sigma": {
"xp_arcsec": 9e-05,
"yp_arcsec": 9e-05,
"ut1_utc_s": 9.5e-06,
"lod_ms": null
}
}
]
}
CSV — the same range as CSV
$ curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?last=2&format=csv"
mjd,date,type,xp_arcsec,yp_arcsec,ut1_utc_s,lod_ms,dX_mas,dY_mas,sig_xp,sig_yp,sig_ut1,sig_lod
61250,2026-07-29,final/rapid,0.219198,0.366419,0.0126808,-0.4121,-0.002,-0.04,9.1e-05,9e-05,1.37e-05,0.0094
61251,2026-07-30,final/rapid,0.219628,0.365836,0.0129614,,-0.011,-0.028,9e-05,9e-05,9.5e-06,
lod_ms and sig_lod fields are empty — IERS publishes length of day one day behind the other parameters. That is normal for the latest epoch, not an error.What the API serves
Six Earth orientation parameters with their uncertainties, split into observations and predictions.
| Property | Value |
|---|---|
| Parameters | xp, yp, UT1−UTC, LOD, dX, dY (+ niepewności) |
| Sampling | daily (one epoch per day, at 00:00 UTC) |
| Coverage | last ~10 years + predictions |
| Epochs | ~4000 |
| Refresh | every 6 h (the source publishes once a day) |
| Source | USNO / IERS Rapid Service–Prediction Center, finals2000A.all |
| Formats | JSON, CSV |
Observations versus predictions
Every record carries a type flag. The distinction matters — predictions have an order of magnitude more uncertainty and change with each new release.
| Flag | Meaning | Character |
|---|---|---|
I | observation (final/rapid) | derived from measurements; stable |
P | prediction | IERS extrapolation; uncertainty grows with horizon |
Field reference
Units follow IERS conventions. Fields may be null when the source publishes
no value for that epoch.
| Field | Unit | Type | Description |
|---|---|---|---|
mjd | day | int | Modified Julian Date of the epoch (00:00 UTC) |
date | — | string | Calendar date YYYY-MM-DD (UTC) |
flag | — | string | I = observation, P = prediction |
xp | arcsec (″) | float | Polar motion, X component (along the Greenwich meridian) |
yp | arcsec (″) | float | Polar motion, Y component (along the 90°E meridian) |
ut1_utc | s | float | UT1 − UTC difference (ΔUT1) |
lod | ms | float / null | Excess length of day over 86,400 SI seconds |
dX | mas | float / null | Celestial pole offset, X component (IAU 2000A) |
dY | mas | float / null | Celestial pole offset, Y component (IAU 2000A) |
xp_err | arcsec | float | Uncertainty (1σ) for xp |
yp_err | arcsec | float | Uncertainty (1σ) for yp |
ut1_err | s | float | Uncertainty (1σ) for ut1_utc |
lod_err | ms | float / null | Uncertainty (1σ) for lod |
lod: null.
Likewise dX/dY are absent from some predictions. Your client
should handle that.
Endpoints
Available now no key
The portal serves the data as static files. They are public and usable today, programmatically included — no registration.
| Resource | Description |
|---|---|
GET /data/eop.json | The full series in columnar layout (parallel arrays) |
GET /data/eop_meta.json | Metadata: coverage, epoch count, source, legal basis |
i-th element of every array refers to the same epoch.
Queries key required
The query endpoints are live. Authenticate with the X-API-Key header.
They cover the full series back to 1973 — more than the static files, which are
trimmed to the last ~10 years.
| Endpoint | Description |
|---|---|
GET /api/v1/eop?date=YYYY-MM-DD | Parameters for a single epoch |
GET /api/v1/eop?mjd=61251 | Parameters for an epoch given as MJD |
GET /api/v1/eop?start=…&end=… | A range of epochs |
GET /api/v1/eop?last=N | Last N days (last=-N = N days ahead) |
GET /api/v1/meta | Dataset metadata (no key) |
GET /api/v1/health | Service health (no key) |
The &format=json|csv parameter switches the response format.
Authenticate with X-API-Key: <key>.
Examples
Working today, against the static files — no account, no key.
Fetching the metadata
curl -s https://gnss.day/data/eop_meta.json
Latest observed epoch (Python)
# Columnar format: the i-th index of every array is the same epoch
import json, urllib.request
B = "https://gnss.day/data/"
d = json.load(urllib.request.urlopen(B + "eop.json"))
m = json.load(urllib.request.urlopen(B + "eop_meta.json"))
i = d["mjd"].index(m["last_obs_mjd"])
print(m["last_obs_date"],
"xp=", d["xp"][i],
"yp=", d["yp"][i],
"UT1-UTC=", d["ut1"][i])
Filtering observations only
# flag is a compact string, one character per epoch: "IIII...PPP"
obs = [(d["mjd"][i], d["xp"][i])
for i, f in enumerate(d["flag"]) if f == "I"]
print(len(obs), "observations")
Response structure (excerpt)
{
"mjd": [61249, 61250, 61251],
"flag": "III",
"xp": [0.218763, 0.219198, 0.219628],
"yp": [0.367005, 0.366419, 0.365836],
"ut1": [0.0124, 0.0126808, 0.0129614],
"lod": [-0.3987, -0.4121, null] // null = absent from the source
}
API queries (with a key)
# a single epoch
curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?date=2026-07-30"
# the last 30 observed days, as CSV
curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?last=30&format=csv"
# a date range
curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?start=2026-01-01&end=2026-06-30"
# interpolated to UTC noon (fractional MJD)
curl -H "X-API-Key: $KEY" \
"https://gnss.day/api/v1/eop?mjd=61250.5"
A Python client
import json, urllib.request
def eop(**q):
"""Query the EOP API. Requires the key in KEY."""
url = "https://gnss.day/api/v1/eop?" + urllib.parse.urlencode(q)
req = urllib.request.Request(url, headers={"X-API-Key": KEY})
with urllib.request.urlopen(req) as r:
return json.load(r)
d = eop(last=7)
for r in d["data"]:
print(r["date"], r["eop"]["xp_arcsec"], r["eop"]["ut1_utc_s"])
Licence and terms of use
The data
Sourced from the USNO / IERS Rapid Service–Prediction Center and carrying the statement “Approved for public release: distribution unlimited” — as a work of the US government (17 U.S.C. § 105) it is in the public domain. We add no licence restrictions of our own: use it freely, commercially included.
Attribution is not legally required, but please cite the source — it is standard scientific practice and helps your readers verify the data.
Disclaimers
- No warranty. The data is served exactly as we receive it from the source. We guarantee neither accuracy, nor completeness, nor continuity of service.
- An independent service. gnss.day is not affiliated with USNO, IERS, NASA or ESA and does not act on their behalf. Naming the data source does not imply their endorsement of this service.
- Safety-critical use. For navigation, safety or any other high-stakes application, go to the source directly and verify the data.
Personal data
Browsing the portal needs no account and involves no collection of personal data. Requesting an API key requires only an email address — processed to provide the service (Art. 6(1)(b) GDPR). We pass it to no one and use it for no marketing. The key can be revoked and the contact details deleted at any time — just write to kontakt@gdansk.ai.
Use of the service is governed by the terms of service (Polish). A detailed analysis of the source licensing is kept in the project documentation and is available on request at the contact address.