API REST WooshStore
Crea progetti, gestisci chat AI, importa prodotti, pubblica store — tutto da script, n8n, dashboard custom. Autenticazione Bearer su ogni endpoint pubblico dell'app.
1. Quick start
Tre passi per usare le API:
- Passa al piano Agency da /app/billing.
- Genera la key in /app/api-keys — copia il valore (mostrato solo una volta).
- Chiama qualunque endpoint con
Authorization: Bearer wsk_....
curl https://wooshstoreai.com/api/projects \
-H "Authorization: Bearer wsk_xxxxxxxxxxxxxxxx..." \
-H "Accept: application/json"2. Autenticazione
Tutti gli endpoint sotto /api/* accettano due metodi alternativi di auth:
- Cookie session — usato dalla UI Next.js dopo login. Niente da fare lato client.
- Bearer API key — header
Authorization: Bearer wsk_.... Per script e integrazioni.
Le API key sono hash SHA-256 a riposo; il valore in chiaro è mostrato solo al momento della creazione. Revocale dal pannello /app/api-keys appena sospetti compromissione.
Authorization: Bearer wsk_q3VYz...K8RT
Content-Type: application/json
Accept: application/json3. Progetti
Lista progetti
GET /api/projects?q=<query>&archived=<0|1>&limit=<n>Restituisce array projects con stato, brand, dominio, contatori prodotti.
Crea progetto
POST /api/projects
{
"title": "Beauty premium · cliente XYZ",
"initialState": {
"niche": "Beauty premium skincare",
"targetGeo": "Europa",
"brandStyle": "Premium",
"brandName": "GlowLab",
"persona": "Donne 28-40 anni, professioniste, sensibili al benessere",
"targetLocales": ["it", "en", "fr"]
}
}Il payload initialState è Zod-whitelisted: campi extra vengono droppati silenziosamente per sicurezza.
Dettaglio progetto
GET /api/projects/:id4. Chat AI streaming
L'endpoint chat ritorna eventi Server-Sent Events (SSE): text, tool_call, tool_result, state_patch, done, error.
POST /api/chat/:projectId
{"message": "Genera 5 brand name premium per beauty skincare"}curl -N https://wooshstoreai.com/api/chat/prj_xxx \
-H "Authorization: Bearer wsk_..." \
-H "Content-Type: application/json" \
-d '{"message":"Crea uno store fashion in italiano partendo da questo prodotto"}'Senza ANTHROPIC_API_KEY in env, la chat fa fallback a una demo scripted deterministica (utile per testing).
5. Shopify OAuth
Avvia il flow OAuth standard per uno store esistente:
GET /api/shopify/install?shop=<store.myshopify.com>&project=<projectId>Per i merchant senza account Shopify, redirige al programma partner WooshStore (commission 20% lifetime allo store):
GET /api/shopify/install?action=partner&project=<projectId>Token salvato cifrato AES-256-GCM con WOOSHSTORE_ENCRYPTION_KEY. Mai esposto via API.
6. Billing webhooks (Whop)
Eventi gestiti automaticamente — non chiamare manualmente a meno di necessità debug:
POST /api/billing/webhook
X-Whop-Signature: t=..., v1=<hmac>
{
"action": "invoice_paid",
"data": {
"id": "inv_...",
"metadata": {
"type": "wooshstore",
"wooshstore_user_id": "<merchantId>",
"wooshstore_tier": "pro"
}
}
}Eventi ascoltati:
invoice_paid·membership_activated·membership.went_valid→ upgrade Pro/Agencymembership.cancelled·membership.went_invalid→ downgrade FREE
7. Errori standard
Tutti gli errori sono JSON con ok: false e un code stabile:
| HTTP | Code | Significato |
|---|---|---|
| 400 | INVALID_JSON | Body non parsabile come JSON |
| 400 | VALIDATION | Zod schema fallito (vedi `issues`) |
| 401 | UNAUTHENTICATED | Manca sessione cookie o Bearer key |
| 403 | PLAN_REQUIRED | Funzionalità riservata a Pro/Agency |
| 403 | FORBIDDEN | Founder-only o cross-tenant |
| 404 | NOT_FOUND | Risorsa inesistente o non tua |
| 429 | COST_LIMIT_EXCEEDED | Token Claude budget esaurito per il progetto |
| 429 | TOO_MANY_KEYS | Hai >10 API keys attive |
| 503 | STRIPE_NOT_CONFIGURED / WHOP_NOT_CONFIGURED | Billing non ancora live |
| 503 | NO_DATABASE | DATABASE_URL non impostata sul project |
8. Rate limit & costi
- Chat AI — max 30 messaggi/h per progetto, 100 messaggi/h per utente
- Token budget — limite per progetto (default 200K input + 50K output per Free, alzato Pro/Agency)
- API keys — max 10 attive per merchant (revocale prima di crearne nuove)
- Magic Import — scraping reale; se mancano media/prodotto, errore esplicito e niente prodotti finti
- Webhook GDPR — risposta entro 30s, audit log su tutti gli eventi (anche replay)