Kacinka API Docs
Postman Kacinka.it

Kacinka API

Integra la potenza di Kacinka nei tuoi siti web e applicazioni. API REST completa per CRM, gestione progetti, chat, email marketing, automazioni e molto altro.

567
Endpoint
60+
Categorie
JWT
Autenticazione
99.9%
Uptime

📮 Collection Postman Completa

567 endpoint pre-configurati con body, script di auto-login e test automatici. Importa e inizia subito.

🔗
Base URL
https://auth.kacinka.it
📋
Formato
JSON (application/json)
🔐
Auth
JWT HttpOnly Cookies + CSRF
📡
CORS
Abilitato con credentials

🔐 Autenticazione

L'API Kacinka utilizza JWT (JSON Web Token) con cookies HttpOnly per la massima sicurezza. Il flusso di autenticazione è progettato per proteggere i token da attacchi XSS.

Flusso di Autenticazione

  1. LoginPOST /login con email e password
  2. Il server imposta due cookie HttpOnly: access_token (15 min) e refresh_token (7 giorni)
  3. La risposta include un csrf_token da inviare come header X-CSRF-Token
  4. L'access_token scade dopo 15 minuti → usa POST /refresh per rinnovarlo
💡 Nota per integrazione frontend Assicurati di includere credentials: 'include' in tutte le fetch() per inviare i cookie cross-origin. Il dominio cookie è .kacinka.it.

Base URL

Produzione:   https://auth.kacinka.it
Sviluppo:     http://local.auth.kacinka.it

Rate Limits

L'API applica limiti di frequenza per proteggere il servizio:

EndpointLimiteFinestra
/login, /register5 richieste1 minuto
/forgot-password3 richieste5 minuti
/api/contact3 richieste1 minuto
Tutti gli altri60 richieste1 minuto

Quando il limite viene superato, l'API restituisce 429 Too Many Requests con header Retry-After.

❌ Gestione Errori

Tutte le risposte di errore seguono un formato standard:

{
  "status": "error",
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "I dati forniti non sono validi",
    "details": {
      "email": ["L'email è obbligatoria"],
      "password": ["La password deve avere almeno 8 caratteri"]
    }
  }
}

Codici HTTP

CodiceSignificatoQuando
200SuccessRichiesta completata
201CreatedRisorsa creata (POST)
400Bad RequestDati non validi o mancanti
401UnauthorizedToken mancante o scaduto
403ForbiddenPermessi insufficienti o CSRF non valido
404Not FoundRisorsa non trovata
409ConflictEmail già registrata, risorsa duplicata
422UnprocessableValidazione fallita
429Too Many RequestsRate limit superato
500Server ErrorErrore interno del server

🔐 Login

POST /login 🔓 Pubblico Autenticazione utente

Semantica: Autentica un utente con credenziali email/password e stabilisce una sessione sicura tramite JWT cookies.

Tecnica: Validazione bcrypt della password, generazione coppia JWT (access_token 15min HS256 + refresh_token 7gg), impostazione cookie HttpOnly Secure SameSite=None su dominio .kacinka.it. CSRF token restituito nel body per double-submit pattern.

Parametri Body
ParametroTipoDescrizione
emailstringrequiredEmail dell'utente registrato
passwordstringrequiredPassword dell'account
totp_codestringoptionalCodice 2FA TOTP se abilitato sull'account
Estratto Postman — Esempi di Codice
curl -X POST https://auth.kacinka.it/login \
  -H "Content-Type: application/json" \
  -c cookies.txt \
  -d '{
    "email": "mario.rossi@example.com",
    "password": "Password123!"
  }'
const response = await fetch('https://auth.kacinka.it/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include', // ← Fondamentale per i cookie
  body: JSON.stringify({
    email: 'mario.rossi@example.com',
    password: 'Password123!'
  })
});

const data = await response.json();
const csrfToken = data.csrf_token;
// Salva csrfToken per le richieste successive
$ch = curl_init('https://auth.kacinka.it/login');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => '/tmp/kacinka_cookies.txt',
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'email' => 'mario.rossi@example.com',
        'password' => 'Password123!'
    ])
]);
$response = json_decode(curl_exec($ch), true);
$csrfToken = $response['csrf_token'];
curl_close($ch);
import requests

session = requests.Session()
response = session.post('https://auth.kacinka.it/login', json={
    'email': 'mario.rossi@example.com',
    'password': 'Password123!'
})
data = response.json()
csrf_token = data['csrf_token']
# La sessione mantiene i cookie automaticamente
Risposta 200 OK
200 application/json
{
  "status": "success",
  "data": {
    "user": {
      "id": 1,
      "email": "mario.rossi@example.com",
      "name": "Mario Rossi",
      "role": "user",
      "plan": "starter",
      "email_verified": true,
      "created_at": "2025-01-15T10:30:00Z"
    }
  },
  "csrf_token": "a1b2c3d4e5f6..."
}
⚠️ Cookie impostati dal server access_token (HttpOnly, Secure, SameSite=None, 15min) e refresh_token (HttpOnly, Secure, SameSite=None, 7 giorni). Il csrf_token va salvato e inviato come header X-CSRF-Token in ogni richiesta autenticata.

Registrazione

