PL EN DE

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.

Browsing the data — no login.
The whole portal — charts, the epoch table, CSV export from the browser — works without an account and without limits. No personal data is collected.
Programmatic access (API) — on request.
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

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.

CodeMeaning
200OK
400Malformed query parameters
401Missing, invalid or deactivated key
404Epoch out of range, or unknown endpoint
429Daily 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,
The 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.

Poster (PNG, 1600×4150) →

Full field and unit reference →

What the API serves

Six Earth orientation parameters with their uncertainties, split into observations and predictions.

PropertyValue
Parametersxp, yp, UT1−UTC, LOD, dX, dY (+ niepewności)
Samplingdaily (one epoch per day, at 00:00 UTC)
Coveragelast ~10 years + predictions
Epochs~4000
Refreshevery 6 h (the source publishes once a day)
SourceUSNO / IERS Rapid Service–Prediction Center, finals2000A.all
FormatsJSON, CSV
Numerical values are not modified — processing is limited to parsing the source format and narrowing the date range. We perform no computations or corrections of our own.

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.

FlagMeaningCharacter
Iobservation (final/rapid)derived from measurements; stable
PpredictionIERS extrapolation; uncertainty grows with horizon

Field reference

Units follow IERS conventions. Fields may be null when the source publishes no value for that epoch.

FieldUnitTypeDescription
mjddayintModified Julian Date of the epoch (00:00 UTC)
datestringCalendar date YYYY-MM-DD (UTC)
flagstringI = observation, P = prediction
xparcsec (″)floatPolar motion, X component (along the Greenwich meridian)
yparcsec (″)floatPolar motion, Y component (along the 90°E meridian)
ut1_utcsfloatUT1 − UTC difference (ΔUT1)
lodmsfloat / nullExcess length of day over 86,400 SI seconds
dXmasfloat / nullCelestial pole offset, X component (IAU 2000A)
dYmasfloat / nullCelestial pole offset, Y component (IAU 2000A)
xp_errarcsecfloatUncertainty (1σ) for xp
yp_errarcsecfloatUncertainty (1σ) for yp
ut1_errsfloatUncertainty (1σ) for ut1_utc
lod_errmsfloat / nullUncertainty (1σ) for lod
LOD is often empty for the newest epochs. IERS publishes length of day one day behind the other parameters, so the latest observed record frequently carries 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.

ResourceDescription
GET /data/eop.jsonThe full series in columnar layout (parallel arrays)
GET /data/eop_meta.jsonMetadata: coverage, epoch count, source, legal basis
The columnar format (parallel arrays instead of a list of objects) cuts the response size by ~40%. The 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.

EndpointDescription
GET /api/v1/eop?date=YYYY-MM-DDParameters for a single epoch
GET /api/v1/eop?mjd=61251Parameters for an epoch given as MJD
GET /api/v1/eop?start=…&end=…A range of epochs
GET /api/v1/eop?last=NLast N days (last=-N = N days ahead)
GET /api/v1/metaDataset metadata (no key)
GET /api/v1/healthService 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

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.