Documentazione autenticazione SingleFax
Chiavi API, OAuth per MCP e Agent Auth delegato.
Guida all’autenticazione per agenti AI e sviluppatori.
Come gli agenti si autenticano su SingleFax. Installazione HTML: https://singlefax.com/agents
Questo file è la destinazione agent_auth.skill indicata nei metadati RFC 8414 su /.well-known/oauth-authorization-server.
SingleFax supporta registrazione Auth.md anonymous e service_auth, con approvazione utente e attestazioni d’identità firmate dal servizio. Le credenziali anonime non accedono ad account prima dell’approvazione. Gli ID-JAG di fornitori esterni non sono accettati. Il precedente flusso JWT host/agente Better Auth è nel Percorso C.
Registrazione Auth.md e scambio token
Destinatari: agenti AI che si registrano per un account SingleFax esistente. Ogni metodo richiede un’autorizzazione di registrazione emessa dal titolare. Richieste pubbliche senza token valido sono respinte prima di creare la registrazione. Issuer OAuth: https://api.singlefax.com/api/auth; risorsa: https://singlefax.com/mcp. Registrarsi non invia email o fax e non addebita pagamenti.
Metodi: anonymous e service_auth. Credenziali: identity_assertion e Bearer access_token. Il titolare accede, verifica i permessi e inserisce il codice a sei cifre dell’agente. Scope supportati: fax:read, fax:draft, fax:send, inbox:read, credits:read, credits:checkout. Predefiniti: fax:read e credits:read; richiedi esplicitamente gli altri.
- Il titolare accede a https://singlefax.com/dashboard/agent-access, sceglie nome e permessi e crea esplicitamente un token di registrazione. Il segreto è mostrato una volta, scade in dieci minuti e registra un solo agente. Consegnalo a quell’agente. Il provisioning API usa la sessione browser proprietaria su
POST https://singlefax.com/api/auth/agent/identity/managecon{ "action": "enroll", "name": "My agent", "scopes": ["fax:read", "credits:read"] }. I cookie non vengono mai condivisi con l’agente. I token inutilizzati sono revocabili dalla stessa pagina. - Registrati con
POST https://api.singlefax.com/api/auth/agent/identity,Content-Type: application/jsone{ "type": "service_auth", "enrollment_token": "<owner-issued token>", "login_hint": "<enrolling owner email>" }. Riceviregistration_id, il segretoclaim_token, scadenza eclaimconuser_code,verification_urie intervallo di polling di cinque secondi. Nessuna attestazione prima dell’approvazione. - In alternativa usa
{ "type": "anonymous", "enrollment_token": "<owner-issued token>" }. Anonimo descrive la credenziale prima dell’associazione, non una registrazione pubblica aperta. Ricevi subitoidentity_assertionfirmato eclaim_token. Scambiando l’attestazione preliminare ottieni un token senza scope, incapace di accedere ad account. Avvia l’approvazione conPOST https://api.singlefax.com/api/auth/agent/identity/claime{ "claim_token": "<secret>", "email": "<account email>" }; leggiclaim_attemptrestituito. - Mostra il codice separatamente e apri
verification_uriper l’utente. L’URL contiene un token segreto di associazione: non aggiungere il codice all’URL. Solo l’account verificato che ha avviato la registrazione può approvare. Nome fissato dal titolare; scope riducibili, mai oltre i permessi iniziali. Email suggerita e di associazione devono coincidere con il titolare. L’utente può rifiutare. Scadenza dieci minuti; un nuovo tentativo invalida il vecchio link. Nessun account creato automaticamente. - Interroga
POST https://api.singlefax.com/api/auth/oauth2/tokenconContent-Type: application/x-www-form-urlencodedegrant_type=urn:workos:agent-auth:grant-type:claim&claim_token=<secret>&resource=https%3A%2F%2Fsinglefax.com%2Fmcp. Gestisciauthorization_pending,slow_down(aumenta l’intervallo di cinque secondi),expired_token,access_denied. L’approvazione restituisceaccess_tokenopaco,token_type,expires_in,scope,identity_assertion,assertion_expires. Token e attestazioni preliminari vengono invalidati. - Usa
Authorization: Bearer <access_token>su MCP o A2A con gli scope concessi. I token durano al massimo un’ora. Per rinnovare usa lo stesso endpoint congrant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<identity_assertion>&resource=https%3A%2F%2Fsinglefax.com%2Fmcp; non viene emesso refresh token. Le attestazioni sono riscambiabili fino a 30 giorni salvo revoca. Le firme EdDSA usano/jwksdell’issuer;typèoauth-id-jag+jwt, eiss/audcoincidono con l’issuer. - Revoca un token con
POST https://api.singlefax.com/api/auth/oauth2/revoke, corpo formtoken=<access_token>&token_type_hint=access_token. È idempotente e lascia utilizzabile l’attestazione. Revoca la registrazione conPOST https://api.singlefax.com/api/auth/agent/identity/revoke, JSON{ "identity_assertion": "<identity_assertion>" }: cessano tutti i token e scambi successivi.
Il titolare può verificare e revocare i permessi su https://singlefax.com/dashboard/agent-access. Revocare la registrazione blocca tutti i token collegati e rinnovi delle attestazioni.
Le risposte di associazione e approvazione sono private e mai memorizzabili in cache. Proteggi token, attestazioni e access token. L’emissione è limitata per titolare tra tutte le repliche API, con massimo cinque token attivi inutilizzati. Le richieste pubbliche senza autorizzazione non consumano la quota del titolare. Token mancanti restituiscono enrollment_required; scaduti, revocati o consumati invalid_enrollment. Una registrazione fallita non consuma il token. Non sondare endpoint di registrazione nelle scansioni passive.
Discovery
Server risorse (MCP + API BFF): https://singlefax.com
GET https://singlefax.com/.well-known/oauth-protected-resource
GET https://singlefax.com/.well-known/oauth-protected-resource/mcp
Metadati risorsa protetta (RFC 9728): il documento radice descrive l’origine (resource https://singlefax.com); /.well-known/oauth-protected-resource/mcp descrive MCP (resource https://singlefax.com/mcp, destinazione dell’URL WWW-Authenticate). Entrambi elencano authorization_servers (issuer https://api.singlefax.com/api/auth) e scopes_supported. Richiedi token per https://singlefax.com/mcp.
GET https://singlefax.com/.well-known/oauth-authorization-server
GET https://singlefax.com/.well-known/oauth-authorization-server/api/auth
I metadati del server autorizzativo includono issuer, authorization_endpoint, token_endpoint, registration_endpoint, jwks_uri, scopes_supported, agent_auth (skill rimanda qui).
L’origine API https://api.singlefax.com espone gli stessi documenti well-known.
Percorso A. MCP OAuth (chat)
Usalo per Cursor, Claude, ChatGPT, Codex e VS Code.
- Aggiungi MCP
https://singlefax.com/mcp(Streamable HTTP). - Su 401 leggi
WWW-Authenticatee recupera PRM sopra. - Registrazione client dinamica:
POST {issuer}/oauth2/register(PKCE S256,token_endpoint_auth_method=noneper client pubblici). - Codice autorizzativo + PKCE su
{issuer}/oauth2/authorize. - Token su
{issuer}/oauth2/token. POST /mcpconAuthorization: Bearer. Per documenti normali chiamacreate_upload, dai all’utenteuploadPageUrl, poicreate_fax_draftcontoeuploadToken.base64solo per file minimi. PUT auploadUrlusa il token HMAC nel percorso, senza header OAuth. Invia Word, Excel, PDF o immagine originali, senza conversione preventiva.
Scope: openid, profile, email, offline_access, fax:read, fax:draft, fax:send, inbox:read, credits:read, credits:checkout. Richiedi credits:checkout per acquisti crediti AP2; ogni addebito richiede comunque approvazione passkey separata.
Senza autenticazione POST /mcp accetta solo server/discover. initialize, tools/list, tools/call richiedono OAuth.
Percorso A2. A2A (agente-agente)
Scheda agente: GET https://singlefax.com/.well-known/agent-card.json (A2A 1.0). Endpoint: POST https://singlefax.com/a2a (JSON-RPC: SendMessage, GetTask, CancelTask; funzionano anche i nomi 0.3 message/send, tasks/get, tasks/cancel).
- Usa server OAuth, scope e token del Percorso A (risorsa
https://singlefax.com/mcp). InviaAuthorization: Bearer. Token vincolati DPoP non accettati su/a2a. - Invia una sola parte dati:
{ "skill": "<skill id from the card>", "arguments": { ... } }. Il testo libero non viene interpretato. - Le funzioni fax e numeri restituiscono link Stripe Checkout (
checkoutUrl). A2A non spende crediti o pagine del piano. Una bozza in attesa di pagamento ha statoinput-required. Interroga conGetTask.
Per crediti AP2 richiedi credits:checkout e negozia l’estensione merchant. Mandati firmati di carrello e pagamento, approvazione passkey separata, utilizzo SPT e ricevute confermate nel registro: https://singlefax.com/ap2.md.
GetTask con fax:read segue la consegna per bozze fax e pagamento/provisioning per numeri. Il compito numero termina all’attivazione. I crediti non hanno task collegato a un ordine: verifica il saldo dopo il pagamento.
Percorso B. Chiave API (backend e CLI)
- Crea una chiave su https://singlefax.com/dashboard/api-keys (
sf_live_…). - Acquista crediti prepagati.
Authorization: Bearer sf_live_…suhttps://singlefax.com/api/v1/…(ohttps://api.singlefax.com/api/v1/…).- CLI:
npx @singlefax/cli send FILE --to +E164conSINGLEFAX_API_KEY. Passa Word, Excel, PDF o immagine originali, senza conversione preventiva.
Esempi di linguaggio (curl, Node, Python, Go, PHP): https://singlefax.com/developers.md
OpenAPI: https://singlefax.com/openapi.json
Percorso C. JWT host/agente delegati Better Auth
Le capacità delegate (validate_fax, send_fax, get_fax_status, get_credits, create_credit_checkout) usano approvazione dispositivo.
- Leggi
GET https://api.singlefax.com/.well-known/agent-configurationper algoritmi, endpoint, modalità e approvazioni. L’issuer Agent Auth èhttps://api.singlefax.com, distinto dall’issuer OAuth che termina in/api/auth. Usa questa origine come audience JWT. Genera chiavi separate host e agente con algoritmo supportato; conserva le private al sicuro. - Prepara prima l’host. Registrazione dinamica host disabilitata. Il titolare deve accedere a SingleFax e chiamare
POST https://singlefax.com/api/auth/host/create(equivalente API: https://api.singlefax.com/api/auth/host/create) dalla sessione browser proprietaria. Fornisci{ "name": "My agent host", "public_key": <host public JWK>, "default_capabilities": [] };hostIdnella risposta identifica l’host. Impostazioni iniziali vuote assicurano approvazione separata delle capacità. Oppure omettipublic_keyper ricevereenrollmentTokenmonouso a scadenza; l’host chiamaPOST https://api.singlefax.com/api/auth/host/enrollcon{ "token": <enrollment token>, "public_key": <host public JWK>, "name": "My agent host" }. Mai condividere cookie o chiavi private con l’agente. - Registrati su
POST https://api.singlefax.com/api/auth/agent/register. InviaAuthorization: Bearer <signed host+jwt>e JSON{ "name": "My agent", "mode": "delegated", "capabilities": ["validate_fax", "get_fax_status", "get_credits"], "preferred_method": "device_authorization", "force_approval": true }. Header JWT:typ: "host+jwt",algsupportato ekiddel JWK firmatario se presente. Claim:iss: <registered hostId>,aud: "https://api.singlefax.com",jtinuovo,iatcorrente,expentro 60 secondi eagent_public_key: <agent public JWK>. Firma con la chiave host predisposta. Identificatori JWT riusati vengono respinti. - La registrazione restituisce
agent_id,host_id, stato, capacità e oggettoapprovalquando necessario. Mostra il codice dispositivo e apriverification_uri_completesu SingleFax. L’utente accede e approva all’URL restituito. Registrazione, provisioning e approvazione cambiano l’account; scanner passivi devono solo leggere discovery. - Interroga
GET https://api.singlefax.com/api/auth/agent/status?agent_id=<registered id>con JWT host nuovo (iss: <host_id>). Dopo l’approvazione firma JWT agente con la sua chiave privata: headertyp: "agent+jwt",alg/kidsupportati; claimiss: <host_id>,sub: <agent_id>,aud: "https://api.singlefax.com",iatcorrente,expentro 60 secondi ejtinuovo. ChiamaPOST https://api.singlefax.com/api/auth/capability/executeconAuthorization: Bearer <signed agent+jwt>e{ "capability": "get_credits", "arguments": {} }, o un’altra capacità concessa con gli argomenti documentati. Sono prove firmate, non chiavi API o access token OAuth. - Per un nuovo codice dispositivo di un agente registrato,
POST https://api.singlefax.com/api/auth/agent/device/codecon{ "agent_id": "<registered id>" }e JWT host firmato. Questo endpoint non registra agenti. Revoca tramitePOST https://api.singlefax.com/api/auth/agent/revokecon{ "agent_id": "<registered id>" }e JWT host proprietario o sessione titolare.send_faxrichiede verifica utente con passkey; non è autonomo.
Non inviare ID-JAG o { "type": "anonymous" } via POST qui: tipi d’identità non supportati.
Pagamenti macchina (non OAuth)
Pagamento autonomo: MPP HTTP 402 su POST /api/v1/machine/faxes con Stripe Shared Payment Token o Tempo USDC. Vedi https://singlefax.com/mpp.md. Cursor non genera SPT: usa Stripe Link CLI su quell’URL REST, non /mcp. I wallet Tempo pagano la richiesta Tempo sullo stesso URL.
HIPAA
Non inviare PHI su MCP, MPP o API pubblica. Gli enti soggetti usano HIPAA Secure sul sito con BAA elettronico.