POST /register 🔓 Pubblico Registrazione nuovo utente

Semantica: Crea un nuovo account utente sulla piattaforma Kacinka. Dopo la registrazione l'utente riceve un'email di verifica.

Tecnica: Validazione unicità email, hashing bcrypt (cost 12), inserimento in auth_users, invio email verifica via PHPMailer SMTP, piano Free assegnato di default.

Parametri Body
ParametroTipoDescrizione
emailstringrequiredEmail valida (unica nel sistema)
passwordstringrequiredMin 8 caratteri, maiuscole, minuscole, numeri
password_confirmstringrequiredDeve corrispondere a password
namestringrequiredNome completo dell'utente
terms_acceptedbooleanrequiredDeve essere true
Estratto Postman
curl -X POST https://auth.kacinka.it/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "nuovo.utente@example.com",
    "password": "SecurePass456!",
    "password_confirm": "SecurePass456!",
    "name": "Marco Bianchi",
    "terms_accepted": true
  }'

Refresh Token

POST /refresh 🔓 Cookie Rinnova access token

Semantica: Rinnova l'access_token scaduto usando il refresh_token valido presente nei cookie.

Tecnica: Decodifica JWT refresh_token dal cookie, verifica validità e scadenza, genera nuovo access_token (15min) e nuovo CSRF token. Il refresh_token rimane invariato fino alla sua scadenza naturale (7 giorni).

curl -X POST https://auth.kacinka.it/refresh \
  -b cookies.txt -c cookies.txt \
  -H "Content-Type: application/json" -d '{}'
💡 Auto-refresh Implementa un interceptor nel tuo client HTTP che, in caso di 401, chiama automaticamente /refresh e riprova la richiesta originale.

Logout

POST /logout 🔒 Auth Termina sessione

Semantica: Termina la sessione corrente dell'utente.

Tecnica: Invalida i cookie JWT impostando Max-Age=0, rimuove la sessione dal database.

curl -X POST https://auth.kacinka.it/logout \
  -b cookies.txt \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -H "Content-Type: application/json" -d '{}'

🔑 Password Reset

POST /forgot-password 🔓 Pubblico Richiedi reset password

Semantica: Invia un'email con link di reset password all'indirizzo specificato.

Tecnica: Genera token crypto 64 byte, salva hash SHA-256 in DB con TTL 1h, invia email via PHPMailer. Per sicurezza anti-enumeration, risposta sempre 200.

curl -X POST https://auth.kacinka.it/forgot-password \
  -H "Content-Type: application/json" \
  -d '{ "email": "mario.rossi@example.com" }'

Reset Password

POST /reset-password 🔓 Pubblico Imposta nuova password

Semantica: Usa il token ricevuto via email per impostare una nuova password.

Tecnica: Verifica hash SHA-256 del token, controlla TTL, aggiorna password con bcrypt cost 12, invalida tutte le sessioni attive dell'utente.

curl -X POST https://auth.kacinka.it/reset-password \
  -H "Content-Type: application/json" \
  -d '{
    "token": "abc123def456...",
    "password": "NuovaPassword789!",
    "password_confirm": "NuovaPassword789!"
  }'

👤 Profilo Utente

Endpoint per gestire il profilo dell'utente autenticato. Tutti richiedono autenticazione.

GET /me 🔒 Auth Profilo utente corrente

Semantica: Recupera il profilo completo dell'utente dalla sessione corrente.

Tecnica: Decodifica JWT dall'access_token cookie, query su auth_users + join piano abbonamento. Include stato verifica email/telefono e configurazione 2FA.

curl https://auth.kacinka.it/me \
  -b cookies.txt \
  -H "X-CSRF-Token: $CSRF_TOKEN"
const res = await fetch('https://auth.kacinka.it/me', {
  credentials: 'include',
  headers: { 'X-CSRF-Token': csrfToken }
});
const { data } = await res.json();
Risposta
200
{
  "data": {
    "id": 1, "email": "mario.rossi@example.com",
    "name": "Mario Rossi", "role": "user", "plan": "starter",
    "email_verified": true, "phone_verified": false,
    "two_factor_enabled": false,
    "company": "Rossi Digital SRL",
    "timezone": "Europe/Rome", "language": "it",
    "created_at": "2025-01-15T10:30:00Z"
  }
}

Aggiorna Profilo

PUT /me/profile 🔒 Auth Aggiorna profilo

Semantica: Modifica i dati personali del profilo utente.

Tecnica: Partial update — solo i campi inclusi nel body vengono aggiornati. Sanitizzazione input, validazione timezone IANA, language ISO 639-1.

curl -X PUT https://auth.kacinka.it/me/profile \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "name": "Mario Rossi",
    "company": "Rossi Digital SRL",
    "timezone": "Europe/Rome",
    "language": "it"
  }'

Cambia Password

PUT /me/password 🔒 Auth Cambia password

Semantica: Modifica la password dell'account. Invalida tutte le sessioni attive tranne quella corrente.

Tecnica: Verifica current_password con bcrypt, hash nuova password, DELETE sessioni ≠ current, log in audit.

curl -X PUT https://auth.kacinka.it/me/password \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "current_password": "VecchiaPassword123!",
    "new_password": "NuovaPassword456!",
    "new_password_confirm": "NuovaPassword456!"
  }'

