In Impostazioni → API e integrazioni premete «Nuova chiave» e scegliete «Solo pubblicazione viaggi». Iniziate con una chiave Prova: ciò che pubblicate non compare in borsa.
Mettete la chiave in una variabile d'ambiente, non nel codice:
export GOCARGO_API_KEY="gc_test_..."curl https://gocargo.ro/api/v1/me \
-H "Authorization: Bearer $GOCARGO_API_KEY"La risposta mostra l'azienda, le autorizzazioni della chiave e il limite di richieste.
Inviate il carico con external_id = ID del vostro TMS. Se lo reinviate, lo aggiorniamo invece di crearne un altro (upsert), quindi la sincronizzazione è banale.
L'elenco dei vostri carichi:
curl "https://gocargo.ro/api/v1/loads?limit=20" \
-H "Authorization: Bearer $GOCARGO_API_KEY"curl -X POST https://gocargo.ro/api/v1/loads \
-H "Authorization: Bearer $GOCARGO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"external_id": "TMS-10045",
"origin_country": "RO",
"origin_city": "Cluj-Napoca",
"dest_country": "DE",
"dest_city": "Stuttgart",
"cargo": "Piese auto, 12 paleti",
"loading_date": "2026-10-19",
"vehicle_kind": "prelata",
"weight_kg": 8000,
"price": 1450,
"currency": "EUR"
}'Ogni richiesta porta l'intestazione Authorization: Bearer gc_live_… (sau gc_test_…). L'indirizzo base è https://gocargo.ro/api/v1. Solo HTTPS.
X-Request-Id; inviatelo quando ci chiedete assistenza.Una richiesta senza l'autorizzazione necessaria riceve 403 scope_missing.
| Autorizzazione | Cosa consente |
|---|---|
loads:read | Legge i carichi dell'azienda |
loads:write | Pubblica, modifica e ritira carichi |
trucks:read | Legge i camion liberi dell'azienda |
trucks:write | Pubblica, modifica e ritira camion liberi |
orders:read | Legge gli ordini |
orders:write | Cambia lo stato degli ordini e invia la posizione GPS |
marketplace:read | Cerca nella borsa pubblica (carichi e camion) |
webhooks:manage | Gestisci i webhook tramite API |
export:read | Esporta dati (piani Business ed Enterprise) |
HTTP/1.1 400 Bad Request
X-Request-Id: 5f0c2e7a9b1d4c3e
Content-Type: application/json
{
"error": {
"code": "invalid_request",
"message": "Datele trimise nu sunt valide.",
"fields": { "loading_date": "Data de încărcare nu poate fi în trecut." }
}
}| HTTP | Codice | Quando |
|---|---|---|
| 400 | invalid_request | Dati non validi; i dettagli per campo sono in «fields» |
| 401 | unauthorized | Chiave mancante, errata o revocata |
| 401 | key_expired | La chiave è scaduta |
| 402 | plan_required | La funzione non è inclusa nel piano dell'azienda |
| 403 | forbidden | Azione non consentita per la vostra azienda |
| 403 | scope_missing | Alla chiave manca l'autorizzazione richiesta (indicata nel messaggio) |
| 403 | ip_not_allowed | La richiesta proviene da un IP non presente nell'elenco della chiave |
| 404 | not_found | La risorsa non esiste o non appartiene all'azienda |
| 409 | conflict | Stato incompatibile o Idempotency-Key riutilizzato con un altro corpo |
| 429 | rate_limited | Troppe richieste; attendete quanto indica Retry-After |
| 429 | quota_exceeded | La quota mensile di richieste dell’azienda è esaurita |
| 500 | server_error | Errore da parte nostra; riprovate e inviateci X-Request-Id |
| Piano / licenza | Richieste al minuto, per chiave | Richieste al mese, per azienda | Domini |
|---|---|---|---|
| Pro | 60 | 50.000 | 1 |
| Business | 300 | 300.000 | 1 |
| Enterprise | 1200 | 2.000.000 | 3 |
| Integratore software | 600 | 1.000.000 | 10 |
| Partner borsa / aggregatore | 1200 | 5.000.000 | 25 |
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Oltre il limite: 429 con Retry-After (secunde).X-Quota-Limit e X-Quota-Remaining; consuma tutte le chiavi, comprese quelle di test. Pacchetti aggiuntivi e licenze commerciali: prezzi API.?limit=100&cursor=…, risposta {data, next_cursor}. Per la sincronizzazione utilizzate updated_since.curl -X POST https://gocargo.ro/api/v1/loads/bulk \
-H "Authorization: Bearer $GOCARGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"items": [ {...}, {...} ]}'
# Răspuns: fiecare element are rezultatul lui
{"results": [
{"index": 0, "ok": true, "ref": "GC1A2B3C4D"},
{"index": 1, "ok": false, "error": {"code": "invalid_request", "message": "..."}}
]}Su qualsiasi POST inviate l'intestazione Idempotency-Key con un valore univoco (es. un UUID). Se la rete cade e riprovate con lo stesso valore, ricevete esattamente la stessa risposta, senza un secondo carico. La risposta viene conservata per 24 ore. Stesso valore con corpo diverso → 409 conflict.
Aggiungete un URL HTTPS in Impostazioni → API e integrazioni → Webhook (oppure tramite POST /webhooks) e scegliete gli eventi. Il segreto whsec_… viene mostrato una sola volta.
| Evento | Quando |
|---|---|
load.created | Un carico è stato pubblicato |
load.updated | Un carico è stato modificato |
load.booked | Un carico è stato prenotato |
load.withdrawn | Un carico è stato ritirato |
quote.received | Avete ricevuto un'offerta di prezzo |
order.created | È stato creato un ordine |
order.status_changed | L'ordine ha cambiato stato |
order.document_added | È stato aggiunto un documento all'ordine (CMR, fattura) |
order.position_updated | La posizione del camion è stata aggiornata |
message.received | Avete ricevuto un messaggio |
POST /gocargo/webhook HTTP/1.1
Content-Type: application/json
GoCargo-Signature: t=1760180000,v1=8f3c...e91a
{
"id": "evt_2b7f0c9e1a4d",
"type": "order.status_changed",
"created_at": "2026-10-11T09:30:00Z",
"data": { ... }
}id per ignorare i duplicati.L'intestazione GoCargo-Signature: t=<unix>,v1=<hex>, dove v1 = HMAC-SHA256 con il segreto del webhook (intero, con whsec_) su {t}.{corpul brut}. Rifiutate le firme più vecchie di 5 minuti.
# pip install flask
import hashlib
import hmac
import os
import time
from flask import Flask, abort, request
SECRET = os.environ["GOCARGO_WEBHOOK_SECRET"] # whsec_..., întreg
app = Flask(__name__)
def verify(header: str, body: bytes, tolerance: int = 300) -> bool:
parts = dict(p.strip().split("=", 1) for p in header.split(",") if "=" in p)
t, sig = parts.get("t", ""), parts.get("v1", "")
if not t.isdigit() or abs(time.time() - int(t)) > tolerance:
return False
expected = hmac.new(SECRET.encode(), t.encode() + b"." + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, sig)
@app.post("/gocargo/webhook")
def webhook():
# Semnătura se calculează pe corpul BRUT, exact cum a sosit.
if not verify(request.headers.get("GoCargo-Signature", ""), request.get_data()):
abort(400)
event = request.get_json()
print(event["type"], event["data"])
return "", 204Se alla creazione spuntate «Firma HMAC obbligatoria», ricevete anche un segreto di firma. Ogni richiesta deve avere inoltre le intestazioni X-GoCargo-Timestamp (secondi unix) e X-GoCargo-Signature = HMAC-SHA256 in esadecimale su {timestamp}.{METODĂ}.{cale}.{corp}.
cale è il percorso completo sul server più la query esatta come la inviate (se presente), ad es. /api/v1/loads sau /api/v1/loads?status=active. Per GET il corpo è vuoto (il messaggio termina con «.»).import hashlib
import hmac
import json
import os
import time
import requests
ORIGIN = "https://gocargo.ro"
PATH = "/api/v1/loads"
KEY = os.environ["GOCARGO_API_KEY"]
SIGNING_SECRET = os.environ["GOCARGO_SIGNING_SECRET"]
body = json.dumps({"origin_city": "Cluj-Napoca", "dest_country": "DE", "dest_city": "Stuttgart",
"cargo": "Piese auto", "loading_date": "2026-10-19"}).encode()
ts = str(int(time.time()))
message = ts.encode() + b".POST." + PATH.encode() + b"." + body
signature = hmac.new(SIGNING_SECRET.encode(), message, hashlib.sha256).hexdigest()
r = requests.post(ORIGIN + PATH, data=body, timeout=30, headers={
"Authorization": "Bearer " + KEY,
"Content-Type": "application/json",
"X-GoCargo-Timestamp": ts,
"X-GoCargo-Signature": signature,
})
print(r.status_code, r.text)GET /export/{set}?format=csv|xlsx|json&from=AAAA-LL-ZZ&to=AAAA-LL-ZZ, con insieme ∈ loads, trucks, orders, quotes, reviews. La chiave richiede export:read. Massimo 50.000 righe e 366 giorni per richiesta. Il CSV ha BOM UTF-8 e separatore «;», per aprirsi correttamente in Excel.
curl -o comenzi.xlsx \
"https://gocargo.ro/api/v1/export/orders?format=xlsx&from=2026-01-01&to=2026-06-30" \
-H "Authorization: Bearer $GOCARGO_API_KEY"Senza codice: Impostazioni → Esportazione dati.
Non inserite mai la chiave API in HTML o JavaScript del browser. Chiunque apra la pagina la vede (View Source, DevTools) e può pubblicare a nome della vostra azienda. La chiave resta solo sul server: il modulo invia a un vostro script, e lo script chiama GoCargo.
<!-- formularul din site: trimite la scriptul PHP de pe serverul vostru, NU la GoCargo -->
<form method="post" action="/publica.php">
<input name="origin_city" placeholder="De la" required>
<input name="dest_city" placeholder="Până la" required>
<input name="dest_country" value="RO" maxlength="2">
<input name="cargo" placeholder="Marfă" required>
<input name="loading_date" type="date" required>
<button>Publică pe GoCargo</button>
</form><?php // publica.php — cheia stă doar aici, pe server
$key = getenv('GOCARGO_API_KEY');
$load = [
'origin_country' => 'RO', 'origin_city' => $_POST['origin_city'] ?? '',
'dest_country' => strtoupper($_POST['dest_country'] ?? 'RO'), 'dest_city' => $_POST['dest_city'] ?? '',
'cargo' => $_POST['cargo'] ?? '', 'loading_date' => $_POST['loading_date'] ?? '',
];
$ch = curl_init('https://gocargo.ro/api/v1/loads');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $key, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($load, JSON_UNESCAPED_UNICODE)]);
$res = curl_exec($ch);
http_response_code(curl_getinfo($ch, CURLINFO_HTTP_CODE) ?: 502);
header('Content-Type: application/json');
echo $res;Proteggete lo script (solo utenti autenticati sul vostro sito, token CSRF) e impostate GOCARGO_API_KEY nella configurazione del server, non nel file. Idealmente, una chiave solo con loads:write e restrizione sull'IP del server.
L'API è inclusa nei piani Pro, Business ed Enterprise. Iniziate con una chiave di prova, senza rischi.