API REST, webhook e server MCP

Specifica di riferimento per sviluppatori e agenti AI. Ogni oggetto del CRM è una risorsa REST, ogni cambiamento è un evento webhook, ogni capacità è anche un tool MCP con gli stessi permessi dell'utente che lo autorizza.

01 — Fondamenta

Convenzioni dell'API

Le regole valgono per tutte le risorse: impara una volta, usa ovunque.

Base URLhttps://nido.logicaltech.it/api/v1Tutte le risorse sono sotto /api/v1
AutenticazioneAuthorization: Bearer <token>Chiavi API (server) o OAuth 2.1 + PKCE (app, MCP)
VersionamentoNido-Version: 2026-09-01Versioni datate, breaking change solo in nuove date
Rate limit100 req/10 s per tokenHeader X-RateLimit-Remaining · 429 + Retry-After
Paginazione?limit=50&cursor=eyJvIjo1MH0Risposta: { data, next_cursor, has_more }
Filtri e ordinamento?filter[stage]=proposta&sort=-amountOperatori: eq, ne, gt, gte, lt, lte, in, contains
IdempotenzaIdempotency-Key: <uuid>Su POST/PATCH, valida 24 h
Errori{ error: { type, code, message } }400 · 401 · 403 · 404 · 409 · 422 · 429 · 5xx
curl
curl https://nido.logicaltech.it/api/v1/contacts?limit=2&filter[lifecycle_stage]=customer \
  -H "Authorization: Bearer nido_sk_live_…" \
  -H "Nido-Version: 2026-09-01"
crea-contatto.ts
const res = await fetch("https://nido.logicaltech.it/api/v1/contacts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.NIDO_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
  },
  body: JSON.stringify({ email: "[email protected]", first_name: "Anna" }),
})
02 — Endpoint

Risorse e metodi

Ogni endpoint indica lo scope OAuth richiesto. 177 endpoint in 25 gruppi, generati dallo stesso registry che serve l'API. Parametri ed esempi →

03 — Modelli dati

Oggetti principali

Tutti gli oggetti condividono id con prefisso, timestamp ISO 8601, proprietà personalizzate in «properties» e associazioni esplicite.

Contact.json
{
  "id": "ct_29f1",
  "object": "contact",
  "email": "[email protected]",
  "first_name": "Marco",
  "last_name": "Ferraro",
  "lifecycle_stage": "opportunity",
  "owner_id": "usr_giulia",
  "lead_score": 92,
  "properties": {
    "lead_source": "fiera",
    "gdpr_newsletter": true
  },
  "associations": {
    "companies": ["co_4471"],
    "deals": ["deal_8841"]
  },
  "created_at": "2026-08-14T09:12:00Z",
  "updated_at": "2026-10-03T10:14:03Z"
}
Deal.json
{
  "id": "deal_8841",
  "object": "deal",
  "name": "Rinnovo licenze 2027",
  "amount": 24000,
  "currency": "EUR",
  "pipeline_id": "pl_vendite_b2b",
  "stage": "negoziazione",
  "probability": 0.8,
  "close_date": "2026-10-12",
  "status": "open",
  "owner_id": "usr_giulia",
  "line_items": [
    { "sku": "NIDO-BIZ", "qty": 25,
      "unit_price": 840, "discount": 0.1 }
  ],
  "associations": {
    "contacts": ["ct_29f1", "ct_31aa"],
    "companies": ["co_4471"]
  }
}
Error.json
HTTP/1.1 422 Unprocessable Entity

{
  "error": {
    "type": "validation_error",
    "code": "invalid_property",
    "message": "La fase «firmato» non esiste
      nella pipeline vendite-b2b.",
    "param": "stage",
    "doc_url": "https://nido.logicaltech.it/developers/errors
      #invalid_property",
    "request_id": "req_9f2c11ab"
  }
}
04 — Webhook

Eventi e consegne

Ogni evento arriva come POST JSON firmato. Rispondi 2xx entro 10 s; in caso di errore riproviamo fino a 5 volte con backoff esponenziale (1 min → 5 min → 30 min → 2 h → 6 h).

Catalogo eventi

Contatticontact.createdcontact.updatedcontact.deletedcontact.merged
Aziendecompany.createdcompany.updatedcompany.deleted
Dealdeal.createddeal.updateddeal.stage_changeddeal.wondeal.lostdeal.deleted
Attivitàtask.createdtask.completedmeeting.bookedcall.loggednote.created
Comunicazioniemail.sentemail.openedemail.repliedconversation.assigned
Sistemaworkflow.run_failedform.submitteduser.invitedai.action_executed
deal.won · envelope
POST /tuo-endpoint
Content-Type: application/json
X-Nido-Event: deal.won
X-Nido-Delivery: dlv_7hq2k…
X-Nido-Signature: t=1791018734,
  v1=5f2a9c…c91e

{
  "id": "evt_01jb7q2k9x",
  "type": "deal.won",
  "api_version": "2026-09-01",
  "created_at": "2026-10-03T10:14:03Z",
  "workspace_id": "005683c9-…",
  "data": {
    "object": { …Deal },
    "previous": { "stage": "negoziazione" }
  }
}
verify.ts
import crypto from "node:crypto";

