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.zipAccess 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.
