curl --request POST \
--url https://api.withallo.com/v2/api/partner/accounts/{id}/numbers \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"country": "FR",
"prefix": "7",
"esim": true
}
'import requests
url = "https://api.withallo.com/v2/api/partner/accounts/{id}/numbers"
payload = {
"country": "FR",
"prefix": "7",
"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({country: 'FR', prefix: '7', esim: true})
};
fetch('https://api.withallo.com/v2/api/partner/accounts/{id}/numbers', 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}/numbers",
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([
'country' => 'FR',
'prefix' => '7',
'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}/numbers"
payload := strings.NewReader("{\n \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\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}/numbers")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/partner/accounts/{id}/numbers")
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 \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"phone_number": "+33745805222",
"country": "FR",
"charged": true
}
}{
"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 numéro
Adds a phone number to one of your accounts. The number is billed on the account’s subscription, which you pay: Allo draws on your prepaid credit first, then charges your card on file for the rest. When the account already pays for a number slot that no number uses, the new number takes that slot and nothing is charged (charged: false). 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}/numbers \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"country": "FR",
"prefix": "7",
"esim": true
}
'import requests
url = "https://api.withallo.com/v2/api/partner/accounts/{id}/numbers"
payload = {
"country": "FR",
"prefix": "7",
"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({country: 'FR', prefix: '7', esim: true})
};
fetch('https://api.withallo.com/v2/api/partner/accounts/{id}/numbers', 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}/numbers",
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([
'country' => 'FR',
'prefix' => '7',
'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}/numbers"
payload := strings.NewReader("{\n \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\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}/numbers")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.withallo.com/v2/api/partner/accounts/{id}/numbers")
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 \"country\": \"FR\",\n \"prefix\": \"7\",\n \"esim\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"phone_number": "+33745805222",
"country": "FR",
"charged": true
}
}{
"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": {}
}PARTNERRequête
Le corps est une préférence de numéro, identique ànumber_preference sur Créer un compte :
countryest requis (code pays ISO, par exempleFR). Un pays inconnu échoue avecINVALID_NUMBER_PREFERENCE.prefixest optionnel : les chiffres par lesquels le numéro doit commencer, par exemple7ou+337.esimest optionnel,falsepar défaut. Passez-le àtruepour obtenir un numéro mobile français qui peut porter une eSIM, à commander ensuite avec Commander une eSIM. Avec uncountryautre queFR, la requête échoue avecESIM_NOT_AVAILABLE_IN_COUNTRY.
{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.
Facturation
- Le numéro est facturé sur l’abonnement du compte, que vous payez. 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 débite tout de suite le reste de la période de facturation en cours du compte, avec la remise de l’abonnement appliquée. Le numéro se renouvelle ensuite avec l’abonnement.
- Si le compte paie déjà un emplacement de numéro qu’aucun numéro n’occupe, le nouveau numéro prend cet emplacement et rien n’est débité. La réponse indique alors
charged: false. - Allo vérifie qu’un numéro est disponible avant tout débit. Si aucun ne correspond au pays et au préfixe, la requête échoue avec
409 NO_NUMBER_AVAILABLEet rien n’est débité. Un pays qui demande d’abord la vérification réglementaire du compte échoue avec409 REGULATORY_VERIFICATION_REQUIRED, là aussi avant tout débit. - Si votre crédit prépayé ne couvre pas le montant et qu’aucune carte n’est enregistrée, la requête échoue avec
402 PARTNER_CREDIT_INSUFFICIENTet rien n’est créé. Rechargez votre crédit ou ajoutez une carte, puis réessayez avec une nouvelleIdempotency-Key. - Une carte refusée échoue avec
402 PARTNER_BILLING_FAILED, et rien n’est créé. - Si le numéro ne peut pas être configuré après le débit, Allo retire le montant de l’abonnement et crédite la période non utilisée sur votre solde.
Nouvelles tentatives
Envoyez un en-têteIdempotency-Key (8 à 100 lettres, chiffres, - ou _, par exemple un UUID) et réutilisez-le pour réessayer la même requête. Une nouvelle tentative avec la même clé ne vous débite pas deux fois. Une clé dans un autre format échoue avec INVALID_IDEMPOTENCY_KEY.
Si vous ne savez pas si une tentative précédente a abouti, vérifiez les phone_numbers du compte avec Obtenir un compte avant de réessayer.
Erreurs
| Code | Signification |
|---|---|
PARTNER_ACCOUNT_BUSY | Un autre numéro ou membre est en cours d’ajout sur ce compte. Toujours retryable: true : réessayez dans quelques secondes. |
IDEMPOTENCY_KEY_ALREADY_USED | Une tentative précédente a déjà utilisé cette Idempotency-Key. Vérifiez les numéros du compte avec Obtenir un compte avant de réessayer avec une nouvelle clé. |
PARTNER_ACCOUNT_DEACTIVATING | Le compte est en cours de désactivation à la fin de sa période de facturation : il ne prend plus de numéros. |
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 avec la même Idempotency-Key, qui reprend le même débit. |
PARTNER_NUMBER_SETUP_FAILED | Le numéro n’a pas pu être configuré (500), et le débit a été annulé. Ne réessayez pas : é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 et sur sa facturation. Ne réessayez pas, une nouvelle tentative ajouterait un autre numéro : écrivez à [email protected] en indiquant le numéro. |
Réponse
phone_numberest le nouveau numéro, au format E.164. Il apparaît aussi dans lesphone_numbersdu compte sur Obtenir un compte.countryest le pays tel qu’Allo le nomme :GBrevient sous la formeUK.chargedvauttruequand un nouvel emplacement a été facturé,falsequand le numéro a pris un emplacement déjà payé par le compte.
Autorisations
En-têtes
Optional. 8 to 100 letters, digits, - or _, for example a UUID. Retrying with the same key does not charge you twice.
^[A-Za-z0-9_-]{8,100}$Paramètres de chemin
The account id returned by Create account (usr-*).
Corps
ISO country code.
"FR"
Optional. Digits the number should start with, after the country code, for example +337 or 7.
"7"
Optional, default false. Set to true to get a French mobile number that can carry an eSIM, which you can then order with POST /v2/api/partner/accounts/{account_id}/esims. eSIM numbers are only available with country set to FR, otherwise the request fails with ESIM_NOT_AVAILABLE_IN_COUNTRY.
true
Réponse
Number added
Show child attributes
Show child attributes
Cette page vous a-t-elle été utile ?