Facturation
Vos factures et vos devis : liste, détail ligne par ligne et documents PDF.
Lister les factures
GET
/v1/billing/invoicesPermission : billing:read
Paramètres de requête
| Champ | Type | Description |
|---|---|---|
status | texte | Valeurs : unpaid, overdue, paid, cancelled, refunded. |
year | entier | Exemple : 2026. |
limit | entier | Nombre d’éléments par page (1 à 100) Par défaut : 20. De 1 à 100. |
cursor | texte | Curseur renvoyé par la page précédente (`next_cursor`) |
Réponse 200
| Champ | Type | Description |
|---|---|---|
data | liste de objet | |
data[].id | texte | Exemple : "inv-1402". |
data[].number | texte | Exemple : "2026-1402". |
data[].status | texte | Valeurs : unpaid, overdue, paid, cancelled, refunded. |
data[].issued_at | texte | |
data[].due_at | texte | |
data[].paid_at | texte ou null | Date de création. |
data[].subtotal | objet | Total hors taxes. |
data[].subtotal.amount | entier | Montant en centimes. Exemple : 790. |
data[].subtotal.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].tax | objet | Taxes (0 en franchise de TVA). |
data[].tax.amount | entier | Montant en centimes. Exemple : 790. |
data[].tax.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].credit_applied | objet | Crédit du compte appliqué. |
data[].credit_applied.amount | entier | Montant en centimes. Exemple : 790. |
data[].credit_applied.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].total | objet | |
data[].total.amount | entier | Montant en centimes. Exemple : 790. |
data[].total.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].balance | objet | Reste à régler. |
data[].balance.amount | entier | Montant en centimes. Exemple : 790. |
data[].balance.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].lines | liste de objet | |
data[].lines[].description | texte | Exemple : "VPS Start - vps-7c2e4a91.vps.corce.link". |
data[].lines[].period_start | texte ou null | |
data[].lines[].period_end | texte ou null | |
data[].lines[].quantity | nombre | Quantité ; entière le plus souvent. Exemple : 1. |
data[].lines[].unit_price | objet | |
data[].lines[].discount | objet | Remise de la ligne (devis). |
data[].lines[].amount | objet | |
data[].pdf_url | texte | |
has_more | booléen | |
next_cursor | texte ou null |
Erreurs
invalid_parameterParamètre invalideinvalid_cursorCurseur invalide- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/invoices" \
-H "Authorization: Bearer $CORCELINK_API_KEY"
import os, uuid, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/invoices",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())
const res = await fetch("https://api.corcelink.fr/v1/billing/invoices", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
console.log(res.status, await res.json());
Réponse 200
{
"data": [
{
"id": "inv-2",
"number": "2026-1402",
"status": "unpaid",
"issued_at": "2026-10-08",
"due_at": "2026-11-01",
"paid_at": null,
"subtotal": {
"amount": 1190,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"credit_applied": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 1190,
"currency": "EUR"
},
"balance": {
"amount": 690,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/invoices/inv-2/pdf"
},
{
"id": "inv-1",
"number": "2026-1398",
"status": "paid",
"issued_at": "2026-09-08",
"due_at": "2026-09-15",
"paid_at": "2026-09-08T14:22:05Z",
"subtotal": {
"amount": 790,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"credit_applied": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 790,
"currency": "EUR"
},
"balance": {
"amount": 0,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/invoices/inv-1/pdf"
},
{
"id": "inv-3",
"number": "2026-1371",
"status": "overdue",
"issued_at": "2026-08-08",
"due_at": "2026-08-15",
"paid_at": null,
"subtotal": {
"amount": 790,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"credit_applied": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 790,
"currency": "EUR"
},
"balance": {
"amount": 790,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/invoices/inv-3/pdf"
}
],
"has_more": false,
"next_cursor": null
}
Essayer avec votre clé
Votre clé reste dans ce navigateur et n’est envoyée qu’à api.corcelink.fr.
Lire une facture
GET
/v1/billing/invoices/{invoice_id}Permission : billing:read
Paramètres de chemin
| Champ | Type | Description |
|---|---|---|
invoice_idobligatoire | texte | Format : ^inv-[0-9]+$. Exemple : "inv-1402". |
Réponse 200
| Champ | Type | Description |
|---|---|---|
id | texte | Exemple : "inv-1402". |
number | texte | Exemple : "2026-1402". |
status | texte | Valeurs : unpaid, overdue, paid, cancelled, refunded. |
issued_at | texte | |
due_at | texte | |
paid_at | texte ou null | Date de création. |
subtotal | objet | Total hors taxes. |
subtotal.amount | entier | Montant en centimes. Exemple : 790. |
subtotal.currency | texte | Devise ISO 4217. Exemple : "EUR". |
tax | objet | Taxes (0 en franchise de TVA). |
tax.amount | entier | Montant en centimes. Exemple : 790. |
tax.currency | texte | Devise ISO 4217. Exemple : "EUR". |
credit_applied | objet | Crédit du compte appliqué. |
credit_applied.amount | entier | Montant en centimes. Exemple : 790. |
credit_applied.currency | texte | Devise ISO 4217. Exemple : "EUR". |
total | objet | |
total.amount | entier | Montant en centimes. Exemple : 790. |
total.currency | texte | Devise ISO 4217. Exemple : "EUR". |
balance | objet | Reste à régler. |
balance.amount | entier | Montant en centimes. Exemple : 790. |
balance.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines | liste de objet | |
lines[].description | texte | Exemple : "VPS Start - vps-7c2e4a91.vps.corce.link". |
lines[].period_start | texte ou null | |
lines[].period_end | texte ou null | |
lines[].quantity | nombre | Quantité ; entière le plus souvent. Exemple : 1. |
lines[].unit_price | objet | |
lines[].unit_price.amount | entier | Montant en centimes. Exemple : 790. |
lines[].unit_price.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines[].discount | objet | Remise de la ligne (devis). |
lines[].discount.amount | entier | Montant en centimes. Exemple : 790. |
lines[].discount.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines[].amount | objet | |
lines[].amount.amount | entier | Montant en centimes. Exemple : 790. |
lines[].amount.currency | texte | Devise ISO 4217. Exemple : "EUR". |
pdf_url | texte |
Erreurs
not_foundRessource introuvable- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/invoices/inv-1402" \
-H "Authorization: Bearer $CORCELINK_API_KEY"
import os, uuid, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/invoices/inv-1402",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())
const res = await fetch("https://api.corcelink.fr/v1/billing/invoices/inv-1402", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
console.log(res.status, await res.json());
Réponse 200
{
"id": "inv-2",
"number": "2026-1402",
"status": "unpaid",
"issued_at": "2026-10-08",
"due_at": "2026-11-01",
"paid_at": null,
"subtotal": {
"amount": 1190,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"credit_applied": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 1190,
"currency": "EUR"
},
"balance": {
"amount": 690,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/invoices/inv-2/pdf",
"lines": [
{
"description": "VPS Start (vps-7c2e4a91.vps.corce.link)",
"period_start": "2026-10-08",
"period_end": "2026-11-07",
"quantity": 1,
"unit_price": {
"amount": 790,
"currency": "EUR"
},
"amount": {
"amount": 790,
"currency": "EUR"
}
},
{
"description": "Réseau privé (production, Plage 10.20.1.0/24)",
"period_start": "2026-10-08",
"period_end": "2026-11-07",
"quantity": 1,
"unit_price": {
"amount": 400,
"currency": "EUR"
},
"amount": {
"amount": 400,
"currency": "EUR"
}
}
]
}
Essayer avec votre clé
Votre clé reste dans ce navigateur et n’est envoyée qu’à api.corcelink.fr.
Télécharger une facture
GET
/v1/billing/invoices/{invoice_id}/pdfPermission : billing:read
Paramètres de chemin
| Champ | Type | Description |
|---|---|---|
invoice_idobligatoire | texte | Format : ^inv-[0-9]+$. Exemple : "inv-1402". |
Réponse 200
Le document PDF.
Erreurs
not_foundRessource introuvableservice_unavailableService momentanément indisponible- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/invoices/inv-1402/pdf" \
-H "Authorization: Bearer $CORCELINK_API_KEY" \
-o facture.pdf
import os, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/invoices/inv-1402/pdf",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=60,
)
r.raise_for_status()
open("facture.pdf", "wb").write(r.content)
import { writeFile } from "node:fs/promises";
const res = await fetch("https://api.corcelink.fr/v1/billing/invoices/inv-1402/pdf", {
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
await writeFile("facture.pdf", Buffer.from(await res.arrayBuffer()));
Lister les devis
GET
/v1/billing/quotesPermission : billing:read
Paramètres de requête
| Champ | Type | Description |
|---|---|---|
limit | entier | Nombre d’éléments par page (1 à 100) Par défaut : 20. De 1 à 100. |
cursor | texte | Curseur renvoyé par la page précédente (`next_cursor`) |
Réponse 200
| Champ | Type | Description |
|---|---|---|
data | liste de objet | |
data[].id | texte | Exemple : "qt-7". |
data[].number | texte | Exemple : "7". |
data[].subject | texte | Exemple : "Migration de la messagerie professionnelle". |
data[].status | texte | Valeurs : pending, accepted, declined, expired. |
data[].issued_at | texte | |
data[].valid_until | texte ou null | |
data[].subtotal | objet | |
data[].subtotal.amount | entier | Montant en centimes. Exemple : 790. |
data[].subtotal.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].tax | objet | |
data[].tax.amount | entier | Montant en centimes. Exemple : 790. |
data[].tax.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].total | objet | |
data[].total.amount | entier | Montant en centimes. Exemple : 790. |
data[].total.currency | texte | Devise ISO 4217. Exemple : "EUR". |
data[].lines | liste de objet | |
data[].lines[].description | texte | Exemple : "VPS Start - vps-7c2e4a91.vps.corce.link". |
data[].lines[].period_start | texte ou null | |
data[].lines[].period_end | texte ou null | |
data[].lines[].quantity | nombre | Quantité ; entière le plus souvent. Exemple : 1. |
data[].lines[].unit_price | objet | |
data[].lines[].discount | objet | Remise de la ligne (devis). |
data[].lines[].amount | objet | |
data[].pdf_url | texte | |
has_more | booléen | |
next_cursor | texte ou null |
Erreurs
invalid_cursorCurseur invalide- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/quotes" \
-H "Authorization: Bearer $CORCELINK_API_KEY"
import os, uuid, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/quotes",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())
const res = await fetch("https://api.corcelink.fr/v1/billing/quotes", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
console.log(res.status, await res.json());
Réponse 200
{
"data": [
{
"id": "qt-1",
"number": "1",
"subject": "Migration de la messagerie",
"status": "pending",
"issued_at": "2026-10-20",
"valid_until": "2026-11-16",
"subtotal": {
"amount": 45000,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 45000,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/quotes/qt-1/pdf"
},
{
"id": "qt-2",
"number": "2",
"subject": "Ancien devis",
"status": "expired",
"issued_at": "2026-01-01",
"valid_until": "2026-01-31",
"subtotal": {
"amount": 10000,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 10000,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/quotes/qt-2/pdf"
}
],
"has_more": false,
"next_cursor": null
}
Essayer avec votre clé
Votre clé reste dans ce navigateur et n’est envoyée qu’à api.corcelink.fr.
Lire un devis
GET
/v1/billing/quotes/{quote_id}Permission : billing:read
Paramètres de chemin
| Champ | Type | Description |
|---|---|---|
quote_idobligatoire | texte | Format : ^qt-[0-9]+$. Exemple : "qt-7". |
Réponse 200
| Champ | Type | Description |
|---|---|---|
id | texte | Exemple : "qt-7". |
number | texte | Exemple : "7". |
subject | texte | Exemple : "Migration de la messagerie professionnelle". |
status | texte | Valeurs : pending, accepted, declined, expired. |
issued_at | texte | |
valid_until | texte ou null | |
subtotal | objet | |
subtotal.amount | entier | Montant en centimes. Exemple : 790. |
subtotal.currency | texte | Devise ISO 4217. Exemple : "EUR". |
tax | objet | |
tax.amount | entier | Montant en centimes. Exemple : 790. |
tax.currency | texte | Devise ISO 4217. Exemple : "EUR". |
total | objet | |
total.amount | entier | Montant en centimes. Exemple : 790. |
total.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines | liste de objet | |
lines[].description | texte | Exemple : "VPS Start - vps-7c2e4a91.vps.corce.link". |
lines[].period_start | texte ou null | |
lines[].period_end | texte ou null | |
lines[].quantity | nombre | Quantité ; entière le plus souvent. Exemple : 1. |
lines[].unit_price | objet | |
lines[].unit_price.amount | entier | Montant en centimes. Exemple : 790. |
lines[].unit_price.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines[].discount | objet | Remise de la ligne (devis). |
lines[].discount.amount | entier | Montant en centimes. Exemple : 790. |
lines[].discount.currency | texte | Devise ISO 4217. Exemple : "EUR". |
lines[].amount | objet | |
lines[].amount.amount | entier | Montant en centimes. Exemple : 790. |
lines[].amount.currency | texte | Devise ISO 4217. Exemple : "EUR". |
pdf_url | texte |
Erreurs
not_foundRessource introuvable- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/quotes/qt-7" \
-H "Authorization: Bearer $CORCELINK_API_KEY"
import os, uuid, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/quotes/qt-7",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=30,
)
r.raise_for_status()
print(r.json())
const res = await fetch("https://api.corcelink.fr/v1/billing/quotes/qt-7", {
method: "GET",
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
console.log(res.status, await res.json());
Réponse 200
{
"id": "qt-1",
"number": "1",
"subject": "Migration de la messagerie",
"status": "pending",
"issued_at": "2026-10-20",
"valid_until": "2026-11-16",
"subtotal": {
"amount": 45000,
"currency": "EUR"
},
"tax": {
"amount": 0,
"currency": "EUR"
},
"total": {
"amount": 45000,
"currency": "EUR"
},
"pdf_url": "https://api.corcelink.fr/v1/billing/quotes/qt-1/pdf",
"lines": [
{
"description": "Audit de la messagerie (Inventaire des boîtes)",
"period_start": null,
"period_end": null,
"quantity": 1,
"unit_price": {
"amount": 20000,
"currency": "EUR"
},
"discount": {
"amount": 0,
"currency": "EUR"
},
"amount": {
"amount": 20000,
"currency": "EUR"
}
},
{
"description": "Migration par boîte",
"period_start": null,
"period_end": null,
"quantity": 5,
"unit_price": {
"amount": 5556,
"currency": "EUR"
},
"discount": {
"amount": 2778,
"currency": "EUR"
},
"amount": {
"amount": 25002,
"currency": "EUR"
}
}
]
}
Essayer avec votre clé
Votre clé reste dans ce navigateur et n’est envoyée qu’à api.corcelink.fr.
Télécharger un devis
GET
/v1/billing/quotes/{quote_id}/pdfPermission : billing:read
Paramètres de chemin
| Champ | Type | Description |
|---|---|---|
quote_idobligatoire | texte | Format : ^qt-[0-9]+$. Exemple : "qt-7". |
Réponse 200
Le document PDF.
Erreurs
not_foundRessource introuvableservice_unavailableService momentanément indisponible- Et les erreurs communes :
missing_api_key,invalid_api_key,missing_scope,ip_not_allowed,rate_limited.
curl "https://api.corcelink.fr/v1/billing/quotes/qt-7/pdf" \
-H "Authorization: Bearer $CORCELINK_API_KEY" \
-o devis.pdf
import os, requests
r = requests.get(
"https://api.corcelink.fr/v1/billing/quotes/qt-7/pdf",
headers={"Authorization": f"Bearer {os.environ['CORCELINK_API_KEY']}"},
timeout=60,
)
r.raise_for_status()
open("devis.pdf", "wb").write(r.content)
import { writeFile } from "node:fs/promises";
const res = await fetch("https://api.corcelink.fr/v1/billing/quotes/qt-7/pdf", {
headers: { Authorization: `Bearer ${process.env.CORCELINK_API_KEY}` },
});
await writeFile("devis.pdf", Buffer.from(await res.arrayBuffer()));