docs

API — Autentificare

Autentificare cu API Key pentru integrările externe și JWT pentru SPA-ul SCOPO Intelligence.

API — Autentificare

API Key (pentru integrări externe)

API-ul public v1 folosește API Key — un token separat de contul tău, creat explicit pentru integrări programatice (CRM, BI, automatizări).

Obținerea cheii

  1. Navighează la Settings → API în aplicație (plan Consultant)
  2. Apasă Generează API Key
  3. Copiază cheia din modalul de confirmare — este afișată o singură dată
  4. Dacă pierzi cheia, generează una nouă și revoc-o pe cea veche

Utilizare

Trimite cheia în antetul Authorization la fiecare cerere:

Authorization: Bearer scopo_<cheie>

Exemplu curl:

curl https://api.scopo.ro/api/v1/tenders \
  -H "Authorization: Bearer scopo_a1b2c3d4e5f6..." \
  -H "Content-Type: application/json"

Format cheie

Cheile au prefixul scopo_ urmat de 64 caractere hexazecimale:

scopo_a1b2c3d4e5f6789012345678901234567890123456789012345678901234

Gestionarea cheilor

AcțiuneUnde
GenerareSettings → API → Generează
Vizualizare listaSettings → API (masked: scopo_1a••••)
RevocareSettings → API → Revocă

Revocarea este efectivă în mai puțin de 1 secundă. Cererile cu cheia revocată primesc 401 API_KEY_REVOKED.

Limite și restricții

  • Maximum 3 chei active per tenant (Faza 1 beta)
  • Cheile nu expiră automat — rotația manuală este recomandată periodic
  • Cheile sunt read-only: nu permit modificarea datelor
  • Izolarea tenant este identică cu JWT — RLS PostgreSQL + CompanyScopeGuard aplicate

Erori de autentificare API Key

CodEroareCauză
401API_KEY_MISSINGAntetul Authorization: Bearer lipsește
401API_KEY_INVALIDCheia nu există sau nu a fost recunoscută
401API_KEY_REVOKEDCheia a fost revocată
403PLAN_UPGRADE_REQUIREDPlan < Consultant

JWT (pentru SPA — utilizare internă)

Această secțiune este relevantă doar dacă construiești integrări care mimează comportamentul SPA-ului Angular. Pentru orice integrare externă, folosește API Key.

POST /auth/login

POST /auth/login
Content-Type: application/json
{
  "email": "utilizator@exemplu.ro",
  "password": "parola"
}

Răspuns (200):

{
  "data": {
    "accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
    "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
    "expiresIn": 900
  }
}

POST /auth/refresh

POST /auth/refresh
Content-Type: application/json
{
  "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4..."
}

Access token: TTL 15 minute. Refresh token: TTL 7 zile.

POST /auth/logout

POST /auth/logout
Authorization: Bearer <access_token>

Răspuns: 204 No Content


Vezi și

On this page