Skip to content

Quickstart

Von null zur ausgeschriebenen Fracht. Vier Requests, alle gegen die Demo-Umgebung.

Voraussetzung

Ein Benutzer in der Demo-Umgebung, der einer Firma zugeordnet ist. Bekommst du über support@aircargobook.com.

Alles in einem Script

bash
#!/usr/bin/env bash
set -euo pipefail

BASE="https://demo.aircargobook.com"
UA="MyApplication / 1.0.0"

# 1) Token holen
TOKEN=$(curl -s -X POST "$BASE/users/login.json" \
  -H "User-Agent: $UA" \
  -d "auth[user]=me@example.com" \
  -d "auth[password]=geheim" | jq -r '.auth.token')

[ "$TOKEN" != "null" ] && [ -n "$TOKEN" ] || { echo "Login fehlgeschlagen"; exit 1; }
echo "Token: ${TOKEN:0:8}…"

AUTH=(-H "Authorization: ApplePass $TOKEN" -H "User-Agent: $UA")

# 2) Fracht als Trucking-Ausschreibung anlegen
#    Beachte: .data.id — beim Anlegen liegt die Fracht flach in data,
#    NICHT unter data.route
ID=$(curl -s -X POST "$BASE/freights/add.json?type=AHR" "${AUTH[@]}" \
  -H "Content-Type: application/json" \
  -d '{
        "class": "rfs",
        "from": "city:60547",
        "from_country": "DE",
        "from_addr": "Frankfurt am Main, Germany",
        "to": "city:34119",
        "to_country": "DE",
        "to_addr": "Kassel, Germany",
        "eta": "2026-09-22 14:00:00",
        "dangerous": "no",
        "pieces": [
          {"pieces": 4, "depth": 120, "width": 80, "height": 100, "weight": 120, "stackable": 1}
        ],
        "refs": {
          "commodity": "Autoteile",
          "customer": "Musterkunde GmbH / Bestellung 4711",
          "pieces": 4,
          "weight_actual": 480,
          "external_ref": "QUICKSTART-1"
        }
      }' | jq -r '.data.id')

[ "$ID" != "null" ] && [ -n "$ID" ] || { echo "Anlegen fehlgeschlagen"; exit 1; }
echo "Fracht angelegt: $ID (status: draft)"

# 3) Ausschreiben — ohne diesen Schritt sieht sie kein Anbieter.
#    Antwortet mit 302, das ist hier normal.
curl -s -X POST "$BASE/freights/view/$ID.json" "${AUTH[@]}" \
  -H "Content-Type: application/json" \
  -d '{"action": "publish", "deadline": "+48 hours"}' > /dev/null

# 4) Abrufen und prüfen — hier liegt die Fracht unter data.route
curl -s "$BASE/freights/view/$ID.json" "${AUTH[@]}" \
  | jq '.data.route | {id, status, from, to, eta, deadline,
                        packstuecke: (._route_pieces | length),
                        angebote: (._bids // [] | length)}'

Ausgabe:

json
{
  "id": 1965,
  "status": "open",
  "from": "60547",
  "to": "34119",
  "eta": "2026-09-22 14:00:00",
  "deadline": "2026-09-17 15:30:00",
  "packstuecke": 1,
  "angebote": 0
}

Die Fracht ist jetzt ausgeschrieben. Anbieter sehen sie und können bieten; ihre Angebote erscheinen unter _bids.

Die vier Dinge, die dabei schiefgehen

1. .json vergessen. Ohne die Endung bekommst du HTML mit HTTP 200, und dein JSON-Parser bricht an einer unerwarteten Stelle ab.

2. Nach data.route.id gegriffen. Beim Anlegen liegt die Fracht flach in data, die ID also unter data.id. Beim Abrufen ist es data.route. Die beiden Endpunkte sind darin nicht einheitlich — im Script oben siehst du beide Varianten.

3. Schritt 3 weggelassen. Eine neu angelegte Fracht hat status: "draft" und ist für Anbieter unsichtbar. Erst action: "publish" schreibt sie aus. Dass dieser Request mit 302 antwortet, ist normal.

4. Datum ohne Uhrzeit. "eta": "2026-09-22" wird still verworfen und das Feld bleibt null. Mit Uhrzeit funktioniert es — deshalb prüft das Script eta in Schritt 4.

Weiter