fragtr›API›Custom ordresystemDansk · English

Custom ordresystem

Til jeres eget system – fx et ERP, et lagersystem eller en webshop, vi ikke har en færdig forbindelse til. Systemet sender ordrerne til fragtr, kan vise jeres forsendelsesmetoder i sin egen checkout og får trackingnummeret tilbage, når ordren er booket.

Kom i gangSend ordrerFragt i checkoutTracking tilbageFejl

Kom i gang

  1. Gå til Backend → Ordresystemer → + Connect ordresystem → Custom. Giv det et navn og evt. en webhook-adresse.
  2. Kopiér nøglen (fco_…). Den vises kun én gang – lav en ny under webshoppen, hvis den bliver væk.
  3. Send nøglen med i hvert kald: Authorization: Bearer fco_…
  4. Opret forsendelsesmetoder på forbindelsen (klik på den under Ordresystemer), hvis jeres checkout skal vise fragtvalg.

Alle adresser starter med https://fragtr.dk/api/v1/shop. Data sendes og modtages som JSON.

KaldHvad det gør
POST /ordersOpret en ordre – eller opdatér den, hvis den ikke er booket endnu (samme order_id).
GET /orders/{order_id}Status, booking og trackingnummer.
DELETE /orders/{order_id}Ordren er annulleret hos jer – flyttes til Ignoreret (hvis den ikke er booket).
GET /methodsJeres synlige forsendelsesmetoder.
POST /ratesFragtvalg og priser til checkout ud fra land, vægt og kurv.

Send ordrer

POST https://fragtr.dk/api/v1/shop/orders
Authorization: Bearer fco_…
Content-Type: application/json

{
  "order_id": "SO-1001",              // jeres eget id (påkrævet, unikt)
  "number": "1001",                   // vises i fragtr og bruges som reference
  "ordered_at": "2026-10-24T10:30:00Z",
  "shipping_method": "fragtr-12",     // code fra /rates eller /methods (valgfri)
  "currency": "DKK",
  "total": 800.00,                    // varernes værdi – bruges til told uden for EU
  "receiver": {
    "name": "Bergen Interiør AS", "contact": "Ola Nordmann",
    "street": "Karl Johans gate 12", "street2": "", "zip": "0162", "city": "Oslo",
    "country": "NO", "email": "ola@bergen.no", "phone": "+47 22 00 00 00"
  },
  "items": [
    {"name": "Bordlampe messing", "qty": 2, "price": 400.00, "weight_kg": 1.1,
     "sku": "L-1", "hs_code": "940520", "origin_country": "DK"}
  ]
}

Svar 201 (ny) eller 200 (opdateret):

{"order": {"order_id": "SO-1001", "number": "1001", "status": "new", "shipping_method": "fragtr-12", "booking": null}}

Ordren lander under Mine bookinger → Webshop-ordrer. Har den en shipping_method, kan den bookes med ét klik – ellers vælger man pris i fragtr.

Fragt i checkout

Kald /rates, når kunden skal vælge fragt. Svaret er jeres egne forsendelsesmetoder med de priser, I har sat op – kun dem, der dækker landet, vægten og kurven.

POST https://fragtr.dk/api/v1/shop/rates
Authorization: Bearer fco_…

{"country": "NO", "items": [{"qty": 2, "price": 400.00, "weight_kg": 1.1}]}
{"rates": [
  {"code": "fragtr-12", "name": "Levering til døren",
   "description": "1–3 hverdage · Told og moms betales af modtageren ved levering",
   "price": 149.0, "currency": "DKK"}
]}

Gem den valgte code og send den som shipping_method, når ordren sendes til fragtr.

Tracking tilbage

Har I angivet en webhook, sender fragtr en POST, så snart ordren er booket og trackingnummeret findes:

POST https://jeres-system.dk/fragtr/webhook
X-Fragtr-Event: order.shipped
X-Fragtr-Timestamp: 1792700000
X-Fragtr-Signature: sha256=5d1c…

{"event": "order.shipped", "sent_at": "2026-10-24T11:02:00+00:00",
 "data": {"order_id": "SO-1001", "tracking_number": "1Z999AA10123456784",
          "tracking_url": "https://www.ups.com/track?tracknum=1Z999AA10123456784", "carrier": "UPS"}}

Signaturen er HMAC-SHA256 af "{timestamp}.{body}" med ordresystemets nøgle (fco_…). Svar med 2xx inden for 8 sekunder – ellers prøver vi igen senere.

# Python
import hmac, hashlib, time
def ok(key, ts, body, signature):
    expected = "sha256=" + hmac.new(key.encode(), f"{ts}.{body}".encode(), hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature) and abs(time.time() - int(ts)) < 300

Uden webhook kan jeres system selv hente status med GET /orders/{order_id}.

Fejl og grænser

Fejl returneres som {"error": "Forklaring på dansk"}: 400 ugyldige data, 401 manglende eller ugyldig nøgle, 403 kontoen er spærret, 404 findes ikke, 409 ordren er allerede booket, 423 ordresystemet er sat på pause, 429 for mange kald (højst 120 pr. minut).

Send Accept-Language: en for at få fejlbeskeder på engelsk.