curl --request POST \
--url https://api.withallo.com/v2/api/partner/accounts/{id}/members \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "[email protected]",
"name": "Paul Martin",
"personal_mobile": "+33612345679",
"role": "MEMBER",
"number_preference": {
"country": "FR",
"esim": true
}
}
'import requests
url = "https://api.withallo.com/v2/api/partner/accounts/{id}/members"
payload = {
"email": "[email protected]",
"name": "Paul Martin",
"personal_mobile": "+33612345679",
"role": "MEMBER",
"number_preference": {
"country": "FR",
"esim": True
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '[email protected]',
name: 'Paul Martin',
personal_mobile: '+33612345679',
role: 'MEMBER',
number_preference: {country: 'FR', esim: true}
})
};
fetch('https://api.withallo.com/v2/api/partner/accounts/{id}/members', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.withallo.com/v2/api/partner/accounts/{id}/members",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '[email protected]',
'name' => 'Paul Martin',
'personal_mobile' => '+33612345679',
'role' => 'MEMBER',
'number_preference' => [
'country' => 'FR',
'esim' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/partner/accounts/{id}/members"
payload := strings.NewReader("{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.withallo.com/v2/api/partner/accounts/{id}/members")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/partner/accounts/{id}/members")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "usr-8C1B2E7F4A9D3C6B0E5F1A2D7C4B9E3F6A0D8C21",
"account_id": "usr-575966AF3661061265263C58882BC409D2A427B8",
"email": "[email protected]",
"name": "Paul Martin",
"role": "MEMBER",
"phone_numbers": [
"+33745805111"
],
"status": "ACTIVE",
"activated": false
}
}{
"error": {}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {}
}{
"error": {}
}{
"error": {}
}{
"error": {}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {}
}Ajouter un membre
Adds a member to one of your accounts, with a phone number of their own. The member takes a seat the account already pays for and no one uses, or one more seat on the account’s subscription, which you pay: Allo draws on your prepaid credit first, then charges your card on file for the rest. The seat includes the member’s number, so the number is not billed on top. Allo sends the member no invitation email. Allo checks that a number is available before charging anything. Requires the PARTNER scope.
curl --request POST \
--url https://api.withallo.com/v2/api/partner/accounts/{id}/members \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "[email protected]",
"name": "Paul Martin",
"personal_mobile": "+33612345679",
"role": "MEMBER",
"number_preference": {
"country": "FR",
"esim": true
}
}
'import requests
url = "https://api.withallo.com/v2/api/partner/accounts/{id}/members"
payload = {
"email": "[email protected]",
"name": "Paul Martin",
"personal_mobile": "+33612345679",
"role": "MEMBER",
"number_preference": {
"country": "FR",
"esim": True
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '[email protected]',
name: 'Paul Martin',
personal_mobile: '+33612345679',
role: 'MEMBER',
number_preference: {country: 'FR', esim: true}
})
};
fetch('https://api.withallo.com/v2/api/partner/accounts/{id}/members', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.withallo.com/v2/api/partner/accounts/{id}/members",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '[email protected]',
'name' => 'Paul Martin',
'personal_mobile' => '+33612345679',
'role' => 'MEMBER',
'number_preference' => [
'country' => 'FR',
'esim' => true
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.withallo.com/v2/api/partner/accounts/{id}/members"
payload := strings.NewReader("{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.withallo.com/v2/api/partner/accounts/{id}/members")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/partner/accounts/{id}/members")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"[email protected]\",\n \"name\": \"Paul Martin\",\n \"personal_mobile\": \"+33612345679\",\n \"role\": \"MEMBER\",\n \"number_preference\": {\n \"country\": \"FR\",\n \"esim\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "usr-8C1B2E7F4A9D3C6B0E5F1A2D7C4B9E3F6A0D8C21",
"account_id": "usr-575966AF3661061265263C58882BC409D2A427B8",
"email": "[email protected]",
"name": "Paul Martin",
"role": "MEMBER",
"phone_numbers": [
"+33745805111"
],
"status": "ACTIVE",
"activated": false
}
}{
"error": {}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {}
}{
"error": {}
}{
"error": {}
}{
"error": {}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"retryable": true,
"request_id": "<string>",
"retry_after_seconds": 123
}
}{
"error": {}
}PARTNERid qui sert à commander son eSIM.
Requête
emailest requis et devient l’identifiant de connexion du membre.nameest requis.personal_mobileest optionnel, au format E.164, par exemple+33612345679. Un numéro illisible échoue avecINVALID_PHONE_NUMBER.roleest optionnel :ADMIN,MANAGERouMEMBER,MEMBERpar défaut. Toute autre valeur échoue avecINVALID_MEMBER_ROLE.number_preferenceest requis : le numéro du membre, avec les mêmes champs que sur Créer un compte.number_preference.countryest requis. Passeznumber_preference.esimàtruepour donner au membre un numéro mobile français qui peut porter une eSIM.- Si l’email ou le mobile personnel appartient déjà à un compte Allo, la requête échoue avec
409 PARTNER_ACCOUNT_ALREADY_EXISTS, etparamindique le champ concerné.
{id} est l’identifiant du compte renvoyé par Créer un compte. Un compte que votre API key n’a pas créé, ou déjà désactivé, renvoie 404 PARTNER_ACCOUNT_NOT_FOUND.
Ce que fait Allo
- Allo crée le membre dans le workspace du compte et lui attribue son numéro.
- Allo n’envoie aucun email d’invitation au membre. C’est vous qui l’accompagnez. Le membre se connecte à Allo avec l’email (ou le mobile personnel) que vous avez envoyé, et
activatedpasse àtruedès sa première connexion sur un appareil. - Le membre occupe un siège sur l’abonnement du compte. Ce siège inclut son numéro : le numéro n’est pas facturé en plus.
Facturation
- Si le compte paie déjà un siège que personne n’occupe, le membre le prend et rien n’est débité.
- Sinon, Allo ajoute un siège à l’abonnement du compte, que vous payez, et débite tout de suite le reste de la période de facturation en cours, avec la remise de l’abonnement appliquée. Allo prélève d’abord votre crédit prépayé, puis débite le reste sur votre carte enregistrée. Allo ne facture jamais votre client.
- Allo vérifie l’email, le mobile personnel et le numéro avant tout débit. Si aucun numéro ne correspond, la requête échoue avec
409 NO_NUMBER_AVAILABLEet rien n’est débité. - Si votre crédit prépayé ne couvre pas le siège et qu’aucune carte n’est enregistrée, la requête échoue avec
402 PARTNER_CREDIT_INSUFFICIENTet rien n’est créé. Une carte refusée échoue avec402 PARTNER_BILLING_FAILED. - Si le numéro du membre ne peut pas être configuré après le débit, Allo supprime le membre et retire le siège de l’abonnement.
Idempotency-Key. Si une requête expire, consultez Lister les membres avant de réessayer : une fois le membre créé, une nouvelle tentative avec le même email échoue avec PARTNER_ACCOUNT_ALREADY_EXISTS.
Comment donner une eSIM au membre
Ajoutez le membre avec un numéro eSIM
number_preference: {"country": "FR", "esim": true}. Le membre reçoit un numéro mobile français qui peut porter une eSIM, listé dans phone_numbers.Commandez l'eSIM pour le membre
POST /v2/api/partner/accounts/{account_id}/esims). Envoyez le numéro du membre comme phone_number et l’id du membre comme holder_id. L’eSIM est alors rattachée au membre, et non au compte.Remettez l'eSIM
partner.esim.ready, puis envoyez au membre le code de Obtenir le code d’activation d’une eSIM.Erreurs
| Code | Signification |
|---|---|
REGULATORY_VERIFICATION_REQUIRED | Un numéro dans ce pays demande d’abord la vérification réglementaire du compte. Rien n’est débité. |
PARTNER_ACCOUNT_BUSY | Un autre numéro ou membre est en cours d’ajout sur ce compte, ou cet email est en cours d’ajout ailleurs. Toujours retryable: true : réessayez dans quelques secondes. |
PARTNER_ACCOUNT_DEACTIVATING | Le compte est en cours de désactivation à la fin de sa période de facturation : il ne prend plus de membres. |
PARTNER_ACCOUNT_SUBSCRIPTION_CONFLICT | L’abonnement du compte ne peut pas être facturé pour le moment. Si retryable vaut true, réessayez dans quelques minutes. Sinon, écrivez à [email protected]. |
PARTNER_SUBSCRIPTION_NOT_BILLABLE | Le compte n’a pas d’abonnement qu’Allo peut facturer (402). |
PARTNER_BILLING_UNAVAILABLE | La facturation est temporairement indisponible (500). Réessayez dans quelques secondes. |
PARTNER_NUMBER_SETUP_FAILED | Le numéro du membre n’a pas pu être configuré (500). Le membre et le débit ont été annulés. Écrivez à [email protected]. |
PARTNER_NUMBER_KEPT | Le numéro a été attribué mais sa configuration n’a pas abouti (500). Il reste sur le compte avec le siège du membre. Ne réessayez pas : écrivez à [email protected] en indiquant le numéro. |
Autorisations
Paramètres de chemin
The account id returned by Create account (usr-*).
Corps
Becomes the member's login. It must not belong to an Allo account yet.
"Paul Martin"
The member's number.
Show child attributes
Show child attributes
Optional, E.164. The member's own mobile. It must not belong to an Allo account yet.
"+33612345679"
Optional, default MEMBER. The member's role in the account's workspace.
ADMIN, MANAGER, MEMBER "MEMBER"
Réponse
Member added
Show child attributes
Show child attributes
Cette page vous a-t-elle été utile ?