📁 Progetti

I progetti sono il contenitore principale per organizzare il lavoro. Ogni progetto contiene tasks, deals, team members, file, calendario ed eventi. 📊 Limitato dal piano: Free 3, Starter 15, Professional+Business illimitati.

POST /projects 🔒 Auth Crea progetto

Semantica: Crea un nuovo progetto nell'area di lavoro dell'utente. L'utente diventa automaticamente owner.

Tecnica: Verifica limite piano (COUNT su projects per user_id), INSERT con slug auto-generato, colore HEX validato, deadline YYYY-MM-DD. Restituisce progetto creato con ID.

Parametri Body
ParametroTipoDescrizione
namestringrequiredNome del progetto (max 255 caratteri)
descriptionstringoptionalDescrizione del progetto
statusstringoptionalactive | archived. Default: active
colorstringoptionalColore HEX (es: #7c3aed)
deadlinestringoptionalData scadenza (YYYY-MM-DD)
Estratto Postman — Esempi di Codice
curl -X POST https://auth.kacinka.it/projects \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "name": "Sito Web E-commerce",
    "description": "Sviluppo sito e-commerce per cliente retail",
    "status": "active",
    "color": "#7c3aed",
    "deadline": "2025-12-31"
  }'
const res = await fetch('https://auth.kacinka.it/projects', {
  method: 'POST',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': csrfToken
  },
  body: JSON.stringify({
    name: 'Sito Web E-commerce',
    description: 'Sviluppo sito e-commerce per cliente retail',
    color: '#7c3aed',
    deadline: '2025-12-31'
  })
});
const { data } = await res.json();
console.log('Progetto creato:', data.id);
$ch = curl_init('https://auth.kacinka.it/projects');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => '/tmp/kacinka_cookies.txt',
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-CSRF-Token: ' . $csrfToken
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Sito Web E-commerce',
        'description' => 'Sviluppo sito e-commerce',
        'color' => '#7c3aed'
    ])
]);
$project = json_decode(curl_exec($ch), true);
GET/projects🔒 AuthLista progetti

Semantica: Elenco paginato di tutti i progetti dell'utente con statistiche aggregate.

Tecnica: Paginazione cursor-based. Query params: ?page=1&per_page=25&status=active&search=keyword. Include count tasks/deals/members per progetto.

GET/projects/{id}🔒 AuthDettaglio progetto

Semantica: Dati completi del progetto con tutte le statistiche aggregate.

Tecnica: JOIN su tasks (count per status), deals (count + sum value), team_members. Verifica ownership o membership.

PUT/projects/{id}🔒 AuthAggiorna progetto

Semantica: Modifica i dati del progetto. Partial update — solo i campi inclusi vengono modificati.

DELETE/projects/{id}🔒 AuthElimina progetto

Semantica: Elimina il progetto e tutti i dati associati (tasks, deals, file). Azione irreversibile.

Tecnica: CASCADE DELETE su foreign keys. Solo l'owner può eseguire. Trigger webhook project.deleted.

✅ Tasks

Gestione attività all'interno dei progetti. Supporta subtask gerarchici, dipendenze, riordinamento drag & drop, template e time tracking.

POST/projects/{projectId}/tasks🔒 AuthCrea task

Semantica: Aggiunge una nuova attività al progetto specificato. Supporta creazione subtask tramite parent_id.

Tecnica: INSERT con position auto-calcolata (MAX+1), validazione assignee_id come membro del progetto, trigger webhook task.created.

Parametri Body
ParametroTipoDescrizione
titlestringrequiredTitolo del task
descriptionstringoptionalDescrizione dettagliata (Markdown supportato)
statusstringoptionaltodo | in_progress | done
prioritystringoptionallow | medium | high | urgent
due_datestringoptionalScadenza (YYYY-MM-DD)
assignee_idintegeroptionalID membro team assegnato
parent_idintegeroptionalID task padre (per subtask)
curl -X POST https://auth.kacinka.it/projects/1/tasks \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "title": "Configurare hosting VPS",
    "description": "Setup server con Nginx e PHP 8.2",
    "status": "todo",
    "priority": "high",
    "due_date": "2025-08-15"
  }'

👥 Contatti CRM

CRM completo con lead scoring automatico, import/export massivo CSV, merge duplicati intelligente, timeline delle interazioni e campi personalizzati illimitati. 📊 Limite contatti per piano.

POST/contacts🔒 AuthCrea contatto

Semantica: Aggiunge un nuovo contatto al CRM con dati anagrafici, tag e campi personalizzati. Il lead score viene calcolato automaticamente.

Tecnica: Verifica limite piano, deduplicazione su email (409 se esiste), INSERT con tags come JSON array, custom_fields come JSON object. Trigger webhook contact.created.

curl -X POST https://auth.kacinka.it/contacts \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "first_name": "Laura",
    "last_name": "Verdi",
    "email": "laura.verdi@azienda.it",
    "phone": "+39 02 1234567",
    "company_id": null,
    "tags": ["cliente", "premium"],
    "custom_fields": {
      "settore": "Tecnologia",
      "budget": "10000-50000"
    }
  }'
