# Comparația cu standardele

Unde stă platforma față de documentațiile și standardele de referință: Claude, Webflow, Framer, Standard Webhooks, OWASP, RFC 9457 și OAuth 2.1.

## De ce comparăm

Clienții care vin din alte platforme se așteaptă la aceleași reguli: limite anunțate în antete, erori într-un format standard, webhook-uri semnate, chei API separate de parola omului. Tabelele de mai jos arată ce avem deja și ce lipsește. Ce lipsește intră în [Foaia de parcurs](#foaie-de-parcurs).

Sursele au fost citite pe 11.11.2026. Starea platformei este cea de pe 12.11.2026; ce s-a adăugat în noiembrie este marcat cu data.

## Platformele de referință

| Subiect | Claude | Webflow | Framer | Ilustromania |
| --- | --- | --- | --- | --- |
| Autentificare pentru API | cheie API pe organizație | jeton de site sau OAuth | cheie API pe proiect (beta) | sesiune; [cheie API](#chei-api) pe firmă, cu rol și expirare (din 12.11.2026, deocamdată doar pentru citirea stocului); jeton `mcp_` pentru MCP |
| Mai multe organizații | spații de lucru în organizație | site-uri în spațiu de lucru | proiecte | firme, cu izolare în baza de date (RLS) |
| Limite anunțate în antete | da | da (`X-RateLimit-*`) | — | da, pe scrieri: `RateLimit` și `RateLimit-Policy` (din 11.11.2026) |
| Webhook-uri semnate | da, pe organizație | da, cu semnătură și marcă de timp | — | da, pe firmă, după Standard Webhooks (din 12.11.2026, [Webhook-uri](#webhook-uri)); plus flux în timp real (SSE) |
| Format de eroare | obiect `error` cu `type` | obiect cu cod și mesaj | — | câmpul `eroare`; la cerere RFC 9457, cu `cod` canonic (din 11.11.2026) |
| Specificație OpenAPI publică | da | da | — | da, dar doar pentru `admin` și parțială |
| Versiunea în adresă | antet de versiune | `/v2` | — | `/v1`, cu [regula de versiuni](#versiuni) scrisă |
| Server MCP | — | da | — | da, cu OAuth 2.1 |

Pentru casa de marcat DLS nu există documentație publică: integrarea se face prin agenți pe server, descrisă în [Sisteme externe](#sisteme-externe).

## Standardele

| Standard | Ce cere | Starea la noi |
| --- | --- | --- |
| [OWASP API Security Top 10](https://owasp.org/API-Security/) | autorizare pe fiecare obiect, autentificare solidă, limite, inventarul rutelor | autorizare pe firmă prin RLS, acces declarat pe fiecare rută (refuz implicit), limite pe scrieri, inventar generat din cod |
| [OAuth 2.1](https://oauth.net/2.1/) | PKCE obligatoriu, fără grant implicit, jetoane de reîmprospătare rotite | respectat: doar `S256`, rotație la fiecare folosire |
| [RFC 9457](https://www.rfc-editor.org/rfc/rfc9457) | erori `application/problem+json` cu `type`, `title`, `status`, `detail` | există din 11.11.2026, la cerere (`Accept: application/problem+json`): `type`, `title`, `status`, plus `cod` și `id_cerere`; fără `detail`. Fără antet rămâne `{ "eroare": … }` ([Erori](#api-erori)) |
| [Standard Webhooks](https://www.standardwebhooks.com) | antete `webhook-id`, `webhook-timestamp`, `webhook-signature`, HMAC-SHA256, reîncercări | există din 12.11.2026: antetele și semnătura `v1` exact după specificație, secret `whsec_`, 10 încercări cu pauze crescătoare, două semnături 24 de ore după rotire, `410` oprește destinația ([Webhook-uri](#webhook-uri)) |
| [IETF RateLimit headers](https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/) | antetele `RateLimit` și `RateLimit-Policy` | există din 11.11.2026, după draft 11, pe scrieri; citirile au doar `429` și `Retry-After` ([Limite](#limite)) |
| Chei de idempotență ([`Idempotency-Key`](https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/)) | o scriere repetată nu se aplică de două ori | există din 11.11.2026, pe 9 rute care creează documente; cheia se ține 24 de ore ([Cereri repetate fără dubluri](#idempotenta)) |
| Identificator de cerere | fiecare răspuns are un id care se regăsește în jurnale | există din 11.11.2026: `x-request-id` pe fiecare răspuns, același în jurnalul serverului |

## Ce facem deja peste medie

- **Refuz implicit:** o rută fără acces declarat răspunde `401 ruta_nedeclarata` înainte să ruleze.
- **Izolarea firmelor în baza de date**, nu doar în cod: chiar o greșeală în aplicație nu poate citi altă firmă.
- **Regula 503:** o sursă externă lipsă nu se ascunde niciodată sub o listă goală.
- **Parolele:** scrypt cu sare, verificare față de parolele comune și față de ultimele 5 ale contului.
- **Jurnale curate:** cookie-urile, antetele de autorizare și câmpurile secrete se înlocuiesc cu `[ascuns]`.
