Invia una richiesta di tesseramento per una persona (lato server)
const url = 'https://api.vimine.network/v1/enroll';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"email":"hello@example.com","first_name":"example","last_name":"example","codicefiscale":"example","codicefiscale_confirmed":true,"guardian":{"first_name":"example","last_name":"example","relation":"example","codicefiscale":"example","email":"hello@example.com","phone":"example"},"address":{"kind":"residence","line":"example","postal_code":"example","city":"example","province":"example","country":"IT"},"phone":"example","dob":"2026-04-15","gender":"M","birthplace":"example","birth_country":"example","membership_type":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","locale":"example","accept_statuto":{"version":1,"sha256":"example"},"privacy_notice":{"version":1,"sha256":"example","locale":"example"},"accept_terms":{"version":"example","sha256":"example"},"acknowledge_privacy":{"version":"example","sha256":"example"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.vimine.network/v1/enroll \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "email": "hello@example.com", "first_name": "example", "last_name": "example", "codicefiscale": "example", "codicefiscale_confirmed": true, "guardian": { "first_name": "example", "last_name": "example", "relation": "example", "codicefiscale": "example", "email": "hello@example.com", "phone": "example" }, "address": { "kind": "residence", "line": "example", "postal_code": "example", "city": "example", "province": "example", "country": "IT" }, "phone": "example", "dob": "2026-04-15", "gender": "M", "birthplace": "example", "birth_country": "example", "membership_type": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "locale": "example", "accept_statuto": { "version": 1, "sha256": "example" }, "privacy_notice": { "version": 1, "sha256": "example", "locale": "example" }, "accept_terms": { "version": "example", "sha256": "example" }, "acknowledge_privacy": { "version": "example", "sha256": "example" } }'Crea l’identità, se l’indirizzo è nuovo, e la richiesta di tesseramento (che nasce ACTIVE subito per un tipo gratuito senza approvazione, altrimenti PENDING finché l’associazione non registra la quota e/o approva). Un indirizzo che ha già un account Vimine non viene mai collegato in silenzio: il suo titolare riceve un link di conferma e la richiesta nasce quando lo usa. Risponde sempre 202. accept_statuto deve indicare la versione dello statuto in vigore (e sha256, quando è pubblicato). Solo con token di client (enroll:write); accetta Idempotency-Key.
Autorizzazioni
Sezione intitolata “Autorizzazioni”Corpo della richiestaobbligatorio
Sezione intitolata “Corpo della richiestaobbligatorio”object
Facoltativo. Una persona si identifica con un codice fiscale OPPURE con dob + birthplace + birth_country — mai nessuno dei due (422 required su ogni dato mancante). Se presente, viene validato e confrontato con nome e cognome, la data e il luogo (lo Stato, per chi è nato all’estero)
La persona conferma un codice che non concorda con i suoi dati (422 codicefiscale_mismatch con confirmable: true)
Chi esercita la responsabilità genitoriale su un minore (meno di 18 anni secondo dob o, in sua assenza, secondo la data di nascita codificata nel codicefiscale). OBBLIGATORIO per un minore dove l’associazione ha dichiarato di raccogliere questo blocco (aps.collects_guardian_data): altrimenti 422 required su guardian; conservato solo dove l’ha dichiarato
object
Genitore, tutore… come lo registra l’associazione
Facoltativo; rifiutato se malformato
Residenza o, se diverso, domicilio. Chiesto a tutti i soci o a nessuno: il profilo pubblico dice che cosa ha dichiarato l’associazione (member_address: none — ignorato, non conservato · optional · required — 422 required su address se manca)
object
Via e numero
Solo indirizzi italiani (due lettere); scartata per quelli esteri
ISO 3166-1 alpha-2
Solo statistico: non viene confrontato
Comune (nati in Italia) o città, testo libero (nati all’estero)
ISO 3166-1 alpha-2
Uno dei tipi di tessera dell’associazione (omettilo quando ne ha uno solo)
La lingua della pagina che la persona ha compilato (una lingua della piattaforma — it, en, …; ogni altro tag viene ricondotto a una di quelle della piattaforma: en-GB → en, zh-TW → zh-Hant). Decide la lingua delle mail che seguono e diventa la preferenza di un account NUOVO; un account esistente tiene la sua. I valori non supportati vengono ignorati
Lo statuto in vigore che la persona ha accettato sul tuo sito (da GET /v1/aps/{slug})
object
L’informativa privacy dell’associazione che la persona ha letto sul tuo sito (GET /v1/aps/{slug} → privacy_notice). OBBLIGATORIA quando l’associazione ne pubblica una; 422 privacy_notice_outdated quando non è la versione in vigore
object
La versione in vigore dell’informativa mostrata (GET /v1/aps/{slug} → privacy_notice)
La lingua dell’informativa che hai mostrato (privacy_notice.locale della risposta da cui l’hai letta). Ogni lingua è un documento a sé, con la sua versione: indicala quando leggi il profilo con ?locale=. Predefinita: il locale della richiesta, poi la lingua dell’associazione
Le condizioni dell’account (platform_terms) che la persona ha accettato sul tuo sito — facoltative, devono indicare la versione in vigore
object
L’etichetta della versione in vigore mostrata (GET /v1/legal/{kind})
L’hash del suo modello, quando è pubblicato
L’informativa della piattaforma (platform_privacy) che la persona ha letto — facoltativa, stessa regola
object
L’etichetta della versione in vigore mostrata (GET /v1/legal/{kind})
L’hash del suo modello, quando è pubblicato
Risposte
Sezione intitolata “Risposte”Accettata
object
Esempio
{ "status": "accepted"}Richiesta non valida
object
object
Esempiogenerato
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "code": "example", "request_id": "example", "errors": [ { "field": "example", "code": "example", "message": "example" } ]}Credenziali mancanti o non valide
object
object
Esempiogenerato
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "code": "example", "request_id": "example", "errors": [ { "field": "example", "code": "example", "message": "example" } ]}L’associazione non accetta richieste di tesseramento (api_disabled)
Non trovato
object
object
Esempiogenerato
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "code": "example", "request_id": "example", "errors": [ { "field": "example", "code": "example", "message": "example" } ]}Validazione non riuscita, tipo di tessera sconosciuto o accept_statuto non indica lo statuto in vigore
Troppe richieste
object
object
Esempiogenerato
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "code": "example", "request_id": "example", "errors": [ { "field": "example", "code": "example", "message": "example" } ]}Errore interno
object
object
Esempiogenerato
{ "type": "https://example.com", "title": "example", "status": 1, "detail": "example", "code": "example", "request_id": "example", "errors": [ { "field": "example", "code": "example", "message": "example" } ]}