const contact = await fetch('https://auth.kacinka.it/contacts', {
  method: 'POST',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': csrfToken
  },
  body: JSON.stringify({
    first_name: 'Laura', last_name: 'Verdi',
    email: 'laura.verdi@azienda.it',
    tags: ['cliente', 'premium']
  })
}).then(r => r.json());
POST/contacts/import🔒 AuthImport massivo

Semantica: Importa più contatti in una sola richiesta, ideale per migrazione da altri CRM.

Tecnica: Batch INSERT con transaction, deduplicazione su email, skip_duplicates: true salta duplicati senza errore. Max 500 contatti per richiesta.

curl -X POST https://auth.kacinka.it/contacts/import \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "contacts": [
      {"first_name": "Mario", "last_name": "Rossi", "email": "mario@example.com"},
      {"first_name": "Anna", "last_name": "Bianchi", "email": "anna@example.com"}
    ],
    "tags": ["importato"],
    "skip_duplicates": true
  }'

💰 Deals (Pipeline Vendite)

Pipeline CRM con fasi personalizzabili: lead → qualified → proposal → negotiation → won/lost. Drag & drop tra fasi, valore monetario e probabilità di chiusura.

POST/projects/{projectId}/deals🔒 AuthCrea deal

Semantica: Crea una nuova opportunità commerciale nella pipeline del progetto.

Tecnica: Validazione stage enum, valore monetario decimal(12,2), expected_close_date futuro. Trigger webhook deal.created.

curl -X POST https://auth.kacinka.it/projects/1/deals \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "title": "Contratto sito web aziendale",
    "value": 5000.00,
    "currency": "EUR",
    "stage": "proposal",
    "expected_close_date": "2025-09-30"
  }'

💬 Chat

Messaggistica in tempo reale tra membri del team. Supporta menzioni @, reazioni emoji, messaggi fissati, ricerca full-text e allegati file.

POST/chats/{chatId}/messages🔒 AuthInvia messaggio

Semantica: Invia un messaggio nella conversazione chat specificata.

Tecnica: Verifica membership nella chat, sanitizzazione HTML, parsing menzioni (@user_id), INSERT con timestamp UTC. Notifica push ai partecipanti.

curl -X POST https://auth.kacinka.it/chats/1/messages \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "content": "Ciao team! La release è prevista per venerdì.",
    "type": "text"
  }'

📧 Email Marketing

Campagne email con template personalizzabili, liste di distribuzione segmentabili, A/B testing, statistiche apertura/click e conformità CAN-SPAM/GDPR.

POST/email/campaigns🔒 AuthCrea campagna

Semantica: Crea una nuova campagna email con template, lista destinatari e schedulazione opzionale.

Tecnica: FK su template_id e list_id, validazione scheduled_at futuro (ISO 8601), stato iniziale "draft". Invio tramite PHPMailer SMTP con tracking pixel per open rate.

curl -X POST https://auth.kacinka.it/email/campaigns \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "name": "Campagna Estiva 2025",
    "template_id": 1,
    "list_id": 1,
    "subject": "Offerta speciale estate!",
    "scheduled_at": "2025-08-01T09:00:00"
  }'

⚡ Workflows (Automazioni)

Automazione dei processi aziendali con trigger basati su eventi, condizioni flessibili e azioni concatenate. Supporta preset pronti all'uso e duplicazione.

POST/workflows🔒 AuthCrea workflow

Semantica: Definisce una nuova automazione che si attiva automaticamente quando si verifica un determinato evento.

Tecnica: Validazione trigger/conditions/actions schema, condizioni con operatori: equals, contains, gt, lt, in. Azioni eseguite in sequenza con retry automatico. Storage actions JSON.

Trigger disponibili: contact.created, deal.stage_changed, task.completed, form.submitted

Azioni disponibili: send_email, add_tag, create_task, update_field, webhook, delay

curl -X POST https://auth.kacinka.it/workflows \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "name": "Benvenuto nuovo contatto",
    "trigger": "contact.created",
    "conditions": [
      {"field": "tags", "operator": "contains", "value": "lead"}
    ],
    "actions": [
      {"type": "send_email", "template_id": 1},
      {"type": "add_tag", "tag": "onboarded"},
      {"type": "create_task", "title": "Follow-up nuovo lead"}
    ],
    "active": true
  }'

📝 Forms

Form builder con embed code per il tuo sito web. Campi personalizzabili con validazione, statistiche di conversione, integrazione automatica nel CRM e trigger per workflow.

GET/f/{slug}🔓 PubblicoForm pubblico

Semantica: Accesso pubblico al form per raccolta dati. Può essere visitato direttamente o incorporato via iframe.

Tecnica: GET restituisce HTML renderizzato, POST riceve i dati JSON. Auto-crea contatto nel CRM, trigger webhook form.submitted e attiva workflow collegati.

<!-- Embed nel tuo sito -->
<iframe
  src="https://auth.kacinka.it/f/richiesta-preventivo"
  width="100%"
  height="600"
  frameborder="0"
  style="border-radius: 12px"
></iframe>

<!-- Oppure submit via API -->
<script>
fetch('https://auth.kacinka.it/f/richiesta-preventivo', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    name: 'Mario Rossi',
    email: 'mario@example.com',
    budget: '5000-15000',
    message: 'Vorrei un preventivo'
  })
});
</script>

