Auditul, din codul tău sau din agentul tău
O cheie, trei forme: JSON-ul complet cu dovezi, un apel doar pentru verdict și scanări în lot. Plus un server MCP, ca Claude Code, Cursor și alți agenți să întrebe singuri „site-ul ăsta e slop AI?”. Un cont gratuit vine cu o cheie și 30 de scanări pe lună.
Autentificare
Fiecare apel poartă cheia ta ca bearer token. Cheile încep cu ca_live_, se afișează o singură dată la creare și pot fi revocate din pagina contului. Sunt pentru servere și unelte, nu pentru browsere: API-ul nu are CORS.
Authorization: Bearer ca_live_…
Endpointuri
| Apel | Ce face |
|---|---|
POST /api/v1/scan | Pornește un audit pentru un URL. Corp: url, opțional mode (standard sau deeper), provenance (implicit true), webhook_url (https), lang (en sau ro: limba PDF-ului, a emailului de final și a webhookului). Răspunde 202 cu un id, sau 200 când același site a fost auditat în ultimele 10 minute. Contează o scanare. Pe un plan plătit, mode deeper cu provenance rulează verificarea de slop AI și pe 5, 10 sau 20 de pagini din crawl (Solo, Team, Partner), în provenance.sitewide; tot o singură scanare. Paginile interioare au verdict cu confidence null, pentru că ratele de eroare au fost măsurate pe pagini principale. |
GET /api/v1/scan/{id} | JSON-ul cu dovezi: stare și progres (cât așteaptă, queue.position și queue.est_wait_s, în secunde), scoruri, blocul de proveniență (bandă, încredere, cele două axe, semne și semne de design propriu, lineage, acoperire, linia legală), built_with (platforma, tema sau șablonul ei, cu versiunea și autorul când tema le scrie, și builderele de pagini de lângă ea), fiecare observație cu dovezile și recomandarea ei, linkuri către raport și PDF. Adaugă ?lang=ro ca să primești observațiile în română; altfel, în engleză. |
GET /api/v1/verdict?url= | Doar verdictul. Un rezultat de proveniență mai nou de 7 zile (max_age_days îl schimbă) vine imediat; altfel se pune la coadă o scanare, se contează una și primești 202 cu un id de interogat. |
POST /api/v1/batch | Până la mărimea de lot a planului tău, într-un singur apel. Tot lotul e verificat mai întâi față de cotă. Răspunde 202 cu un batch_id și cu URL-urile acceptate și respinse. |
GET /api/v1/batch/{batch_id} | Numărul de terminate, eșuate și în așteptare, plus un rând pe URL cu stare, scor general, bandă și link către raport. |
GET /api/v1/me | Planul tău, consumul din luna curentă, limitele și numărul de chei active. |
Exemplu
curl -X POST https://audit.crocky.host/api/v1/scan \
-H "Authorization: Bearer ca_live_…" -H "Content-Type: application/json" \
-d '{"url":"https://example.com"}'
# {"id":"3cfd…","status":"pending","cached":false,"result_url":"…/api/v1/scan/3cfd…","report_url":"…/report/3cfd…"}
curl -H "Authorization: Bearer ca_live_…" https://audit.crocky.host/api/v1/scan/3cfd…
# {"id":"3cfd…","status":"done","scores":{"performance":62,"seo":88,"security":74,"hosting":91,"accessibility":95,"overall":79},
# "provenance":{"band":"LIKELY","probability":81,"tools":[],"tells":["E36","E03","E17"],"anti_tells":[],
# "axes":{"discipline":54,"provenance":71},"lineage":{"tier_a":[],"tier_b":["…"]},
# "legal":"Automated estimate from public signals - not a statement of fact about a site or its authors."},
# "findings":[{"category":"security","severity":"high","title":"No Content-Security-Policy header", …}],
# "checks":{"total":{"ran":310,"hit":29,"pass":281,"review":0,"na":75,"skip":0},"by_category":{"security":{…}, …},
# "rows":[{"id":"chk:hdr_hsts","category":"security","name":"Strict-Transport-Security (HSTS) header","state":"found","severity":"high"},
# {"id":"path:/.env","category":"security","name":"/.env","state":"passed"}, …]}, …}
Benzile de verdict
CONFIRMED (un artefact de build numește unealta), LIKELY (cu un grad de încredere), POSSIBLE (plafonat, fără număr: designerii folosesc aceleași kituri), NONE (nicio dovadă găsită; greșește cam o dată din 12), UNMEASURED (nu s-a putut descărca sau randa). API-ul nu spune niciodată că un site e făcut de om. Ratele de eroare și ce înseamnă fiecare bandă sunt pe pagina despre slop AI.
Toate verificările, nu doar constatările
Fiecare rezultat are și checks: fiecare verificare rulată de audit, cu starea ei (passed, found, needs_review, not_applicable, not_run), severitatea acolo unde a găsit ceva și motivul acolo unde nu se aplica sau n-a putut rula. Findings arată doar ce a găsit o verificare; checks arată și ce a ieșit curat, ca să poți deosebi „verificat și în regulă” de „neverificat”. Numărătorile pe categorii vin cu orice rezultat, rândurile cu rezultatul complet.
Server MCP
Aceeași cheie merge pe un server MCP la /api/mcp (Streamable HTTP, JSON fără stare, fără SSE). Două unelte: check_site cu un URL întoarce verdictul cu dovezi când există un rezultat mai nou de 7 zile, altfel pune la coadă o scanare și îi spune modelului să apeleze get_result cu id-ul după 20 de secunde.
claude mcp add --transport http crocky-audit https://audit.crocky.host/api/mcp \
--header "Authorization: Bearer ca_live_…"
{ "mcpServers": { "crocky-audit": {
"url": "https://audit.crocky.host/api/mcp",
"headers": { "Authorization": "Bearer ca_live_…" } } } }
Webhookuri
Trimite webhook_url la o scanare și facem un singur POST cu JSON-ul de dovezi când se termină, cu X-Crocky-Event: scan.completed și X-Crocky-Signature: sha256=… (HMAC-SHA256 peste corp cu secretul de semnare din pagina contului). Buget de trei secunde, fără reîncercări.
Planuri
| Plan | Scanări pe lună | Lot | Chei | Monitoare | Pagini pe tot site-ul |
|---|---|---|---|---|---|
| Free | 30 | 5 | 1 | 0 | - |
| Solo | 300 | 20 | 2 | 5 | 5 |
| Team | 2000 | 100 | 10 | 50 | 10 |
| Partner | 10000 | 500 | 25 | 500 | 20 |
Fiecare cheie e limitată la 60 de cereri pe minut. Pentru un plan plătit scrie la audit@crocky.host; plata self-service vine mai târziu.
Erori
401 bad_key | Cheie lipsă, revocată sau necunoscută. |
|---|---|
402 quota | Scanările lunare s-au terminat; corpul spune cât ai folosit și limita. |
429 rate | Peste 60 de cereri într-un minut pe o cheie. |
400 validation | URL greșit, mod necunoscut, lot prea mare, webhook fără https. |
404 not_found | Nicio scanare sau lot cu acel id pe contul tău. |
Estimare automată din semnale publice, nu o afirmație factuală despre un site sau despre autorii lui.