Pinqo API · v0
API Documentation
A Pinqo REST API: Claude-alapú auditok, streaming chat és Stripe billing. Minden végpont JSON-t vár és JSON-t ad vissza. Egyetlen kivétel a chat streaming végpont, ami text/plain formában streamel.
Áttekintés
Az API nem más, mint a Pinqo dashboardot hajtó App Router route handlerek összessége, így nincs külön felület, amit meg kéne tanulni. Public base URL: https://pinqoai.com.
Minden válasz tartalmaz egy x-request-id és egy x-duration-ms headert. Ha bármiben elakadsz, küldd át mindkettőt a support kéréssel, így azonnal megtaláljuk.
Hitelesítés
A felhasználói végpontokat (/api/audit, /api/chat, /api/billing) a session cookie hitelesíti, így minden böngészőből érkező kérés eleve a Supabase auth flow-n belül van.
A szerverközi hívások a webhook (Stripe-signature) és a cron (Authorization: Bearer $CRON_SECRET) végpontokon mennek. Külön API kulcsot (PAT) a v1-ben vezetünk be.
Rate limit
IP-alapú token bucket, scope-onként:
| /api/audit/run | 5 / perc |
| /api/chat/insight | 30 / perc |
| /api/billing/* | 60 / perc |
| /api/billing/webhook | — (Stripe signature) |
| /api/cron/* | — (CRON_SECRET) |
| minden más | 60 / perc |
Ha túlléped a limitet, 429 Too Many Requests jön vissza egy Retry-After headerrel (másodpercben). A válasz törzse így néz ki:
{
"error": "rate_limited",
"message": "Túl sok kérés. Próbáld újra 60 másodperc múlva.",
"retryAfter": 60
}POST /api/audit/run
Teljes Claude-alapú auditot futtat az elküldött workspace kontextusra. Cache-elt prompt, Sonnet 4.6. Számolj 20–40 másodperc futásidővel.
curl -X POST https://pinqoai.com/api/audit/run \
-H "Content-Type: application/json" \
--cookie "sb-access-token=..." \
-d '{
"context": {
"workspace": { "name": "Vitaflex", "currency": "HUF" },
"topEntities": [ … ],
"anomalies": [ … ]
}
}'Response:
{
"ok": true,
"mode": "claude",
"output": {
"executive_summary": "…",
"account_health_score": 78,
"insights": [ … ]
},
"usage": {
"promptTokens": 12483,
"cachedTokens": 11200,
"completionTokens": 2174,
"costUsd": 0.018,
"elapsedMs": 24180
}
}POST /api/chat/insight
Streaming Claude-válasz egy insight kontextusra. A válasz text/plain, tokenenként streamelve, kliens oldalon a Fetch streams API-val olvasd be.
curl -N -X POST https://pinqoai.com/api/chat/insight \
-H "Content-Type: application/json" \
--cookie "sb-access-token=..." \
-d '{
"insight": { "id": "…", "severity": "high", "metricEvidence": {…} },
"messages": [{ "role": "user", "content": "Miért magas a CPM?" }]
}'X-Pinqo-Mode response header: claude vagy mock.
POST /api/billing/checkout
Stripe Checkout Session-t nyit, és visszaadja a redirect URL-t.
curl -X POST https://pinqoai.com/api/billing/checkout \
-H "Content-Type: application/json" \
-d '{
"plan": "growth",
"currency": "huf",
"interval": "year",
"email": "user@example.com",
"referrer": "PINQO-ABCD-1234"
}'Response:
{
"ok": true,
"url": "https://checkout.stripe.com/c/pay/cs_…",
"id": "cs_test_…"
}Elfogadott értékek: plan ∈ {starter,growth,agency,done,setup_pack}, currency ∈ {huf,gbp,eur}, interval ∈ {month,year}. A setup_pack egyszeri díj, ezért az interval figyelmen kívül marad.
POST /api/billing/portal
Stripe Customer Portal session a kártyaadatok módosításához, a lemondáshoz és a számlákhoz. A bejelentkezett felhasználó Stripe customer ID-jával hívd.
curl -X POST https://pinqoai.com/api/billing/portal \
-H "Content-Type: application/json" \
--cookie "sb-access-token=..." \
-d '{"customerId": "cus_…"}'Stripe webhook
POST /api/billing/webhook, ahol minden eseményt a Stripe signature alapján ellenőrzünk. A kezelt típusok:
checkout.session.completed: jóváírja az ajánlót (metadata.referrer_code), és naplózza az eseménytcustomer.subscription.created / updated: naplózza az előfizetés állapotátcustomer.subscription.deleted: win-back emailt küld (Resend)invoice.payment_failed: dunning emailt küld Stripe Portal frissítő linkkelinvoice.upcoming(havi, >30 nap): éves csomagra ösztönző emailt küld
GET /api/health
Könnyűsúlyú health probe, ami az integrációk készültségét jelzi. Nem hív külső API-t, és publikus.
curl https://pinqoai.com/api/healthResponse:
{
"ok": true,
"version": "0.1.0",
"env": "production",
"uptime": 18420.5,
"integrations": {
"stripe": true, "claude": true, "resend": true,
"meta_ads": true, "google_ads": true, "supabase": true
},
"readiness": { "ready": 6, "total": 6, "percent": 100 },
"timestamp": "2026-05-25T19:48:11.221Z"
}Hibakódok
| 400 | invalid_json / missing_fields / invalid_plan stb. |
| 401 | unauthorized — a session lejárt vagy hiányzik |
| 403 | forbidden — nincs jogosultság ehhez a workspace-hez |
| 429 | rate_limited — lásd a Retry-After headert |
| 500 | internal_error — request_id-vel a válaszban |
| 503 | *_not_configured — hiányzik egy integráció env-je (Claude/Stripe/Resend) |