Upload a flight via API (CSV log verified method)

No account required Verifies, stores & builds charts

Overview

This is the programmatic version of the web upload tool. It takes a flight log, verifies it exactly as the CSV verification endpoint does, and if the log is genuine and not already stored it adds the flight to the cloud, generates the chart thumbnails, and returns the new flight.

If the same flight has already been uploaded it is not added again. The existing flight is returned instead, with a duplicate flag set. This matches the behaviour of the web uploader, so re-sending a log is always safe.

Endpoint

POST https://www.altimetercloud.com/api/upload/ Parameter: csv

Authentication

None. Uploads are anonymous, exactly like the web upload tool. Cryptographic verification is the gate: only genuine, unedited logs from a real Nano can pass, and duplicates are ignored, so an open endpoint only ever stores legitimate logs. A flight is associated with its device, and the device owner can claim it later by adding that device to their Altimeter Cloud account.

Request

Send the flight log, unedited, as a multipart file field named csv (or flightlog), or as a raw text POST parameter named csv.

curl -X POST https://www.altimetercloud.com/api/upload/ \
  -F "csv=@flight_1234.csv"

Response

The API returns JSON. When the flight is newly added, duplicate is false and the thumbnails have just been generated:

✓ Verified & uploaded
{
  "success": true,
  "verified": true,
  "duplicate": false,
  "verify_method": "Ed25519",
  "flight": {
    "id": 1234,
    "url": "https://www.altimetercloud.com/flights/1234/",
    "firmware": "1.52",
    "hardware": "4",
    "device_tag": "MY-NANO",
    "competitor_tag": "C-07",
    "apogee": 246.4,
    "apogee_time": 5.21,
    "max_velocity": 98.3,
    "samples": 3210,
    "flight_unique_id": "a1b2c3...",
    "thumbnails": {
      "meters_small": "https://www.altimetercloud.com/flightdata/4/1234.webp",
      "meters_large": "https://www.altimetercloud.com/flightdata/4/1234_l.webp",
      "feet_small":   "https://www.altimetercloud.com/flightdata/4/1234_ft.webp",
      "feet_large":   "https://www.altimetercloud.com/flightdata/4/1234_l_ft.webp",
      "miles_small":  "https://www.altimetercloud.com/flightdata/4/1234_mi.webp",
      "miles_large":  "https://www.altimetercloud.com/flightdata/4/1234_l_mi.webp",
      "km_small":     "https://www.altimetercloud.com/flightdata/4/1234_km.webp",
      "km_large":     "https://www.altimetercloud.com/flightdata/4/1234_l_km.webp"
    }
  }
}

When the same flight already exists it is returned unchanged, with duplicate set to true and no thumbnails regenerated:

↻ Already stored
{
  "success": true,
  "verified": true,
  "duplicate": true,
  "verify_method": "Ed25519",
  "flight": { "id": 1234, "url": "https://www.altimetercloud.com/flights/1234/", "...": "..." }
}

If the log fails verification it is not stored:

✗ Verification failed
{
  "success": false,
  "verified": false,
  "error": { "code": "400", "message": "Flight log failed verification" }
}

Duplicate handling

A flight counts as already stored when its device and signature hash match an existing uploaded flight. In that case nothing is re-added and no charts are rebuilt; you simply receive the existing flight id with duplicate set to true.

Response fields

FieldTypeDescription
successbooleanTrue if the log was accepted (newly stored or already present)
verifiedbooleanWhether the log passed cryptographic verification
duplicatebooleanTrue if the flight already existed and was not re-added
verify_methodstringMethod used: Ed25519, HMAC-SHA256 or SHA-256
flight.idintegerThe cloud flight id (new or existing)
flight.flight_unique_idstringThe signature hash, usable with the Flight Info endpoint
flight.thumbnailsobjectChart image URLs in every size
error.code / error.messagestringError code and description (on failure)

Errors

CodeMeaning
400 (verification)The log failed cryptographic verification and was not stored
400 (pressure)The log failed the secondary pressure cross check and was not stored
412No flight log was supplied in the request

Claiming a flight

Because uploads are anonymous, a flight is linked only to the device that recorded it. To take ownership of flights from a device, add that device to your Altimeter Cloud account; its flights, including any uploaded through this API, are then claimed automatically.

Notes

Verification here is identical to the CSV verification endpoint, so any log that verifies there will upload here. The only difference is that this endpoint also stores the flight and builds its charts. To check a log without storing it, use the CSV verification endpoint instead. There is no live playground on this page, because each successful call creates a real stored flight.