Content Actions
Le Content Actions permettono di attivare chiamate HTTP esterne (webhook, workflow n8n, Zapier, ecc.) direttamente da un contenuto. Le azioni sono configurate sul Content Type e possono funzionare in due modalita': sincrona e asincrona con callback.
Endpoint
| Metodo | Endpoint | Descrizione |
|---|---|---|
GET |
/actions/{contentTypeKey}/{contentId}/{actionId}/execute |
Esegui un'azione |
GET |
/actions/{contentTypeKey}/{contentId}/{actionId}/navigate |
Esegui un'azione di navigazione (ritorna URL) |
GET |
/actions/{contentTypeKey}/{contentId}/{actionId}/status |
Stato dell'esecuzione (solo modalita' callback) |
POST |
/actions/callback/{workspaceId}/{operationId} |
Endpoint di callback per servizi esterni |
Modalita' sincrona (default)
Quando UseCallback e' disabilitato sull'azione, l'esecuzione e' sincrona: Contit chiama il servizio esterno, attende la risposta e ritorna il risultato immediatamente.
Client --> GET /actions/{type}/{id}/{actionId}/execute
--> Contit chiama il servizio esterno
<-- Il servizio esterno risponde
<-- Risposta con risultato
Esempio
curl -H "Authorization: Bearer {token}" \
"https://api.contit.cloud/actions/orders/abc123/send-email/execute"
Risposta:
"OK"
Modalita' asincrona con callback
Quando UseCallback e' abilitato sull'azione, l'esecuzione diventa asincrona: Contit crea un record di tracciamento, chiama il servizio esterno passando un callbackUrl, e ritorna immediatamente con stato Running. Il servizio esterno processa la richiesta e poi chiama il callbackUrl per comunicare il risultato.
Client --> GET /actions/{type}/{id}/{actionId}/execute
--> Contit crea record esecuzione (Running)
--> Contit chiama il servizio esterno (con callbackUrl nel payload)
<-- Il servizio esterno risponde 2xx (accettato)
<-- Risposta: { operationId, callbackUrl }
Client --> GET /actions/{type}/{id}/{actionId}/status (polling)
<-- Risposta: { status: "Running", progress: 50, message: "Elaborazione..." }
Servizio esterno --> POST /actions/callback/{workspaceId}/{operationId}
{ "success": true, "result": "completato" }
<-- 200 OK
Client --> GET /actions/{type}/{id}/{actionId}/status (polling)
<-- Risposta: { status: "Succeeded", result: "completato" }
Risposta execute (modalita' callback)
{
"operationId": "d4f5a6b7-...",
"callbackUrl": "https://api.contit.cloud/actions/callback/ws-123/d4f5a6b7-..."
}
Risposta status
curl -H "Authorization: Bearer {token}" \
"https://api.contit.cloud/actions/orders/abc123/send-email/status"
{
"operationId": "d4f5a6b7-...",
"status": "Running",
"progress": 50,
"message": "Elaborazione ordine...",
"result": null,
"error": null,
"updatedAt": "2026-04-02T10:30:00Z"
}
Valori dello stato: Running (0), Succeeded (1), Failed (-1)
Prevenzione duplicati
Se un'azione con UseCallback e' gia' in esecuzione per lo stesso contenuto e la stessa azione, l'endpoint execute ritorna 409 Conflict.
Endpoint di callback
L'endpoint di callback viene chiamato dal servizio esterno (n8n, Zapier, ecc.) per comunicare il risultato. Non richiede autenticazione — la sicurezza e' basata sull'ID operazione non prevedibile (GUID).
`POST /actions/callback/
Completare l'azione (successo):
{
"success": true,
"result": "Ordine elaborato con successo",
"message": "Completato"
}
Completare l'azione (errore):
{
"success": false,
"error": "Timeout gateway di pagamento",
"message": "Pagamento fallito"
}
Aggiornamento di progresso intermedio:
{
"success": true,
"progress": 50,
"message": "Elaborazione articoli..."
}
Quando progress e' inferiore a 100, l'esecuzione resta in stato Running e vengono aggiornati solo progress e message. Questo permette al servizio esterno di inviare piu' aggiornamenti di progresso prima del completamento finale.
Campi della richiesta di callback
| Campo | Tipo | Descrizione |
|---|---|---|
success |
bool |
true per successo, false per errore |
result |
string |
Dati del risultato (ritornati al client in caso di successo) |
error |
string |
Messaggio di errore (ritornato al client in caso di fallimento) |
message |
string |
Messaggio di stato visualizzato nella UI |
progress |
int? |
Percentuale di progresso (0-100). Valori < 100 aggiornano il progresso senza completare |
Come viene consegnato il callbackUrl
Il callbackUrl viene incluso nella richiesta al servizio esterno in base alla modalita' di payload dell'azione:
| Modalita' Payload | Come viene consegnato il callbackUrl |
|---|---|
| None (GET) | Aggiunto come query parameter: ?callbackUrl=... |
| IdOnly | Campo nel body JSON: { "id": "...", "callbackUrl": "..." } |
| FullEntity | Campo nel body JSON: { "id": "...", "fields": {...}, "callbackUrl": "..." } |
| CustomTemplate | Disponibile nel template come {{callbackUrl}} |
Esempio payload (IdOnly)
{
"id": "abc123",
"contentType": "orders",
"workspaceId": "ws-xyz",
"callbackUrl": "https://api.contit.cloud/actions/callback/ws-xyz/d4f5a6b7-..."
}
Esempio integrazione n8n
Configura l'azione sul Content Type:
- Imposta l'URL template con l'URL del webhook n8n
- Imposta la modalita' payload su
IdOnlyoFullEntity - Abilita
UseCallback
Workflow n8n:
- Nodo Webhook trigger riceve il payload (incluso
callbackUrl) - Processa i vari step del workflow
- Nodo HTTP Request finale:
POSTsu{{ $json.callbackUrl }}con body:{ "success": true, "result": "Completato" }
- Nodo Webhook trigger riceve il payload (incluso
Aggiornamenti di progresso opzionali:
- Aggiungi nodi HTTP Request intermedi durante workflow lunghi:
{ "success": true, "progress": 30, "message": "Step 1 completato" }
- Aggiungi nodi HTTP Request intermedi durante workflow lunghi:
Ciclo di vita dell'esecuzione
I record di esecuzione scadono automaticamente dopo 1 ora. Se il servizio esterno non chiama il callback entro questo tempo, il record viene rimosso e l'azione puo' essere rieseguita.