🪝 Webhooks

Ricevi notifiche in tempo reale degli eventi Kacinka nel tuo server. Ogni delivery è firmata con HMAC-SHA256 per garantire l'autenticità. Retry automatico con backoff esponenziale.

POST/webhooks🔒 AuthCrea webhook

Semantica: Registra un endpoint che riceverà notifiche automatiche quando si verificano gli eventi specificati.

Tecnica: Validazione URL HTTPS obbligatoria, secret min 16 char, events validati contro whitelist. Test ping alla creazione per verificare raggiungibilità. Max 10 webhook per utente.

Parametri Body
ParametroTipoDescrizione
urlstringrequiredURL HTTPS del tuo endpoint webhook
eventsstring[]requiredLista eventi da monitorare
secretstringrequiredSegreto per firma HMAC-SHA256 (min 16 char)
activebooleanoptionalDefault: true
curl -X POST https://auth.kacinka.it/webhooks \
  -b cookies.txt \
  -H "Content-Type: application/json" \
  -H "X-CSRF-Token: $CSRF_TOKEN" \
  -d '{
    "url": "https://tuosito.it/webhook/kacinka",
    "events": ["contact.created", "deal.stage_changed", "task.completed"],
    "secret": "whsec_mio_segreto_sicuro",
    "active": true
  }'

Verifica Firma Webhook

Ogni delivery include l'header X-Webhook-Signature con la firma HMAC-SHA256 del payload. Verifica sempre la firma prima di processare il webhook per prevenire spoofing.

<?php
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$secret = 'whsec_mio_segreto_sicuro';

$expected = hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    echo json_encode(['error' => 'Invalid signature']);
    exit;
}

$event = json_decode($payload, true);

// Processa l'evento in base al tipo
switch ($event['event']) {
    case 'contact.created':
        // Nuovo contatto creato in Kacinka
        break;
    case 'deal.stage_changed':
        // Deal ha cambiato fase nella pipeline
        break;
    case 'task.completed':
        // Un task è stato completato
        break;
}

http_response_code(200);
echo json_encode(['received' => true]);
const crypto = require('crypto');
const express = require('express');
const app = express();

app.post('/webhook/kacinka', express.raw({type: '*/*'}), (req, res) => {
  const signature = req.headers['x-webhook-signature'];
  const secret = 'whsec_mio_segreto_sicuro';

  const expected = crypto
    .createHmac('sha256', secret)
    .update(req.body)
    .digest('hex');

  if (!crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(signature)
  )) {
    return res.status(401).json({ error: 'Invalid signature' });
  }

  const event = JSON.parse(req.body);
  console.log('Evento ricevuto:', event.event);
  res.json({ received: true });
});
import hmac, hashlib, json
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook/kacinka', methods=['POST'])
def webhook():
    payload = request.get_data()
    signature = request.headers.get('X-Webhook-Signature', '')
    secret = b'whsec_mio_segreto_sicuro'

    expected = hmac.new(secret, payload, hashlib.sha256).hexdigest()

    if not hmac.compare_digest(expected, signature):
        return jsonify(error='Invalid signature'), 401

    event = json.loads(payload)
    print(f"Evento: {event['event']}")
    return jsonify(received=True)
✅ Eventi Webhook Disponibili contact.created · contact.updated · contact.deleted · deal.created · deal.stage_changed · deal.updated · task.created · task.completed · form.submitted · invoice.created · project.created · project.updated

💳 Abbonamenti & Pagamenti

Gestione piani, checkout Stripe e portale di fatturazione. Integrazione diretta con Stripe Checkout per pagamenti sicuri PCI DSS.

GET/plans🔓 PubblicoLista piani

Semantica: Restituisce tutti i piani disponibili con prezzi, funzionalità e limiti risorse. Nessuna autenticazione richiesta.

Tecnica: Cache in-memory 1h, dati sincronizzati con Stripe Products/Prices. Valori -1 indicano "illimitato".

200
{
  "data": [
    { "id": "free", "name": "Free", "price": 0, "projects": 3, "contacts": 100, "team_members": 1 },
    { "id": "starter", "name": "Starter", "price": 7.90, "projects": 15, "contacts": 1000, "team_members": 5 },
    { "id": "professional", "name": "Professional", "price": 19.90, "projects": -1, "contacts": 10000, "team_members": 25 },
    { "id": "business", "name": "Business", "price": 39.90, "projects": -1, "contacts": -1, "team_members": -1 }
  ]
}

📞 Form di Contatto (Integrazione Esterna)

Endpoint pubblico per integrare un form di contatto nei tuoi siti web. Nessuna autenticazione richiesta. Perfetto per landing page, siti statici e WordPress.

POST/api/contact🔓 PubblicoInvia messaggio contatto

Semantica: Invia un messaggio di contatto che viene recapitato all'amministratore Kacinka via email.

Tecnica: Rate limit 3/min per IP, sanitizzazione HTML, invio email via PHPMailer SMTP al destinatario configurato in .env. CORS aperto per tutti i domini.

