/api/v1/outils-ia/note-de-fraisAPI Note de frais (PDF)
Génère une note de frais au format PDF, ou son détail calculé en JSON : TVA et montant HT de chaque dépense, indemnités kilométriques au barème fiscal 2026, avances et net à rembourser.
Tapez au moins 2 caractères pour lancer la recherche.
Présentation
Cet endpoint produit la même note de frais que le générateur en ligne du site : vous envoyez l'entreprise, le bénéficiaire, le mois concerné, les dépenses et les trajets, l'API renvoie un PDF A4 prêt à signer, ou les montants calculés en JSON pour les intégrer à votre logiciel.
Pour chaque dépense, la TVA est déduite du montant TTC selon le taux indiqué (20, 10, 5,5, 2,1 ou 0 %), puis le HT en est déduit, au centime près. Les indemnités kilométriques suivent le barème kilométrique 2026 de l'administration fiscale (revenus 2025, montants de l'arrêté du 27 mars 2023), selon le type de véhicule et sa puissance fiscale, avec une majoration de 20 % pour les véhicules électriques. Sans km_annuels, le taux de la première tranche s'applique ; avec, le taux moyen de la tranche correspondante. Le net à rembourser vaut le total TTC des frais plus les indemnités, moins les avances. Aucune donnée n'est conservée après la réponse.
Pour générer automatiquement les notes de frais mensuelles depuis un outil de saisie des dépenses, un logiciel de paie ou un tableur, ou pour contrôler des montants d'indemnités kilométriques. Pour un usage ponctuel, le générateur en ligne fait la même chose sans jeton : https://www.websource.fr/modele-note-de-frais (exemple rempli et modèle vierge à télécharger).
Sans jeton ni code : Modèle de note de frais en ligne.
Utilisation pas à pas
- 1Renseignez entreprise.nom, beneficiaire.nom et la periode (mois au format AAAA-MM).
- 2Ajoutez une ligne par dépense dans frais (date, categorie, description, montant_ttc, taux_tva) et une ligne par trajet dans indemnites_km (date, trajet, km, vehicule, puissance_cv).
- 3Indiquez si besoin km_annuels (kilométrage professionnel annuel, pour la tranche du barème) et avances (sommes déjà versées).
- 4Gardez format à 'pdf' pour recevoir le fichier (enregistrez la réponse binaire), ou passez-le à 'json' pour obtenir les montants calculés.
- 5Imprimez ou transmettez le PDF, faites-le signer et joignez les justificatifs.
Limites à connaître
- Au moins une ligne de frais ou d'indemnités kilométriques ; 100 lignes au maximum dans chacun des deux tableaux.
- Montants de 0 à 1 000 000 €, distances de 0 à 100 000 km par ligne ; textes de 140 caractères au plus (description, trajet).
- Dates au format AAAA-MM-JJ. Corps obligatoirement en JSON (Content-Type: application/json).
- Pas de logo dans le PDF généré par l'API (version 1) : utilisez le générateur en ligne pour un PDF avec logo.
- Le barème est appliqué tel quel : vérifiez les règles propres à votre entreprise (forfaits, plafonds) avec votre expert-comptable.
Endpoint et authentification
Chaque requête porte votre jeton dans l'en-tête Authorization, et le corps est envoyé en JSON (Content-Type: application/json). Le jeton est gratuit, sur demande depuis votre compte (formulaire en bas de page).
Authorization: Bearer VOTRE_JETONParamètres du corps (JSON)
| Paramètre | Type | Requis | Description |
|---|---|---|---|
| entreprise.nom | string | Requis | Raison sociale (80 caractères max). |
| entreprise.siret | string | Optionnel | SIRET, affiché tel quel (20 caractères max). |
| entreprise.adresse | string | Optionnel | Adresse de l'entreprise (140 caractères max). |
| beneficiaire.nom | string | Requis | Salarié ou dirigeant remboursé (80 caractères max). |
| beneficiaire.poste | string | Optionnel | Poste ou service (80 caractères max). |
| periode | string | Requis | Mois concerné, au format AAAA-MM (ex. 2026-09). |
| motif | string | Optionnel | Motif ou mission (160 caractères max). |
| frais[] | array<object> | Optionnel | Dépenses, 100 lignes max : date (AAAA-MM-JJ), categorie, description, montant_ttc, taux_tva (optionnel), justificatif (optionnel, n° de pièce). |
| frais[].categorie | string | Requis | 'transport', 'train', 'taxi', 'carburant', 'peage', 'repas', 'hebergement', 'fournitures', 'telecom' ou 'autre'. |
| frais[].taux_tva | number | Optionnel | 20, 10, 5.5, 2.1 ou 0. Par défaut selon la catégorie (0 pour transport, train, taxi et hébergement, 10 pour repas, 20 sinon). |
| indemnites_km[] | array<object> | Optionnel | Trajets en véhicule personnel, 100 lignes max : date, trajet, km, vehicule, puissance_cv, electrique. |
| indemnites_km[].vehicule | string | Optionnel | 'voiture' (défaut), 'moto' ou 'cyclomoteur' (50 cm³ et moins). |
| indemnites_km[].puissance_cv | int | Requis | Puissance fiscale en CV (carte grise). Voiture : 3 et moins à 7 et plus ; moto : 1-2, 3-5, plus de 5. Ignorée pour un cyclomoteur. |
| indemnites_km[].electrique | bool | Optionnel | true pour un véhicule électrique (+20 %). Défaut false. |
| km_annuels | number | Optionnel | Kilométrage professionnel annuel du véhicule, pour choisir la tranche du barème. Absent : première tranche. |
| avances | number | Optionnel | Avances déjà perçues, déduites du net à rembourser. Défaut 0. |
| format | string | Optionnel | 'pdf' (défaut) : fichier application/pdf ; 'json' : montants calculés. |
Exemples de code
Le même appel en plusieurs langages. Remplacez VOTRE_JETON par le jeton reçu par e-mail et gardez-le côté serveur (variable d'environnement), jamais dans un dépôt public.
curl -X POST https://www.websource.fr/api/v1/outils-ia/note-de-frais \
-H "Authorization: Bearer VOTRE_JETON" \
-H "Content-Type: application/json" \
-d '{"entreprise":{"nom":"Atelier Durand SARL","siret":"123 456 789 00012","adresse":"12 rue des Lilas, 69003 Lyon"},"beneficiaire":{"nom":"Camille Martin","poste":"Chargée de clientèle"},"periode":"2026-09","motif":"Salon professionnel à Paris","frais":[{"date":"2026-09-08","categorie":"train","description":"Billet TGV Lyon - Paris aller-retour","montant_ttc":118.4,"taux_tva":0,"justificatif":"J01"},{"date":"2026-09-08","categorie":"repas","description":"Déjeuner avec un client","montant_ttc":64.8,"taux_tva":10,"justificatif":"J02"}],"indemnites_km":[{"date":"2026-09-15","trajet":"Lyon - Chambéry aller-retour","km":214,"puissance_cv":5,"vehicule":"voiture"}],"avances":150,"format":"pdf"}' \
--fail-with-body -o note-de-frais.pdf<?php
$ch = curl_init('https://www.websource.fr/api/v1/outils-ia/note-de-frais');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer VOTRE_JETON',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'entreprise' => [
'nom' => 'Atelier Durand SARL',
'siret' => '123 456 789 00012',
'adresse' => '12 rue des Lilas, 69003 Lyon',
],
'beneficiaire' => [
'nom' => 'Camille Martin',
'poste' => 'Chargée de clientèle',
],
'periode' => '2026-09',
'motif' => 'Salon professionnel à Paris',
'frais' => [
[
'date' => '2026-09-08',
'categorie' => 'train',
'description' => 'Billet TGV Lyon - Paris aller-retour',
'montant_ttc' => 118.4,
'taux_tva' => 0,
'justificatif' => 'J01',
],
[
'date' => '2026-09-08',
'categorie' => 'repas',
'description' => 'Déjeuner avec un client',
'montant_ttc' => 64.8,
'taux_tva' => 10,
'justificatif' => 'J02',
],
],
'indemnites_km' => [
[
'date' => '2026-09-15',
'trajet' => 'Lyon - Chambéry aller-retour',
'km' => 214,
'puissance_cv' => 5,
'vehicule' => 'voiture',
],
],
'avances' => 150,
'format' => 'pdf',
], JSON_UNESCAPED_UNICODE),
]);
$pdf = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status === 200) {
file_put_contents('note-de-frais.pdf', $pdf);
} else {
print_r(json_decode($pdf, true)); // {"success": false, "error": "…"}
}
import requests
response = requests.post(
"https://www.websource.fr/api/v1/outils-ia/note-de-frais",
headers={"Authorization": "Bearer VOTRE_JETON"},
json={
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
},
timeout=60,
)
if response.ok:
with open("note-de-frais.pdf", "wb") as f:
f.write(response.content)
else:
print(response.json())
// Node.js 18+ (fetch natif)
import { writeFile } from "node:fs/promises";
const response = await fetch("https://www.websource.fr/api/v1/outils-ia/note-de-frais", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WEBSOURCE_API_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
}),
});
if (response.ok) {
await writeFile("note-de-frais.pdf", Buffer.from(await response.arrayBuffer()));
} else {
console.log(await response.json());
}
// ⚠️ Ne placez jamais votre jeton dans du code exécuté dans le navigateur.
// Appelez l'API depuis votre serveur (route API Next.js, Express…) qui renvoie
// le PDF tel quel, et laissez React appeler cette route : ici "/api/websource/note-de-frais".
export default function NoteDeFrais() {
async function download() {
const response = await fetch("/api/websource/note-de-frais", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
}),
});
if (!response.ok) return alert((await response.json()).error);
const url = URL.createObjectURL(await response.blob());
const a = Object.assign(document.createElement("a"), { href: url, download: "note-de-frais.pdf" });
a.click();
URL.revokeObjectURL(url);
}
return <button onClick={download}>Télécharger la note de frais</button>;
}
require "net/http"
require "json"
uri = URI("https://www.websource.fr/api/v1/outils-ia/note-de-frais")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer VOTRE_JETON"
request["Content-Type"] = "application/json"
request.body = <<~JSON
{
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
}
JSON
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
if response.is_a?(Net::HTTPSuccess)
File.binwrite("note-de-frais.pdf", response.body)
else
puts JSON.parse(response.body)
end
package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
payload := []byte(`{"entreprise":{"nom":"Atelier Durand SARL","siret":"123 456 789 00012","adresse":"12 rue des Lilas, 69003 Lyon"},"beneficiaire":{"nom":"Camille Martin","poste":"Chargée de clientèle"},"periode":"2026-09","motif":"Salon professionnel à Paris","frais":[{"date":"2026-09-08","categorie":"train","description":"Billet TGV Lyon - Paris aller-retour","montant_ttc":118.4,"taux_tva":0,"justificatif":"J01"},{"date":"2026-09-08","categorie":"repas","description":"Déjeuner avec un client","montant_ttc":64.8,"taux_tva":10,"justificatif":"J02"}],"indemnites_km":[{"date":"2026-09-15","trajet":"Lyon - Chambéry aller-retour","km":214,"puissance_cv":5,"vehicule":"voiture"}],"avances":150,"format":"pdf"}`)
req, _ := http.NewRequest("POST", "https://www.websource.fr/api/v1/outils-ia/note-de-frais", bytes.NewBuffer(payload))
req.Header.Set("Authorization", "Bearer VOTRE_JETON")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
if res.StatusCode != http.StatusOK {
fmt.Println(string(body))
return
}
os.WriteFile("note-de-frais.pdf", body, 0644)
}
using System.Net.Http;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer VOTRE_JETON");
var json = """
{
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
}
""";
var response = await client.PostAsync(
"https://www.websource.fr/api/v1/outils-ia/note-de-frais",
new StringContent(json, Encoding.UTF8, "application/json"));
if (response.IsSuccessStatusCode)
await File.WriteAllBytesAsync("note-de-frais.pdf", await response.Content.ReadAsByteArrayAsync());
else
Console.WriteLine(await response.Content.ReadAsStringAsync());
// Java 15+ (java.net.http et blocs de texte)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Path;
public class Example {
public static void main(String[] args) throws Exception {
String json = """
{
"entreprise": {
"nom": "Atelier Durand SARL",
"siret": "123 456 789 00012",
"adresse": "12 rue des Lilas, 69003 Lyon"
},
"beneficiaire": {
"nom": "Camille Martin",
"poste": "Chargée de clientèle"
},
"periode": "2026-09",
"motif": "Salon professionnel à Paris",
"frais": [
{
"date": "2026-09-08",
"categorie": "train",
"description": "Billet TGV Lyon - Paris aller-retour",
"montant_ttc": 118.4,
"taux_tva": 0,
"justificatif": "J01"
},
{
"date": "2026-09-08",
"categorie": "repas",
"description": "Déjeuner avec un client",
"montant_ttc": 64.8,
"taux_tva": 10,
"justificatif": "J02"
}
],
"indemnites_km": [
{
"date": "2026-09-15",
"trajet": "Lyon - Chambéry aller-retour",
"km": 214,
"puissance_cv": 5,
"vehicule": "voiture"
}
],
"avances": 150,
"format": "pdf"
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://www.websource.fr/api/v1/outils-ia/note-de-frais"))
.header("Authorization", "Bearer VOTRE_JETON")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
HttpResponse<byte[]> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofByteArray());
if (response.statusCode() == 200) {
Files.write(Path.of("note-de-frais.pdf"), response.body());
} else {
System.out.println(new String(response.body()));
}
}
}
Réponses
Avec format = 'pdf' (par défaut), la réponse est le fichier lui-même : Content-Type: application/pdf et Content-Disposition: attachment; filename="note-de-frais-camille-martin-2026-09.pdf". Enregistrez le corps binaire tel quel, comme dans les exemples de code. Avec format = 'json', la réponse détaille les montants calculés :
{
"success": true,
"entreprise": { "nom": "Atelier Durand SARL", "siret": "123 456 789 00012", "adresse": "12 rue des Lilas, 69003 Lyon" },
"beneficiaire": { "nom": "Camille Martin", "poste": "Chargée de clientèle" },
"periode": { "mois": "2026-09", "du": "2026-09-01", "au": "2026-09-30" },
"motif": "Salon professionnel à Paris",
"frais": [
{ "date": "2026-09-08", "categorie": "train", "categorie_libelle": "Train / avion", "description": "Billet TGV Lyon - Paris aller-retour", "justificatif": "J01", "montant_ttc": 118.4, "taux_tva": 0, "montant_tva": 0, "montant_ht": 118.4 },
{ "date": "2026-09-08", "categorie": "repas", "categorie_libelle": "Repas", "description": "Déjeuner avec un client", "justificatif": "J02", "montant_ttc": 64.8, "taux_tva": 10, "montant_tva": 5.89, "montant_ht": 58.91 }
],
"indemnites_km": [
{ "date": "2026-09-15", "trajet": "Lyon - Chambéry aller-retour", "vehicule": "voiture", "puissance": "5 CV", "electrique": false, "km": 214, "taux_km": 0.636, "montant": 136.1 }
],
"bareme_km": { "annee": 2026, "revenus": 2025, "source": "Arrêté du 27 mars 2023, barème 2026 (revenus 2025)", "km_annuels": null },
"totaux": {
"total_ht": 177.31,
"total_tva": 5.89,
"total_ttc": 183.2,
"total_km": 214,
"indemnites_km": 136.1,
"total_a_rembourser": 319.3,
"avances": 150,
"net_a_rembourser": 169.3,
"justificatifs": 2
},
"fichier": "note-de-frais-camille-martin-2026-09.pdf"
}| Code | Signification | Que faire |
|---|---|---|
| 400 | Paramètre manquant ou invalide | Lisez le champ error, il précise la limite dépassée. |
| 401 | Jeton absent, invalide ou révoqué | Vérifiez l'en-tête Authorization. |
| 429 | Limite horaire atteinte | Attendez l'échéance indiquée dans Retry-After. |
| 503 | Service momentanément indisponible | Réessayez après quelques instants. |
Toute erreur a la forme {"success": false, "error": "…"}. Limite par défaut : 60 requêtes par heure et par jeton (ajustable sur demande).
Demander un accès API
Gratuit. Un jeton vous est envoyé par e-mail une fois la demande approuvée. Il donne accès à tous les outils de cette API.
Pour demander un accès, connectez-vous ou créez un compte gratuit. Vous reviendrez ensuite directement sur ce formulaire.