API (Technique)
Gateway
Proxy, scopes, rate limits, runs (async).

API — Gateway (Marketplace)

Le Gateway est un proxy contrôlé (style RapidAPI/Apify) qui:

  • Valide une Marketplace API key (dk_live_... / dk_test_...)
  • Applique scopes + rate limits + quotas
  • Résout la version d’API (explicit ou default)
  • Proxyfie vers l’upstream enregistré (si autorisé)
  • Loggue l’usage (latence, status, credits)

Base: /gateway

Authentification

HeaderExemple
x-api-keyx-api-key: dk_live_<...>
AuthorizationAuthorization: Bearer dk_live_<...>

Le Gateway renvoie des erreurs structurées via sendError:

{ "ok": false, "code": "...", "error": "...", "requestId": "...", "details": {} }

Routes (direct proxy)

Version explicite

MéthodesGET POST PUT PATCH DELETE
Path/gateway/:publisherSlug/:apiSlug/v/:version/*

Exemple:

curl -X GET "https://<host>/gateway/acme/weather/v/1.0.0/forecast?city=Algiers" -H "x-api-key: dk_live_<...>"

Version par défaut

MéthodesGET POST PUT PATCH DELETE
Path/gateway/:publisherSlug/:apiSlug/*

Si la version n’est pas fournie, le Gateway utilise la version is_default active (sinon la première active).

Scopes (allow-list)

Les scopes sont évalués avant le proxy et s’appliquent à la route relative appelée (ex: /v1/search).

Format supporté:

  • * autorise tout
  • METHOD:PATHPATTERN où METHOD peut être *
  • PATHPATTERN supporte * (glob simple)

Exemples:

ScopeEffet
*Tout autoriser
*:/v1/*Toute méthode sur /v1/...
GET:/v1/healthAutoriser uniquement ce GET

Erreurs:

  • 403 SCOPE_DENIED

Headers & body (forwarding)

  • Le Gateway retire les hop-by-hop headers et host / content-length.
  • Il retire aussi authorization et x-api-key avant l’upstream.
  • Body: pour GET/HEAD, aucun body n’est envoyé; sinon le body Express (JSON) est forwardé.

Execution mode

Le Gateway peut bloquer certaines formes d’exécution selon execution_mode (stocké par endpoint):

ModeDirect proxyRuns
directautorisébloqué (409 DIRECT_REQUIRED)
runbloqué (409 RUN_REQUIRED)autorisé
bothautoriséautorisé

Le matching endpoint supporte :param, {param} et un * final.

Rate limits & quotas

Le Gateway applique plusieurs fenêtres possibles:

  • Per-second: rate_limit
  • Per-minute: rate_limit_per_minute
  • Per-hour: rate_limit_per_hour
  • Daily quota: daily_quota
  • Monthly quota: monthly_quota (comparé à requests_this_period)

Erreurs:

  • 429 RATE_LIMIT_EXCEEDED
  • 429 QUOTA_EXCEEDED

Runs (asynchrone)

Les routes runs existent en version explicite et version default:

  • /gateway/:publisherSlug/:apiSlug/v/:version/runs...
  • /gateway/:publisherSlug/:apiSlug/runs...

Créer un run

MéthodePOST
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs
AuthMarketplace API key

Body

ChampTypeRequisDescription
methodstringnonGET | POST | PUT | PATCH | DELETE (défaut POST)
pathstringouiChemin relatif upstream (ex: /v1/search). Le matching scopes ignore la query-string
headersobjectnonHeaders envoyés à l’upstream (hors hop-by-hop)
bodyanynonBody upstream
webhookUrlstringnonURL webhook (doit être autorisée par les règles de sécurité)
webhookHeadersobjectnonHeaders webhook
webhookSecretstringnonSecret (trim, max ~512)

Réponse 201

{ "ok": true, "run": { "id": "...", "status": "queued", "created_at": "..." } }

Erreurs (sendError)

StatusCodeQuand
400VALIDATION_ERRORmethod non supporté / path manquant / webhookUrl interdite
401MISSING_API_KEY / INVALID_API_KEYAuth manquante/invalide
403API_KEY_DISABLED / API_KEY_EXPIRED / SUBSCRIPTION_INACTIVE / KEY_API_MISMATCH / SCOPE_DENIEDAccès refusé
409DIRECT_REQUIREDEndpoint configuré en direct uniquement
429RATE_LIMIT_EXCEEDED / QUOTA_EXCEEDEDLimite/quota dépassé
500REQUEST_ERRORErreur serveur

Lister mes runs

MéthodeGET
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs

Query parameters

NomTypeRequisDéfautDescription
statusstringnon-Filtre (ex: queued, running, succeeded, failed, cancelled)
limitnumbernon201..100
offsetnumbernon0Pagination

Réponse 200

{ "ok": true, "runs": [], "total": 0, "limit": 20, "offset": 0 }

Lire un run

MéthodeGET
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs/:runId

Réponse 200

{ "ok": true, "run": { "id": "...", "status": "...", "result_json": null, "error_message": null } }

Erreurs

StatusCodeQuand
404NOT_FOUNDRun introuvable (pas à cette API key)

Annuler un run

MéthodePOST
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs/:runId/cancel

Réponse 200

{ "ok": true, "run": { "id": "...", "status": "cancelled" } }

Note: l’annulation ne s’applique qu’aux runs queued/running.

Événements (JSON)

MéthodeGET
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs/:runId/events/list

Query parameters

NomTypeRequisDéfautDescription
afterIdnumbernon0Retourne les events id > afterId
limitnumbernon2001..500

Réponse 200

{ "ok": true, "events": [ { "id": 1, "type": "status", "message": "queued", "data": null } ], "afterId": 0, "limit": 200 }

Événements (SSE)

MéthodeGET
Path/gateway/:publisherSlug/:apiSlug/v/:version/runs/:runId/events
Responsetext/event-stream

Query parameters

NomTypeRequisDescription
lastEventIdnumbernonReprise à partir de cet id

Le stream envoie:

  • event: hello au démarrage
  • event: ping (heartbeat)
  • des events typés (status, etc.) avec id: + data: JSON