Salta ai contenuti

Invia una richiesta di tesseramento per una persona (lato server)

POST
/v1/enroll
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.

Tipo di contenutoapplication/json
object
email
obbligatorio
string formato: email
first_name
obbligatorio
string
<= 50 caratteri
last_name
obbligatorio
string
<= 50 caratteri
codicefiscale

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)

string
nullable <= 16 caratteri
codicefiscale_confirmed

La persona conferma un codice che non concorda con i suoi dati (422 codicefiscale_mismatch con confirmable: true)

boolean
guardian

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
first_name
obbligatorio
string
<= 50 caratteri
last_name
obbligatorio
string
<= 50 caratteri
relation
obbligatorio

Genitore, tutore… come lo registra l’associazione

string
<= 20 caratteri
codicefiscale

Facoltativo; rifiutato se malformato

string
nullable <= 16 caratteri
email
string formato: email
nullable
phone
string
nullable <= 20 caratteri
address

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
kind
string
predefinito: residence
Valori ammessi: residence domicile
line
obbligatorio

Via e numero

string
<= 150 caratteri
postal_code
string
nullable <= 12 caratteri
city
obbligatorio
string
<= 150 caratteri
province

Solo indirizzi italiani (due lettere); scartata per quelli esteri

string
nullable <= 2 caratteri
country

ISO 3166-1 alpha-2

string
predefinito: IT >= 2 caratteri <= 2 caratteri
phone
string
nullable <= 20 caratteri
dob
string formato: date
nullable
gender

Solo statistico: non viene confrontato

string
nullable
Valori ammessi: M F
birthplace

Comune (nati in Italia) o città, testo libero (nati all’estero)

string
nullable <= 150 caratteri
birth_country

ISO 3166-1 alpha-2

string
nullable >= 2 caratteri <= 2 caratteri
membership_type

Uno dei tipi di tessera dell’associazione (omettilo quando ne ha uno solo)

string formato: uuid
locale

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

string
nullable
accept_statuto
obbligatorio

Lo statuto in vigore che la persona ha accettato sul tuo sito (da GET /v1/aps/{slug})

object
version
obbligatorio
integer
sha256
string
privacy_notice

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
version
obbligatorio

La versione in vigore dell’informativa mostrata (GET /v1/aps/{slug} → privacy_notice)

integer
sha256
string
locale

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

string
accept_terms

Le condizioni dell’account (platform_terms) che la persona ha accettato sul tuo sito — facoltative, devono indicare la versione in vigore

object
version
obbligatorio

L’etichetta della versione in vigore mostrata (GET /v1/legal/{kind})

string
sha256

L’hash del suo modello, quando è pubblicato

string
acknowledge_privacy

L’informativa della piattaforma (platform_privacy) che la persona ha letto — facoltativa, stessa regola

object
version
obbligatorio

L’etichetta della versione in vigore mostrata (GET /v1/legal/{kind})

string
sha256

L’hash del suo modello, quando è pubblicato

string

Accettata

Tipo di contenutoapplication/json
object
status
obbligatorio
string
Valori ammessi: accepted
Esempio
{
"status": "accepted"
}

Richiesta non valida

Tipo di contenutoapplication/problem+json
object
type
obbligatorio
string formato: uri
title
obbligatorio
string
status
obbligatorio
integer
detail
string
code
obbligatorio
string
request_id
string
errors
Array<object>
object
field
string
code
string
message
string
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

Tipo di contenutoapplication/problem+json
object
type
obbligatorio
string formato: uri
title
obbligatorio
string
status
obbligatorio
integer
detail
string
code
obbligatorio
string
request_id
string
errors
Array<object>
object
field
string
code
string
message
string
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

Tipo di contenutoapplication/problem+json
object
type
obbligatorio
string formato: uri
title
obbligatorio
string
status
obbligatorio
integer
detail
string
code
obbligatorio
string
request_id
string
errors
Array<object>
object
field
string
code
string
message
string
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

Tipo di contenutoapplication/problem+json
object
type
obbligatorio
string formato: uri
title
obbligatorio
string
status
obbligatorio
integer
detail
string
code
obbligatorio
string
request_id
string
errors
Array<object>
object
field
string
code
string
message
string
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

Tipo di contenutoapplication/problem+json
object
type
obbligatorio
string formato: uri
title
obbligatorio
string
status
obbligatorio
integer
detail
string
code
obbligatorio
string
request_id
string
errors
Array<object>
object
field
string
code
string
message
string
Esempiogenerato
{
"type": "https://example.com",
"title": "example",
"status": 1,
"detail": "example",
"code": "example",
"request_id": "example",
"errors": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}