RTKdataPPK API

RTKdata PPK API

Reference-station data for post-processing: send the coordinate you flew at and a time window, get RINEX back from the nearest station with data.

Base URL
https://ppk.rtkdata.com/api/ppk/v1
Integration guide (PDF)Endpoints, error codes, limits and processing notes

Moved on 1 October 2026 from reseller.rtkdata.com/api/ppk/v1. Change the base URL; your username, password, tokens, order ids and station codes stay valid.

Quick start

Every response is HTTP 200; the outcome is the code field in the body.

BASE=https://ppk.rtkdata.com/api/ppk/v1

# 1. sign in (the token is valid for 7 days)
TOKEN=$(curl -s -X POST $BASE/user/signin \
  -H 'Content-Type: application/json' \
  -d '{"username":"YOUR_USERNAME","password":"YOUR_PASSWORD"}' | jq -r .data.token)

# 2. order: where you flew, and the UTC hours you flew (both inclusive)
ORDER_ID=$(curl -s -X POST $BASE/user/download \
  -H "token: $TOKEN" -H 'Content-Type: application/json' \
  -d '{"longitude":13.405,"latitude":52.52,
       "startYear":2026,"startMonth":7,"startDay":14,"startHour":8,
       "endYear":2026,"endMonth":7,"endDay":14,"endHour":9,
       "fileType":1}' | jq -r .data.orderId)

# 3. poll every 5 s until 2 (ready) or 3 (failed), with a deadline
DEADLINE=$(( $(date +%s) + 600 ))
while :; do
  STATUS=$(curl -s --max-time 30 $BASE/download/status/$ORDER_ID -H "token: $TOKEN")
  case "$(echo "$STATUS" | jq -r .data.status)" in
    2) break ;;
    3) echo "order failed: $(echo "$STATUS" | jq -r .data.error)" >&2; exit 1 ;;
  esac
  [ "$(date +%s)" -lt "$DEADLINE" ] || { echo "timed out: $STATUS" >&2; exit 1; }
  sleep 5
done

# 4. only now download the ZIP (RINEX observations, plus navigation where the station relays it)
curl -s $BASE/download/$ORDER_ID -H "token: $TOKEN" -o base.zip

Access and support

Accounts are issued by RTKdata. For access or help with an order, write to jonas@rtkdata.com and include the orderId and the station code.