Parametri Body
ParametroTipoDescrizione
namestringrequiredNome del mittente
emailstringrequiredEmail del mittente (per risposta)
messagestringrequiredCorpo del messaggio
subjectstringoptionalOggetto del messaggio
companystringoptionalAzienda del mittente
Integrazione HTML — Copia e Incolla nel Tuo Sito
<form id="kacinkaContact" style="max-width:500px">
  <input name="name" placeholder="Nome" required
    style="width:100%;padding:12px;margin:8px 0;border:1px solid #ccc;border-radius:8px" />
  <input name="email" type="email" placeholder="Email" required
    style="width:100%;padding:12px;margin:8px 0;border:1px solid #ccc;border-radius:8px" />
  <input name="subject" placeholder="Oggetto"
    style="width:100%;padding:12px;margin:8px 0;border:1px solid #ccc;border-radius:8px" />
  <textarea name="message" placeholder="Messaggio" rows="5" required
    style="width:100%;padding:12px;margin:8px 0;border:1px solid #ccc;border-radius:8px"></textarea>
  <button type="submit"
    style="background:#7c3aed;color:#fff;padding:12px 24px;border:none;border-radius:8px;cursor:pointer;font-size:16px">
    Invia Messaggio
  </button>
</form>

<script>
document.getElementById('kacinkaContact').addEventListener('submit', async (e) => {
  e.preventDefault();
  const form = e.target;
  const btn = form.querySelector('button');
  btn.textContent = 'Invio...';
  btn.disabled = true;

  try {
    const res = await fetch('https://auth.kacinka.it/api/contact', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(Object.fromEntries(new FormData(form)))
    });
    if (res.ok) {
      form.innerHTML = '<p style="color:#34d399;font-size:18px">' +
        '✅ Messaggio inviato!</p>';
    } else { throw new Error(); }
  } catch {
    btn.textContent = 'Riprova';
    btn.disabled = false;
    alert('Errore. Riprova più tardi.');
  }
});
</script>

❤️ Health Check

Endpoint per monitoraggio uptime, status dei servizi e connettività database. Ideale per sistemi di alerting (UptimeRobot, Pingdom).

GET/health🔓 PubblicoStatus API

Semantica: Verifica che l'API sia operativa e il database raggiungibile.

Tecnica: SELECT 1 su MariaDB, check memory usage, timestamp UTC. Nessuna autenticazione, nessun rate limit.

curl https://auth.kacinka.it/health
200
{ "status": "ok", "timestamp": "2025-07-14T12:00:00Z", "database": "connected" }

🧾 Fatturazione V2

Sistema di fatturazione completo conforme alla normativa italiana. Supporta fatture, note di credito, proforma, autofatture, pagamenti parziali, PDF brandizzati e integrazione contabile con partita doppia. 16 endpoint per il ciclo completo.

GET/projects/{projectId}/invoices-v2🔒 AuthLista fatture V2

Semantica: Elenco paginato di tutte le fatture del progetto con filtri avanzati.

Tecnica: Query params: ?status=draft|finalized|sent|paid&type=invoice|credit_note|proforma&page=1&per_page=25. Include totali aggregati per status.

POST/projects/{projectId}/invoices-v2🔒 AuthCrea fattura V2

Semantica: Crea una nuova fattura con righe dettagliate, aliquote IVA configurabili e dati di fatturazione del cliente.

Tecnica: Validazione numero univoco, calcolo automatico subtotal/tax/total da line items, FK su tax_codes, withholding_tax_id, cost_center_id. Stato iniziale "draft".

Azioni Fattura

POST/invoices-v2/{id}/finalize🔒 AuthFinalizza fattura

Semantica: Blocca la fattura — non più modificabile. Genera la registrazione contabile automatica (partita doppia) e assegna numero progressivo.

POST/invoices-v2/{id}/send🔒 AuthInvia via email/PEC/SDI

Semantica: Invia la fattura al cliente tramite email, PEC o SDI. Aggiorna sent_at e sent_via.

POST/invoices-v2/{id}/credit-note🔒 AuthCrea nota di credito

Semantica: Genera una nota di credito collegata alla fattura originale. Stornatura automatica della registrazione contabile.

GET/invoices-v2/{id}/pdf🔒 AuthDownload PDF

Semantica: Genera e scarica il PDF della fattura con branding personalizzato (logo, colori, footer). Supporta template personalizzabili.

GET/invoices-v2/aging-report🔒 AuthScadenziario

Semantica: Report scadenziario con fatture raggruppate per fascia temporale (30/60/90/120+ giorni). Totali per fascia.

📒 Contabilità

Modulo di contabilità a partita doppia completo. Piano dei conti gerarchico, registrazioni in prima nota, bilancio di verifica, conto economico, stato patrimoniale, cash flow, anni fiscali e liquidazione IVA. 52 endpoint totali.

GET/projects/{projectId}/accounting/accounts🔒 AuthPiano dei conti

Semantica: Restituisce il piano dei conti completo del progetto con struttura gerarchica.

Tecnica: Supporta GET /tree (struttura ad albero), GET /balances (saldi per conto), POST /import (importa template standard). 9 endpoint totali per CRUD + albero + saldi + ledger + import.

POST/projects/{projectId}/accounting/journal-entries🔒 AuthPrima nota

