{"openapi":"3.1.0","info":{"title":"Rendiconto — API per agenti","version":"1.0.0","description":"Gli strumenti degli agenti di Rendiconto via HTTP. Autenticazione: Authorization: Bearer rmcp_… (mai nell'indirizzo). Ogni accesso vale per un solo ente. Le scritture accettano idempotencyKey; le operazioni in blocco chiedono conferma."},"servers":[{"url":"https://rendiconto.io"}],"tags":[{"name":"anomalies"},{"name":"categories"},{"name":"classification"},{"name":"contabilita"},{"name":"context"},{"name":"contributi"},{"name":"cost_centers"},{"name":"documents"},{"name":"exports"},{"name":"import"},{"name":"movements"},{"name":"reports"},{"name":"rimborsi"},{"name":"scadenze"},{"name":"soci"}],"paths":{"/api/agent/v1/whoami":{"get":{"operationId":"whoami","summary":"Chi sono","description":"Ente, esercizi con regime, accesso (scope, scadenza), piano, uso delle ultime 24 ore e limiti.","tags":["agent"],"security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Il contesto dell'accesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhoAmI"}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools.json":{"get":{"operationId":"tools_json","summary":"Catalogo degli strumenti","description":"Nome, descrizione, scope, permessi e JSON Schema di ogni strumento. Pubblico, in cache 1 ora.","tags":["agent"],"security":[],"responses":{"200":{"description":"Il catalogo.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/agent/v1/openapi.json":{"get":{"operationId":"openapi_json","summary":"Questo documento","tags":["agent"],"security":[],"responses":{"200":{"description":"OpenAPI 3.1.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/agent/v1/files":{"put":{"operationId":"upload_file","summary":"Carica un file","description":"Corpo grezzo (massimo 20 MB), intestazioni X-Filename e Content-Type, opzionale X-Purpose (import | document). Restituisce fileId da passare a import_statement_preview o upload_document.","tags":["files"],"security":[{"bearerAuth":[]}],"responses":{"201":{"description":"File caricato (fileId)."},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/uploads/{fileId}":{"put":{"operationId":"upload_signed","summary":"Carica un file con link firmato","description":"Il link (ws, exp, sig) lo restituisce create_upload_link: vale 10 minuti, un solo uso. Niente bearer.","tags":["files"],"security":[],"parameters":[{"name":"fileId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"File caricato."},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_workspace_info":{"post":{"operationId":"get_workspace_info","summary":"Informazioni sull'ente","description":"CHIAMALO PER PRIMO. Descrive l'ente a cui questo accesso è legato: nome, tipo di ente, periodo contabile, gli esercizi (anni) con il regime contabile di ciascuno (cassa o competenza), se sono chiusi e se hanno movimenti, il piano di abbonamento, i permessi (scope) di questo accesso e il ruolo con cui agisce, i limiti di uso equo. I valori in denaro di tutti gli strumenti sono stringhe con 2 decimali (es. \"1234.56\"); gli importi dei movimenti sono negativi per le uscite. Nessun argomento: l'ente è sempre quello dell'accesso.\n\n[sola lettura]","tags":["context"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":null,"x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_years":{"post":{"operationId":"list_years","summary":"Esercizi","description":"Gli esercizi (anni) dell'ente con il regime contabile di ciascuno (cassa o competenza) e quali sono chiusi. Sola lettura: gli agenti non creano, chiudono né riaprono esercizi e non cambiano il regime. Per il quadro completo con piano e permessi usa get_workspace_info.\n\n[sola lettura]","tags":["context"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"settings.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_bank_accounts":{"post":{"operationId":"list_bank_accounts","summary":"Conti e casse","description":"Conti bancari, conti online e casse contanti dell'ente, con IBAN, saldo iniziale e fido. Servono gli id (bankAccountId) per filtrare i movimenti e per importare un estratto conto.\n\n[sola lettura]","tags":["context"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_accounts":{"post":{"operationId":"list_accounts","summary":"Piano dei conti (elenco)","description":"Elenco piatto del piano dei conti per l'esercizio (codice, nome, natura, lato normale, saldo aggregato in cent). Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_piano_conti":{"post":{"operationId":"get_piano_conti","summary":"Piano dei conti (albero)","description":"Piano dei conti gerarchico (albero) con saldi aggregati per nodo e quadratura. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_trial_balance":{"post":{"operationId":"get_trial_balance","summary":"Bilancio di verifica","description":"Bilancio di verifica: per conto totale dare/avere e saldo, più ΣDare/ΣAvere e flag quadra. Opzionale asOfDate. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"asOfDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_a":{"post":{"operationId":"get_modello_a","summary":"Stato Patrimoniale (Modello A)","description":"Stato Patrimoniale per competenza (Attivo/Passivo, stock alla data di chiusura). Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_b":{"post":{"operationId":"get_modello_b","summary":"Rendiconto Gestionale (Modello B)","description":"Rendiconto Gestionale per competenza (oneri/proventi aree A–E, flusso, incluse righe non monetarie). Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_open_items":{"post":{"operationId":"list_open_items","summary":"Partite aperte (crediti/debiti)","description":"Partite aperte (crediti = receivable, debiti = payable) con residuo. Filtri: kind, status, asOf. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza-workspace","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["crediti","debiti"]},"status":{"type":"string","enum":["aperta","parziale","chiusa","stornata"]},"asOf":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["kind"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_journal_entries":{"post":{"operationId":"list_journal_entries","summary":"Scritture del giornale","description":"Testate del libro giornale per l'esercizio (data, descrizione, ΣDare/ΣAvere, balanced, stato). Paginabile via limit. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"prima_nota.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":1000}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_journal_entry":{"post":{"operationId":"get_journal_entry","summary":"Dettaglio scrittura","description":"Una singola scrittura (testata + righe dare/avere) per id, all'interno dell'esercizio. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"prima_nota.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["year","entryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/reconcile_status":{"post":{"operationId":"reconcile_status","summary":"Stato riconciliazione","description":"Sintesi riconciliazione movimenti banca ↔ partite: quante riconciliazioni suggeribili e quante 'sicure'. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza-workspace","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/check_quadratura":{"post":{"operationId":"check_quadratura","summary":"Verifica quadratura","description":"Verifica le due invarianti della partita doppia: giornale (ΣDare===ΣAvere, dal bilancio di verifica) e patrimoniale (Attivo===Passivo, dallo Stato Patrimoniale). isBalanced = entrambe vere. Recupera i numeri dagli engine, non li ricalcola. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/validate_period_close":{"post":{"operationId":"validate_period_close","summary":"Verifica chiudibilità esercizio","description":"Dry-run di chiusura: { canClose, blockers[], warnings[] } — scritture sbilanciate, bozze, partite senza contropartita, anno precedente non chiuso, ecc. Ogni voce ha label e stateLabel in italiano, delta in euro e la guida (cosa controlla, cosa fare). NON chiude nulla. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_salute":{"post":{"operationId":"get_salute","summary":"Salute contabile","description":"Cruscotto Salute contabile: tutti i controlli (saldo banca, partite, continuità, numerazione, ritenute, quadratura) con stato e dettaglio + isDepositabile. Ogni controllo ha label e stateLabel in italiano, delta in euro e la guida; saldo_banca ha anche bank e ledger (euro) e una spiegazione dello scarto. Fonte: ledger.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read:contabilita"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_movements":{"post":{"operationId":"list_movements","summary":"Elenco movimenti","description":"Elenco paginato dei movimenti (entrate positive, uscite negative) con categoria, centri di costo, contributi imputati, numero di documenti e ritenuta. Filtri: year (esercizio) oppure from/to, accountId o bankAccountId (list_bank_accounts), categoryId (id da list_categories), costCenterId o \"unassigned\", projectId (contributo/fondo) o \"unassigned\", status, search (descrizione/controparte), amountSign, counterpartyKeys (chiavi da list_counterparties). Restituisce anche statusCounts (conteggi per stato sulla stessa vista) e nextCursor.\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"search":{"type":"string","minLength":1,"maxLength":200},"amountSign":{"type":"string","enum":["positive","negative"]},"counterpartyKeys":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"sortField":{"type":"string","enum":["date","amount","description","counterparty"]},"sortDir":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_movement":{"post":{"operationId":"get_movement","summary":"Dettaglio movimento","description":"Vista completa di UN movimento: dati, categoria, imputazioni ai contributi, ripartizione sui centri di costo, documenti collegati (solo metadati) e avvisi aperti.\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_unclassified_movements":{"post":{"operationId":"list_unclassified_movements","summary":"Movimenti da classificare","description":"Movimenti senza alcuna categoria, paginati: il punto di partenza per classificare. Stessi filtri e stessa risposta di list_movements (year o from/to, accountId, search, amountSign...).\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"string","const":"unassigned"}]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"search":{"type":"string","minLength":1,"maxLength":200},"amountSign":{"type":"string","enum":["positive","negative"]},"counterpartyKeys":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"sortField":{"type":"string","enum":["date","amount","description","counterparty"]},"sortDir":{"type":"string","enum":["asc","desc"]},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_counterparties":{"post":{"operationId":"list_counterparties","summary":"Controparti","description":"Controparti dei movimenti (nome normalizzato `key`, etichetta più frequente `label`, numero di movimenti) nel periodo, dalla più frequente. Le `key` si passano a list_movements come counterpartyKeys. `empty` conta i movimenti senza controparte.\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_movement_warnings":{"post":{"operationId":"list_movement_warnings","summary":"Avvisi sui movimenti","description":"Avvisi non risolti sui movimenti (possibile duplicato, confidenza bassa, importo o data anomali) con il movimento interessato e, per i duplicati, quello collegato. Contatori per tipo in `counts`; `total` conta tutti gli avvisi aperti. `truncated: true` vuol dire che l'elenco è parziale (l'endpoint ne restituisce al massimo 500): risolvi i primi per vedere gli altri.\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_comments":{"post":{"operationId":"list_comments","summary":"Commenti","description":"Commenti su un movimento o su un documento (targetType + targetId), dal più recente, con paginazione. I commenti interni sono visibili solo ai ruoli che possono vederli.\n\n[sola lettura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"comments.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"targetType":{"type":"string","enum":["movement","document"]},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["targetType","targetId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_categories":{"post":{"operationId":"list_categories","summary":"Categorie","description":"Categorie analitiche dell'ente (id, nome, tipo entrata/uscita, voce del Modello D/RUNTS `runtsSectionCode`/`runtsRowCode`). Sono le categorie con cui si classificano i movimenti: usa questi id come categoryId.\n\n[sola lettura]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_category_usage":{"post":{"operationId":"get_category_usage","summary":"Utilizzo delle categorie","description":"Per ogni categoria, quanti movimenti e quale totale nell'esercizio (year; se manca, l'esercizio principale dell'ente). Serve a trovare categorie inutilizzate o dominanti.\n\n[sola lettura]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_d_mapping":{"post":{"operationId":"get_modello_d_mapping","summary":"Mappatura Modello D","description":"La struttura del Modello D (rendiconto per cassa): sezioni A-E, investimenti (INV) e fuori rendiconto (X) con le righe di entrata e di uscita, e la mappatura delle categorie dell'ente su quelle righe. Serve per capire dove finisce una categoria nel rendiconto e per proporre la voce RUNTS di una categoria nuova.\n\n[sola lettura]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_classification_rules":{"post":{"operationId":"list_classification_rules","summary":"Regole di classificazione","description":"Regole di classificazione automatica (di sistema, dello studio e dell'ente) con condizione, categoria di destinazione e confidenza. Prima di proporre una regola nuova controlla che non esista già. Filtro ruleType; includeArchived per le archiviate.\n\n[sola lettura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"classification_rules.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"ruleType":{"type":"string","minLength":1,"maxLength":40},"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_low_confidence":{"post":{"operationId":"list_low_confidence","summary":"Classificazioni incerte","description":"Movimenti classificati con confidenza sotto la soglia (threshold 0-1, default 0.6), dai meno sicuri, da ricontrollare. Filtro source (ai, rule, manual, analogy). Restituisce al massimo `limit` righe e il totale; se total > count restringi la soglia.\n\n[sola lettura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"classification_rules.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"threshold":{"type":"number","minimum":0,"maximum":1},"source":{"type":"string","enum":["ai","rule","manual","analogy"]},"limit":{"type":"integer","minimum":1,"maximum":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/suggest_document_matches":{"post":{"operationId":"suggest_document_matches","summary":"Abbinamenti documento-movimento","description":"Per un movimento, i documenti già caricati che probabilmente lo giustificano, con punteggio di confidenza (importo, data, fornitore). Non collega nulla: per collegare usa link_document. limit 1-10 (default 5).\n\n[sola lettura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":10}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_cost_centers":{"post":{"operationId":"list_cost_centers","summary":"Centri di costo","description":"Centri di costo dell'ente (id, codice, nome, tipo, predefinito). Gli id servono per filtrare i movimenti e per i report. includeArchived per comprendere anche quelli archiviati.\n\n[sola lettura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"cost_centers.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_cost_center_report":{"post":{"operationId":"get_cost_center_report","summary":"Report centri di costo","description":"Report delle spese di UN centro di costo nel periodo (year oppure from+to; default l'esercizio corrente): quota imputata per categoria, elenco dei movimenti imputati con la quota del centro, documenti e completezza. Gli importi sono le quote imputate al centro, non gli importi lordi dei movimenti.\n\n[sola lettura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"cost_centers.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["costCenterId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_cost_center_completeness":{"post":{"operationId":"get_cost_center_completeness","summary":"Completezza centri di costo","description":"Quante uscite dell'esercizio (year; default tutto lo storico) sono ripartite sui centri di costo e quante no: totale speso, uscite assegnate e non assegnate, copertura in percentuale e spesa per centro. Il campo excluded elenca a parte le uscite fuori perimetro (senza categoria, investimenti, fuori rendiconto) senza centri: il 100% non le include. Le uscite non assegnate si sistemano con bulk_assign_cost_center o allocate_cost_centers.\n\n[sola lettura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"cost_centers.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_contributi":{"post":{"operationId":"list_contributi","summary":"Contributi","description":"Tutti i contributi (fondi dei finanziatori) dell'ente con stato della pratica, importo concesso e ammesso, speso, residuo, finestra di ammissibilità, scadenze collegate e «prossimo passo», più i fondi propri. È la mappa di partenza per la rendicontazione. Regola di dominio: si spende l'ammessa, non il concesso. spesoAmmissibile e residuoDaSpendere si misurano sull'ammessa (spese dentro la finestra di ammissibilità); residuoDaSpendere non scende sotto zero, e oltreAmmessa dice quanto la spesa la supera (warnings elenca questi contributi). daRicevere è invece concesso meno incassato: quanto l'erogatore deve ancora versare.\n\n[sola lettura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_contributo":{"post":{"operationId":"get_contributo","summary":"Dettaglio contributo","description":"Scheda di UN contributo: anagrafica (nome, finanziatore, CUP, periodo, concesso, ammesso, stato), totali, ripartizione per categoria, ultimi movimenti imputati e numero di movimenti non ancora assegnati ad alcun fondo.\n\n[sola lettura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_contributo_rendicontazione":{"post":{"operationId":"get_contributo_rendicontazione","summary":"Rendicontazione del contributo","description":"La rendicontazione di UN contributo nel periodo (from+to; se mancano, quello del finanziatore): spese imputate per voce, documenti, completezza. Se il contributo ha uno schema di rendicontazione del finanziatore, include anche il report per voce dello schema con budget, speso e minimi (schemeReport: è lì il budget di set_contributo_budget; il prospetto di rendicontazione è il preventivo per categoria analitica). ammessa riporta concesso, somma ammessa, speso nella finestra di ammissibilità, residuo e oltreAmmessa, come nella pagina Contributi; warnings segnala la spesa oltre l'ammessa (si spende l'ammessa, non il concesso). Serve a trovare le spese non ancora imputate.\n\n[sola lettura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_contributo_trend":{"post":{"operationId":"get_contributo_trend","summary":"Andamento del contributo","description":"Andamento mensile della spesa imputata a UN contributo dentro la sua finestra di ammissibilità, con il confronto con la somma ammessa. Serve a capire se si sta spendendo troppo piano o troppo in fretta.\n\n[sola lettura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_funder_schemes":{"post":{"operationId":"list_funder_schemes","summary":"Schemi dei finanziatori","description":"Schemi di rendicontazione dei finanziatori (nome, documenti richiesti) con i contributi che li usano. Uno schema dice quali voci di spesa il finanziatore riconosce. Con schemeId restituisce QUELLO schema con le sue voci (items: id, codice, etichetta, macrovoce, entrata/uscita) e le corrispondenze con le categorie (mappings): gli id delle voci servono a set_contributo_budget e allocate_to_contributo.\n\n[sola lettura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200},"schemeId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_documents":{"post":{"operationId":"list_documents","summary":"Documenti","description":"Documenti caricati (fatture, ricevute, contratti...), dal più recente, con tipo, dimensione, stato dell'estrazione e dati estratti (data, importo, fornitore, numero fattura, IVA). Filtro documentType. Solo metadati: il file si scarica con get_document_download_link. Massimo 100 per pagina.\n\n[sola lettura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"documents.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"documentType":{"type":"string","minLength":1,"maxLength":40},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_document":{"post":{"operationId":"get_document","summary":"Dettaglio documento","description":"Metadati di UN documento: nome, tipo, dimensione, dati estratti con affidabilità, numerazione progressiva, conservazione, movimenti collegati e un'anteprima del testo estratto. NON include il file né link di download.\n\n[sola lettura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"documents.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_import_batches":{"post":{"operationId":"list_import_batches","summary":"Importazioni eseguite","description":"Importazioni di estratti conto già eseguite, dalla più recente: file, conto, righe dichiarate, movimenti ancora collegati, quanti sono ancora senza categoria, e se l'importazione l'ha fatta un agente (importedByAgent) o questo accesso (importedByThisToken). Filtro accountId. Si può annullare solo una importazione propria e recente (undo_import).\n\n[sola lettura]","tags":["import"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_analisi":{"post":{"operationId":"get_analisi","summary":"Analisi","description":"La pagina Analisi dell'esercizio (year): per centro di costo entrate, uscite, saldo, quota sulle uscite, andamento mensile e uscite non assegnate; per contributo ammessa, speso, incassato, residuo e % speso; torta della composizione delle uscite. residuo = ammessa − speso nella finestra di ammissibilità (mai sotto zero): un contributo chiuso con speso 0 non ha spese imputate. Nei totali sommaAmmessa somma solo i contributi con ammessa, speso tutti, spesoSuAmmessa solo quelli con ammessa. compare=true aggiunge il confronto con l'esercizio precedente.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"compare":{"type":"boolean"}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_analitico":{"post":{"operationId":"get_analitico","summary":"Bilancio analitico","description":"Rendiconto analitico per categoria dell'esercizio (year): per ogni categoria entrate/uscite, budget e scostamenti, con colonne di confronto sugli anni precedenti (additionalYears 0-5 oltre al precedente). Filtro projectIds per limitarlo a uno o più contributi; from+to per un periodo diverso dall'esercizio.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"additionalYears":{"type":"integer","minimum":0,"maximum":5},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_cdc_pivot":{"post":{"operationId":"get_cdc_pivot","summary":"Pivot centri di costo","description":"Tabella centri di costo × categorie: la quota imputata a ogni centro per ogni categoria, per le uscite (sign=uscita, default) o per le entrate (sign=entrata), nel periodo (year oppure from/to; senza, tutto lo storico).\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"sign":{"type":"string","enum":["uscita","entrata"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_d":{"post":{"operationId":"get_modello_d","summary":"Modello D","description":"Modello D, il rendiconto per cassa dell'esercizio (year): sezioni A-E con ogni riga di entrata e di uscita (anno corrente e precedente), blocco investimenti, totali, avanzo, saldo iniziale e finale e la QUADRATURA (isBalanced). Solo per esercizi per cassa (per competenza: errore 409, usa get_modello_a/b/c). projectIds limita ai contributi indicati.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_e":{"post":{"operationId":"get_modello_e","summary":"Modello E","description":"Modello E, il rendiconto per cassa aggregato (enti minori) dell'esercizio (year). Solo per esercizi per cassa (per competenza: errore 409). projectIds limita ai contributi indicati.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_modello_c":{"post":{"operationId":"get_modello_c","summary":"Relazione di missione (Modello C)","description":"Modello C per competenza dell'esercizio (year): le cifre di bilancio (da Modello A e B), il controllo di quadratura tra avanzo e variazione del patrimonio netto, e i 22 punti della relazione di missione con il testo scritto. Solo per esercizi per competenza. locale=it|de sceglie la lingua del testo.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"locale":{"type":"string","enum":["it","de"]}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_preventivo":{"post":{"operationId":"get_preventivo","summary":"Preventivo","description":"Bilancio preventivo dell'esercizio (year) nella forma del Modello D, costruito sulle previsioni inserite. Richiede il piano con le previsioni. projectIds limita ai contributi indicati.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_forecast":{"post":{"operationId":"get_forecast","summary":"Previsioni","description":"Previsioni di entrata e uscita per categoria dell'esercizio (year). resolve=true restituisce la previsione già risolta (valori inseriti o stimati dallo storico) con il consuntivo per categoria e il periodo; senza resolve, i valori inseriti (projectId per un solo contributo). Richiede il piano con le previsioni.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"resolve":{"type":"boolean"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"projectIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_relazione_sections":{"post":{"operationId":"get_relazione_sections","summary":"Sezioni della relazione di missione","description":"I punti della relazione di missione dell'esercizio (year) con titolo, se obbligatori e il testo scritto in italiano e tedesco; `basis` dice il regime dell'esercizio, `stato` lo stato della relazione (bozza, approvato, depositato) con `statoNota` che spiega se si può ancora scrivere, e `access` se questo accesso può modificarla (si congela con bilancio approvato o depositato; un esercizio solo chiuso resta in bozza). Funziona per esercizi per cassa e per competenza. Per scrivere un punto: update_relazione_section.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_snapshots":{"post":{"operationId":"list_snapshots","summary":"Istantanee","description":"Istantanee dei report (copie congelate di un report in un dato momento): nome, tipo di report, anno, stato, data. Filtri reportType e year. Massimo 100 per pagina.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"reportType":{"type":"string","minLength":1,"maxLength":60},"year":{"type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_scadenze":{"post":{"operationId":"list_scadenze","summary":"Scadenze","description":"Scadenze dell'ente (fiscali, RUNTS, assicurative, dei contributi) con data, stato (pending, snoozed, completed, skipped), voce di catalogo e contributo collegato, in ordine di data. Filtri status e from/to sulla data di scadenza.\n\n[sola lettura]","tags":["scadenze"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"scadenze.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","snoozed","completed","skipped"]},"from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_rimborsi":{"post":{"operationId":"list_rimborsi","summary":"Rimborsi","description":"Richieste di rimborso spese (volontari e collaboratori) dalla più recente, con importo, stato e dati della richiesta. Massimo 100 per pagina.\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_rimborso":{"post":{"operationId":"get_rimborso","summary":"Dettaglio rimborso","description":"Una richiesta di rimborso spese con tutti i suoi dati (importo, stato, motivo, beneficiario, movimento collegato).\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reimbursementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["reimbursementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_ritenute":{"post":{"operationId":"list_ritenute","summary":"Ritenute","description":"Ritenute d'acconto registrate sui compensi: lordo, netto, aliquota, ritenuta, causale, codice tributo, percipiente (nome e tipo di rapporto; senza codice fiscale). Filtri movementId e percipientId.\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"ritenute.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"percipientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_anomalies":{"post":{"operationId":"list_anomalies","summary":"Anomalie","description":"Anomalie dell'esercizio (year; default quello corrente) per gravità (blocking, critical, warning) e tipo (unclassified, missing_document, amount_mismatch, duplicate_suspect), con riepilogo dei conteggi. summaryOnly=true restituisce solo il riepilogo. Massimo 200 per pagina.\n\n[sola lettura]","tags":["anomalies"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"severity":{"type":"string","enum":["blocking","critical","warning"]},"type":{"type":"string","enum":["unclassified","missing_document","amount_mismatch","duplicate_suspect"]},"summaryOnly":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":200},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_review_queue":{"post":{"operationId":"get_review_queue","summary":"Coda di revisione","description":"Tutto ciò che aspetta una persona, in un colpo solo: movimenti da rivedere per stato (needs_review, to_review, ambiguous, missing_document), avvisi aperti e classificazioni incerte. `perSection` (default 25, max 100) limita le righe di ogni sezione; ogni sezione ha il suo total (negli avvisi `truncated: true` se `items` non li contiene tutti). Per scorrere una sezione usa list_movements con status, list_movement_warnings o list_low_confidence.\n\n[sola lettura]","tags":["anomalies"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"perSection":{"type":"integer","minimum":1,"maximum":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_year_end_checklist":{"post":{"operationId":"get_year_end_checklist","summary":"Checklist di fine anno","description":"Lo stato di preparazione del rendiconto dell'esercizio (year): movimenti ancora senza categoria, uscite non ripartite sui centri di costo, quadratura del Modello D (per cassa), punti della relazione di missione scritti e obbligatori mancanti, scadenze aperte, anomalie. Ogni voce ha status ok / todo / info / not_applicable e il numero che lo spiega; `ready` è vero quando nessuna voce è todo. Ogni voce ha anche label e guidance in italiano; `esercizioHint` dice che creare o chiudere un esercizio si fa dall'app, non da qui. Non modifica nulla.\n\n[sola lettura]","tags":["anomalies"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_members":{"post":{"operationId":"list_members","summary":"Collaboratori dell'ente","description":"Le persone che lavorano nell'ente su Rendiconto (collaboratori diretti e studio commercialista), con nome e ruolo. Serve per menzionare qualcuno in un commento: scrivi nel testo di add_comment il valore «mention» (es. «@Mario Rossi») seguito da una virgola o da un punto. mention è null quando il nome ha accenti o più di due parole: quella persona non si può menzionare. isYou indica chi ha creato questo accesso. Le email non sono incluse.\n\n[sola lettura]","tags":["context"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"members.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_soci":{"post":{"operationId":"list_soci","summary":"Soci","description":"Il libro soci: nome, categoria e quota annuale della categoria, stato (active, inactive, resigned, expelled), date di iscrizione e di uscita, codice di pagamento (la causale che il socio usa nel bonifico) e ultimo sollecito. Filtri: search (nome o cognome), status, categoryId, isActive. Senza codice fiscale, indirizzo, dati di nascita e contatti: per quelli di UN socio usa get_socio. includeCategories=true aggiunge le categorie soci con la quota annuale.\n\n[sola lettura]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"members.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"search":{"description":"Parte del nome o del cognome.","type":"string","minLength":1,"maxLength":100},"status":{"description":"Stato del socio.","type":"string","enum":["active","inactive","resigned","expelled"]},"categoryId":{"description":"Categoria soci.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"isActive":{"description":"Solo attivi (true) o solo non attivi (false).","type":"boolean"},"includeCategories":{"description":"Aggiunge l'elenco delle categorie soci.","type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_socio":{"post":{"operationId":"get_socio","summary":"Scheda del socio","description":"La scheda completa di un socio (anche codice fiscale, contatti, indirizzo, dati di nascita, note, uscita) e le sue quote dell'anno indicato (year, facoltativo). Gli id vengono da list_soci.\n\n[sola lettura]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"members.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci)."},"year":{"description":"Anno delle quote da includere.","type":"integer","minimum":2000,"maximum":2100}},"required":["memberId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_quote":{"post":{"operationId":"list_quote","summary":"Quote associative","description":"Le quote associative di un anno, socio per socio (importo, stato pending/paid/overdue/waived, scadenza, pagamento, movimento collegato), con il riepilogo dell'anno (quante pagate, quanto atteso e quanto incassato). Filtri: status, memberId. Gli importi sono stringhe in euro con 2 decimali.\n\n[sola lettura]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"members.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno delle quote."},"status":{"description":"Stato della quota.","type":"string","enum":["pending","paid","overdue","waived"]},"memberId":{"description":"Solo le quote di questo socio.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_quote_non_pagate":{"post":{"operationId":"list_quote_non_pagate","summary":"Quote non pagate","description":"Le quote di un anno ancora da incassare (pending e overdue), dalla scadenza più vecchia, con «scaduta» = la data di scadenza è passata (oggi, ora italiana) e il totale da incassare. Per sollecitare usa send_quota_reminder (un socio) o send_quota_reminders (tutti), che chiedono la conferma della persona.\n\n[sola lettura]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"members.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno delle quote."},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/annotate_movement":{"post":{"operationId":"annotate_movement","summary":"Annotare un movimento","description":"Aggiorna i dati descrittivi di un movimento: descrizione, controparte, stato di revisione e nota di revisione. Non cambia mai importo, data o categoria (per la categoria usa classify_movement). Stati: complete, missing_document, needs_review, ambiguous, to_review. Un esercizio chiuso non si modifica. Restituisce il movimento aggiornato.\n\n[scrittura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"description":{"description":"Nuova descrizione.","type":"string","minLength":1,"maxLength":500},"counterparty":{"description":"Controparte; null per toglierla.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"status":{"description":"Stato di revisione del movimento.","type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"reviewNote":{"description":"Nota di revisione; null per toglierla.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/resolve_movement_warning":{"post":{"operationId":"resolve_movement_warning","summary":"Risolvere un avviso","description":"Chiude un avviso su un movimento (ad esempio un possibile doppione o un importo anomalo). action: «resolve» = sistemato, «dismiss» = da ignorare. Non unisce né cancella movimenti: l'unione dei doppioni resta un'operazione della persona nell'app. Gli id degli avvisi vengono da list_movement_warnings.\n\n[scrittura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"warningId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id dell'avviso (da list_movement_warnings)."},"action":{"type":"string","enum":["resolve","dismiss"],"description":"resolve = sistemato; dismiss = ignorato."},"note":{"description":"Nota facoltativa sul perché.","type":"string","maxLength":1000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["warningId","action"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_cash_movement":{"post":{"operationId":"create_cash_movement","summary":"Registrare un movimento di cassa","description":"Registra a mano un movimento su un conto cassa o bancario dell'ente (non sui conti online, che si sincronizzano da soli). amount è una stringa in euro con segno: negativo = uscita, positivo = entrata (es. \"-12.50\"). La categoria analitica, se indicata, deve avere lo stesso segno (uscita/entrata). Un esercizio chiuso non accetta movimenti. Usa i conti di list_bank_accounts. Restituisce il movimento creato.\n\n[scrittura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto cassa o bancario (da list_bank_accounts)."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data del movimento, AAAA-MM-GG."},"amount":{"type":"string","pattern":"^-?\\d{1,9}(\\.\\d{1,2})?$","description":"Importo in euro con segno, es. \"-12.50\" per un'uscita."},"description":{"type":"string","minLength":1,"maxLength":500,"description":"Descrizione."},"counterparty":{"description":"Controparte.","type":"string","maxLength":200},"analyticalCategoryId":{"description":"Categoria (da list_categories).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["bankAccountId","date","amount","description"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/classify_movement":{"post":{"operationId":"classify_movement","summary":"Classificare un movimento","description":"Assegna la categoria a un movimento. analyticalCategoryId è la categoria del piano dei conti dell'ente (da list_categories), quella da usare; categoryId è la macrovoce RUNTS legacy e serve solo in casi particolari. null toglie la categoria. La categoria deve avere lo stesso segno del movimento (uscita/entrata). Un esercizio chiuso non si modifica. Non tocca importo, data o descrizione.\n\n[scrittura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"analyticalCategoryId":{"description":"Categoria analitica; null = nessuna.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"categoryId":{"description":"Macrovoce RUNTS legacy (raramente necessaria).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/bulk_classify_movements":{"post":{"operationId":"bulk_classify_movements","summary":"Classificare più movimenti","description":"Assegna la stessa categoria analitica a più movimenti (fino a 500) in un'unica operazione: o tutti o nessuno. Tutti i movimenti devono avere il segno della categoria. Sopra 50 movimenti serve la conferma della persona (la prima risposta contiene requiresConfirmation). Restituisce accepted e failed.\n\n[scrittura; richiede conferma (bulk)]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da classificare."},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Categoria analitica (da list_categories)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementIds","analyticalCategoryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/suggest_classification":{"post":{"operationId":"suggest_classification","summary":"Suggerire la classificazione","description":"Chiede al motore di classificazione (regole dell'ente, storico e AI) una categoria per fino a 50 movimenti. Non modifica nulla: per applicare usa accept_classification o bulk_accept_classifications. Consuma la quota AI del piano. Restituisce per ogni movimento il suggerimento con confidenza e motivazione.\n\n[scrittura; usa l'AI del piano]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da classificare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/accept_classification":{"post":{"operationId":"accept_classification","summary":"Accettare un suggerimento","description":"Applica a un movimento la categoria suggerita da suggest_classification e la registra come esempio, così il motore impara. Il movimento passa a «complete» se ha un documento, altrimenti «missing_document». La categoria deve avere il segno del movimento. Un esercizio chiuso non si modifica.\n\n[scrittura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Categoria suggerita (analitica)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","analyticalCategoryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/bulk_accept_classifications":{"post":{"operationId":"bulk_accept_classifications","summary":"Accettare più suggerimenti","description":"Accetta in blocco fino a 100 suggerimenti (action «accept», predefinita) oppure segna i movimenti come da rivedere (action «mark_to_review»). Con accept ogni voce porta analyticalCategoryId e la confidence del suggerimento ricevuto da suggest_classification. Le voci con segno incompatibile vengono saltate e riportate in errors. Sopra 50 voci serve la conferma della persona.\n\n[scrittura; richiede conferma (bulk)]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"batch.execute","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"analyticalCategoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"analyticalCategoryName":{"type":"string","maxLength":200},"confidence":{"type":"number","minimum":0,"maximum":1},"reasoning":{"type":"string","maxLength":1000}},"required":["movementId"],"additionalProperties":false},"description":"Voci: movimento + suggerimento."},"action":{"description":"accept (predefinita) o mark_to_review.","type":"string","enum":["accept","mark_to_review"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/allocate_cost_centers":{"post":{"operationId":"allocate_cost_centers","summary":"Ripartire sui centri di costo","description":"Imposta la ripartizione di UN movimento sui centri di costo, in percentuale: sostituisce quella esistente. La somma non può superare 100; un centro di costo compare una sola volta e non può essere archiviato. Un esercizio chiuso non si modifica. Centri di costo da list_cost_centers.\n\n[scrittura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"cost_centers.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento."},"allocations":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"percentage":{"type":"number","minimum":0,"maximum":100}},"required":["costCenterId","percentage"],"additionalProperties":false},"description":"Ripartizione completa: [{ costCenterId, percentage }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","allocations"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/bulk_assign_cost_center":{"post":{"operationId":"bulk_assign_cost_center","summary":"Assegnare un centro di costo a più movimenti","description":"Assegna fino a 500 movimenti a un solo centro di costo al 100%, sostituendo la loro ripartizione. Sopra 50 movimenti serve la conferma della persona. Un esercizio chiuso non si modifica.\n\n[scrittura; richiede conferma (bulk)]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"cost_centers.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti da assegnare."},"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Centro di costo (da list_cost_centers)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementIds","costCenterId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_category":{"post":{"operationId":"create_category","summary":"Creare una categoria","description":"Crea una categoria del piano dei conti dell'ente, con tipo (entrata/uscita) e voce RUNTS del Modello D (sezione A–E, INV o X e riga, es. B.2). La riga deve esistere per quel tipo e appartenere alla sezione. suggest_runts_mapping propone la voce a partire dal nome. Il nome è unico nell'ente.\n\n[scrittura]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome della categoria."},"type":{"type":"string","enum":["entrata","uscita"],"description":"entrata o uscita."},"runtsSectionCode":{"type":"string","enum":["A","B","C","D","E","INV","X"],"description":"Sezione RUNTS: A, B, C, D, E, INV (investimenti) o X (fuori rendiconto)."},"runtsRowCode":{"type":"string","pattern":"^(?:[A-E]\\.\\d{1,2}|INV\\.[1-4]|X)$","description":"Riga RUNTS, es. A.1, B.2, INV.1, X."},"description":{"description":"Descrizione.","type":"string","maxLength":500},"exemptFromMissingDoc":{"description":"true = i movimenti non richiedono documento (es. oneri bancari).","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","type","runtsSectionCode","runtsRowCode"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_category":{"post":{"operationId":"update_category","summary":"Modificare una categoria","description":"Modifica nome, descrizione, esenzione dal documento o voce RUNTS / Modello D di una categoria. Il tipo (entrata/uscita) non cambia. Se cambia la voce del Modello D serve la conferma della persona (la prima risposta contiene requiresConfirmation). Non disattiva né cancella categorie.\n\n[scrittura; richiede conferma (conditional)]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"movements.classify","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della categoria (da list_categories)."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"description":{"description":"Descrizione; null per toglierla.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"runtsSectionCode":{"description":"Nuova sezione RUNTS.","type":"string","enum":["A","B","C","D","E","INV","X"]},"runtsRowCode":{"description":"Nuova riga RUNTS.","type":"string","pattern":"^(?:[A-E]\\.\\d{1,2}|INV\\.[1-4]|X)$"},"exemptFromMissingDoc":{"description":"Esenzione dal documento mancante.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["categoryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/suggest_runts_mapping":{"post":{"operationId":"suggest_runts_mapping","summary":"Suggerire la voce RUNTS","description":"Propone la voce RUNTS / Modello D per fino a 100 categorie, dal nome e dal tipo, con le regole del prodotto. Non modifica nulla e non usa l'AI. Restituisce suggestions: [{ name, type, suggestion }].\n\n[scrittura]","tags":["categories"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"type":{"type":"string","enum":["entrata","uscita"]}},"required":["name","type"],"additionalProperties":false},"description":"Categorie da mappare: [{ name, type }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["categories"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_classification_rule":{"post":{"operationId":"create_classification_rule","summary":"Creare una regola","description":"Crea una regola di classificazione dell'ente: quando un movimento soddisfa la condizione, il motore propone la categoria (e facoltativamente contributo e centro di costo) indicati. Tipi: controparte, importo, keyword, combo. Vale solo per questo ente. confidence 0–1 (predefinita 0.95): da 0.85 la regola si applica senza AI.\n\n[scrittura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"classification_rules.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ruleType":{"type":"string","enum":["controparte","importo","keyword","combo"],"description":"Tipo di condizione."},"pattern":{"anyOf":[{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false},{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false},{"type":"object","properties":{"and":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}},"or":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}],"description":"Condizione della regola, secondo ruleType: controparte {match, mode?: exact|contains}; importo {min?, max?} oppure {value, tolerance?}; keyword {keywords[], anyOrAll?: any|all, case_sensitive?}; combo {and: [...]} oppure {or: [...]} con figli {ruleType, pattern}."},"targetCategoryId":{"description":"Categoria analitica proposta.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetProjectId":{"description":"Contributo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetCostCenterId":{"description":"Centro di costo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"confidence":{"description":"Fiducia della regola, 0–1.","type":"number","minimum":0,"maximum":1},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["ruleType","pattern"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_classification_rule":{"post":{"operationId":"update_classification_rule","summary":"Modificare una regola","description":"Modifica una regola di classificazione di questo ente (da list_classification_rules): condizione, destinazioni, confidence, oppure archived: true per spegnerla (false per riaccenderla). Se cambi pattern indica anche ruleType. Le regole dello studio o di sistema non si modificano da qui.\n\n[scrittura]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"classification_rules.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ruleId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della regola."},"ruleType":{"description":"Tipo di condizione (obbligatorio se cambi pattern).","type":"string","enum":["controparte","importo","keyword","combo"]},"pattern":{"anyOf":[{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false},{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false},{"type":"object","properties":{"and":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}},"or":{"minItems":1,"maxItems":10,"type":"array","items":{"anyOf":[{"type":"object","properties":{"ruleType":{"type":"string","const":"controparte"},"pattern":{"type":"object","properties":{"match":{"type":"string","minLength":1,"maxLength":200},"mode":{"type":"string","enum":["exact","contains"]}},"required":["match"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"importo"},"pattern":{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false},{"type":"object","properties":{"ruleType":{"type":"string","const":"keyword"},"pattern":{"type":"object","properties":{"keywords":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"anyOrAll":{"type":"string","enum":["any","all"]},"case_sensitive":{"type":"boolean"}},"required":["keywords"],"additionalProperties":false}},"required":["ruleType","pattern"],"additionalProperties":false}]}}},"additionalProperties":false},{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"},"value":{"type":"number"},"tolerance":{"type":"number","minimum":0}},"additionalProperties":false}],"description":"Condizione della regola, secondo ruleType: controparte {match, mode?: exact|contains}; importo {min?, max?} oppure {value, tolerance?}; keyword {keywords[], anyOrAll?: any|all, case_sensitive?}; combo {and: [...]} oppure {or: [...]} con figli {ruleType, pattern}."},"targetCategoryId":{"description":"Categoria analitica proposta.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetProjectId":{"description":"Contributo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"targetCostCenterId":{"description":"Centro di costo proposto.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"confidence":{"description":"Fiducia della regola, 0–1.","type":"number","minimum":0,"maximum":1},"archived":{"description":"true = regola spenta; false = riattivata.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["ruleId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_cost_center":{"post":{"operationId":"create_cost_center","summary":"Creare un centro di costo","description":"Crea un centro di costo dell'ente con nome, codice univoco (lettere, numeri, _ - .), tipo e, facoltativamente, descrizione e centro padre.\n\n[scrittura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"cost_centers.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome."},"code":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_\\-.]+$","description":"Codice univoco nell'ente."},"kind":{"type":"string","enum":["geografica","area_intervento","progetto","evento","generale"],"description":"Tipo di centro di costo."},"description":{"description":"Descrizione.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"parentId":{"description":"Centro di costo padre.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","code","kind"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_cost_center":{"post":{"operationId":"update_cost_center","summary":"Modificare un centro di costo","description":"Modifica nome, codice, tipo, descrizione o padre di un centro di costo (da list_cost_centers). Non archivia né cancella centri di costo.\n\n[scrittura]","tags":["cost_centers"],"security":[{"bearerAuth":[]}],"x-scope":["write:setup"],"x-permission":"cost_centers.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del centro di costo."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"code":{"description":"Nuovo codice.","type":"string","minLength":1,"maxLength":40,"pattern":"^[A-Za-z0-9_\\-.]+$"},"kind":{"description":"Nuovo tipo.","type":"string","enum":["geografica","area_intervento","progetto","evento","generale"]},"description":{"description":"Descrizione; null per toglierla.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"parentId":{"description":"Centro padre; null per toglierlo.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["costCenterId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_contributo":{"post":{"operationId":"create_contributo","summary":"Creare un contributo","description":"Crea un contributo (finanziamento di un ente erogatore) con stato della pratica, importi concesso e ammesso (stringhe in euro), periodo del progetto e finestra di ammissibilità delle spese. funderContactId è l'ente erogatore in anagrafica; schemeId lo schema di rendicontazione (da list_funder_schemes). Restituisce il contributo creato (project).\n\n[scrittura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Nome del contributo."},"applicationStatus":{"type":"string","enum":["bozza","inviata","deliberata","anticipo_ricevuto","saldata","respinta","rinunciata","revocata"],"description":"Stato della pratica, es. bozza, inviata, deliberata."},"description":{"description":"Descrizione iniziale (poi si usa add_contributo_note).","type":"string","maxLength":500},"status":{"description":"Stato del fondo: active (predefinito) o draft.","type":"string","enum":["draft","active"]},"startDate":{"description":"Inizio progetto.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"description":"Fine progetto.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"budget":{"description":"Budget complessivo del progetto.","type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"importoConcesso":{"description":"Importo concesso dall'erogatore.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"sommaAmmessa":{"description":"Somma ammessa (quella da spendere e rendicontare).","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"eligibilityFrom":{"description":"Inizio ammissibilità delle spese.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"eligibilityTo":{"description":"Fine ammissibilità delle spese.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"funderContactId":{"description":"Ente erogatore in anagrafica.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"office":{"description":"Ufficio dell'erogatore che segue la pratica.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"schemeId":{"description":"Schema di rendicontazione del finanziatore.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","applicationStatus"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_contributo":{"post":{"operationId":"update_contributo","summary":"Modificare un contributo","description":"Modifica i dati di un contributo: nome, periodo, importi concesso/ammesso, finestra di ammissibilità, stato della pratica, ente erogatore, ufficio, scadenza del rendiconto, stato del fondo, schema di rendicontazione (schemeId da list_funder_schemes; null lo scollega; non si cambia finché ci sono righe di budget della delibera). Le note si aggiungono con add_contributo_note; l'invio del rendiconto si segna con mark_contributo_report_sent. Chiudere il fondo (status «closed») richiede la conferma della persona.\n\n[scrittura; richiede conferma (conditional)]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo (da list_contributi)."},"name":{"description":"Nuovo nome.","type":"string","minLength":1,"maxLength":100},"status":{"description":"Stato del fondo; closed chiede conferma.","type":"string","enum":["draft","active","closed"]},"startDate":{"description":"Inizio progetto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"endDate":{"description":"Fine progetto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"budget":{"description":"Budget complessivo.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"importoConcesso":{"description":"Importo concesso.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"sommaAmmessa":{"description":"Somma ammessa.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"eligibilityFrom":{"description":"Inizio ammissibilità.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"eligibilityTo":{"description":"Fine ammissibilità.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"applicationStatus":{"description":"Stato della pratica.","type":"string","enum":["bozza","inviata","deliberata","anticipo_ricevuto","saldata","respinta","rinunciata","revocata"]},"funderContactId":{"description":"Ente erogatore.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"office":{"description":"Ufficio dell'erogatore.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"reportDueDate":{"description":"Scadenza del rendiconto.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"schemeId":{"description":"Schema di rendicontazione del finanziatore (da list_funder_schemes); null lo scollega.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/set_contributo_budget":{"post":{"operationId":"set_contributo_budget","summary":"Impostare il budget del contributo","description":"Imposta il budget di delibera del contributo per voce del suo schema di rendicontazione: sostituisce tutte le righe con quelle indicate (le voci non elencate vengono tolte). Ogni voce una sola volta; importi come stringhe in euro. Il contributo deve avere uno schema (update_contributo schemeId); le voci e i loro id sono in list_funder_schemes con schemeId.\n\n[scrittura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"lines":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"schemeItemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"minAmount":{"anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]}},"required":["schemeItemId","amount"],"additionalProperties":false},"description":"Righe di budget: [{ schemeItemId, amount, minAmount? }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","lines"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/record_disbursement":{"post":{"operationId":"record_disbursement","summary":"Registrare un'erogazione","description":"Registra una tranche del contributo (anticipo, saldo, unica, altro, oppure restituzione all'erogatore): importo atteso e/o ricevuto come stringhe in euro, data di incasso e movimento bancario collegato.\n\n[scrittura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"kind":{"type":"string","enum":["anticipo","saldo","unica","altro","restituzione"],"description":"Tipo di tranche."},"expectedAmount":{"description":"Importo atteso.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"receivedAmount":{"description":"Importo ricevuto.","anyOf":[{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},{"type":"null"}]},"receivedDate":{"description":"Data di incasso.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"movementId":{"description":"Movimento dell'incasso (da list_movements).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"note":{"description":"Nota.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","kind"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/allocate_to_contributo":{"post":{"operationId":"allocate_to_contributo","summary":"Imputare spese a un contributo","description":"Due usi. (1) Un movimento: movementId + allocations = la ripartizione COMPLETA del movimento sui fondi (1–5 righe { projectId, amount | percentage, schemeItemId? }; amount è una stringa positiva in euro), che sostituisce quella esistente; la somma non supera l'importo del movimento, il resto resta ai mezzi propri. (2) Più movimenti: movementIds + schemeItemId assegna la voce dello schema del contributo projectId alle sue imputazioni già esistenti (null la toglie); sopra 50 movimenti serve la conferma della persona. Un esercizio chiuso non si modifica. Dopo l'uso (1) warnings segnala i contributi la cui spesa supera la somma ammessa (oltreAmmessa): non è un blocco, come nell'app, ma l'eccedenza non aumenta il contributo (si spende l'ammessa, non il concesso).\n\n[scrittura; richiede conferma (bulk)]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.classify","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo."},"movementId":{"description":"Uso (1): il movimento da ripartire.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"allocations":{"description":"Uso (1): la ripartizione completa del movimento.","minItems":1,"maxItems":5,"type":"array","items":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"amount":{"type":"string","pattern":"^\\d{1,10}(\\.\\d{1,2})?$"},"percentage":{"type":"number","minimum":0.01,"maximum":100},"schemeItemId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["projectId"],"additionalProperties":false}},"movementIds":{"description":"Uso (2): i movimenti già imputati al contributo.","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"schemeItemId":{"description":"Uso (2): la voce dello schema; null = nessuna.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/remove_contributo_allocation":{"post":{"operationId":"remove_contributo_allocation","summary":"Rimuovere un'imputazione","description":"Toglie un movimento da un contributo. Le imputazioni del movimento ad altri fondi restano com'erano; la quota tolta torna ai mezzi propri. Si può rifare con allocate_to_contributo. Un esercizio chiuso non si modifica.\n\n[scrittura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo."},"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento da togliere."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/add_contributo_note":{"post":{"operationId":"add_contributo_note","summary":"Aggiungere una nota al contributo","description":"Aggiunge una nota datata al diario del contributo (in coda, senza toccare le note precedenti). date facoltativa, predefinita oggi.\n\n[scrittura]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"text":{"type":"string","minLength":1,"maxLength":4000,"description":"Testo della nota."},"date":{"description":"Data della nota, AAAA-MM-GG (predefinita oggi).","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["projectId","text"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/mark_contributo_report_sent":{"post":{"operationId":"mark_contributo_report_sent","summary":"Segnare la rendicontazione come inviata","description":"Segna che il rendiconto del contributo è stato inviato all'erogatore in una data (non futura): la pratica passa a «rendicontata». Solo da «deliberata» o «anticipo_ricevuto». Richiede sempre la conferma della persona.\n\n[scrittura; richiede conferma (always)]","tags":["contributi"],"security":[{"bearerAuth":[]}],"x-scope":["write:contributi"],"x-permission":"movements.classify","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del contributo."},"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di invio del rendiconto, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["projectId","date"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_relazione_section":{"post":{"operationId":"update_relazione_section","summary":"Scrivere una sezione della relazione","description":"Scrive il testo di uno o più punti della relazione di missione (Modello C) di un esercizio: code è il numero del punto come in get_relazione_sections (es. \"3\"), locale it o de, body il testo (al massimo 20000 caratteri; le tabelle si scrivono come righe con | fra le colonne). Sostituisce il testo esistente di quel punto. Un esercizio con bilancio approvato o depositato non si modifica. Leggi prima get_relazione_sections. Restituisce quante sezioni sono cambiate.\n\n[scrittura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["write:reports"],"x-permission":"relazione.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"sections":{"minItems":1,"maxItems":48,"type":"array","items":{"type":"object","properties":{"code":{"type":"string","pattern":"^\\d{1,2}$"},"locale":{"type":"string","enum":["it","de"]},"body":{"type":"string","minLength":1,"maxLength":20000}},"required":["code","locale","body"],"additionalProperties":false},"description":"Sezioni da scrivere: [{ code, locale, body }]."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","sections"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_snapshot":{"post":{"operationId":"create_snapshot","summary":"Creare un'istantanea","description":"Archivia una copia del report di un esercizio così com'è oggi. Per cassa: Modello D o bilancio analitico, facoltativamente limitati a uno o più contributi. Per competenza: Modello A (Stato patrimoniale), Modello B (Rendiconto gestionale) o Modello C (Relazione di missione con le cifre), sempre dell'intero ente. Le cifre vengono calcolate dal server, non dall'agente. La copia compare in Archivio report come bozza. Restituisce l'istantanea creata (senza i dati).\n\n[scrittura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["write:reports"],"x-permission":"reports.export","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200,"description":"Nome dell'istantanea."},"reportType":{"type":"string","enum":["modello-d","analitico","modello-a","modello-b","modello-c"],"description":"Report da archiviare: modello-d o analitico (per cassa), modello-a, modello-b o modello-c (per competenza)."},"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"projectIds":{"description":"Solo questi contributi.","minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","reportType","year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/add_comment":{"post":{"operationId":"add_comment","summary":"Aggiungere un commento","description":"Aggiunge un commento a un movimento o a un documento, visibile ai membri dell'ente. Il testo compare preceduto da «[via agente]». Le menzioni @Nome funzionano come nell'app. visibility «internal» (solo studio) richiede che l'autore del token sia dello studio.\n\n[scrittura]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:comments","write:movements"],"x-permission":"comments.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"targetType":{"type":"string","enum":["movement","document"],"description":"A cosa si riferisce il commento."},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento o del documento."},"content":{"type":"string","minLength":1,"maxLength":4987,"description":"Testo del commento."},"visibility":{"description":"shared (predefinito) o internal (solo studio).","type":"string","enum":["shared","internal"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["targetType","targetId","content"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_scadenza":{"post":{"operationId":"create_scadenza","summary":"Creare una scadenza","description":"Crea una scadenza personalizzata (stato «da fare») con nome e data, facoltativamente collegata a un contributo. Le scadenze di legge del catalogo si generano dall'app, non da qui.\n\n[scrittura]","tags":["scadenze"],"security":[{"bearerAuth":[]}],"x-scope":["write:scadenze"],"x-permission":"scadenze.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":300,"description":"Nome della scadenza."},"dueDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di scadenza, AAAA-MM-GG."},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"projectId":{"description":"Contributo collegato (da list_contributi).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","dueDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/complete_scadenza":{"post":{"operationId":"complete_scadenza","summary":"Completare una scadenza","description":"Segna come completata una scadenza (da list_scadenze), con una nota facoltativa.\n\n[scrittura]","tags":["scadenze"],"security":[{"bearerAuth":[]}],"x-scope":["write:scadenze"],"x-permission":"scadenze.complete","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"notes":{"description":"Nota sul completamento.","type":"string","maxLength":2000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/snooze_scadenza":{"post":{"operationId":"snooze_scadenza","summary":"Rimandare una scadenza","description":"Rimanda (silenzia) una scadenza fino a una data futura. La data deve essere nel futuro.\n\n[scrittura]","tags":["scadenze"],"security":[{"bearerAuth":[]}],"x-scope":["write:scadenze"],"x-permission":"scadenze.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"until":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Fino a quando rimandarla, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId","until"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/unsnooze_scadenza":{"post":{"operationId":"unsnooze_scadenza","summary":"Riattivare una scadenza","description":"Annulla il rinvio di una scadenza: torna attiva e visibile negli avvisi.\n\n[scrittura]","tags":["scadenze"],"security":[{"bearerAuth":[]}],"x-scope":["write:scadenze"],"x-permission":"scadenze.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scadenzaId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scadenza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["scadenzaId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_rimborso":{"post":{"operationId":"create_rimborso","summary":"Creare una richiesta di rimborso","description":"Crea una richiesta di rimborso spese (stato «inviata») da approvare nell'app: l'agente non approva mai. amount è una stringa in euro positiva. method «autocertificato» (art. 17 c.4 CTS) applica i limiti dell'autocertificazione e può essere rifiutato con il motivo. Gli approvatori ricevono la notifica come dall'app.\n\n[scrittura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["write:rimborsi"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"beneficiaryName":{"type":"string","minLength":1,"maxLength":200,"description":"Chi riceve il rimborso."},"beneficiaryEmail":{"description":"Email del beneficiario.","type":"string","maxLength":254,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"amount":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo in euro, es. \"45.00\"."},"description":{"type":"string","minLength":1,"maxLength":1000,"description":"Che spesa è."},"expenseDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data della spesa, AAAA-MM-GG."},"documentId":{"description":"Giustificativo già caricato (da list_documents).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contactId":{"description":"Volontario o socio in anagrafica.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"method":{"description":"Predefinito: documentato.","type":"string","enum":["documentato","autocertificato"]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["beneficiaryName","amount","description","expenseDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/dismiss_anomaly":{"post":{"operationId":"dismiss_anomaly","summary":"Archiviare un'anomalia","description":"Chiude le anomalie di fino a 50 movimenti per chiamata (da list_anomalies). action «dismiss» = falso allarme, il movimento torna «complete»; action «resolve» = il movimento torna «needs_review» per essere sistemato. Un esercizio chiuso non si modifica. Restituisce accepted e failed.\n\n[scrittura]","tags":["anomalies"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementIds":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Movimenti con l'anomalia (al massimo 50)."},"action":{"type":"string","enum":["dismiss","resolve"],"description":"dismiss = falso allarme; resolve = da rivedere."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementIds","action"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_manual_movement":{"post":{"operationId":"update_manual_movement","summary":"Correggere un movimento manuale","description":"Corregge un movimento registrato a mano (cassa o inserimento manuale): importo, data, descrizione, controparte. Importo e data si cambiano SOLO sui movimenti manuali: quelli importati dalla banca tengono le cifre dell'estratto (per loro descrizione e controparte si cambiano con annotate_movement). Cambiare importo o data chiede la conferma della persona; le imputazioni ai contributi vengono riproporzionate al nuovo importo. Non si può invertire il segno di un movimento già classificato (togli prima la categoria con classify_movement) né cambiare il conto (elimina e registra di nuovo). Un esercizio chiuso non si modifica. amount è una stringa in euro con segno, es. \"-12.50\".\n\n[scrittura; richiede conferma (conditional)]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento manuale."},"amount":{"description":"Nuovo importo con segno, es. \"-12.50\".","type":"string","pattern":"^-?\\d{1,9}(\\.\\d{1,2})?$"},"date":{"description":"Nuova data, AAAA-MM-GG.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"description":"Nuova descrizione.","type":"string","minLength":1,"maxLength":500},"counterparty":{"description":"Controparte; null per toglierla.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/delete_manual_movement":{"post":{"operationId":"delete_manual_movement","summary":"Eliminare un movimento manuale","description":"Elimina un movimento registrato a mano (ad esempio una spesa di cassa inserita due volte o per errore). Chiede sempre la conferma della persona. Solo movimenti manuali: quelli importati dalla banca si tolgono con undo_import (importazione recente e non ancora lavorata) o nell'app. Non elimina un movimento di un esercizio chiuso né uno con documenti, imputazioni o una ritenuta collegati: prima vanno scollegati.\n\n[scrittura; richiede conferma (always)]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:movements"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento manuale da eliminare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["movementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/delete_comment":{"post":{"operationId":"delete_comment","summary":"Eliminare un proprio commento","description":"Elimina un commento scritto dalla persona che ha creato questo accesso (mai quelli degli altri). Indica il commento e il movimento o documento su cui si trova (targetType + targetId, come in list_comments). Chiede sempre la conferma della persona. Un commento non si modifica: eliminalo e scrivine uno nuovo con add_comment.\n\n[scrittura; richiede conferma (always)]","tags":["movements"],"security":[{"bearerAuth":[]}],"x-scope":["write:comments","write:movements"],"x-permission":"comments.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"commentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del commento (da list_comments)."},"targetType":{"type":"string","enum":["movement","document"],"description":"Dove si trova il commento."},"targetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del movimento o del documento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["commentId","targetType","targetId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/apply_classification_rules":{"post":{"operationId":"apply_classification_rules","summary":"Applicare le regole di classificazione","description":"Classifica i movimenti NON ancora classificati con le regole dell'ente (list_classification_rules), senza AI e senza consumare la quota AI. Solo esercizi aperti; i movimenti già classificati non vengono mai toccati. Passo 1, dryRun (predefinito): indica year e/o movementIds e ricevi le proposte (movimento, categoria, regola, confidenza) senza modifiche. Passo 2: richiama con dryRun=false e movementIds = gli id delle proposte che la persona approva (fino a 500); le regole vengono rivalutate e applicate. Sopra 50 movimenti serve la conferma della persona. I movimenti senza regola applicabile restano da classificare (classify_movement o suggest_classification).\n\n[scrittura; richiede conferma (bulk)]","tags":["classification"],"security":[{"bearerAuth":[]}],"x-scope":["write:classify"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"dryRun":{"description":"true (predefinito) = solo proposte; false = applica le regole ai movementIds.","type":"boolean"},"year":{"description":"Esercizio dei movimenti da esaminare.","type":"integer","minimum":2000,"maximum":2100},"movementIds":{"description":"Movimenti precisi; obbligatorio per applicare (dryRun=false).","minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"limit":{"description":"Con year: quanti movimenti non classificati esaminare (massimo 500).","type":"integer","minimum":1,"maximum":500},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_socio":{"post":{"operationId":"create_socio","summary":"Aggiungere un socio","description":"Iscrive un nuovo socio nel libro soci: nome, cognome e data di iscrizione obbligatori; categoria, contatti, codice fiscale e dati di nascita facoltativi. Un codice fiscale già presente viene rifiutato (il socio esiste già: usa list_soci e update_socio). Restituisce il socio creato con il suo codice di pagamento.\n\n[scrittura]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["write:soci"],"x-permission":"members.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":100,"description":"Nome."},"lastName":{"type":"string","minLength":1,"maxLength":100,"description":"Cognome."},"joinDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di iscrizione, AAAA-MM-GG."},"categoryId":{"description":"Categoria soci (da list_soci con includeCategories).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"email":{"description":"Email del socio.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"phone":{"description":"Telefono.","anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"pec":{"description":"PEC.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"address":{"description":"Indirizzo.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"codiceFiscale":{"description":"Codice fiscale (16 caratteri) o partita IVA (11 cifre).","anyOf":[{"type":"string","maxLength":16},{"type":"null"}]},"birthDate":{"description":"Data di nascita, AAAA-MM-GG.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"birthPlace":{"description":"Luogo di nascita.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["firstName","lastName","joinDate"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_socio":{"post":{"operationId":"update_socio","summary":"Modificare un socio","description":"Aggiorna i dati di un socio (contatti, categoria, codice fiscale, dati di nascita, note, data di iscrizione) o il suo stato: active, inactive, resigned (recesso), expelled (esclusione). Recesso ed esclusione tolgono il socio dai soci attivi e chiedono la conferma della persona; exitDate (predefinita oggi) ed exitReason ne registrano data e motivo. null svuota un campo facoltativo.\n\n[scrittura; richiede conferma (conditional)]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["write:soci"],"x-permission":"members.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci)."},"firstName":{"description":"Nome.","type":"string","minLength":1,"maxLength":100},"lastName":{"description":"Cognome.","type":"string","minLength":1,"maxLength":100},"joinDate":{"description":"Data di iscrizione, AAAA-MM-GG.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"categoryId":{"description":"Categoria soci (da list_soci con includeCategories).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"email":{"description":"Email del socio.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"phone":{"description":"Telefono.","anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"pec":{"description":"PEC.","anyOf":[{"type":"string","maxLength":200,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"null"}]},"address":{"description":"Indirizzo.","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"codiceFiscale":{"description":"Codice fiscale (16 caratteri) o partita IVA (11 cifre).","anyOf":[{"type":"string","maxLength":16},{"type":"null"}]},"birthDate":{"description":"Data di nascita, AAAA-MM-GG.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"birthPlace":{"description":"Luogo di nascita.","anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"notes":{"description":"Note.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"status":{"description":"Stato del socio.","type":"string","enum":["active","inactive","resigned","expelled"]},"exitDate":{"description":"Data di uscita (recesso o esclusione).","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"exitReason":{"description":"Motivo dell'uscita.","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["memberId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/record_quota_payment":{"post":{"operationId":"record_quota_payment","summary":"Registrare il pagamento di una quota","description":"Segna come pagata una quota associativa in attesa o scaduta (gli id vengono da list_quote o list_quote_non_pagate), con metodo (bank_transfer, cash, manual) e importo incassato. movementId collega la quota al movimento bancario o di cassa che l'ha incassata (il codice di pagamento del socio di solito è nella causale). Una quota già pagata o esonerata non cambia. Chiede sempre la conferma della persona: se il socio ha un'email, Rendiconto gli invia la conferma di pagamento.\n\n[scrittura; richiede conferma (always)]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["write:soci"],"x-permission":"members.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"duesId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della quota."},"paymentMethod":{"type":"string","enum":["bank_transfer","cash","manual"],"description":"Come è stata pagata."},"amount":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo incassato in euro, es. \"25.00\"."},"movementId":{"description":"Movimento che ha incassato la quota (da list_movements).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"proofDocumentId":{"description":"Documento che prova il pagamento (da list_documents).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["duesId","paymentMethod","amount"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/send_quota_reminder":{"post":{"operationId":"send_quota_reminder","summary":"Sollecitare un socio","description":"Invia al socio un'email di sollecito per le sue quote non pagate. Chiede sempre la conferma della persona. Il socio deve avere un'email e non essere stato sollecitato nelle ultime 24 ore. Richiede la funzione solleciti dell'abbonamento.\n\n[scrittura; richiede conferma (always)]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["write:soci"],"x-permission":"members.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"memberId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del socio (da list_soci o list_quote_non_pagate)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["memberId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/send_quota_reminders":{"post":{"operationId":"send_quota_reminders","summary":"Sollecitare i soci con quote non pagate","description":"Invia un'email di sollecito a TUTTI i soci con quote in attesa o scadute (di un anno, se indicato) che hanno un'email e non sono stati sollecitati nelle ultime 24 ore. Chiede sempre la conferma della persona e dice quante email partiranno. Richiede la funzione solleciti dell'abbonamento.\n\n[scrittura; richiede conferma (always)]","tags":["soci"],"security":[{"bearerAuth":[]}],"x-scope":["write:soci"],"x-permission":"members.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"description":"Solo le quote di questo anno.","type":"integer","minimum":2000,"maximum":2100},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_upload_link":{"post":{"operationId":"create_upload_link","summary":"Creare un link di caricamento","description":"Crea un link firmato per caricare UN file (valido 10 minuti, usabile una volta): estratto conto (purpose «import») o documento (purpose «document»). Caricalo con `curl -T file \"<uploadUrl>\"`, poi usa il fileId restituito con import_statement_preview, upload_document o scan_receipt. Massimo 20 MB; tipi ammessi: estratti CSV/TSV/CBI/XLS/XLSX/PDF, documenti PDF/immagini/Excel/Word/XML/P7M. Il file resta disponibile 24 ore.\n\n[scrittura]","tags":["import"],"security":[{"bearerAuth":[]}],"x-scope":["write:import","write:documents"],"x-permission":"documents.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"purpose":{"type":"string","enum":["import","document"],"description":"«import» per un estratto conto, «document» per un giustificativo."},"filename":{"type":"string","minLength":1,"maxLength":255,"description":"Nome del file con estensione, es. «estratto-marzo.csv»."},"contentType":{"type":"string","minLength":3,"maxLength":120,"description":"Tipo MIME, es. «text/csv», «application/pdf»."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["purpose","filename","contentType"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/import_statement_preview":{"post":{"operationId":"import_statement_preview","summary":"Anteprima importazione estratto conto","description":"Legge un estratto conto (CSV, TSV, CBI, Excel o PDF) con la stessa procedura dell'app e restituisce l'anteprima: righe (le prime 500), avvisi, colonne riconosciute, quadratura dei saldi e, se passi bankAccountId, i movimenti già presenti (duplicates, saltati) e le righe che entreranno segnalate come possibile duplicato (possibleDuplicates: rowIndex e relatedMovementId, o relatedRowIndex se il gemello è un'altra riga del file). Non crea movimenti. Passa fileId (da create_upload_link o PUT /api/agent/v1/files) oppure contentBase64 + filename per file ≤ 256 KB. Il PDF usa l'AI (serve il permesso use:ai); se le colonne non vengono riconosciute passa roleOverride. Restituisce previewId da usare con import_statement_confirm. Per PDF lunghi, se va in timeout ripeti con la stessa idempotencyKey.\n\n[scrittura]","tags":["import"],"security":[{"bearerAuth":[]}],"x-scope":["write:import"],"x-permission":"documents.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"description":"Il file caricato (purpose «import»).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentBase64":{"description":"Il file in base64, al massimo 256 KB.","type":"string","maxLength":400000},"filename":{"description":"Obbligatorio con contentBase64.","type":"string","minLength":1,"maxLength":255},"contentType":{"description":"Con contentBase64; se manca si ricava dall'estensione.","type":"string","maxLength":120},"bankAccountId":{"description":"Conto di destinazione: se c'è, l'anteprima segnala i movimenti già importati.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankHint":{"description":"Nome della banca (aiuta la lettura dei PDF).","type":"string","maxLength":100},"roleOverride":{"type":"object","properties":{"columns":{"type":"object","properties":{"date":{"type":"integer","minimum":0,"maximum":10000},"valueDate":{"type":"integer","minimum":0,"maximum":10000},"description":{"type":"integer","minimum":0,"maximum":10000},"extraDescription":{"maxItems":50,"type":"array","items":{"type":"integer","minimum":0,"maximum":10000}},"amount":{"type":"integer","minimum":0,"maximum":10000},"debit":{"type":"integer","minimum":0,"maximum":10000},"credit":{"type":"integer","minimum":0,"maximum":10000},"direction":{"type":"integer","minimum":0,"maximum":10000},"balance":{"type":"integer","minimum":0,"maximum":10000},"currency":{"type":"integer","minimum":0,"maximum":10000},"counterparty":{"type":"integer","minimum":0,"maximum":10000},"reference":{"type":"integer","minimum":0,"maximum":10000}},"additionalProperties":false,"description":"Indice (da 0) della colonna di ogni ruolo; un ruolo omesso = nessuna colonna."},"headerRow":{"type":"integer","minimum":-1,"maximum":1000000},"dateOrder":{"type":"string","enum":["DMY","MDY","YMD"]},"decimal":{"type":"string","enum":[",","."]},"signConvention":{"type":"string","enum":["standard","inverted"]},"sheet":{"type":"string","maxLength":255}},"required":["columns"],"additionalProperties":false,"description":"Mappatura manuale delle colonne (come «Scegli le colonne» nell'app). Usala se l'anteprima non ha riconosciuto le colonne."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/import_statement_confirm":{"post":{"operationId":"import_statement_confirm","summary":"Confermare l'importazione","description":"Importa i movimenti di un'anteprima sul conto indicato. Le righe e gli importi vengono SOLO dall'anteprima salvata: puoi scegliere il conto e le righe da escludere (excludeRowIndexes, gli index dell'anteprima), niente altro. Richiede la conferma della persona: la prima chiamata restituisce requiresConfirmation con il riepilogo. I movimenti già presenti sul conto vengono saltati. Restituisce importBatchId e i conteggi.\n\n[scrittura; richiede conferma (always)]","tags":["import"],"security":[{"bearerAuth":[]}],"x-scope":["write:import"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"previewId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il previewId di import_statement_preview."},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il conto (list_bank_accounts) su cui importare."},"excludeRowIndexes":{"description":"Index delle righe dell'anteprima da NON importare.","maxItems":20000,"type":"array","items":{"type":"integer","minimum":0,"maximum":20000}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["previewId","bankAccountId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/undo_import":{"post":{"operationId":"undo_import","summary":"Annullare un'importazione","description":"Annulla un'importazione fatta da QUESTO accesso nelle ultime 24 ore, eliminando i movimenti creati. Rifiutato (undo_not_allowed) se l'import è di altri, è più vecchio di 24 ore, o se un suo movimento è già stato classificato, ripartito o collegato a un documento. Richiede la conferma della persona.\n\n[scrittura; richiede conferma (always)]","tags":["import"],"security":[{"bearerAuth":[]}],"x-scope":["write:import"],"x-permission":"movements.write","x-write":true,"x-risk":"confirm","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"batchId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"L'importBatchId restituito da import_statement_confirm."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["batchId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_document_download_link":{"post":{"operationId":"get_document_download_link","summary":"Link di download del documento","description":"Restituisce un link firmato per scaricare un documento dell'archivio (valido 15 minuti, sempre come allegato). Non restituisce il contenuto: scarica il file dal link solo se serve.\n\n[sola lettura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"documents.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del documento (list_documents)."}},"required":["documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/upload_document":{"post":{"operationId":"upload_document","summary":"Caricare un documento","description":"Archivia come documento un file già caricato (create_upload_link con purpose «document», o PUT /api/agent/v1/files). Stessi controlli dell'app (tipo, contenuto reale). Restituisce documentId; poi link_document lo collega a un movimento. Il file caricato si usa una volta sola.\n\n[scrittura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["write:documents"],"x-permission":"documents.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il fileId del caricamento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["fileId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/link_document":{"post":{"operationId":"link_document","summary":"Collegare un documento","description":"Collega un documento dell'archivio a un movimento (giustificativo). Se il movimento era classificato e aspettava il documento diventa «completo», come nell'app. Se importo o data letti dal documento sono molto diversi da quelli del movimento, la risposta contiene `warnings` (il collegamento avviene comunque: si toglie con unlink_document).\n\n[scrittura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["write:documents"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento."},"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento da collegare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/unlink_document":{"post":{"operationId":"unlink_document","summary":"Scollegare un documento","description":"Toglie il collegamento tra un documento e un movimento. Il documento resta in archivio (gli agenti non cancellano documenti).\n\n[scrittura]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["write:documents"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"movementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il movimento."},"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento da scollegare."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["movementId","documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/extract_document_data":{"post":{"operationId":"extract_document_data","summary":"Leggere i dati di un documento","description":"Legge data, importo, fornitore e numero da un documento dell'archivio (PDF o immagine con l'AI; fattura elettronica XML/P7M senza AI) e li salva sul documento. Consuma il limite AI mensile per PDF e immagini. Importi in euro come stringhe.\n\n[scrittura; usa l'AI del piano]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["write:documents"],"x-permission":"documents.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"documentId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il documento."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["documentId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/scan_receipt":{"post":{"operationId":"scan_receipt","summary":"Leggere uno scontrino","description":"Legge importo, data ed esercente dalla foto di uno scontrino già caricata (purpose «document», JPEG/PNG/WebP ≤ 10 MB). Usa l'AI dell'abbonamento. Non crea movimenti né documenti.\n\n[scrittura; usa l'AI del piano]","tags":["documents"],"security":[{"bearerAuth":[]}],"x-scope":["write:documents"],"x-permission":"movements.write","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fileId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il fileId della foto caricata."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["fileId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_analisi":{"post":{"operationId":"export_analisi","summary":"Esportare l'analisi","description":"Analisi dell'esercizio (centri di costo, andamento mensile, contributi) in PDF (solo tabelle) o Excel, con gli stessi numeri della pagina Analisi. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.export","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"format":{"description":"Default pdf.","type":"string","enum":["pdf","xlsx"]},"compare":{"description":"Confronto con l'esercizio precedente (default sì).","type":"boolean"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_modello_d":{"post":{"operationId":"export_modello_d","summary":"Esportare il Modello D","description":"Rendiconto per cassa (Modello D) in PDF, come lo scarica l'app. Solo per esercizi per cassa. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"description":"Esercizio (default quello in corso).","type":"integer","minimum":2000,"maximum":2100},"projectId":{"description":"Solo i movimenti di un contributo.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_modello_a_b_c":{"post":{"operationId":"export_modello_a_b_c","summary":"Esportare i Modelli A, B e C","description":"Bilancio per competenza in PDF: Stato Patrimoniale (a), Rendiconto Gestionale (b) o Relazione di missione (c). Solo per esercizi per competenza. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","enum":["a","b","c"],"description":"a = Stato Patrimoniale, b = Rendiconto Gestionale, c = Relazione di missione."},"year":{"type":"integer","minimum":2000,"maximum":2100},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["model","year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_report_workbook":{"post":{"operationId":"export_report_workbook","summary":"Esportare la cartella dei report","description":"Cartella Excel dei report dell'esercizio (movimenti, categorie, conti, contributi), come «Esporta» nella pagina Report. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.export","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_movements":{"post":{"operationId":"export_movements","summary":"Esportare i movimenti","description":"Movimenti filtrati in CSV o Excel (stessi filtri dell'elenco movimenti). Il CSV usa il punto e virgola come separatore e il punto come decimale (-49.99), UTF-8 con BOM. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"movements.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"description":"Default csv.","type":"string","enum":["csv","xlsx"]},"status":{"type":"string","enum":["complete","missing_document","needs_review","ambiguous","to_review"]},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"search":{"type":"string","maxLength":200},"categoryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"bankAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"unclassified":{"type":"boolean"},"amountSign":{"type":"string","enum":["positive","negative"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_contributo_bundle":{"post":{"operationId":"export_contributo_bundle","summary":"Esportare il pacchetto di rendicontazione","description":"ZIP dei documenti di spesa di un contributo: i giustificativi collegati alle spese imputate nel periodo, una cartella per movimento, con _INDICE.csv (elenco delle spese e dei file) e _PROVE_MANCANTI.txt (spese senza giustificativo). È il download «Solo documenti (ZIP)» della sezione Consegna dell'app. NON contiene frontespizio, elenco analitico (PDF/Excel) né prospetto: il pacchetto completo («Esporta» nella Consegna del contributo) si scarica dall'app. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"documents.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il contributo (list_contributi)."},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_cost_center_report":{"post":{"operationId":"export_cost_center_report","summary":"Esportare il report dei centri di costo","description":"Report spese di un centro di costo (movimenti imputati e quote) in Excel o PDF. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"costCenterId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il centro di costo (list_cost_centers)."},"format":{"description":"Default xlsx.","type":"string","enum":["xlsx","pdf"]},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["costCenterId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_scadenzario":{"post":{"operationId":"export_scadenzario","summary":"Esportare lo scadenzario","description":"Scadenzario fiscale dell'ente in PDF o Excel. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"scadenze.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"description":"Default pdf.","type":"string","enum":["pdf","xlsx"]},"status":{"type":"string","enum":["pending","snoozed","completed","skipped"]},"from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_libro_giornale":{"post":{"operationId":"export_libro_giornale","summary":"Esportare il libro giornale","description":"Libro giornale dell'esercizio per competenza in CSV nel formato italiano da libro contabile: punto e virgola come separatore, virgola come decimale (1123,57), UTF-8 con BOM. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_rimborso_declaration":{"post":{"operationId":"export_rimborso_declaration","summary":"Esportare l'autodichiarazione di rimborso","description":"Autodichiarazione di un rimborso spese autocertificato, in PDF da far firmare al volontario. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reimbursementId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Il rimborso (list_rimborsi)."},"locale":{"description":"Lingua del documento (default italiano).","type":"string","enum":["it","de"]}},"required":["reimbursementId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_cinque_per_mille":{"post":{"operationId":"list_cinque_per_mille","summary":"Rendiconti 5×1000","description":"I rendiconti del 5×1000 dell'ente, uno per anno finanziario: importo e data dell'accredito, stato mostrato dalla pagina (bozza finché i passi di legge richiesti non sono tutti fatti) e i passi con la loro scadenza (redatto entro 12 mesi dall'accredito; da 20.000 euro anche invio al Ministero, pubblicazione e link), il prossimo passo da fare e la sanzione a rischio. Importi in euro come stringhe.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_cinque_per_mille":{"post":{"operationId":"get_cinque_per_mille","summary":"Dettaglio rendiconto 5×1000","description":"Il rendiconto 5×1000 come lo stampa il PDF: spese imputate per sezione ministeriale nella finestra di 12 mesi dall'accredito, totale speso, differenza con l'importo ricevuto (negativa se speso più del ricevuto), stato e passi di legge. filingId da list_cinque_per_mille.\n\n[sola lettura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"reports.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."}},"required":["filingId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/export_cinque_per_mille":{"post":{"operationId":"export_cinque_per_mille","summary":"Esportare il rendiconto 5×1000","description":"Il PDF del rendiconto 5×1000 da firmare, lo stesso del pulsante «PDF» della pagina, con il logo dell'ente. Restituisce un link firmato valido 15 minuti (url), non il contenuto.\n\n[sola lettura]","tags":["exports"],"security":[{"bearerAuth":[]}],"x-scope":["export"],"x-permission":"reports.export","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."}},"required":["filingId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_cinque_per_mille":{"post":{"operationId":"create_cinque_per_mille","summary":"Creare un rendiconto 5×1000","description":"Crea il rendiconto 5×1000 di un anno finanziario (uno per anno), come «Nuovo rendiconto» nella pagina: anno finanziario, anno e data dell'accredito, importo ricevuto. Nasce in bozza e fa comparire la sua scadenza nello scadenzario. importoErogato è una stringa in euro.\n\n[scrittura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["write:reports"],"x-permission":"reports.export","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"annoFinanziario":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno finanziario a cui si riferisce il contributo."},"annoErogazione":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno in cui è arrivato l'accredito."},"importoErogato":{"type":"string","pattern":"^\\d{1,9}(\\.\\d{1,2})?$","description":"Importo ricevuto in euro, es. \"12345.67\"."},"dataErogazione":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data dell'accredito, AAAA-MM-GG."},"notes":{"description":"Note.","type":"string","maxLength":2000},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["annoFinanziario","annoErogazione","importoErogato","dataErogazione"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_cinque_per_mille":{"post":{"operationId":"update_cinque_per_mille","summary":"Aggiornare un rendiconto 5×1000","description":"Registra i passi di legge del rendiconto 5×1000, come la lista «Adempimenti» della pagina: data di redazione (rendicontoRedattoIl), di invio al Ministero (inviatoMinisteroIl), di pubblicazione con l'indirizzo della pagina (pubblicatoIl + urlPubblicazione) e di comunicazione del link (linkComunicatoIl). null annulla un passo (solo l'ultimo fatto). I passi vanno in ordine, non nel futuro né prima dell'accredito; lo stato segue i passi. notes solo in bozza. Un rendiconto archiviato non si modifica.\n\n[scrittura]","tags":["reports"],"security":[{"bearerAuth":[]}],"x-scope":["write:reports"],"x-permission":"reports.export","x-write":true,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filingId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rendiconto (da list_cinque_per_mille)."},"rendicontoRedattoIl":{"description":"Rendiconto redatto il, AAAA-MM-GG; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"inviatoMinisteroIl":{"description":"Inviato al Ministero il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"pubblicatoIl":{"description":"Pubblicato sul sito il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"urlPubblicazione":{"description":"Indirizzo della pagina pubblicata.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"linkComunicatoIl":{"description":"Link comunicato al Ministero il; null annulla.","anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}]},"notes":{"description":"Note (solo in bozza).","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["filingId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_ritenute_report":{"post":{"operationId":"get_ritenute_report","summary":"Riepilogo ritenute e F24","description":"Le ritenute d'acconto di un anno raggruppate per mese di pagamento e codice tributo, con la data del versamento F24 (16 del mese dopo, spostata al primo giorno lavorativo; ritenute di luglio entro il 20 agosto), l'importo da versare e lo stato (scaduto, in_scadenza entro 15 giorni, futuro); prossimo = il primo F24 non ancora scaduto. Il versamento fatto si segna sulla scadenza (list_scadenze, complete_scadenza). Il modello F24 e la CU si preparano nell'app. includeRitenute aggiunge le singole ritenute (nome del percipiente, senza codice fiscale).\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"ritenute.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Anno solare dei pagamenti."},"month":{"description":"Solo questo mese (1-12).","type":"integer","minimum":1,"maximum":12},"percipientId":{"description":"Solo un percipiente (da list_percipienti).","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"includeRitenute":{"description":"Aggiungi l'elenco delle ritenute (predefinito no).","type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_percipienti":{"post":{"operationId":"list_percipienti","summary":"Percipienti","description":"I percipienti attivi (chi riceve compensi con ritenuta): nome, tipo di rapporto, causale, aliquota predefinita, partita IVA. Con year anche numero di pagamenti, lordo e ritenute dell'anno (i dati della CU). Il codice fiscale, la nascita e l'indirizzo non sono restituiti: hasCodiceFiscale, anagraficaCuCompleta e campiCuMancanti dicono se ci sono.\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"percipients.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"description":"Anno dei totali (lordo, ritenute, pagamenti).","type":"integer","minimum":2000,"maximum":2100},"limit":{"type":"integer","minimum":1,"maximum":500},"cursor":{"type":"string","minLength":1,"maxLength":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_percipiente":{"post":{"operationId":"get_percipiente","summary":"Dettaglio percipiente","description":"Un percipiente (da list_percipienti) con, se indichi year, numero di pagamenti, lordo e ritenute dell'anno. Codice fiscale, nascita e indirizzo non sono restituiti: campiCuMancanti dice cosa manca per la CU.\n\n[sola lettura]","tags":["rimborsi"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"percipients.read","x-write":false,"x-risk":"normal","x-regime":"any","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"percipientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del percipiente."},"year":{"description":"Anno dei totali.","type":"integer","minimum":2000,"maximum":2100}},"required":["percipientId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_assestamenti":{"post":{"operationId":"list_assestamenti","summary":"Ratei, risconti e fondi","description":"Gli assestamenti di fine anno di un esercizio per competenza, come la pagina Assestamenti: ratei e risconti (accruals: tipo, conto patrimoniale e conto economico, periodo di competenza, importo totale, se già registrati) e fondi (provisions: rischi, oneri, TFR, svalutazione, con saldo iniziale). Importi in euro come stringhe.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/list_cespiti":{"post":{"operationId":"list_cespiti","summary":"Cespiti","description":"Il registro dei cespiti, come la pagina Cespiti: per ogni bene costo, data di acquisto, vita utile o aliquota, conti collegati, stato (attivo, dismesso, completamente ammortizzato), fondo ammortamento registrato, valore netto e piano di ammortamento (quote registrate e da registrare). Importi in euro come stringhe.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/get_saldi_apertura":{"post":{"operationId":"get_saldi_apertura","summary":"Saldi di apertura","description":"La griglia dei saldi di apertura di un esercizio per competenza: i conti patrimoniali movimentabili con il saldo già salvato (dare o avere), i totali, se quadrano, se l'apertura è già registrata (alreadySeeded) e se si può ancora scrivere (canEdit: esercizio aperto e apertura non registrata). Da leggere prima di set_saldi_apertura.\n\n[sola lettura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["read"],"x-permission":"bilancio.read","x-write":false,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."}},"required":["year"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_journal_entry":{"post":{"operationId":"create_journal_entry","summary":"Creare una scrittura in prima nota","description":"Crea una scrittura in bozza nella prima nota per competenza, come «Nuova scrittura»: data, causale e righe dare/avere su conti movimentabili (da list_accounts; non i mastri di controllo crediti/debiti). L'agente scrive solo scritture QUADRATE (Σdare = Σavere, almeno 2 righe). La bozza non è registrata: la approva una persona nell'app (submit:true la mette subito in coda di approvazione). La data deve stare nell'esercizio year; un esercizio chiuso non si tocca.\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"prima_nota.write","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura."},"entryDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di competenza, AAAA-MM-GG, dentro l'esercizio."},"description":{"type":"string","minLength":1,"maxLength":500,"description":"Causale."},"lines":{"minItems":2,"maxItems":200,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto (da list_accounts)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Importo positivo in euro."},"lineDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"analyticalCategoryId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false},"description":"Righe dare/avere, quadrate."},"documentId":{"description":"Documento collegato (da list_documents).","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"submit":{"description":"true = invia subito in approvazione.","type":"boolean"},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryDate","description","lines"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/update_journal_entry":{"post":{"operationId":"update_journal_entry","summary":"Modificare una scrittura in bozza","description":"Modifica una scrittura ancora in BOZZA (una registrata si corregge con uno storno, nell'app): data, causale e/o righe. lines sostituisce tutte le righe e deve essere quadrata. La data resta nell'esercizio year.\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"prima_nota.write","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"entryDate":{"description":"Nuova data, dentro lo stesso esercizio.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"description":{"description":"Nuova causale.","type":"string","minLength":1,"maxLength":500},"lines":{"description":"Tutte le righe, quadrate.","minItems":2,"maxItems":200,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto (da list_accounts)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Importo positivo in euro."},"lineDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"contactId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"analyticalCategoryId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"projectId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"costCenterId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false}},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/submit_journal_entry":{"post":{"operationId":"submit_journal_entry","summary":"Inviare una scrittura in approvazione","description":"Mette una bozza quadrata in coda di approvazione, come «Invia per approvazione». La registra una persona con il permesso di approvare: l'agente non registra mai.\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"prima_nota.write","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/withdraw_journal_entry":{"post":{"operationId":"withdraw_journal_entry","summary":"Ritirare una scrittura dall'approvazione","description":"Riporta in bozza modificabile una scrittura in coda di approvazione, come «Ritira».\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"prima_nota.write","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","entryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/delete_journal_entry":{"post":{"operationId":"delete_journal_entry","summary":"Eliminare una scrittura in bozza","description":"Elimina una scrittura ancora in BOZZA (mai una registrata: quella si storna nell'app). Chiede sempre conferma.\n\n[scrittura; richiede conferma (always)]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"prima_nota.write","x-write":true,"x-risk":"confirm","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio della scrittura (da list_journal_entries)."},"entryId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id della scrittura in bozza."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","entryId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_assestamento":{"post":{"operationId":"create_assestamento","summary":"Registrare un rateo, risconto o fondo","description":"Aggiunge un assestamento di fine anno, come la pagina Assestamenti. type «accrual» = rateo o risconto: kind (rateo_attivo, rateo_passivo, risconto_attivo, risconto_passivo), balanceSheetAccountId e counterAccountId diversi, competenceStart/competenceEnd che toccano l'esercizio, totalAmount (l'intero importo). type «provision» = fondo: name, kind (fondo_rischi, fondo_oneri, tfr, fondo_svalutazione), provisionAccountId, expenseAccountId e openingBalance facoltativi. Le scritture le genera la chiusura dell'esercizio, non questo strumento. Un esercizio chiuso non si tocca.\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio."},"type":{"type":"string","enum":["accrual","provision"]},"kind":{"type":"string","enum":["rateo_attivo","rateo_passivo","risconto_attivo","risconto_passivo","fondo_rischi","fondo_oneri","tfr","fondo_svalutazione"]},"balanceSheetAccountId":{"description":"accrual: conto patrimoniale.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"counterAccountId":{"description":"accrual: conto economico.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"competenceStart":{"description":"accrual: inizio competenza.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"competenceEnd":{"description":"accrual: fine competenza.","type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"totalAmount":{"description":"accrual: importo totale in euro.","type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},"name":{"description":"provision: nome del fondo.","type":"string","minLength":1,"maxLength":200},"provisionAccountId":{"description":"provision: conto del fondo.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"expenseAccountId":{"description":"provision: conto di accantonamento.","anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"openingBalance":{"description":"provision: saldo iniziale in euro.","anyOf":[{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["year","type","kind"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/delete_assestamento":{"post":{"operationId":"delete_assestamento","summary":"Eliminare un rateo, risconto o fondo","description":"Elimina un rateo/risconto (type accrual) o un fondo (type provision) NON ancora registrato in contabilità (uno registrato si storna nell'app). itemId e year da list_assestamenti. Chiede sempre conferma.\n\n[scrittura; richiede conferma (always)]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"confirm","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio dell'assestamento."},"type":{"type":"string","enum":["accrual","provision"]},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del rateo/risconto o del fondo."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","type","itemId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/create_cespite":{"post":{"operationId":"create_cespite","summary":"Registrare un cespite","description":"Registra un'immobilizzazione e il suo piano di ammortamento, come «Nuovo cespite»: nome, conto del cespite, data e costo di acquisto, vita utile in mesi OPPURE aliquota annua, valore residuo; per ammortizzarlo servono il conto della quota (depreciationExpenseAccountId) e il fondo ammortamento (accumulatedDepreciationAccountId). Le quote si registrano alla chiusura dell'esercizio. L'esercizio dell'acquisto deve essere aperto; fa eccezione un anno chiuso solo per cassa (prima del passaggio alla competenza): il bene si registra, l'ammortamento parte dal primo esercizio aperto e il fondo maturato prima va nei saldi di apertura (preCompetenzaYears nella risposta).\n\n[scrittura]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"normal","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"assetAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto dell'immobilizzazione."},"depreciationExpenseAccountId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"accumulatedDepreciationAccountId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"acquisitionDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di acquisto, AAAA-MM-GG."},"acquisitionCost":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Costo in euro."},"usefulLifeMonths":{"description":"Vita utile in mesi.","anyOf":[{"type":"integer","minimum":1,"maximum":1200},{"type":"null"}]},"depreciationRate":{"description":"Aliquota annua %, es. \"20\".","anyOf":[{"type":"string","pattern":"^\\d+(\\.\\d{1,2})?$"},{"type":"null"}]},"residualValue":{"description":"Valore residuo in euro.","anyOf":[{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$"},{"type":"null"}]},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"}},"required":["name","assetAccountId","acquisitionDate","acquisitionCost"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/dispose_cespite":{"post":{"operationId":"dispose_cespite","summary":"Dismettere un cespite","description":"Dismette un cespite alla data indicata, come «Dismetti»: il piano di ammortamento viene tagliato ai mesi di possesso, le quote già registrate restano. Lo storno contabile del costo e del fondo resta da fare in prima nota. Chiede sempre conferma.\n\n[scrittura; richiede conferma (always)]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"confirm","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del cespite (da list_cespiti)."},"disposedAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Data di dismissione, AAAA-MM-GG."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["assetId","disposedAt"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/delete_cespite":{"post":{"operationId":"delete_cespite","summary":"Eliminare un cespite","description":"Elimina un cespite registrato per errore che non ha quote di ammortamento registrate (uno con quote registrate si dismette). Chiede sempre conferma.\n\n[scrittura; richiede conferma (always)]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"confirm","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"assetId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Id del cespite (da list_cespiti)."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["assetId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}},"/api/agent/v1/tools/set_saldi_apertura":{"post":{"operationId":"set_saldi_apertura","summary":"Registrare i saldi di apertura","description":"Registra i saldi di apertura di un esercizio per competenza e la scrittura di apertura, come «Conferma» nella pagina Saldi di apertura: un saldo per conto patrimoniale (attività in dare, passività e patrimonio netto in avere), Attivo = Passivo al centesimo. Si fa una volta sola, su un esercizio aperto senza apertura (get_saldi_apertura: canEdit). La scrittura è registrata subito: chiede sempre conferma.\n\n[scrittura; richiede conferma (always)]","tags":["contabilita"],"security":[{"bearerAuth":[]}],"x-scope":["write:competenza"],"x-permission":"bilancio.setup","x-write":true,"x-risk":"confirm","x-regime":"competenza","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"year":{"type":"integer","minimum":2000,"maximum":2100,"description":"Esercizio da aprire."},"lines":{"minItems":2,"maxItems":500,"type":"array","items":{"type":"object","properties":{"ledgerAccountId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Conto patrimoniale (da get_saldi_apertura)."},"side":{"type":"string","enum":["dare","avere"]},"amount":{"type":"string","pattern":"^\\d{1,12}(\\.\\d{1,2})?$","description":"Saldo positivo in euro."}},"required":["ledgerAccountId","side","amount"],"additionalProperties":false},"description":"Un saldo per conto, quadrati."},"idempotencyKey":{"description":"Chiave scelta da te, unica per questa operazione: ripetere la chiamata con la stessa chiave non la ripete.","type":"string","minLength":1,"maxLength":100,"pattern":"^[\\x21-\\x7e]+$"},"confirmationId":{"description":"Il confirmationId ricevuto nella risposta requiresConfirmation, dopo la conferma della persona.","type":"string","minLength":1,"maxLength":200}},"required":["year","lines"],"additionalProperties":false}}}},"responses":{"200":{"description":"Risultato dello strumento.","content":{"application/json":{"schema":{"anyOf":[{"type":"object","description":"Oggetto JSON del risultato. Gli importi sono stringhe con 2 decimali, salvo dove lo strumento dice centesimi.","additionalProperties":true},{"type":"object","required":["requiresConfirmation","confirmationId","summary","expiresAt"],"properties":{"requiresConfirmation":{"const":true},"summary":{"type":"string","description":"Cosa cambierà, in italiano, da mostrare alla persona."},"effects":{"type":"object","additionalProperties":{"type":"number"}},"confirmationId":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"additionalProperties":true}]}}}},"400":{"description":"Argomenti o corpo non validi (invalid_args, parse_error, token_in_url, confirmation_invalid).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"401":{"description":"Token mancante, non valido, scaduto o revocato.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"403":{"description":"Permesso negato (scope, ruolo, piano, regime, IP, host).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"404":{"description":"Strumento sconosciuto, o risorsa non trovata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"409":{"description":"Conflitto (idempotencyKey riusata con altri argomenti, conferma scaduta o non corrispondente).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"413":{"description":"Richiesta troppo grande (massimo 1 MB).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"429":{"description":"Troppe richieste: rispetta l'intestazione Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}},"503":{"description":"Funzione non disponibile (interruttore spento, archivio file assente, timeout).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolError"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"rmcp_…"}},"schemas":{"ToolError":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string","description":"Messaggio in italiano."},"code":{"type":"string","description":"Codice stabile (es. invalid_args, scope_not_granted, http_404)."},"details":{"type":"object","additionalProperties":true},"callId":{"type":"string","format":"uuid"}},"additionalProperties":false},"WhoAmI":{"type":"object","required":["workspace","token","plan","usage","limits","registryVersion"],"properties":{"workspace":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"entityType":{"type":["string","null"]},"accountingPeriodStart":{"type":"string"},"accountingPeriodEnd":{"type":"string"}},"additionalProperties":true},"currentYear":{"type":"integer"},"years":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer"},"regime":{"enum":["cassa","competenza"]},"locked":{"type":"boolean"}},"additionalProperties":true}},"plan":{"type":"object","additionalProperties":true},"token":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"role":{"type":["string","null"]},"writesAllowed":{"type":"boolean"},"expiresAt":{"type":["string","null"],"format":"date-time"}},"additionalProperties":true},"usage":{"type":"object","description":"Ultime 24 ore.","properties":{"token":{"$ref":"#/components/schemas/UsageCounts"},"workspace":{"$ref":"#/components/schemas/UsageCounts"}}},"limits":{"type":"object","additionalProperties":true},"registryVersion":{"type":"string"}},"additionalProperties":true},"UsageCounts":{"type":"object","properties":{"calls":{"type":"integer"},"writes":{"type":"integer"},"exports":{"type":"integer"}}}}}}