export function verify(req, secret) {
  const [t, v1] = req.headers["x-nido-signature"]
    .split(",").map((p) => p.split("=")[1]);

  // rifiuta richieste più vecchie di 5 min
  if (Date.now() / 1000 - Number(t) > 300)
    return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${t}.${req.rawBody}`)
    .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(v1), Buffer.from(expected));
}
05 — MCP per AI

Server MCP di Nido

Il Model Context Protocol permette a Claude, ChatGPT, Cursor e ai tuoi agenti di leggere e aggiornare il CRM con tool tipizzati. Il server è remoto (streamable HTTP), autenticato via OAuth 2.1 e rispetta ruoli e permessi dell'utente che lo collega.

Client AIClaude, ChatGPT, Cursor, agenti custom (Agent SDK, n8n).ClaudeChatGPTCursor
nido.logicaltech.it/api/mcpServer MCP remoto. Espone tool, risorse e prompt; chiede conferma per le scritture.OAuth 2.1scopesHTTP
API v1Stesse regole di rate limit, validazione e idempotenza dell'API pubblica.v1idempotency
Dati CRM + auditOgni chiamata è registrata con utente, client, tool e risultato.audit_logUE
claude_desktop_config.json
{
  "mcpServers": {
    "nido": {
      "type": "http",
      "url": "https://nido.logicaltech.it/api/mcp",
      "oauth": {
        "scopes": [
          "contacts:read",
          "contacts:write",
          "deals:read",
          "deals:write",
          "activities:write"
        ]
      }
    }
  }
}

Collegare un client in 4 passi

1Impostazioni › AI & MCPCrea una connessione e scegli il client (Claude, ChatGPT, Cursor, personalizzato).
2Scegli i permessiLettura, scrittura o per singolo tool. Le scritture possono richiedere conferma.
3Autorizza con OAuthIl client apre la pagina di consenso di Nido; nessuna chiave da copiare.
4Chiedi in linguaggio naturale«Quali deal chiudono questa settimana e cosa manca per firmarli?»
ToolCosa faParametri principaliTipoConferma utente
search_crmCerca nel CRMquery, types, limitLettura— Configurabile
get_recordLeggi recordobject, id, includeLettura— Configurabile
get_timelineCronologia attivitàobject, id, since, limitLettura— Configurabile
list_dealsElenca dealpipeline, stage, owner, close_beforeLettura— Configurabile
pipeline_summaryRiepilogo pipelinepipeline, periodLettura— Configurabile
run_reportEsegui reportreport_id, filtersLettura— Configurabile
create_contactCrea contattoemail, first_name, last_name, companyScrittura— Configurabile
update_recordAggiorna recordobject, id, propertiesScrittura Sempre
move_deal_stageSposta fase del dealdeal_id, stage, reasonScrittura Sempre
log_activityRegistra attivitàobject, id, type, bodyScrittura— Configurabile
create_taskCrea tasktitle, due_at, owner_id, relatedScrittura— Configurabile
draft_emailPrepara bozza emailto, subject, body, context_idLettura— Configurabile
send_emailInvia emaildraft_idScrittura Sempre
enroll_in_workflowIscrivi a workflowworkflow_id, object, idScrittura Sempre

Risorse

nido://contacts/{id}Scheda contatto in markdownnido://companies/{id}Azienda con deal e personenido://deals/{id}Deal, prodotti e cronologianido://pipelinesPipeline e fasi del workspacenido://reports/{id}Risultato di un report salvatonido://schema/{object}Proprietà disponibili e tipi

Prompt pronti

/prepara_meetingBrief di 1 pagina prima di una call: contesto, persone, rischi, domande/riassumi_accountStoria del cliente, valore, stato dei deal e prossimi passi/revisione_pipelineDeal fermi, a rischio o senza prossima attività/follow_upEmail di follow-up dopo un meeting registrato

Sicurezza e controllo

Permessi dell'utenteL'AI non vede né modifica più di chi l'ha collegata.Umano nel loopScritture sensibili richiedono conferma esplicita.Audit logClient, tool, parametri e risultato per ogni chiamata.Revoca immediataToken a scadenza, revocabili in un clic.Dati in UENessun addestramento su dati dei clienti.
Esempio reale

Da una domanda a tre azioni nel CRM.

Claude combina tool di lettura e scrittura. Lo spostamento di fase richiede conferma: l'utente approva dentro la chat e l'azione finisce nell'audit log di Nido.

Ferraro ha firmato. Chiudi il deal e ricordami il kickoff tra 3 giorni.
nido · search_crm{ "query": "Ferraro", "types": ["deal"] }1 risultato · deal_8841 Rinnovo licenze 2027
nido · move_deal_stage{ "deal_id": "deal_8841", "stage": "vinto" }Richiede conferma · Approva / Rifiuta
nido · create_task{ "title": "Kickoff Ferraro", "due_at": "2026-10-06", "deal_id": "deal_8841" }Task creato per Giulia Rinaldi
06 — Sicurezza

Scope e permessi

Gli stessi scope valgono per chiavi API, token OAuth e tool MCP. Un token non può mai superare i permessi del ruolo dell'utente che l'ha autorizzato.

contacts:readcontacts:writecontacts:deletecompanies:readcompanies:writecompanies:deletedeals:readdeals:writedeals:deleteactivities:readactivities:writeemails:reademails:sendworkflows:readworkflows:writewebhooks:manageschema:readusers:readreports:read