Semantica: Crea una registrazione contabile in partita doppia. Le righe dare/avere devono bilanciarsi.

Tecnica: Validazione somma dare = somma avere, FK su account_id (piano dei conti). Supporta POST/void per stornatura. 7 endpoint totali.

GET/projects/{projectId}/accounting/fiscal-years🔒 AuthAnni fiscali

Semantica: Gestisci anni fiscali e periodi contabili. Chiusura anno, apertura anno successivo.

Report Finanziari

9 report finanziari disponibili, tutti sotto /projects/{projectId}/accounting/reports/:

📊
Trial Balance
Bilancio di verifica
💰
Profit & Loss
Conto economico
🏛️
Balance Sheet
Stato patrimoniale
💧
Cash Flow
Rendiconto finanziario
📖
General Ledger
Libro mastro
🧮
VAT / IVA
Liquidazione IVA e LIPE

🏦 Banking & Riconciliazione

Conti bancari, transazioni, import OFX/CSV, riconciliazione automatica e manuale con match intelligente. 23 endpoint.

GET/projects/{projectId}/bank-accounts🔒 AuthLista conti bancari

Semantica: CRUD completo conti bancari + summary saldo. Import batch transazioni da CSV/OFX.

GET/bank-accounts/{id}/transactions🔒 AuthTransazioni

Semantica: Lista transazioni con filtri data, importo, tipo. POST per inserimento manuale.

POST/bank-accounts/{id}/reconciliation🔒 AuthRiconciliazione

Semantica: Avvia sessione di riconciliazione. Auto-match intelligente tra transazioni bancarie e registrazioni contabili. 9 endpoint per il flusso completo: start, auto-match, match, unmatch, accept-suggestion, complete.

💸 Spese & Categorie

Gestione spese con workflow di approvazione (submit → approve → reject), receipt attach, categorie personalizzabili e report per categoria. 18 endpoint.

POST/projects/{projectId}/expenses🔒 AuthCrea spesa

Semantica: CRUD spese + workflow approvazione. Endpoint dedicati per submit, approve, reject, void. Collegamento ricevute e fatturabilità.

GET/projects/{projectId}/expense-categories🔒 AuthCategorie spese

Semantica: CRUD categorie spese + POST seed per categorie predefinite italiane.

💰 Pagamenti & Scadenziario

Registrazione pagamenti, allocazione su fatture, rimborsi, piani rateali e scadenziario. 22 endpoint.

POST/projects/{projectId}/payments🔒 AuthRegistra pagamento

Semantica: Crea pagamento con allocazione su una o più fatture. Supporta pagamenti parziali, rimborsi e riconciliazione automatica.

GET/schedule/overdue🔒 AuthScadenziario scaduti

Semantica: Fatture scadute, prossime scadenze, riepilogo per periodo. Endpoint: overdue, upcoming, summary + mark-overdue batch.

📜 Fatturazione Elettronica (FatturaPA & PEPPOL)

Generazione XML FatturaPA conforme SDI, PEPPOL per l'Europa, invio e ricezione notifiche SDI. 14 endpoint.

POST/projects/{projectId}/einvoice/generate-fatturapa🔒 AuthGenera XML FatturaPA

Semantica: Genera il file XML conforme al formato FatturaPA v1.2.2 per invio al Sistema di Interscambio (SDI). Validazione automatica prima della generazione.

POST/projects/{projectId}/einvoice/generate-peppol🔒 AuthGenera PEPPOL BIS 3.0

Semantica: Genera file UBL conforme PEPPOL BIS Billing 3.0 per fatturazione elettronica europea.

💱 Multi-Valuta

Gestione valute, tassi di cambio, conversione importi e rivalutazione periodica. Fetch automatico tassi BCE. 10 endpoint.

GET/projects/{projectId}/currencies🔒 AuthValute configurate

Semantica: CRUD valute, GET/POST tassi di cambio, POST convert, POST fetch-ecb (aggiornamento automatico da BCE), POST revaluation.

📊 Budget & Centri di Costo

Pianificazione finanziaria con budget per centro di costo, workflow approvazione, analisi varianze e consuntivi. 17 endpoint.

POST/projects/{projectId}/budgets🔒 AuthCrea budget

Semantica: CRUD budget con workflow (approve → activate → close). Analisi varianze budget vs actual. CRUD centri di costo. Time-to-invoice tracking.

🤖 AI Assistant

Assistente AI integrato con chat contestuale, escalation automatica per richieste complesse e riepilogo conversazioni. Supportato dal backend AI con confidence scoring.

POST/chats/{chatId}/messages🔒 AuthChat con AI

Semantica: Invia un messaggio nella chat con AI. L'assistente risponde con suggerimenti contestuali basati sui dati del progetto.

Tecnica: Interazioni salvate in ai_interactions con category, confidence score e flag needs_human. Riepiloghi automatici in ai_conversation_summaries. Escalation automatica quando confidence < threshold.

GET/admin/ai/escalations🔒 AdminEscalation AI

Semantica: Lista escalation AI da gestire manualmente. Include statistiche, dettagli interazione e contesto. 4 endpoint admin: list, stats, update, interactions.

📸 OCR Ricevute

