Télécharger l'avis AADL
curl --request GET \
--url https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis"
headers = {"X-Access-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Token': '<api-key>'}};
fetch('https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis', 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.oneclickdz.com/v3/bills/transactions/{transactionId}/avis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"Content-Type": {},
"Content-Disposition": {},
"Content-Length": {},
"Cache-Control": {}
}Paiement de factures
Télécharger l'avis AADL
Téléchargez l’avis de paiement officiel d’AADL pour l’une de vos propres transactions
GET
/
v3
/
bills
/
transactions
/
{transactionId}
/
avis
Télécharger l'avis AADL
curl --request GET \
--url https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis \
--header 'X-Access-Token: <api-key>'import requests
url = "https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis"
headers = {"X-Access-Token": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Access-Token': '<api-key>'}};
fetch('https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis', 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.oneclickdz.com/v3/bills/transactions/{transactionId}/avis",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Access-Token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Access-Token", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis")
.header("X-Access-Token", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.oneclickdz.com/v3/bills/transactions/{transactionId}/avis")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Access-Token"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"Content-Type": {},
"Content-Disposition": {},
"Content-Length": {},
"Cache-Control": {}
}Vue d’ensemble
Diffuse l’avis de paiement qu’AADL publie pour un dossier de logement — le PDF que le locataire téléchargerait lui-même chez le facturier — pour une transaction qui vous appartient. Comme Télécharger le reçu, cet endpoint ne renvoie pas l’enveloppe JSON en cas de succès : le corps, ce sont les octets, que vous pouvez transmettre directement à votre propre client.
Ce n’est pas le reçu. Le reçu prouve que votre paiement est passé ; l’avis est l’état que publie AADL pour le dossier. Seul AADL en produit un.
L’avis s’adresse par transaction, jamais par dossier de logement. Cette requête ne contient aucun
codeloc, et aucun n’est accepté. Nous chargeons la transaction, vérifions qu’elle est bien la vôtre dans cet environnement, la refusons si son partner n’est pas AADL, puis lisons le dossier de logement dans la facture déjà enregistrée sur cette transaction.C’est délibéré. La page d’export d’AADL ne demande aucune session et renvoie un PDF pour n’importe quel code, existant ou non : relayer un code fourni par l’appelant transformerait cet endpoint en outil d’énumération des dossiers d’autrui. Le résoudre depuis votre propre transaction rend cela impossible.Paramètres de chemin
string
requis
L’identifiant de transaction. Une chaîne hexadécimale minuscule de 24 caractères, issue de Obtenir une transaction par ID ou de n’importe quelle liste, appartenant à l’une de vos transactions
AADL.Contrairement au reçu, la transaction n’a pas besoin d’être en SUCCESS : n’importe laquelle de vos transactions AADL ayant résolu une facture peut produire un avis.Réponse
En cas de succès, le corps est le PDF lui-même. Lisez les en-têtes pour savoir ce que vous avez reçu.header
requis
application/pdf.header
requis
attachment; filename="avis_<transactionId>.pdf". Le nom est construit à partir du seul identifiant de transaction : il ne porte aucune identité de locataire.header
requis
La taille du fichier en octets.
header
requis
private, no-store. AADL régénère l’avis à la demande et le remplace à chaque période : il n’y a rien de stable à mettre en cache — et c’est le document d’un client, jamais un document partagé.Exemples
# -J -O écrit le fichier sous le nom proposé par le serveur
curl https://api.oneclickdz.com/v3/bills/transactions/68b2f4c1a7d3e9f204c81a55/avis \
-H "X-Access-Token: YOUR_API_KEY" \
--fail \
--remote-header-name --remote-name
import { writeFile } from "node:fs/promises";
const transactionId = "68b2f4c1a7d3e9f204c81a55";
const response = await fetch(
`https://api.oneclickdz.com/v3/bills/transactions/${transactionId}/avis`,
{ headers: { "X-Access-Token": process.env.ONECLICKDZ_API_KEY } },
);
if (!response.ok) {
const error = await response.json();
throw new Error(`${error.error.code}: ${error.error.message}`);
}
const bytes = Buffer.from(await response.arrayBuffer());
await writeFile(`avis-${transactionId}.pdf`, bytes);
console.log(bytes.length);
import os
import requests
transaction_id = '68b2f4c1a7d3e9f204c81a55'
response = requests.get(
f'https://api.oneclickdz.com/v3/bills/transactions/{transaction_id}/avis',
headers={'X-Access-Token': os.getenv('ONECLICKDZ_API_KEY')}
)
if response.status_code != 200:
error = response.json()
raise RuntimeError(f"{error['error']['code']}: {error['error']['message']}")
with open(f'avis-{transaction_id}.pdf', 'wb') as handle:
handle.write(response.content)
print(len(response.content))
<?php
$transactionId = '68b2f4c1a7d3e9f204c81a55';
$ch = curl_init("https://api.oneclickdz.com/v3/bills/transactions/$transactionId/avis");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-Access-Token: ' . getenv('ONECLICKDZ_API_KEY')
]);
$bytes = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
$error = json_decode($bytes, true);
throw new Exception($error['error']['code'] . ': ' . $error['error']['message']);
}
file_put_contents("avis-$transactionId.pdf", $bytes);
echo strlen($bytes);
?>
Réponse de succès
Le corps est binaire. Les en-têtes ressemblent à ceci :HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Length: 71204
Content-Disposition: attachment; filename="avis_68b2f4c1a7d3e9f204c81a55.pdf"
Cache-Control: private, no-store
Réponses d’erreur
Les erreurs sont renvoyées en JSON, dans la même enveloppe que pour tous les autres endpoints.401 — Jeton d'accès manquant ou invalide
401 — Jeton d'accès manquant ou invalide
La clé était absente ou a été rejetée.Que faire : vérifiez la clé selon le guide Authentification.
{
"success": false,
"error": {
"code": "INVALID_ACCESS_TOKEN",
"message": "The provided access token is invalid."
},
"requestId": "req_9f3a1c72e0b84d51aB3xZq07"
}
404 — Transaction introuvable
404 — Transaction introuvable
L’identifiant est inconnu, ou la transaction n’est pas la vôtre dans cet environnement.Une clé sandbox ne voit jamais une transaction de production, et aucune des deux ne voit celle d’une autre clé. La réponse est identique dans tous les cas : l’endpoint ne confirme donc jamais l’existence de la transaction de quelqu’un d’autre.Que faire : vérifiez l’identifiant, et vérifiez que vous utilisez bien la clé avec laquelle la transaction a été créée.
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Transaction not found."
},
"requestId": "req_9f3a1c72e0b84d51aB3xZq07"
}
404 — Ce n'est pas une transaction AADL
404 — Ce n'est pas une transaction AADL
La transaction est bien la vôtre, mais son partenaire ne publie pas d’avis.Que faire : lisez d’abord
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "This partner does not publish a downloadable avis."
},
"requestId": "req_9f3a1c72e0b84d51aB3xZq07"
}
partner sur la transaction et ne proposez le téléchargement que lorsqu’il vaut AADL. Pour tous les autres facturiers, c’est le reçu qu’il vous faut.404 — Aucun avis disponible pour l'instant
404 — Aucun avis disponible pour l'instant
Aucun dossier de logement n’a encore été résolu sur cette transaction, ou AADL a refusé de produire le document.Une découverte qui n’a pas encore atteint
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "No avis is available for this transaction yet."
},
"requestId": "req_9f3a1c72e0b84d51aB3xZq07"
}
READY ne porte aucune facture : il n’y a donc rien d’où résoudre un dossier de logement.Que faire : attendez que la transaction porte une facture, puis réessayez. Un refus du facturier mérite un essai supplémentaire, pas une boucle.À quoi sert l’avis
Montrer au client ce qu'il doit
L’avis porte le détail établi par AADL pour le dossier de logement. C’est le document que le locataire reconnaît.
Pas un substitut au reçu
Seul le reçu prouve qu’un paiement est passé. C’est celui-là qu’il faut conserver avec votre commande.
Rappelez-vous qu’un dossier de logement AADL n’a qu’un seul avis ouvert, avec ses éventuels arriérés intégrés au total : ce PDF représente donc tout ce que doit le dossier, jamais une période parmi d’autres. Voir Partenaires et comptes.
Bonnes pratiques
Vérifiez d'abord le partenaire
Ne proposez le téléchargement que pour les transactions
AADL. Tous les autres partenaires répondent 404 NOT_FOUND.N'exposez jamais l'URL
Cette URL exige votre clé API. Servez les octets depuis votre propre système, derrière votre propre authentification.
Récupérez-le au moment voulu
no-store n’est pas décoratif : AADL remplace l’avis à chaque période. Téléchargez-le quand vous en avez besoin.N'envoyez jamais de codeloc
Il n’y a aucun paramètre d’identifiant à deviner. Si votre code en construit un, c’est qu’il appelle autre chose.
Endpoints associés
Télécharger le reçu
La preuve d’un paiement réussi
Obtenir une transaction par ID
Où apparaissent
partner et les facturesDécouvrir les factures
Comment un dossier de logement AADL est interrogé
Partenaires et comptes
Les règles d’identifiant AADL