Scansione e digitalizzazione ricevute con OCR AI (Mindee/Veryfi). Estrazione automatica: fornitore, importo, IVA, data, righe dettaglio. 8 endpoint.

POST/projects/{projectId}/ocr/upload🔒 AuthCarica ricevuta

Semantica: Carica un'immagine o PDF di una ricevuta per l'elaborazione OCR.

Tecnica: Upload file, creazione record in ocr_receipts con status "pending". Supporta JPEG, PNG, PDF. Max 10MB.

POST/ocr/{id}/process🔒 AuthProcessa OCR

Semantica: Avvia l'elaborazione OCR. Estrae vendor_name, vendor_vat, total, tax, net, line_items. Confidence score 0-1. POST link-expense per collegare a spesa esistente. Review manuale con PUT review.

🏧 Open Banking (PSD2)

Connessione diretta con banche europee tramite PSD2/Nordigen. Sincronizzazione automatica transazioni, collegamento conti bancari. 8 endpoint.

GET/projects/{projectId}/open-banking/institutions🔒 AuthBanche disponibili

Semantica: Lista istituzioni bancarie disponibili per la connessione PSD2.

Tecnica: Flusso completo: GET institutions → POST requisitions → POST complete → POST link (collega a bank_account) → POST sync (sincronizza transazioni). Log sync in open_banking_sync_log.

🌐 Site Builder

Crea siti web professionali con template personalizzabili. Preview live, form collegati al CRM, rendering pubblico. 6 endpoint + 4 template.

GET/sites🔒 AuthLista siti

Semantica: CRUD siti web. GET /s/{slug} per rendering pubblico. Endpoint separati per template personalizzabili.

🔔 Notifiche

Sistema notifiche multi-canale con raggruppamento, preferenze personalizzabili e digest email. 8 endpoint.

GET/notifications🔒 AuthLista notifiche

Semantica: Lista, mark read, mark all read, preferenze (GET/PUT), grouped, digest, count. Rate real-time via polling o webhook.

👥 Team & Permessi

Invita membri al progetto, gestisci ruoli e permessi granulari con RBAC a 6 livelli. 8 endpoint.

POST/projects/{projectId}/team/invite🔒 AuthInvita membro

Semantica: Invita un utente al progetto con ruolo specifico. Email con link di accettazione. CRUD team members + accept-invite. GET /roles e /permissions per la configurazione RBAC.

📁 File & Documenti

Upload, download, preview e gestione file di progetto. Supporta qualsiasi formato con preview inline per immagini e PDF. 7 endpoint.

POST/projects/{projectId}/files🔒 AuthUpload file

Semantica: Upload multipart/form-data. Download, preview, update, delete. Preview info per thumbnail.

📅 Calendario & Eventi

Eventi di progetto con calendario cross-project. 5 endpoint.

GET/calendar/events🔒 AuthTutti gli eventi

Semantica: Aggregazione eventi da tutti i progetti dell'utente. CRUD per progetto sotto /projects/{projectId}/events.

⏱️ Time Tracking

Registrazione ore lavorate per task/progetto con report aggregati. 5 endpoint.

GET/projects/{projectId}/time-entries🔒 AuthOre lavorate

Semantica: CRUD time entries con GET /time-report per report aggregato per periodo/utente/task.

🔑 API Keys

Gestione chiavi API per integrazioni server-to-server. Scoping permessi, rotazione, revoca e tracking utilizzo. 10 endpoint.

POST/api-keys🔒 AuthCrea API key

Semantica: Genera una nuova API key con scope definiti. CRUD + revoke, rotate, usage stats. La chiave viene mostrata solo al momento della creazione.

🏪 Portale Clienti

Portale white-label per i tuoi clienti con accesso via magic link. Visualizzazione fatture, messaggi, documenti e approvazioni. 19 endpoint (V1 + V2).

GET/projects/{projectId}/portal/config🔒 AuthConfigurazione portale

Semantica: Config branding (logo, colori, welcome message). V1: accesso PIN. V2: magic link + sessioni. Sezione client: fatture, messaggi, documenti.

🛡️ Pannello Admin

39 endpoint riservati agli amministratori di piattaforma. Dashboard, gestione utenti, feature flags, impersonazione, audit log, monitoraggio chat e gestione AI escalation.

GET/admin/dashboard🔒 AdminDashboard admin

Semantica: Dashboard completa con statistiche utenti, revenue, sistema e chat. Sotto-sezioni: users CRUD (4), impersonation (3), feature flags (5), subscriptions, settings (2), audit, chat monitoring (2), notifications/communications (4), contact submissions (2), AI escalations (4), commerce (6).

📋 Changelog

DataVersioneModifiche
2026-02-102.0.0Documentazione aggiornata a 567 endpoint, 60+ categorie. Aggiunti: Contabilità (52 ep), Fatturazione V2 (16 ep), Banking (23 ep), E-Invoice (14 ep), Multi-Currency (10 ep), Budget (17 ep), OCR (8 ep), Open Banking (8 ep), AI Assistant, Pagamenti (22 ep), Spese (18 ep), Admin (39 ep), API Keys (10 ep), Client Portal V2 (13 ep), Time Tracking, Calendar, Notifications, Site Builder.
2025-07-141.0.0Release iniziale — Collection Postman completa, documentazione integrale