Aller au contenu
REST API / v1UNE API. VOTRE LOGICIEL.
La facturation, intégrée à votre produit. Connectez vos clients, vos documents et vos paiements à Invoicing.plus. Des premiers appels aux intégrations métier, retrouvez les repères et les contrats dont vous avez besoin.
JSON / HTTPS X-Company 85 opérations documentées
Démarrage Bienvenue dans le guide API Tout ce qu’il faut pour connecter votre logiciel à Invoicing.plus.
L’API publique v1 couvre les clients, produits, devis, commandes, factures, paiements et plusieurs ressources de gestion commerciale. Chaque opération ci-dessous provient du contrat OpenAPI et des routes Laravel.
Le guide explique les parcours d’intégration. Swagger fournit la référence technique et permet de tester les appels. Utilisez les deux ensemble.
URL de base de production : https://api.invoicing.plus/v1. La version est portée par /v1 dans le chemin. Le guide est public et ne nécessite pas de connexion.
Important Ces exemples n’exécutent aucun appel. Remplacez les identifiants fictifs par les valeurs de votre société. Conservez vos identifiants et tokens côté serveur.
cURL · GET /companies Copier
curl --request GET 'https://api.invoicing.plus/v1/companies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
Démarrage Bienvenue dans le guide API Tout ce qu’il faut pour connecter votre logiciel à Invoicing.plus.
L’API publique v1 couvre les clients, produits, devis, commandes, factures, paiements et plusieurs ressources de gestion commerciale. Chaque opération ci-dessous provient du contrat OpenAPI et des routes Laravel.
Le guide explique les parcours d’intégration. Swagger fournit la référence technique et permet de tester les appels. Utilisez les deux ensemble.
URL de base de production : https://api.invoicing.plus/v1. La version est portée par /v1 dans le chemin. Le guide est public et ne nécessite pas de connexion.
Important Ces exemples n’exécutent aucun appel. Remplacez les identifiants fictifs par les valeurs de votre société. Conservez vos identifiants et tokens côté serveur.
cURL · GET /companies Copier
curl --request GET 'https://api.invoicing.plus/v1/companies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
Démarrage Authentification et premier appel Un token personnel, puis une société explicitement sélectionnée.
1. Envoyez POST /token avec email et password d’un compte existant. Récupérez data.token et transmettez Authorization: Bearer YOUR_API_TOKEN. short_token: true limite la durée à 30 minutes ; sinon cette route n’ajoute pas d’expiration propre au token. Une expiration globale peut s’appliquer.
2. Appelez GET /companies sans X-Company. Conservez data[].id : c’est un identifiant opaque, pas l’ID numérique interne.
3. Ajoutez X-Company: YOUR_COMPANY_ID à chaque appel métier. Le token ne donne accès qu’aux sociétés et aux opérations autorisées pour cet utilisateur. Révoquez le token courant avec POST /revoke-token.
Démarrage URL de base et environnements Choisissez explicitement l’environnement de destination.
La production utilise https://api.invoicing.plus/v1. Le projet prévoit également des configurations de vhost API sandbox et un serveur OpenAPI configurable avec L5_SWAGGER_CONST_HOST. Aucune URL publique de sandbox ni procédure d’accès universelle n’a pu être confirmée dans le code : demandez un environnement dédié avant les tests d’écriture.
Les exemples utilisent uniquement des données fictives. Une création, une validation, un envoi ou une suppression exécutée depuis Swagger agit réellement sur l’environnement sélectionné.
Concepts généraux Sociétés et gestion des accès Une requête métier appartient à une seule société.
L’en-tête X-Company est comparé au unique_hash d’une société accessible à l’utilisateur. Le serveur fixe ensuite le contexte de société et applique les permissions Bouncer. Ne réutilisez pas un ID de client, article ou document d’une autre société.
X-Company absent ou inaccessible peut produire 401 ; un droit métier manquant produit 403. Certains documents hors du périmètre visible répondent 404. POST /company ne requiert pas de société sélectionnée. POST /company/user crée un administrateur et nécessite les droits d’administration du dossier.
Concepts généraux JSON, dates et montants Des valeurs typées, exprimées dans la devise du document.
Envoyez Accept: application/json et Content-Type: application/json pour un corps JSON. L’import d’achat utilise multipart/form-data et les téléchargements renvoient application/pdf. Les réponses de succès JSON sont généralement enveloppées dans data.
Les dates de document utilisent YYYY-MM-DD. Les timestamps documentés utilisent le format ISO 8601. Transmettez les nombres comme nombres JSON, les booléens comme true ou false, et non comme chaînes. Les identifiants de société restent des chaînes opaques.
Les prix d’articles, prix de lignes, totaux de factures et montants de paiements exposés par cette API sont en unité monétaire : 75.5 représente 75,50 dans la devise concernée, pas 75,50 centimes. Les conversions internes ne doivent pas être reproduites dans le client. Le serveur calcule les taxes et les totaux.
Les endpoints utilisant api_validation rejettent les propriétés non prévues. Les champs personnalisés dépendent de la configuration de la société ; leur liste ne peut pas être déduite d’un contrat statique.
Concepts généraux Pagination, recherche et filtres Les paramètres dépendent de chaque ressource.
GET /customers, /invoices, /estimates et /orders acceptent page et limit (1 à 1000, 1000 par défaut). Ces listes fournissent meta.current_page, meta.last_page, meta.total et meta.has_more. Parcourez les pages jusqu’à has_more: false.
search recherche les clients par coordonnées et les documents par numéro, référence ou nom de client selon la route. Les filtres status ne sont pas universels : active/inactive pour les clients, DRAFT/DONE pour les factures, CURRENT/ALL pour devis et commandes.
from_date et to_date filtrent la date du document, pas la date de modification de son statut. Pour un suivi périodique des devis et commandes, utilisez status=ALL et parcourez toutes les pages. Il n’existe pas de curseur universel de synchronisation.
GET /items et /payments renvoient une collection sans pagination. Les préfacturations ont leur propre pagination dans metadata. Consultez les paramètres et les schémas propres à chaque opération.
Concepts généraux Erreurs, codes HTTP et quotas Traitez les erreurs et les nouvelles tentatives explicitement.
200 signifie succès, 201 création et 204 succès sans contenu selon l’opération. La création d’un paiement renvoie 200. 401 indique une authentification ou un contexte société invalide ; 403 des droits insuffisants ; 404 une ressource absente ou invisible ; 409 un conflit de statut ; 422 une validation refusée ; 429 un quota dépassé. Certaines opérations documentent aussi 400 ou 503.
Les erreurs de validation historiques utilisent message et debug.errors, debug.fatal_error ou debug.unexpected_attributes. Les Form Requests Laravel utilisent message et errors ; certaines créations de documents peuvent renvoyer erreur. Ne supposez pas une enveloppe d’erreur unique.
Quota standard : 240 appels par minute, partagés entre les endpoints et les sociétés d’un même utilisateur authentifié, ou par IP sans authentification. La configuration serveur peut prévoir des dérogations temporaires. Lisez X-RateLimit-Limit et X-RateLimit-Remaining. Après 429, attendez Retry-After secondes ; X-RateLimit-Reset indique un timestamp Unix.
POST /token ajoute deux limites : 5 tentatives/minute par couple email et IP, et 30/minute par IP. D’autres endpoints peuvent avoir leurs propres limites.
Aucun mécanisme public général de clé d’idempotence ni abonnement webhook sortant n’a été confirmé pour les ressources décrites ici. Après un timeout sur une écriture, vérifiez d’abord si la ressource existe avant de rejouer l’appel. Les webhooks d’intégrations internes ne constituent pas un service webhook public.
Concepts généraux Périmètre et limites connues Un contrat vérifié vaut mieux qu’une promesse implicite.
La référence est générée depuis les annotations OpenAPI. Les champs et réponses non décrits sont signalés explicitement. Les exemples de réponse sont des extraits illustratifs, jamais des captures de données clients.
Les routes de journal et de médias de projets, équipes People, OCR et achats électroniques ne disposent pas encore de contrats OpenAPI complets. Le guide ne propose pas d’exemples non vérifiés pour ces opérations. Les intégrations spécifiques, mobiles et internes ne sont pas présentées comme API génériques.
La route GET /customer/name/{name} référence une méthode getCustomerByName absente du contrôleur : ne l’utilisez pas. Préférez GET /customers?search=Exemple ou les recherches par code, compte et email. Ce défaut métier préexistant nécessite une correction séparée.
Ressources API Disponibilité Contrats, paramètres et exemples pour cette ressource.
GET Un simple appel API pour se chauffer #
https://api.invoicing.plus/v1/check
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/check' \
--header 'Accept: application/json'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/check", {
method: 'GET',
headers: {
"Accept": "application/json"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
))
->send('GET', 'https://api.invoicing.plus/v1/check')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 503Service Unavailable
Voir le contrat dans Swagger ↗
Ressources API Tokens et identité Contrats, paramètres et exemples pour cette ressource.
POST Obtenir un token personnel #
https://api.invoicing.plus/v1/token
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
emailstring
Obligatoire Adresse email d'un utilisateur connu
Format: email
passwordstring
Obligatoire Mot de passe de l'utilisateur
Format: password
short_tokenboolean
Facultatif true : expiration après 30 minutes ; false : aucun délai propre au token ajouté ici.
Valeur par défaut: false
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/token", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/token', ['json' => array (
'email' => 'demo@example.com',
'password' => 'YOUR_ACCOUNT_PASSWORD',
'short_token' => true,
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"type": "Bearer",
"token": "TOKEN_FICTIF_A_REMPLACER"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.typestring
data.tokenstring
Codes HTTP et erreurs
HTTP Description / contraintes
422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Token émis 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Afficher l’utilisateur connecté #
https://api.invoicing.plus/v1/who-i-am
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/who-i-am' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/who-i-am", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('GET', 'https://api.invoicing.plus/v1/who-i-am')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Camille Exemple",
"email": "demo@example.com",
"phone": "0601020304",
"language": "fr"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.emailstring
Format: email
data.phonestring
Accepte null
data.languagestring
Uniquement dans GET /who-i-am.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
POST Supprimer le token courant #
https://api.invoicing.plus/v1/revoke-token
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/revoke-token' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/revoke-token", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('POST', 'https://api.invoicing.plus/v1/revoke-token')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
Ressources API Sociétés et utilisateurs Contrats, paramètres et exemples pour cette ressource.
GET Lister les sociétés accessibles et leurs identifiants X-Company #
https://api.invoicing.plus/v1/companies
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/companies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/companies", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('GET', 'https://api.invoicing.plus/v1/companies')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
]
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idstring
Identifiant opaque à transmettre tel quel dans X-Company, jamais l'ID numérique interne.
data[].namestring
data[].company_namestring
data[].logostring
Accepte null
data[].colorstring
Accepte null
data[].is_adminboolean
data[].permissionsobject
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Afficher les coordonnées de la société #
https://api.invoicing.plus/v1/company
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/company' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/company", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/company')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idstring
Identifiant opaque à transmettre tel quel dans X-Company, jamais l'ID numérique interne.
data.namestring
data.company_namestring
data.logostring
Accepte null
data.colorstring
Accepte null
data.is_adminboolean
data.permissionsobject
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
POST Créer une société pour l'utilisateur connecté #
https://api.invoicing.plus/v1/company
Authentification requise, sans X-Company. Le créateur devient administrateur. Utiliser data.id de la réponse comme X-Company pour les appels suivants. La création initialise les paramètres et le logo de la société.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
company_namestring
Obligatoire
address_street_1string
Obligatoire
address_street_2string
Facultatif
Accepte null
zipstring
Obligatoire
citystring
Obligatoire
emailstring
Obligatoire
Format: email
phonestring
Facultatif
Accepte null
crnstring
Obligatoire SIREN ou SIRET de la société.
vatstring
Facultatif
Accepte null
logostring
Facultatif Image encodée en base64 ; omettre pour utiliser le logo par défaut.
Accepte null
footer_documentstring
Facultatif
Accepte null
pricenumber
Facultatif Facultatif, ignoré : tarif issu du price_child du premier dossier accessible (par ID croissant), ou 7 si absent.
Accepte null
company_group_idinteger
Facultatif Groupe du partenaire connecté uniquement ; équipe interne autorisée à choisir tout groupe existant.
Accepte null
settingsobject
Facultatif
Accepte null
settings.languagestring
Facultatif Initialisation en français (pays France) ou espagnol (pays Espagne).
Valeur par défaut: fr fr · es
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/company' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"address_street_1": "10 rue des Ateliers",
"address_street_2": "Bâtiment A",
"zip": "75001",
"city": "Paris",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "12345678900012",
"vat": "FR00123456789"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/company", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"address_street_1": "10 rue des Ateliers",
"address_street_2": "Bâtiment A",
"zip": "75001",
"city": "Paris",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "12345678900012",
"vat": "FR00123456789"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/company', ['json' => array (
'name' => 'Atelier Exemple',
'company_name' => 'SAS Atelier Exemple',
'address_street_1' => '10 rue des Ateliers',
'address_street_2' => 'Bâtiment A',
'zip' => '75001',
'city' => 'Paris',
'email' => 'demo@example.com',
'phone' => '0102030405',
'crn' => '12345678900012',
'vat' => 'FR00123456789',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idstring
Identifiant opaque à transmettre tel quel dans X-Company, jamais l'ID numérique interne.
data.namestring
data.company_namestring
data.logostring
Accepte null
data.colorstring
Accepte null
data.is_adminboolean
data.permissionsobject
Codes HTTP et erreurs
HTTP Description / contraintes
201Société créée 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
POST Créer un administrateur dans la société sélectionnée #
https://api.invoicing.plus/v1/company/user
Réservé aux administrateurs de la société. Crée un nouveau compte avec le rôle admin et le rattache à la société indiquée par X-Company. La réponse historique est HTTP 200. Aucun token n'est retourné ; utiliser POST /token pour connecter ce nouvel utilisateur.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire data.id obtenu via GET /companies ou POST /company.
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
emailstring
Obligatoire Adresse unique parmi tous les utilisateurs. Cette route crée un nouvel utilisateur, elle ne rattache pas un compte existant.
Format: email
passwordstring
Obligatoire Au moins une minuscule, une majuscule et un chiffre.
Format: password
phonestring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/company/user' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"email": "demo@example.com",
"password": "ExempleDemo42!",
"phone": "0601020304"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/company/user", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"email": "demo@example.com",
"password": "ExempleDemo42!",
"phone": "0601020304"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/company/user', ['json' => array (
'name' => 'Camille Exemple',
'email' => 'demo@example.com',
'password' => 'ExempleDemo42!',
'phone' => '0601020304',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Camille Exemple",
"email": "demo@example.com",
"phone": "0601020304",
"language": "fr"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.emailstring
Format: email
data.phonestring
Accepte null
data.languagestring
Uniquement dans GET /who-i-am.
Codes HTTP et erreurs
HTTP Description / contraintes
200Administrateur créé et rattaché 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
Ressources API Clients Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des clients de la société. #
https://api.invoicing.plus/v1/customers
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
pageinteger
Facultatif Page demandée
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif Nombre de résultats par page
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
searchstring
Facultatif Recherche par nom ou référence du document
statusstring
Facultatif Filtre de statut
active · inactive
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customers' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customers", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customers')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].namestring
data[].company_namestring
data[].codestring
data[].account_codestring
data[].emailstring
data[].phonestring
data[].crnstring
data[].nicstring
data[].vatstring
data[].billing_address_1string
data[].billing_zipstring
data[].billing_citystring
data[].is_webboolean
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Afficher les coordonnées du client. #
https://api.invoicing.plus/v1/customer/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/customer/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Facultatif
company_namestring
Facultatif
codestring
Facultatif
Accepte null
sequencenumber
Facultatif
Accepte null
account_codestring
Facultatif
Accepte null
emailstring
Facultatif
Accepte null
phonestring
Facultatif
Accepte null
crnstring
Facultatif
Accepte null
nicstring
Facultatif
Accepte null
vatstring
Facultatif
Accepte null
nafNon précisé
Facultatif
Accepte null
billing_address_1string
Facultatif
Accepte null
billing_address_2string
Facultatif
Accepte null
billing_zipstring
Facultatif
Accepte null
billing_citystring
Facultatif
Accepte null
billing_country_idinteger
Facultatif
Accepte null
billing_countrystring
Facultatif
Accepte null
is_webboolean
Facultatif
Accepte null
is_private_personboolean
Facultatif
Accepte null
civilitystring
Facultatif
Accepte null
activitystring
Facultatif
Accepte null
ibanstring
Facultatif
Accepte null
bicstring
Facultatif
Accepte null
rumstring
Facultatif
Accepte null
rum_xml_typestring
Facultatif
Accepte null
rum_datestring
Facultatif
Format: date Accepte null
notesstring
Facultatif
Accepte null
payment_method_idinteger
Facultatif
Accepte null
currency_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"email": "demo@example.com"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/customer/123', ['json' => array (
'name' => 'Atelier Exemple',
'email' => 'demo@example.com',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
DELETE Supprimer un client #
https://api.invoicing.plus/v1/customer/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/customer/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": "Deleted."
}
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/customer
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
company_namestring
Facultatif
Accepte null
codestring
Facultatif
Accepte null
sequencenumber
Facultatif
Accepte null
account_codestring
Facultatif
Accepte null
emailstring
Facultatif
Accepte null
phonestring
Facultatif
Accepte null
crnstring
Facultatif
Accepte null
nicstring
Facultatif
Accepte null
vatstring
Facultatif
Accepte null
nafNon précisé
Facultatif
Accepte null
billing_address_1string
Facultatif
Accepte null
billing_address_2string
Facultatif
Accepte null
billing_zipstring
Facultatif
Accepte null
billing_citystring
Facultatif
Accepte null
billing_country_idinteger
Facultatif
Accepte null
billing_countrystring
Facultatif
Accepte null
is_webboolean
Facultatif
Accepte null
is_private_personboolean
Facultatif
Accepte null
civilitystring
Facultatif
Accepte null
activitystring
Facultatif
Accepte null
ibanNon précisé
Facultatif
Accepte null
bicNon précisé
Facultatif
Accepte null
rumstring
Facultatif
Accepte null
rum_xml_typestring
Facultatif
Accepte null
rum_datestring
Facultatif
Format: date Accepte null
notesstring
Facultatif
Accepte null
payment_method_idinteger
Facultatif
Accepte null
currency_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/customer' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/customer', ['json' => array (
'name' => 'Atelier Exemple',
'company_name' => 'SAS Atelier Exemple',
'email' => 'demo@example.com',
'billing_country' => 'FR',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
GET Rechercher un client : code #
https://api.invoicing.plus/v1/customer/code/{code}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
codestring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customer/code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/code/DEMO-001')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
GET Rechercher un client : account-code #
https://api.invoicing.plus/v1/customer/account-code/{code}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
codestring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customer/account-code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/account-code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/account-code/DEMO-001')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
GET Rechercher un client : email #
https://api.invoicing.plus/v1/customer/email/{email}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
emailstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customer/email/demo%40example.com' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/customer/email/demo%40example.com", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/email/demo%40example.com')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
Ressources API Contacts Contrats, paramètres et exemples pour cette ressource.
https://api.invoicing.plus/v1/contact
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
firstnamestring
Facultatif
Accepte null
lastnamestring
Facultatif
Accepte null
emailstring
Facultatif
Accepte null
phonestring
Facultatif
Accepte null
phone2Non précisé
Facultatif
Accepte null
auto_recipient_emailboolean
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/contact' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"firstname": "Camille",
"lastname": "Exemple",
"email": "demo@example.com",
"phone": "0102030405"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/contact", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"firstname": "Camille",
"lastname": "Exemple",
"email": "demo@example.com",
"phone": "0102030405"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/contact', ['json' => array (
'name' => 'Camille Exemple',
'firstname' => 'Camille',
'lastname' => 'Exemple',
'email' => 'demo@example.com',
'phone' => '0102030405',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
POST Associer un contact à un client #
https://api.invoicing.plus/v1/contact/{id}/customer/{target}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
targetstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/contact/123/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/contact/123/customer/123", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/contact/123/customer/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
Ressources API Produits et services Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des produits de la société. #
https://api.invoicing.plus/v1/items
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/items' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/items", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/items')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
]
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].namestring
data[].descriptionstring
data[].codestring
data[].account_codestring
data[].pricenumber
data[].ecotaxenumber
data[].default_tax_idinteger
data[].default_tax_namestring
data[].unit_idinteger
data[].unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Afficher les détails du produit #
https://api.invoicing.plus/v1/item/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Produit ou service. Prix en unité monétaire, pas en centimes. Les noms de TVA et unité sont conditionnels ; currency contient id et name si une devise existe.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/item/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Facultatif
Accepte null
descriptionstring
Facultatif
Accepte null
codestring
Facultatif
Accepte null
account_codestring
Facultatif
Accepte null
pricenumber
Facultatif
Accepte null
default_tax_idinteger
Facultatif
Accepte null
unit_idinteger
Facultatif
Accepte null
currency_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"price": 80
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"price": 80
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/item/123', ['json' => array (
'price' => 80,
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Produit ou service. Prix en unité monétaire, pas en centimes. Les noms de TVA et unité sont conditionnels ; currency contient id et name si une devise existe.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
DELETE Supprimer un produit #
https://api.invoicing.plus/v1/item/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/item/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/item
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
descriptionstring
Facultatif
Accepte null
codestring
Facultatif
Accepte null
account_codestring
Facultatif
Accepte null
pricenumber
Facultatif
Accepte null
default_tax_idinteger
Facultatif
Accepte null
unit_idinteger
Facultatif
Accepte null
currency_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/item' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/item', ['json' => array (
'name' => 'Conseil technique',
'code' => 'DEMO-001',
'price' => 75.5,
'default_tax_id' => 12,
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Produit ou service. Prix en unité monétaire, pas en centimes. Les noms de TVA et unité sont conditionnels ; currency contient id et name si une devise existe.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
GET Rechercher un produit : name #
https://api.invoicing.plus/v1/item/name/{name}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/item/name/Atelier%20Exemple' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item/name/Atelier%20Exemple", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/name/Atelier%20Exemple')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Produit ou service. Prix en unité monétaire, pas en centimes. Les noms de TVA et unité sont conditionnels ; currency contient id et name si une devise existe.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
GET Rechercher un produit : code #
https://api.invoicing.plus/v1/item/code/{code}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
codestring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/item/code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/item/code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/code/DEMO-001')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Produit ou service. Prix en unité monétaire, pas en centimes. Les noms de TVA et unité sont conditionnels ; currency contient id et name si une devise existe.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
Ressources API TVA Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des TVA. #
https://api.invoicing.plus/v1/tax-types
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/tax-types' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/tax-types", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/tax-types')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/tax-type
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
percentnumber
Obligatoire
account_codestring
Facultatif
codestring
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/tax-type' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/tax-type", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/tax-type', ['json' => array (
'name' => 'TVA 8.5 %',
'percent' => 8.5,
'account_code' => '445664',
'code' => '1',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/tax-type/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Facultatif
percentnumber
Facultatif
account_codestring
Facultatif
codestring
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/tax-type/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/tax-type/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/tax-type/123', ['json' => array (
'name' => 'TVA 8.5 %',
'percent' => 8.5,
'account_code' => '445664',
'code' => '1',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
Ressources API Unités Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des unités. #
https://api.invoicing.plus/v1/units
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/units' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/units", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/units')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/unit
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
pluralstring
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/unit' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "forfait",
"plural": "forfaits"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/unit", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "forfait",
"plural": "forfaits"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/unit', ['json' => array (
'name' => 'forfait',
'plural' => 'forfaits',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
Ressources API Devis Contrats, paramètres et exemples pour cette ressource.
L’API expose la liste, la consultation, la création et le PDF. Aucune route publique de modification de devis ou de changement arbitraire de statut n’est exposée. CURRENT inclut DRAFT, ACCEPTED, ORDERED et PARTIAL_INVOICED.
GET Obtenir la liste de vos devis. #
https://api.invoicing.plus/v1/estimates
Pour le suivi périodique, utiliser status=ALL et parcourir toutes les pages. from_date et to_date filtrent la date du document, pas celle de changement de statut.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
statusstring
Facultatif ALL : tous les statuts ; CURRENT : DRAFT, ACCEPTED, ORDERED, PARTIAL_INVOICED. Sans filtre, tous les statuts sont renvoyés.
CURRENT · ALL
searchstring
Facultatif Recherche dans le numéro de devis ou le nom du client.
pageinteger
Facultatif Page demandée.
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif Nombre de documents par page.
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
from_datestring
Facultatif Filtrer les devis à partir de cette date (YYYY-MM-DD).
Format: date
to_datestring
Facultatif Filtrer les devis jusqu'à cette date (YYYY-MM-DD).
Format: date
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/estimates' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/estimates", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimates')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 123,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "DEV20260001",
"reference": "AFFAIRE-001",
"status": "ACCEPTED",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
]
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].customer_idinteger
data[].customerobject
data[].customer.namestring
data[].estimate_datestring
Format: date
data[].expiry_datestring
Format: date Accepte null
data[].estimate_numberstring
Numéro du document : DEVxxxx pour un devis, COMxxxx pour une commande (le nom du champ reste estimate_number).
data[].referencestring
Référence libre du document, distincte du devis d'origine.
Accepte null
data[].statusstring
Statut métier courant, renvoyé tel qu'enregistré. Les commandes peuvent notamment être DRAFT, PARTIAL_INVOICED, INVOICED, ARCHIVED ou DELIVERED ; les devis également SENT, VIEWED, EXPIRED, ACCEPTED, REJECTED ou ORDERED selon leur parcours.
data[].status_changed_atstring
Format: date-time Accepte null
data[].updated_atstring
Format: date-time Accepte null
data[].titlestring
Accepte null
data[].notesstring
Accepte null
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].payment_method_idinteger
Accepte null
data[].linesarray
data[].lines[].line_numberinteger
Position dans le tableau lines, à partir de 1, lignes de titre comprises. Ce numéro peut changer lors d'un ajout, d'une suppression ou d'un déplacement de ligne et ne constitue pas un identifiant stable.
Minimum: 1
data[].lines[].item_idinteger
Accepte null
data[].lines[].is_titleboolean
Accepte null
data[].lines[].titlestring
Accepte null
data[].lines[].namestring
Accepte null
data[].lines[].replace_namestring
Accepte null
data[].lines[].descriptionstring
Accepte null
data[].lines[].quantitynumber
Accepte null
data[].lines[].unitstring
Unité enregistrée sur la ligne du document (forfait, pièce, heure…), indépendamment de l'unité actuelle du produit.
Accepte null
data[].lines[].pricenumber
Accepte null
data[].lines[].discount_typestring
Accepte null
data[].lines[].discountnumber
Accepte null
data[].lines[].is_ttcboolean
Accepte null
data[].lines[].sub_totalnumber
Accepte null
data[].lines[].taxnumber
Accepte null
data[].lines[].totalnumber
Accepte null
data[].lines[].tax_type_idinteger
Accepte null
data[].lines[].tax_typeobject
Accepte null
data[].lines[].tax_type.idinteger
data[].lines[].tax_type.namestring
data[].lines[].tax_type.percentnumber
data[].lines[].tax_type.amountnumber
Présent pour les anciennes lignes utilisant la relation taxes.
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 200OK 429Limite par défaut de l'API publique : 240 appels par minute, partagée entre les endpoints et les sociétés pour un même utilisateur authentifié (par IP hors authentification). Une dérogation temporaire peut être configurée côté serveur pour une reprise initiale de données ; elle expire automatiquement. Le plafond effectif est indiqué par X-RateLimit-Limit sur les réponses. Quelques appels par quart d'heure et par société sont compatibles avec la limite standard. Après HTTP 429, attendre le délai Retry-After avant de réessayer. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/estimate/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/estimate/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/estimate/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimate/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "DEV20260001",
"reference": "AFFAIRE-001",
"status": "ACCEPTED",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
]
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Devis ou commande. Les montants sont exprimés en unité monétaire (ex. euros), pas en centimes. status_changed_at est la date du dernier changement de statut enregistré depuis la mise en place du suivi ; null pour les documents antérieurs sans nouveau changement. updated_at désigne toute modification et ne constitue pas une date de changement d'état. Dates horaires au format ISO 8601 en UTC.
data.idinteger
data.customer_idinteger
data.customerobject
data.customer.namestring
data.estimate_datestring
Format: date
data.expiry_datestring
Format: date Accepte null
data.estimate_numberstring
Numéro du document : DEVxxxx pour un devis, COMxxxx pour une commande (le nom du champ reste estimate_number).
data.referencestring
Référence libre du document, distincte du devis d'origine.
Accepte null
data.statusstring
Statut métier courant, renvoyé tel qu'enregistré. Les commandes peuvent notamment être DRAFT, PARTIAL_INVOICED, INVOICED, ARCHIVED ou DELIVERED ; les devis également SENT, VIEWED, EXPIRED, ACCEPTED, REJECTED ou ORDERED selon leur parcours.
data.status_changed_atstring
Format: date-time Accepte null
data.updated_atstring
Format: date-time Accepte null
data.titlestring
Accepte null
data.notesstring
Accepte null
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.payment_method_idinteger
Accepte null
data.linesarray
data.lines[].line_numberinteger
Position dans le tableau lines, à partir de 1, lignes de titre comprises. Ce numéro peut changer lors d'un ajout, d'une suppression ou d'un déplacement de ligne et ne constitue pas un identifiant stable.
Minimum: 1
data.lines[].item_idinteger
Accepte null
data.lines[].is_titleboolean
Accepte null
data.lines[].titlestring
Accepte null
data.lines[].namestring
Accepte null
data.lines[].replace_namestring
Accepte null
data.lines[].descriptionstring
Accepte null
data.lines[].quantitynumber
Accepte null
data.lines[].unitstring
Unité enregistrée sur la ligne du document (forfait, pièce, heure…), indépendamment de l'unité actuelle du produit.
Accepte null
data.lines[].pricenumber
Accepte null
data.lines[].discount_typestring
Accepte null
data.lines[].discountnumber
Accepte null
data.lines[].is_ttcboolean
Accepte null
data.lines[].sub_totalnumber
Accepte null
data.lines[].taxnumber
Accepte null
data.lines[].totalnumber
Accepte null
data.lines[].tax_type_idinteger
Accepte null
data.lines[].tax_typeobject
Accepte null
data.lines[].tax_type.idinteger
data.lines[].tax_type.namestring
data.lines[].tax_type.percentnumber
data.lines[].tax_type.amountnumber
Présent pour les anciennes lignes utilisant la relation taxes.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 200OK 429Limite par défaut de l'API publique : 240 appels par minute, partagée entre les endpoints et les sociétés pour un même utilisateur authentifié (par IP hors authentification). Une dérogation temporaire peut être configurée côté serveur pour une reprise initiale de données ; elle expire automatiquement. Le plafond effectif est indiqué par X-RateLimit-Limit sur les réponses. Quelques appels par quart d'heure et par société sont compatibles avec la limite standard. Après HTTP 429, attendre le délai Retry-After avant de réessayer. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/estimate
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
estimate_datestring
Facultatif
Format: date Accepte null
expiry_datestring
Facultatif
Format: date Accepte null
customer_idinteger
Obligatoire
titleNon précisé
Facultatif
Accepte null
notesNon précisé
Facultatif
Accepte null
referenceNon précisé
Facultatif
Accepte null
linesarray
Obligatoire
lines[].is_titleboolean
Facultatif
Accepte null
lines[].item_idinteger
Facultatif Condition : required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Facultatif
Accepte null
lines[].titleNon précisé
Facultatif
Accepte null
lines[].is_ttcNon précisé
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].quantitynumber
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif
Accepte null
lines[].discount_typestring
Facultatif
Accepte null
lines[].discountnumber
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/estimate' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/estimate", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/estimate', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
POST Créer un devis (sans effort), le client est créé automatiquemet avec comme clé l'adresse email, les produits sont créés automatiquement avec comme clés les codes produits #
https://api.invoicing.plus/v1/estimate/effortless
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
estimate_datestring
Facultatif
Format: date Accepte null
expiry_datestring
Facultatif
Format: date Accepte null
customer_emailstring
Obligatoire
Format: email
customerobject
Obligatoire
customer.namestring
Obligatoire
customer.company_namestring
Facultatif
Accepte null
customer.codestring
Facultatif
Accepte null
customer.account_codestring
Facultatif
Accepte null
customer.phoneNon précisé
Facultatif
Accepte null
customer.crnNon précisé
Facultatif
Accepte null
customer.vatNon précisé
Facultatif
Accepte null
customer.billing_address_1string
Facultatif
Accepte null
customer.billing_address_2string
Facultatif
Accepte null
customer.billing_zipstring
Facultatif
Accepte null
customer.billing_citystring
Facultatif
Accepte null
customer.is_webboolean
Facultatif
Accepte null
titleNon précisé
Facultatif
Accepte null
notesNon précisé
Facultatif
Accepte null
referenceNon précisé
Facultatif
Accepte null
linesarray
Obligatoire
lines[].is_titleboolean
Facultatif
Accepte null
lines[].item_codestring
Facultatif Condition : required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Facultatif
Accepte null
lines[].tax_percentnumber
Facultatif
Accepte null
lines[].titleNon précisé
Facultatif
Accepte null
lines[].is_ttcNon précisé
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].quantitynumber
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif
Accepte null
lines[].discount_typestring
Facultatif
Accepte null
lines[].discountnumber
Facultatif
Accepte null
lines[].itemobject
Facultatif
lines[].item.namestring
Facultatif Condition : required_if:lines.*.is_title,false
lines[].item.descriptionNon précisé
Facultatif
Accepte null
lines[].item.account_codeNon précisé
Facultatif
Accepte null
lines[].item.tax_percentnumber
Facultatif
Accepte null
lines[].item.priceNon précisé
Facultatif
Accepte null
lines[].item.tax_type_idinteger
Facultatif
Accepte null
lines[].item.unit_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/estimate/effortless' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/estimate/effortless", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/estimate/effortless', ['json' => array (
'customer_email' => 'demo@example.com',
'customer' =>
array (
'name' => 'Atelier Exemple',
),
'lines' =>
array (
0 =>
array (
'item_code' => 'DEMO-001',
'item' =>
array (
'name' => 'Conseil technique',
),
'quantity' => 2,
'price' => 75.5,
'tax_percent' => 20,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
GET Afficher le PDF d'un devis #
https://api.invoicing.plus/v1/estimate/{id}/pdf
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idNon précisé
Obligatoire ID du devis à envoyer
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/estimate/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/estimate/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimate/123/pdf')
->throw()
->body();
Exemple de réponse HTTP 200
Réponse binaire application/pdf. Enregistrer le corps de la réponse dans un fichier PDF.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Ok 404Ressource introuvable ou non visible dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Ressources API Commandes Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des commandes. #
https://api.invoicing.plus/v1/orders
Par défaut, retourne les commandes DRAFT et PARTIAL_INVOICED. Pour le suivi périodique de tous les statuts, utiliser status=ALL et parcourir toutes les pages : une commande facturée disparaît de la liste CURRENT. Les filtres de dates portent sur la date du document, pas sur le changement de statut.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
from_datestring
Facultatif Date du document minimale incluse.
Format: date
to_datestring
Facultatif Date du document maximale incluse.
Format: date
statusstring
Facultatif CURRENT : DRAFT et PARTIAL_INVOICED ; ALL : tous les statuts.
Valeur par défaut: CURRENT CURRENT · ALL
searchstring
Facultatif Recherche dans le numéro de commande ou le nom du client.
pageinteger
Facultatif Page demandée.
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif Nombre de documents par page.
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/orders' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/orders", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/orders')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 124,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "COM20260001",
"reference": "AFFAIRE-001",
"status": "DRAFT",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
],
"previous_document": {
"type": "estimate",
"number": "DEV20260001",
"reference": "AFFAIRE-001",
"sub_total": 100
},
"estimate_id": 123,
"estimate": {
"id": 123,
"estimate_number": "DEV20260001"
}
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].customer_idinteger
data[].customerobject
data[].customer.namestring
data[].estimate_datestring
Format: date
data[].expiry_datestring
Format: date Accepte null
data[].estimate_numberstring
data[].referencestring
Référence libre du document, distincte du devis d'origine.
Accepte null
data[].statusstring
data[].status_changed_atstring
Format: date-time Accepte null
data[].updated_atstring
Format: date-time Accepte null
data[].titlestring
Accepte null
data[].notesstring
Accepte null
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].payment_method_idinteger
Accepte null
data[].linesarray
data[].lines[].line_numberinteger
Position dans le tableau lines, à partir de 1, lignes de titre comprises. Ce numéro peut changer lors d'un ajout, d'une suppression ou d'un déplacement de ligne et ne constitue pas un identifiant stable.
Minimum: 1
data[].lines[].item_idinteger
Accepte null
data[].lines[].is_titleboolean
Accepte null
data[].lines[].titlestring
Accepte null
data[].lines[].namestring
Accepte null
data[].lines[].replace_namestring
Accepte null
data[].lines[].descriptionstring
Accepte null
data[].lines[].quantitynumber
Accepte null
data[].lines[].unitstring
Unité enregistrée sur la ligne du document (forfait, pièce, heure…), indépendamment de l'unité actuelle du produit.
Accepte null
data[].lines[].pricenumber
Accepte null
data[].lines[].discount_typestring
Accepte null
data[].lines[].discountnumber
Accepte null
data[].lines[].is_ttcboolean
Accepte null
data[].lines[].sub_totalnumber
Accepte null
data[].lines[].taxnumber
Accepte null
data[].lines[].totalnumber
Accepte null
data[].lines[].tax_type_idinteger
Accepte null
data[].lines[].tax_typeobject
Accepte null
data[].lines[].tax_type.idinteger
data[].lines[].tax_type.namestring
data[].lines[].tax_type.percentnumber
data[].lines[].tax_type.amountnumber
Présent pour les anciennes lignes utilisant la relation taxes.
data[].previous_documentobject
Devis d'origine accessible, au même format que pour les factures. Champ absent sans devis accessible. sub_total est exprimé en unité monétaire, pas en centimes.
data[].previous_document.typestring
estimate
data[].previous_document.numberstring
data[].previous_document.referencestring
Accepte null
data[].previous_document.sub_totalnumber
data[].estimate_idinteger
Identifiant du devis d'origine accessible, sinon null.
Accepte null
data[].estimateobject
Devis d'origine accessible dans la société et pour l'utilisateur courant, sinon null.
Accepte null
data[].estimate.idinteger
data[].estimate.estimate_numberstring
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 200OK 429Limite par défaut de l'API publique : 240 appels par minute, partagée entre les endpoints et les sociétés pour un même utilisateur authentifié (par IP hors authentification). Une dérogation temporaire peut être configurée côté serveur pour une reprise initiale de données ; elle expire automatiquement. Le plafond effectif est indiqué par X-RateLimit-Limit sur les réponses. Quelques appels par quart d'heure et par société sont compatibles avec la limite standard. Après HTTP 429, attendre le délai Retry-After avant de réessayer. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Données d'une commande #
https://api.invoicing.plus/v1/order/{id}
Le numéro COM est renvoyé dans estimate_number, comme dans la liste. previous_document décrit le devis d'origine au même format que pour les factures (type, number, reference, sub_total) et est absent sans devis accessible. estimate contient l'identifiant et le numéro du devis d'origine, ou null pour une commande sans devis accessible.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/order/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/order/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/order/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 124,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "COM20260001",
"reference": "AFFAIRE-001",
"status": "DRAFT",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
],
"previous_document": {
"type": "estimate",
"number": "DEV20260001",
"reference": "AFFAIRE-001",
"sub_total": 100
},
"estimate_id": 123,
"estimate": {
"id": 123,
"estimate_number": "DEV20260001"
}
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.customer_idinteger
data.customerobject
data.customer.namestring
data.estimate_datestring
Format: date
data.expiry_datestring
Format: date Accepte null
data.estimate_numberstring
data.referencestring
Référence libre du document, distincte du devis d'origine.
Accepte null
data.statusstring
data.status_changed_atstring
Format: date-time Accepte null
data.updated_atstring
Format: date-time Accepte null
data.titlestring
Accepte null
data.notesstring
Accepte null
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.payment_method_idinteger
Accepte null
data.linesarray
data.lines[].line_numberinteger
Position dans le tableau lines, à partir de 1, lignes de titre comprises. Ce numéro peut changer lors d'un ajout, d'une suppression ou d'un déplacement de ligne et ne constitue pas un identifiant stable.
Minimum: 1
data.lines[].item_idinteger
Accepte null
data.lines[].is_titleboolean
Accepte null
data.lines[].titlestring
Accepte null
data.lines[].namestring
Accepte null
data.lines[].replace_namestring
Accepte null
data.lines[].descriptionstring
Accepte null
data.lines[].quantitynumber
Accepte null
data.lines[].unitstring
Unité enregistrée sur la ligne du document (forfait, pièce, heure…), indépendamment de l'unité actuelle du produit.
Accepte null
data.lines[].pricenumber
Accepte null
data.lines[].discount_typestring
Accepte null
data.lines[].discountnumber
Accepte null
data.lines[].is_ttcboolean
Accepte null
data.lines[].sub_totalnumber
Accepte null
data.lines[].taxnumber
Accepte null
data.lines[].totalnumber
Accepte null
data.lines[].tax_type_idinteger
Accepte null
data.lines[].tax_typeobject
Accepte null
data.lines[].tax_type.idinteger
data.lines[].tax_type.namestring
data.lines[].tax_type.percentnumber
data.lines[].tax_type.amountnumber
Présent pour les anciennes lignes utilisant la relation taxes.
data.previous_documentobject
Devis d'origine accessible, au même format que pour les factures. Champ absent sans devis accessible. sub_total est exprimé en unité monétaire, pas en centimes.
data.previous_document.typestring
estimate
data.previous_document.numberstring
data.previous_document.referencestring
Accepte null
data.previous_document.sub_totalnumber
data.estimate_idinteger
Identifiant du devis d'origine accessible, sinon null.
Accepte null
data.estimateobject
Devis d'origine accessible dans la société et pour l'utilisateur courant, sinon null.
Accepte null
data.estimate.idinteger
data.estimate.estimate_numberstring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Limite par défaut de l'API publique : 240 appels par minute, partagée entre les endpoints et les sociétés pour un même utilisateur authentifié (par IP hors authentification). Une dérogation temporaire peut être configurée côté serveur pour une reprise initiale de données ; elle expire automatiquement. Le plafond effectif est indiqué par X-RateLimit-Limit sur les réponses. Quelques appels par quart d'heure et par société sont compatibles avec la limite standard. Après HTTP 429, attendre le délai Retry-After avant de réessayer.
Voir le contrat dans Swagger ↗
GET Afficher le PDF d'une commande #
https://api.invoicing.plus/v1/order/{id}/pdf
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idNon précisé
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/order/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/order/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/order/123/pdf')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
Ressources API Préfacturations Contrats, paramètres et exemples pour cette ressource.
GET Liste des préfacturations #
https://api.invoicing.plus/v1/pre-billings
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
customer_idinteger
Facultatif
statusstring
Facultatif
from_datestring
Facultatif
Format: date
to_datestring
Facultatif
Format: date
limitinteger
Facultatif
Maximum: 100 Valeur par défaut: 20
pageinteger
Facultatif
Valeur par défaut: 1
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/pre-billings' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billings", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/pre-billings')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Liste paginée 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Consulter une préfacturation #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/pre-billing/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
PUT Remplacer une préfacturation brouillon non liée à une facture #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Obligatoire
pre_billing_datestring
Facultatif Date de préfacturation (défaut : aujourd'hui)
Format: date Accepte null
referencestring
Facultatif
Accepte null
titlestring
Facultatif
Accepte null
notesstring
Facultatif
Accepte null
refundboolean
Facultatif
Valeur par défaut: false
linesarray
Obligatoire
lines[].item_idinteger
Facultatif Produit de la société, obligatoire sauf pour un titre
lines[].is_titleboolean
Facultatif
Valeur par défaut: false
lines[].titlestring
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].name2string
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif Prix unitaire en devise (défaut : prix du produit)
lines[].ecotaxenumber
Facultatif Écotaxe unitaire en devise (défaut : produit)
lines[].quantitynumber
Facultatif
Valeur par défaut: 1
lines[].nkpnumber
Facultatif
Valeur par défaut: 1
lines[].tax_type_idinteger
Facultatif TVA de la société ; défaut : TVA du produit, null : sans TVA
Accepte null
lines[].discount_typestring
Facultatif
Valeur par défaut: fixed fixed · percentage
lines[].discountnumber
Facultatif Remise unitaire en devise ou en pourcentage
Valeur par défaut: 0
lines[].is_ttcboolean
Facultatif
Valeur par défaut: false
lines[].is_freeboolean
Facultatif
Valeur par défaut: false
lines[].deboursboolean
Facultatif
Valeur par défaut: false
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/pre-billing/123', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 404Ressource introuvable ou non visible dans la société sélectionnée. 409Préfacturation déjà facturée ou archivée 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
DELETE Supprimer une préfacturation brouillon non liée à une facture #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/pre-billing/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Deleted 404Ressource introuvable ou non visible dans la société sélectionnée. 409Préfacturation déjà facturée ou archivée
Voir le contrat dans Swagger ↗
POST Créer une préfacturation #
https://api.invoicing.plus/v1/pre-billing
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Obligatoire
pre_billing_datestring
Facultatif Date de préfacturation (défaut : aujourd'hui)
Format: date Accepte null
referencestring
Facultatif
Accepte null
titlestring
Facultatif
Accepte null
notesstring
Facultatif
Accepte null
refundboolean
Facultatif
Valeur par défaut: false
linesarray
Obligatoire
lines[].item_idinteger
Facultatif Produit de la société, obligatoire sauf pour un titre
lines[].is_titleboolean
Facultatif
Valeur par défaut: false
lines[].titlestring
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].name2string
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif Prix unitaire en devise (défaut : prix du produit)
lines[].ecotaxenumber
Facultatif Écotaxe unitaire en devise (défaut : produit)
lines[].quantitynumber
Facultatif
Valeur par défaut: 1
lines[].nkpnumber
Facultatif
Valeur par défaut: 1
lines[].tax_type_idinteger
Facultatif TVA de la société ; défaut : TVA du produit, null : sans TVA
Accepte null
lines[].discount_typestring
Facultatif
Valeur par défaut: fixed fixed · percentage
lines[].discountnumber
Facultatif Remise unitaire en devise ou en pourcentage
Valeur par défaut: 0
lines[].is_ttcboolean
Facultatif
Valeur par défaut: false
lines[].is_freeboolean
Facultatif
Valeur par défaut: false
lines[].deboursboolean
Facultatif
Valeur par défaut: false
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pre-billing' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billing", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pre-billing', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201Created 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
POST Dupliquer une préfacturation à aujourd'hui #
https://api.invoicing.plus/v1/pre-billing/{id}/duplicate
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pre-billing/123/duplicate' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123/duplicate", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/pre-billing/123/duplicate')
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201Brouillon dupliqué à la date du jour 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
Ressources API Factures Contrats, paramètres et exemples pour cette ressource.
La création produit un brouillon DRAFT avec paid_status=UNPAID. PUT /invoice/{id} modifie uniquement un brouillon. POST /invoice/{id}/validation effectue la validation vers DONE avec les contrôles de dates, de TVA et de numérotation configurés. Le champ due_date porte la date d’échéance ; aucune API générique de gestion multi-échéances n’est documentée.
Une modification sans lines conserve les lignes et les montants enregistrés. Si lines est fourni, la liste remplace toutes les lignes existantes et les montants sont recalculés. La prise en compte de due_date dépend du réglage invoice_set_due_date_automatically=YES. Contrôlez la facture relue après modification.
GET Obtenir la liste de vos factures. #
https://api.invoicing.plus/v1/invoices
Chaque ligne de facture expose unit (unité enregistrée sur la ligne, nullable) et line_number (position à partir de 1, titres compris). line_number peut changer après modification du document et ne constitue pas un identifiant stable.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
from_datestring
Facultatif Filtrer les factures à partir de cette date (YYYY-MM-DD).
Format: date
to_datestring
Facultatif Filtrer les factures jusqu'à cette date (YYYY-MM-DD).
Format: date
pageinteger
Facultatif Page demandée
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif Nombre de résultats par page
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
searchstring
Facultatif Recherche par nom ou référence du document
statusstring
Facultatif Filtre de statut
DONE · DRAFT
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoices')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].customer_idinteger
data[].invoice_datestring
Format: date
data[].due_datestring
Format: date
data[].invoice_numberstring
data[].referencestring
data[].statusstring
data[].paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data[].refundboolean
data[].depositboolean
data[].finalboolean
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].linesarray
data[].lines[].line_numberinteger
data[].lines[].item_idinteger
data[].lines[].quantitynumber
data[].lines[].unitstring
Accepte null
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Données d'une facture #
https://api.invoicing.plus/v1/invoice/{id}
Chaque ligne de facture expose unit (unité enregistrée sur la ligne, nullable) et line_number (position à partir de 1, titres compris). line_number peut changer après modification du document et ne constitue pas un identifiant stable.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Principaux champs de facture. Montants en unité monétaire, pas en centimes. La réponse complète inclut notamment customer, lines, devise, mode de paiement et champs personnalisés éventuels.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
PUT Modifier une facture brouillon #
https://api.invoicing.plus/v1/invoice/{id}
Réservé aux factures DRAFT ; une facture validée renvoie 404. Sans lines, les lignes et montants enregistrés sont conservés. Si lines est fourni, toutes les lignes existantes sont remplacées et les montants recalculés. due_date est appliqué uniquement si invoice_set_due_date_automatically vaut YES. Les montants sont en unité monétaire.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
invoice_datestring
Facultatif
Format: date
due_datestring
Facultatif
Format: date
customer_idinteger
Facultatif
payment_method_idinteger
Facultatif
titlestring
Facultatif
notesstring
Facultatif
referencestring
Facultatif
refundboolean
Facultatif
period_startstring
Facultatif
Format: date
period_endstring
Facultatif
Format: date
currency_idinteger
Facultatif
linesarray
Facultatif
lines[].is_titleboolean
Facultatif
lines[].item_idinteger
Facultatif
lines[].tax_type_idinteger
Facultatif
lines[].titlestring
Facultatif
lines[].is_ttcboolean
Facultatif
lines[].namestring
Facultatif
lines[].descriptionstring
Facultatif
lines[].quantitynumber
Facultatif
lines[].unitstring
Facultatif
lines[].pricenumber
Facultatif
lines[].discount_typestring
Facultatif
lines[].discountnumber
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"reference": "DEMO-ORDER-42"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"reference": "DEMO-ORDER-42"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/invoice/123', ['json' => array (
'reference' => 'DEMO-ORDER-42',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Principaux champs de facture. Montants en unité monétaire, pas en centimes. La réponse complète inclut notamment customer, lines, devise, mode de paiement et champs personnalisés éventuels.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
DELETE Supprimer une facture brouillon #
https://api.invoicing.plus/v1/invoice/{id}
La suppression effective est limitée aux brouillons. Une réponse 200 ne prouve pas la suppression d’une facture validée ; relire la ressource.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/invoice/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": "Deleted."
}
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/invoice
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
invoice_datestring
Facultatif
Format: date Accepte null
due_datestring
Facultatif
Format: date Accepte null
customer_idinteger
Obligatoire
related_customer_idinteger
Facultatif
Accepte null
payment_method_idinteger
Facultatif Mode de paiement de la société sélectionnée.
Accepte null
titlestring
Facultatif
Accepte null
notesstring
Facultatif
Accepte null
referencestring
Facultatif
Accepte null
refundboolean
Facultatif
Accepte null
period_startstring
Facultatif
Format: date Accepte null
period_endstring
Facultatif
Format: date Accepte null
linesarray
Obligatoire
lines[].is_titleboolean
Facultatif
Accepte null
lines[].item_idinteger
Facultatif Condition : required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Facultatif TVA de la société sélectionnée.
Accepte null
lines[].titlestring
Facultatif Texte pour une ligne de titre.
Accepte null
lines[].is_ttcNon précisé
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].quantitynumber
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif Prix unitaire en unité monétaire.
Accepte null
lines[].discount_typestring
Facultatif
Accepte null
lines[].discountnumber
Facultatif
Accepte null
lines[].group_keystring
Facultatif
Accepte null
group_linesarray
Facultatif
Accepte null
group_lines[].keystring
Obligatoire
group_lines[].namestring
Obligatoire
group_lines[].descriptionstring
Facultatif
Accepte null
group_lines[].quantitynumber
Obligatoire
group_lines[].unitstring
Facultatif
Accepte null
currency_idinteger
Facultatif
Accepte null
invoice_type_idinteger
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice', ['json' => array (
'customer_id' => 42,
'invoice_date' => '2026-10-28',
'due_date' => '2026-11-28',
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
1 =>
array (
'item_id' => 124,
'quantity' => 1,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Principaux champs de facture. Montants en unité monétaire, pas en centimes. La réponse complète inclut notamment customer, lines, devise, mode de paiement et champs personnalisés éventuels.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
POST Créer une facture (sans effort), le client est créé automatiquemet avec comme clé l'adresse email, les produits sont créés automatiquement avec comme clés les codes produits #
https://api.invoicing.plus/v1/invoice/effortless
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
invoice_datestring
Facultatif
Format: date Accepte null
due_datestring
Facultatif
Format: date Accepte null
customer_emailstring
Obligatoire
Format: email
customerobject
Obligatoire
customer.namestring
Obligatoire
customer.company_namestring
Facultatif
Accepte null
customer.codestring
Facultatif
Accepte null
customer.account_codestring
Facultatif
Accepte null
customer.phoneNon précisé
Facultatif
Accepte null
customer.crnNon précisé
Facultatif
Accepte null
customer.vatNon précisé
Facultatif
Accepte null
customer.billing_address_1string
Facultatif
Accepte null
customer.billing_address_2string
Facultatif
Accepte null
customer.billing_zipstring
Facultatif
Accepte null
customer.billing_citystring
Facultatif
Accepte null
customer.is_webboolean
Facultatif
Accepte null
titleNon précisé
Facultatif
Accepte null
notesNon précisé
Facultatif
Accepte null
referenceNon précisé
Facultatif
Accepte null
refundboolean
Facultatif
Accepte null
period_startstring
Facultatif
Format: date Accepte null
period_endstring
Facultatif
Format: date Accepte null
linesarray
Obligatoire
lines[].is_titleboolean
Facultatif
Accepte null
lines[].item_codestring
Facultatif Condition : required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Facultatif Condition : required_if:lines.*.tax_type_id,false
Accepte null
lines[].tax_percentnumber
Facultatif
Accepte null
lines[].titleNon précisé
Facultatif
Accepte null
lines[].is_ttcNon précisé
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].quantitynumber
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif
Accepte null
lines[].discount_typestring
Facultatif
Accepte null
lines[].discountnumber
Facultatif
Accepte null
lines[].group_keystring
Facultatif
Accepte null
lines[].itemobject
Facultatif
lines[].item.namestring
Facultatif Condition : required_if:lines.*.is_title,false
lines[].item.descriptionNon précisé
Facultatif
Accepte null
lines[].item.account_codeNon précisé
Facultatif
Accepte null
lines[].item.tax_percentnumber
Facultatif
Accepte null
lines[].item.priceNon précisé
Facultatif
Accepte null
lines[].item.tax_type_idinteger
Facultatif
Accepte null
lines[].item.unit_idinteger
Facultatif
Accepte null
group_linesarray
Facultatif
Accepte null
group_lines[].keystring
Obligatoire
group_lines[].namestring
Obligatoire
group_lines[].descriptionstring
Facultatif
Accepte null
group_lines[].quantitynumber
Obligatoire
group_lines[].unitstring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice/effortless' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/effortless", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/effortless', ['json' => array (
'customer_email' => 'demo@example.com',
'customer' =>
array (
'name' => 'Atelier Exemple',
),
'lines' =>
array (
0 =>
array (
'item_code' => 'DEMO-001',
'item' =>
array (
'name' => 'Conseil technique',
),
'quantity' => 2,
'price' => 75.5,
'tax_percent' => 20,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Principaux champs de facture. Montants en unité monétaire, pas en centimes. La réponse complète inclut notamment customer, lines, devise, mode de paiement et champs personnalisés éventuels.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/invoice/{id}/validation
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idNon précisé
Obligatoire ID de la facture à valider
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice/123/validation' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/validation", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/123/validation')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Ok 404Ressource introuvable ou non visible dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
GET Afficher le PDF d'une facture #
https://api.invoicing.plus/v1/invoice/{id}/pdf
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idNon précisé
Obligatoire ID de la facture à envoyer
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123/pdf')
->throw()
->body();
Exemple de réponse HTTP 200
Réponse binaire application/pdf. Enregistrer le corps de la réponse dans un fichier PDF.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Ok 404Ressource introuvable ou non visible dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
POST Envoyer par email une facture #
https://api.invoicing.plus/v1/invoice/{id}/send
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idNon précisé
Obligatoire ID de la facture à envoyer
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
tostring
Facultatif
subjectstring
Obligatoire
from_namestring
Obligatoire
from_emailstring
Obligatoire
bodystring
Facultatif
ccstring
Facultatif
bccstring
Facultatif
to_arrayarray
Facultatif
to_array[].namestring
Obligatoire
to_array[].emailstring
Obligatoire
Format: email
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice/123/send' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"to": "demo@example.com",
"subject": "Votre facture",
"from_name": "Camille Exemple",
"from_email": "demo@example.com"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/send", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"to": "demo@example.com",
"subject": "Votre facture",
"from_name": "Camille Exemple",
"from_email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/123/send', ['json' => array (
'to' => 'demo@example.com',
'subject' => 'Votre facture',
'from_name' => 'Camille Exemple',
'from_email' => 'demo@example.com',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"message": "Queued."
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.messagestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Ok 404Ressource introuvable ou non visible dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
GET Générer et télécharger le PDF #
https://api.invoicing.plus/v1/invoice/{id}/stream-pdf
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/stream-pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/stream-pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123/stream-pdf')
->throw()
->body();
Exemple de réponse HTTP 200
Réponse binaire application/pdf. Enregistrer le corps de la réponse dans un fichier PDF.
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
Ressources API Factures récurrentes Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste de vos factures récurrentes. #
https://api.invoicing.plus/v1/recurring-invoices
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/recurring-invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/recurring-invoices')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Données d'une facture récurrente #
https://api.invoicing.plus/v1/recurring-invoice/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/recurring-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/recurring-invoice/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
POST Créer une facture récurrente #
https://api.invoicing.plus/v1/recurring-invoice
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Obligatoire
frequencystring
Obligatoire
M · T · Q · S · A · H
statusstring
Facultatif
ACTIVE · INACTIVE Accepte null
referenceNon précisé
Facultatif
Accepte null
generation_datestring
Obligatoire
Format: date
invoice_datestring
Obligatoire
Format: date
due_datestring
Obligatoire
Format: date
init_datestring
Facultatif
Format: date Accepte null
end_datestring
Facultatif
Format: date Accepte null
period_startstring
Facultatif
Format: date Accepte null
period_endstring
Facultatif
Format: date Accepte null
generate_pre_billingsboolean
Facultatif Inclure la préfacturation lors de la génération des factures récurrentes.
Accepte null
payment_method_idinteger
Facultatif
Accepte null
titleNon précisé
Facultatif
Accepte null
notesNon précisé
Facultatif
Accepte null
linesarray
Facultatif
Accepte null
lines[].is_titleboolean
Facultatif
Accepte null
lines[].item_idinteger
Facultatif Condition : required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Facultatif
Accepte null
lines[].titleNon précisé
Facultatif
Accepte null
lines[].is_ttcNon précisé
Facultatif
Accepte null
lines[].namestring
Facultatif
Accepte null
lines[].name2string
Facultatif
Accepte null
lines[].descriptionstring
Facultatif
Accepte null
lines[].quantitynumber
Facultatif
Accepte null
lines[].unitstring
Facultatif
Accepte null
lines[].pricenumber
Facultatif
Accepte null
lines[].discount_typestring
Facultatif
Accepte null
lines[].discountnumber
Facultatif
Accepte null
lines[].is_percentboolean
Facultatif
Accepte null
lines[].percentnumber
Facultatif
Accepte null
lines[].line_percentarray
Facultatif
Accepte null
lines[].updownstring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/recurring-invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"frequency": "M",
"generation_date": "2026-11-01",
"invoice_date": "2026-11-01",
"due_date": "2026-11-30",
"lines": [
{
"item_id": 123,
"quantity": 1
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoice", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"frequency": "M",
"generation_date": "2026-11-01",
"invoice_date": "2026-11-01",
"due_date": "2026-11-30",
"lines": [
{
"item_id": 123,
"quantity": 1
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/recurring-invoice', ['json' => array (
'customer_id' => 42,
'frequency' => 'M',
'generation_date' => '2026-11-01',
'invoice_date' => '2026-11-01',
'due_date' => '2026-11-30',
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 1,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Ressources API Paiements Contrats, paramètres et exemples pour cette ressource.
Privilégiez une facture validée et non soldée. Envoyez un amount explicite en unité monétaire. Les montants négatifs et supérieurs au solde sont rejetés. GET /invoice/{id} expose paid_status (UNPAID, PARTIALLY_PAID, PAID) et GET /payments permet de retrouver les règlements. Le solde due_amount n’est pas exposé par InvoiceResource : ne supposez pas sa présence dans la réponse.
GET Obtenir la liste des paiements. #
https://api.invoicing.plus/v1/payments
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/payments' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payments", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payments')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
]
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].customer_idinteger
data[].payment_numberstring
data[].payment_datestring
data[].amountnumber
data[].invoice_idinteger
Accepte null
data[].refund_invoice_idinteger
Accepte null
data[].payment_method_idinteger
Accepte null
data[].notesstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Afficher les données d'un paiement #
https://api.invoicing.plus/v1/payment/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idstring
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/payment/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.customer_idinteger
data.payment_numberstring
data.payment_datestring
data.amountnumber
data.invoice_idinteger
Accepte null
data.refund_invoice_idinteger
Accepte null
data.payment_method_idinteger
Accepte null
data.notesstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
DELETE Supprimer un paiement #
https://api.invoicing.plus/v1/payment/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/payment/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/payment/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": "Deleted"
}
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/payment
Renseigner invoice_id pour une facture ou refund_invoice_id pour un avoir. Montant en unité monétaire. Sans amount, le solde restant est utilisé. Le montant ne doit être ni négatif ni supérieur au solde. La réponse réelle est HTTP 200.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
invoice_idinteger
Facultatif Facture de la société sélectionnée ; utiliser cet identifiant pour un règlement de facture.
refund_invoice_idinteger
Facultatif Avoir de la société sélectionnée, à utiliser à la place de invoice_id.
payment_datestring
Facultatif
Format: date
amountnumber
Facultatif
payment_method_idinteger
Facultatif
currency_idinteger
Facultatif
notesstring
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/payment' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/payment', ['json' => array (
'invoice_id' => 123,
'payment_date' => '2026-10-28',
'amount' => 120,
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.customer_idinteger
data.payment_numberstring
data.payment_datestring
data.amountnumber
data.invoice_idinteger
Accepte null
data.refund_invoice_idinteger
Accepte null
data.payment_method_idinteger
Accepte null
data.notesstring
Accepte null
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
Ressources API Modes de paiement Contrats, paramètres et exemples pour cette ressource.
GET Obtenir la liste des méthodes de paiements. #
https://api.invoicing.plus/v1/payment-methods
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/payment-methods' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment-methods", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment-methods')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
]
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].namestring
data[].account_codestring
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur.
Voir le contrat dans Swagger ↗
GET Consulter un mode de paiement #
https://api.invoicing.plus/v1/payment-method/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/payment-method/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment-method/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment-method/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.account_codestring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
DELETE Supprimer un mode de paiement #
https://api.invoicing.plus/v1/payment-method/{id}
La suppression renvoie 403 si des paiements ou dépenses sont rattachés.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/payment-method/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment-method/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/payment-method/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": "Deleted"
}
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
POST Créer un mode de paiement #
https://api.invoicing.plus/v1/payment-method
Le nom doit être unique dans la société. La création renvoie HTTP 200.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
account_codestring
Facultatif
filebankboolean
Facultatif
accountingboolean
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/payment-method' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Virement Démo",
"account_code": "512000",
"filebank": false,
"accounting": false
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/payment-method", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Virement Démo",
"account_code": "512000",
"filebank": false,
"accounting": false
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/payment-method', ['json' => array (
'name' => 'Virement Démo',
'account_code' => '512000',
'filebank' => false,
'accounting' => false,
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.account_codestring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Ressources API Achats Contrats, paramètres et exemples pour cette ressource.
GET Historique des achats envoyés par l’utilisateur connecté #
https://api.invoicing.plus/v1/purchase-invoices
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
pageinteger
Facultatif
Minimum: 1
limitinteger
Facultatif
Minimum: 1 Maximum: 50
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoices')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Achats de l’utilisateur, du plus récent au plus ancien
Voir le contrat dans Swagger ↗
POST Importer une facture fournisseur ou une note #
https://api.invoicing.plus/v1/purchase-invoice/import
Enregistre la pièce jointe. Si supplier_id est fourni, une écriture à compléter est préparée. Sans paramètre ocr, toutes les sociétés bénéficient temporairement automatiquement de l’extraction sur les formats compatibles lorsque le service est disponible. Sinon, la pièce est conservée pour saisie manuelle. Les paramètres ocr=true/false restent disponibles pour les intégrations existantes.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire Laisser le client HTTP générer le boundary multipart.
multipart/form-data
Corps de la requête multipart/form-data
Nom Type Obligatoire Description / contraintes
filestring
Obligatoire PDF, image, document Word, Excel, PowerPoint ou OpenDocument (20 Mo maximum).
Format: binary
ocrboolean
Facultatif Facultatif : absent, le backend active automatiquement l’OCR sur les formats compatibles lorsque le service est disponible. true demande explicitement l’OCR, false conserve le document pour saisie manuelle. L’OCR est temporairement disponible pour toutes les sociétés. HEIC/HEIF et ODS/ODP restent des documents classiques en mode automatique.
supplier_idinteger
Facultatif Identifiant facultatif d'un fournisseur appartenant à la société.
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/purchase-invoice/import' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--form 'file=@/path/to/document.pdf'
JavaScript · fetch Copier
const form = new FormData();
form.append('file', fileInput.files[0]);
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/import", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
},
body: form
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
$file = fopen('/path/to/document.pdf', 'r');
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->attach('file', $file, 'document.pdf')
->send('POST', 'https://api.invoicing.plus/v1/purchase-invoice/import')
->throw()
->json();
Exemple de réponse HTTP 201
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 201Pièce importée 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
GET Consulter un achat et son résultat OCR #
https://api.invoicing.plus/v1/purchase-invoice/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoice/123')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Achat, pièce jointe et état OCR 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
DELETE Supprimer son envoi non comptabilisé #
https://api.invoicing.plus/v1/purchase-invoice/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/purchase-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/purchase-invoice/123')
->throw()
->json();
Exemple de réponse HTTP 204
Réponse sans contenu.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 204Envoi et pièce jointe supprimés 404Ressource introuvable ou non visible dans la société sélectionnée. 409Envoi déjà comptabilisé
Voir le contrat dans Swagger ↗
GET Télécharger la pièce originale d’un achat #
https://api.invoicing.plus/v1/purchase-invoice/{id}/pdf
Renvoie le PDF original sans modification (notamment Factur-X). Pour une image ou un document Office, renvoie le fichier dans son format original, sans conversion.
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoice/123/pdf')
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200Fichier original 404Ressource introuvable ou non visible dans la société sélectionnée.
Voir le contrat dans Swagger ↗
Ressources API Exemples de validation Contrats, paramètres et exemples pour cette ressource.
Ces routes pédagogiques servent à observer la validation. Les exemples volontairement invalides doivent produire des erreurs ; ils ne sont pas des modèles de création de documents métier.
POST Poster des données en JSON avec le bon type, un nombre c'est un nombre, une date c'est une date... #
https://api.invoicing.plus/v1/pass-good-data
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Facultatif
invoice_datestring
Facultatif
Format: date
namestring
Facultatif
linesarray
Facultatif Lines
lines[].item_idinteger
Facultatif
lines[].quantitynumber
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pass-good-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"lines": [
{
"item_id": 54321,
"quantity": 7.5
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pass-good-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"lines": [
{
"item_id": 54321,
"quantity": 7.5
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-good-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => '2026-10-28',
'name' => 'Avignon',
'lines' =>
array (
0 =>
array (
'item_id' => 54321,
'quantity' => 7.5,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
POST Poster des données en JSON avec le mauvais type pour voir comment ça réagit #
https://api.invoicing.plus/v1/pass-bad-data
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Facultatif
invoice_datestring
Facultatif
Format: date
namestring
Facultatif
linesarray
Facultatif Lines
lines[].item_idinteger
Facultatif
lines[].quantitynumber
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pass-bad-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "lundi",
"name": "Avignon",
"lines": [
{
"item_id": 54321.9,
"quantity": 7.5
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pass-bad-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "lundi",
"name": "Avignon",
"lines": [
{
"item_id": 54321.9,
"quantity": 7.5
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-bad-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => 'lundi',
'name' => 'Avignon',
'lines' =>
array (
0 =>
array (
'item_id' => 54321.9,
'quantity' => 7.5,
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
POST Poster un JSON avec des propriétés non attendues #
https://api.invoicing.plus/v1/pass-unexpected-data
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
customer_idinteger
Facultatif
invoice_datestring
Facultatif
Format: date
namestring
Facultatif
citystring
Facultatif
linesarray
Facultatif Lines
lines[].item_idinteger
Facultatif
lines[].quantitynumber
Facultatif
lines[].tax_namestring
Facultatif
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pass-unexpected-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"city": "Marseille",
"lines": [
{
"item_id": "54321",
"quantity": "7.5",
"tax_name": "TVA 20%"
},
{
"item_id": "98760",
"quantity": "12",
"measure": "100cm",
"negative": "false"
}
]
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pass-unexpected-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"city": "Marseille",
"lines": [
{
"item_id": "54321",
"quantity": "7.5",
"tax_name": "TVA 20%"
},
{
"item_id": "98760",
"quantity": "12",
"measure": "100cm",
"negative": "false"
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-unexpected-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => '2026-10-28',
'name' => 'Avignon',
'city' => 'Marseille',
'lines' =>
array (
0 =>
array (
'item_id' => '54321',
'quantity' => '7.5',
'tax_name' => 'TVA 20%',
),
1 =>
array (
'item_id' => '98760',
'quantity' => '12',
'measure' => '100cm',
'negative' => 'false',
),
),
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
POST Poster un JSON cassé pour voir comment ça réagit (il faut enlever le double quote à la fin de titi) #
https://api.invoicing.plus/v1/pass-bad-json
Authentification : Aucune authentification requise
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Aucun paramètre documenté.
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/pass-bad-json' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/pass-bad-json", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-bad-json', ['json' => (object) array(
)])
->throw()
->json();
Exemple de réponse HTTP 200
Aucun exemple de réponse vérifié n’est disponible dans le contrat OpenAPI. Consulter Swagger et vérifier le résultat dans votre environnement dédié.
Codes HTTP et erreurs
HTTP Description / contraintes
429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 200OK 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors. 503Service Unavailable
Voir le contrat dans Swagger ↗
Ressources API Avoirs Les avoirs utilisent la ressource facture.
Créez un avoir avec POST /invoice et refund: true. Le document est un brouillon et sa réponse porte refund: true. Pour lister ou consulter les avoirs, utilisez GET /invoices puis le champ refund, ou GET /invoice/{id}. Il n’existe pas d’endpoint /credit-notes.
Le contrôleur public de création n’accepte pas de champ permettant de rattacher cet avoir à une facture d’origine. La réponse peut exposer previous_document pour des liens créés par d’autres parcours, mais cela ne constitue pas un paramètre de création public. Pour un règlement d’avoir, POST /payment accepte refund_invoice_id.
Ressources API Projets Contrats, paramètres et exemples pour cette ressource.
https://api.invoicing.plus/v1/projects
search filtre le nom ; status accepte DONE ou CURRENT. from_date et to_date sont validés mais ne sont pas appliqués par le contrôleur actuel.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
pageinteger
Facultatif
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
searchstring
Facultatif
statusstring
Facultatif
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/projects' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/projects", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/projects')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].namestring
data[].descriptionstring
Accepte null
data[].zipstring
Accepte null
data[].citystring
Accepte null
data[].statusstring
data[].photoobject
Accepte null
data[].photo.idinteger
data[].photo.thumbstring
Format: uri
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/project/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/project/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepte null
data.zipstring
Accepte null
data.citystring
Accepte null
data.statusstring
data.photoobject
Accepte null
data.photo.idinteger
data.photo.thumbstring
Format: uri
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/project/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
descriptionstring
Facultatif
Accepte null
zipstring
Facultatif
Accepte null
citystring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request PUT 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Projet de démonstration"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Projet de démonstration"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/project/123', ['json' => array (
'name' => 'Projet de démonstration',
)])
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepte null
data.zipstring
Accepte null
data.citystring
Accepte null
data.statusstring
data.photoobject
Accepte null
data.photo.idinteger
data.photo.thumbstring
Format: uri
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
DELETE Supprimer un projet #
https://api.invoicing.plus/v1/project/{id}
Authentification : Token Bearer requis
Paramètres d’URL
Nom Type Obligatoire Description / contraintes
idinteger
Obligatoire
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request DELETE 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/project/123')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": "Deleted."
}
Champs de réponse documentés
Nom Type Description / contraintes
datastring
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates.
Voir le contrat dans Swagger ↗
https://api.invoicing.plus/v1/project
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
descriptionstring
Facultatif
Accepte null
zipstring
Facultatif
Accepte null
citystring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/project' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Projet de démonstration"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/project", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Projet de démonstration"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/project', ['json' => array (
'name' => 'Projet de démonstration',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepte null
data.zipstring
Accepte null
data.citystring
Accepte null
data.statusstring
data.photoobject
Accepte null
data.photo.idinteger
data.photo.thumbstring
Format: uri
Codes HTTP et erreurs
HTTP Description / contraintes
201OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Ressources API Prospects Contrats, paramètres et exemples pour cette ressource.
https://api.invoicing.plus/v1/lead
name renseigne le nom du contact ; le nom du prospect est pris dans company_name par le contrôleur actuel. super_name est obligatoire. Les champs d’adresse ne sont pas acceptés par la validation publique.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Aucun paramètre documenté.
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Content-Typestring
Obligatoire
application/json
Corps de la requête application/json
Nom Type Obligatoire Description / contraintes
namestring
Obligatoire
super_namestring
Obligatoire
company_namestring
Facultatif
emailstring
Facultatif
phonestring
Facultatif
Accepte null
notesstring
Facultatif
Accepte null
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/lead' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"super_name": "Prospect Démo",
"company_name": "Atelier Exemple",
"email": "demo@example.com"
}'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/lead", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"super_name": "Prospect Démo",
"company_name": "Atelier Exemple",
"email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/lead', ['json' => array (
'name' => 'Camille Exemple',
'super_name' => 'Prospect Démo',
'company_name' => 'Atelier Exemple',
'email' => 'demo@example.com',
)])
->throw()
->json();
Exemple de réponse HTTP 201
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataobject
Coordonnées client. Peut également contenir contacts, custom_fields, devise, mode de paiement et pays de facturation.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
Codes HTTP et erreurs
HTTP Description / contraintes
201OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Ressources API Artisans Contrats, paramètres et exemples pour cette ressource.
https://api.invoicing.plus/v1/artisans
status accepte active ou inactive ; search filtre le nom ou l’email. La liste exclut les fiches vintage et is_web.
Authentification : Token Bearer requis
Paramètres d’URL
Aucun paramètre documenté.
Paramètres de recherche
Nom Type Obligatoire Description / contraintes
pageinteger
Facultatif
Minimum: 1 Valeur par défaut: 1
limitinteger
Facultatif
Minimum: 1 Maximum: 1000 Valeur par défaut: 1000
statusstring
Facultatif
searchstring
Facultatif
Headers
Nom Type Obligatoire Description / contraintes
Acceptstring
Obligatoire
application/json
Authorizationstring
Obligatoire Bearer YOUR_API_TOKEN
X-Companystring
Obligatoire
Exemple de requête
cURL
JavaScript · fetch
PHP · Laravel
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/artisans' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copier
const response = await fetch("https://api.invoicing.plus/v1/artisans", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copier
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/artisans')
->throw()
->json();
Exemple de réponse HTTP 200
Extrait illustratif fondé sur les champs documentés. Les réponses complètes peuvent contenir d’autres champs. Les identifiants sont fictifs.
JSON Copier
{
"data": [
{
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Champs de réponse documentés
Nom Type Description / contraintes
dataarray
data[].idinteger
data[].namestring
data[].company_namestring
data[].codestring
data[].account_codestring
data[].emailstring
data[].phonestring
data[].crnstring
data[].nicstring
data[].vatstring
data[].billing_address_1string
data[].billing_zipstring
data[].billing_citystring
data[].is_webboolean
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
Codes HTTP et erreurs
HTTP Description / contraintes
200OK 401Token absent, invalide ou expiré ; ou X-Company absent, inconnu ou inaccessible à cet utilisateur. 403Utilisateur authentifié mais droits insuffisants dans la société sélectionnée. 404Ressource introuvable ou non visible dans la société sélectionnée. 429Quota dépassé. Attendre Retry-After secondes avant de réessayer ; éviter les nouvelles tentatives immédiates. 422JSON malformé, champ invalide ou attribut non prévu. api_validation utilise debug.errors, debug.fatal_error ou debug.unexpected_attributes ; les Form Requests Laravel utilisent message et errors.
Voir le contrat dans Swagger ↗
Guides pratiques Obtenir un accès API Du compte existant au premier client consulté.
Prérequis : un compte existant, ses identifiants et l’accès à une société. Utilisez HTTPS et stockez le token côté serveur.
Résultat : une réponse data contenant les clients de la société sélectionnée.
Erreurs : 401 pour des identifiants ou un contexte société invalides ; 403 si la lecture des clients est interdite ; 429 en cas de quota dépassé.
Étapes
1 POST /token Obtenez data.token. L’exemple demande un token de 30 minutes.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}'
JSON Copier
{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}
Obtenir un token personnel →
3 GET /customers Transmettez le token et X-Company pour obtenir la liste des clients.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customers' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Obtenir la liste des clients de la société. →
Guides pratiques Créer un client Créez le tiers qui portera vos documents.
Prérequis : token, X-Company et droit create-customer. name est obligatoire ; les autres champs dépendent de votre besoin.
Résultat : création HTTP 201 et lecture HTTP 200 du même client.
Erreurs : 422 pour name absent, email invalide ou attribut non prévu ; 401/403 selon les droits.
Étapes
1 POST /customer Envoyez un nom et des coordonnées fictives. Conservez data.id.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/customer' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}'
JSON Copier
{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}
Créer un client →
2 GET /customer/{id} Remplacez 123 par data.id pour vérifier le client créé.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Afficher les coordonnées du client. →
Guides pratiques Créer un article avec sa TVA Réutilisez les articles dans les lignes de vos documents.
Prérequis : token, X-Company et droit de création d’articles. Les IDs de TVA et d’unité doivent appartenir à la société.
Résultat : HTTP 201, avec le prix en unité monétaire et l’identifiant de l’article.
Erreurs : 422 pour name absent ou référence de TVA/unité invalide ; 403 si le droit est absent.
Étapes
1 GET /tax-types Récupérez l’identifiant du taux de TVA voulu.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/tax-types' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Obtenir la liste des TVA. →
2 POST /item Remplacez default_tax_id par cet ID, créez l’article et conservez data.id.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/item' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}'
JSON Copier
{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}
Créer un produit →
Guides pratiques Créer une facture à plusieurs lignes Du client et des articles au brouillon vérifiable.
Prérequis : un client et deux articles existants dans la même société, un token et le droit create-invoice. Remplacez customer_id et les deux item_id.
Résultat : un brouillon DRAFT. La validation n’est pas automatique ; effectuez-la séparément après contrôle via POST /invoice/{id}/validation si vous disposez du droit validate-invoice.
Erreurs : 422 pour un client/article inexistant dans la société, un champ imprévu ou un corps invalide ; 403 si le droit manque.
Étapes
1 POST /invoice Créez deux lignes avec des quantités explicites. L’API reprend les prix et taxes des articles si vous ne les surchargez pas.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}'
JSON Copier
{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}
Créer une facture →
2 GET /invoice/{id} Remplacez 123 par data.id et contrôlez DRAFT, les lignes, les montants et due_date.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Données d'une facture →
Guides pratiques Récupérer et suivre une facture Relisez l’état enregistré par le serveur.
Prérequis : un token, X-Company, un ID de facture et le droit view-invoice.
Résultat : HTTP 200 et data avec l’état courant visible pour l’utilisateur.
Erreurs : 404 si la facture n’est pas visible ; 401/403 selon le contexte et les droits.
Étapes
1 GET /invoice/{id} Lisez status, paid_status, due_date, total et lines.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Données d'une facture →
2 GET /invoices Pour un suivi global, parcourez les pages et utilisez les filtres de dates du document avec précaution.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Obtenir la liste de vos factures. →
Guides pratiques Télécharger le PDF d’une facture Récupérez un document binaire, sans parseur JSON.
Prérequis : un token, X-Company, un ID de facture accessible et le droit view-invoice.
Résultat : HTTP 200 et les octets du PDF. Les devis et commandes disposent aussi d’un endpoint PDF documenté.
Erreurs : 404 si le document est introuvable ou non visible ; 422 ou autres erreurs documentées si la génération échoue.
Étapes
1 GET /invoice/{id}/pdf Téléchargez le corps application/pdf. Avec cURL, ajoutez --output invoice.pdf ; fetch utilise response.blob() et Laravel utilise body().
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Afficher le PDF d'une facture →
Guides pratiques Enregistrer un paiement Enregistrez un règlement sur une facture existante.
Prérequis : une facture validée non soldée, son ID, un token, X-Company et le droit create-payment. Le montant est en unité monétaire.
Résultat : le paiement est enregistré et le solde interne est mis à jour. Aucun prélèvement bancaire n’est déclenché par cet endpoint.
Erreurs : 422 pour un montant négatif, trop élevé ou une facture déjà soldée ; 401/403/404 pour les contrôles d’accès.
Étapes
1 POST /payment Remplacez invoice_id et amount. Conservez data.id du paiement. La création répond 200.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/payment' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}'
JSON Copier
{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}
Créer un paiement →
2 GET /invoice/{id} Relisez paid_status ; n’envoyez pas à nouveau le paiement sans vérifier les règlements existants.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Données d'une facture →
Guides pratiques Créer un avoir Utilisez le contrat de création d’une facture.
Prérequis : un client, des articles de la société et les droits requis. Le rattachement à une facture d’origine n’est pas un paramètre public de cette création.
Résultat : un avoir brouillon, consultable par les endpoints de facture.
Erreurs : 422 si les références ou les lignes sont invalides ; 403 si les droits de création/validation manquent.
Étapes
1 POST /invoice Reprenez l’exemple de facture et ajoutez "refund": true au corps JSON.
cURL Copier
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
],
"refund": true
}'
JSON Copier
{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
],
"refund": true
}
Créer une facture →
2 GET /invoice/{id} Relisez le document créé et vérifiez refund: true. La validation d’un avoir nécessite validate-refund.
cURL Copier
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Données d'une facture →
Getting started Welcome to the API guide Everything you need to connect your software to Invoicing.plus.
The public v1 API covers customers, products, estimates, orders, invoices, payments and other business resources. Each operation below comes from the OpenAPI contract and Laravel routes.
The guide explains integration workflows. Swagger provides the technical reference and lets you test requests. Use both together.
Production base URL: https://api.invoicing.plus/v1. The version is carried by /v1 in the path. This guide is public and requires no sign-in.
Important These examples do not execute requests. Replace fictional IDs with values from your company. Keep credentials and tokens on your server.
cURL · GET /companies Copy
curl --request GET 'https://api.invoicing.plus/v1/companies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
Getting started Authentication and first request A personal token, followed by an explicitly selected company.
1. Send POST /token with the email and password of an existing account. Read data.token and send Authorization: Bearer YOUR_API_TOKEN. short_token: true limits its lifetime to 30 minutes; otherwise this route adds no token-specific expiry. A global expiry may apply.
2. Call GET /companies without X-Company. Save data[].id: this is an opaque identifier, not the internal numeric ID.
3. Add X-Company: YOUR_COMPANY_ID to each business request. The token only grants access to companies and operations allowed for that user. Revoke the current token with POST /revoke-token.
Getting started Base URL and environments Choose the target environment explicitly.
Production uses https://api.invoicing.plus/v1. The project also supports API sandbox vhost configurations and a configurable OpenAPI server using L5_SWAGGER_CONST_HOST. No public sandbox URL or universal access procedure could be confirmed in the code: obtain a dedicated environment before write tests.
Examples use fictional data only. Creating, validating, sending or deleting from Swagger makes real changes in the selected environment.
Core concepts Companies and access control Each business request belongs to one company.
The X-Company header is checked against the unique_hash of a company accessible to the user. The server then sets the company context and applies Bouncer permissions. Do not reuse customer, item or document IDs from another company.
A missing or inaccessible X-Company can produce 401; a missing business permission produces 403. Some documents outside the visible scope return 404. POST /company requires no selected company. POST /company/user creates an administrator and requires company administration rights.
Core concepts JSON, dates and amounts Typed values expressed in the document currency.
Send Accept: application/json and Content-Type: application/json for a JSON body. Purchase imports use multipart/form-data and downloads return application/pdf. Successful JSON responses are generally wrapped in data.
Document dates use YYYY-MM-DD. Documented timestamps use ISO 8601. Send numbers as JSON numbers and booleans as true or false, not strings. Company identifiers remain opaque strings.
Item prices, line prices, invoice totals and payment amounts exposed by this API are in currency units: 75.5 means 75.50 in the relevant currency, not 75.50 cents. Do not reproduce internal storage conversions in your client. The server calculates taxes and totals.
Endpoints using api_validation reject unexpected properties. Custom fields depend on company configuration; their list cannot be inferred from a static contract.
Core concepts Pagination, search and filters Parameters vary by resource.
GET /customers, /invoices, /estimates and /orders accept page and limit (1 to 1000, default 1000). These lists provide meta.current_page, meta.last_page, meta.total and meta.has_more. Iterate until has_more: false.
search matches customer details and document numbers, references or customer names depending on the route. status filters are not universal: active/inactive for customers, DRAFT/DONE for invoices, CURRENT/ALL for estimates and orders.
from_date and to_date filter the document date, not the time its status changed. For periodic estimate and order tracking, use status=ALL and iterate through every page. There is no universal synchronization cursor.
GET /items and /payments return an unpaginated collection. Pre-billings have their own pagination in metadata. Consult the parameters and schemas for each operation.
Core concepts Errors, HTTP status codes and limits Handle errors and retries explicitly.
200 means success, 201 creation and 204 success with no content depending on the operation. Creating a payment returns 200. 401 indicates invalid authentication or company context; 403 insufficient permissions; 404 a missing or invisible resource; 409 a state conflict; 422 validation failure; 429 a rate limit. Some operations also document 400 or 503.
Legacy validation errors use message and debug.errors, debug.fatal_error or debug.unexpected_attributes. Laravel Form Requests use message and errors; some document creations may return erreur. Do not assume a single error envelope.
Standard limit: 240 calls per minute, shared across endpoints and companies for one authenticated user, or per IP without authentication. Server configuration may allow temporary exceptions. Read X-RateLimit-Limit and X-RateLimit-Remaining. After 429, wait Retry-After seconds; X-RateLimit-Reset provides a Unix timestamp.
POST /token adds two limits: 5 attempts/minute per email and IP pair, and 30/minute per IP. Other endpoints may have their own limits.
No general public idempotency-key mechanism or outgoing webhook subscription was confirmed for these resources. After a write timeout, first check whether the resource exists before retrying. Internal integration webhooks are not a public webhook service.
Core concepts Scope and known limitations A verified contract is better than an implicit promise.
The reference is generated from OpenAPI annotations. Undocumented fields and responses are explicitly identified. Response examples are illustrative excerpts, never customer-data captures.
Project journal and media routes, People teams, OCR and electronic purchases do not yet have complete OpenAPI contracts. The guide does not provide unverified examples for those operations. Specific, mobile and internal integrations are not presented as generic APIs.
GET /customer/name/{name} references a getCustomerByName method missing from its controller: do not use it. Prefer GET /customers?search=Exemple or lookups by code, account code and email. This pre-existing business defect requires a separate fix.
API resources Availability Contracts, parameters and examples for this resource.
GET Check API availability #
https://api.invoicing.plus/v1/check
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/check' \
--header 'Accept: application/json'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/check", {
method: 'GET',
headers: {
"Accept": "application/json"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
))
->send('GET', 'https://api.invoicing.plus/v1/check')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 503Service Unavailable
View contract in Swagger ↗
API resources Tokens and identity Contracts, parameters and examples for this resource.
POST Obtain a personal token #
https://api.invoicing.plus/v1/token
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
emailstring
Required Email address of an existing user
Format: email
passwordstring
Required User password
Format: password
short_tokenboolean
Optional true: expires after 30 minutes; false: no token-specific expiry is added here.
Default value: false
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/token", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/token', ['json' => array (
'email' => 'demo@example.com',
'password' => 'YOUR_ACCOUNT_PASSWORD',
'short_token' => true,
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"type": "Bearer",
"token": "TOKEN_FICTIF_A_REMPLACER"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.typestring
data.tokenstring
HTTP status codes and errors
HTTP Description / constraints
422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200Token issued 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
GET Get the authenticated user #
https://api.invoicing.plus/v1/who-i-am
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/who-i-am' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/who-i-am", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('GET', 'https://api.invoicing.plus/v1/who-i-am')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Camille Exemple",
"email": "demo@example.com",
"phone": "0601020304",
"language": "fr"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.emailstring
Format: email
data.phonestring
Accepts null
data.languagestring
Only in GET /who-i-am.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
POST Revoke the current token #
https://api.invoicing.plus/v1/revoke-token
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/revoke-token' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/revoke-token", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('POST', 'https://api.invoicing.plus/v1/revoke-token')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
API resources Companies and users Contracts, parameters and examples for this resource.
GET List accessible companies and their X-Company identifiers #
https://api.invoicing.plus/v1/companies
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/companies' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/companies", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
))
->send('GET', 'https://api.invoicing.plus/v1/companies')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
]
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idstring
Opaque identifier to pass unchanged in X-Company; never use the internal numeric ID.
data[].namestring
data[].company_namestring
data[].logostring
Accepts null
data[].colorstring
Accepts null
data[].is_adminboolean
data[].permissionsobject
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/company
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/company' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/company", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/company')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idstring
Opaque identifier to pass unchanged in X-Company; never use the internal numeric ID.
data.namestring
data.company_namestring
data.logostring
Accepts null
data.colorstring
Accepts null
data.is_adminboolean
data.permissionsobject
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
POST Create a company for the authenticated user #
https://api.invoicing.plus/v1/company
Authentication required, without X-Company. The creator becomes an administrator. Use data.id from the response as X-Company in subsequent requests. Creation initializes company settings and logo.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
company_namestring
Required
address_street_1string
Required
address_street_2string
Optional
Accepts null
zipstring
Required
citystring
Required
emailstring
Required
Format: email
phonestring
Optional
Accepts null
crnstring
Required Company SIREN or SIRET (French business identifier).
vatstring
Optional
Accepts null
logostring
Optional Base64-encoded image; omit to use the default logo.
Accepts null
footer_documentstring
Optional
Accepts null
pricenumber
Optional Optional, ignored: price comes from price_child on the first accessible company (ascending ID), or 7 when unset.
Accepts null
company_group_idinteger
Optional Only the signed-in partner’s own group; internal staff may select any existing group.
Accepts null
settingsobject
Optional
Accepts null
settings.languagestring
Optional Initialize in French (France) or Spanish (Spain).
Default value: fr fr · es
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/company' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"address_street_1": "10 rue des Ateliers",
"address_street_2": "Bâtiment A",
"zip": "75001",
"city": "Paris",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "12345678900012",
"vat": "FR00123456789"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/company", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"address_street_1": "10 rue des Ateliers",
"address_street_2": "Bâtiment A",
"zip": "75001",
"city": "Paris",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "12345678900012",
"vat": "FR00123456789"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/company', ['json' => array (
'name' => 'Atelier Exemple',
'company_name' => 'SAS Atelier Exemple',
'address_street_1' => '10 rue des Ateliers',
'address_street_2' => 'Bâtiment A',
'zip' => '75001',
'city' => 'Paris',
'email' => 'demo@example.com',
'phone' => '0102030405',
'crn' => '12345678900012',
'vat' => 'FR00123456789',
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": "societe_demo",
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"is_admin": true
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idstring
Opaque identifier to pass unchanged in X-Company; never use the internal numeric ID.
data.namestring
data.company_namestring
data.logostring
Accepts null
data.colorstring
Accepts null
data.is_adminboolean
data.permissionsobject
HTTP status codes and errors
HTTP Description / constraints
201Company created 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
POST Create an administrator in the selected company #
https://api.invoicing.plus/v1/company/user
Restricted to company administrators. Creates a new account with the admin role and links it to the company specified by X-Company. The existing response status is HTTP 200. No token is returned; use POST /token to authenticate this new user.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required Obtain data.id using GET /companies or POST /company.
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
emailstring
Required Email address must be unique across all users. This endpoint creates a new user; it does not link an existing account.
Format: email
passwordstring
Required At least one lowercase letter, one uppercase letter and one digit.
Format: password
phonestring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/company/user' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"email": "demo@example.com",
"password": "ExempleDemo42!",
"phone": "0601020304"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/company/user", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"email": "demo@example.com",
"password": "ExempleDemo42!",
"phone": "0601020304"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/company/user', ['json' => array (
'name' => 'Camille Exemple',
'email' => 'demo@example.com',
'password' => 'ExempleDemo42!',
'phone' => '0601020304',
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Camille Exemple",
"email": "demo@example.com",
"phone": "0601020304",
"language": "fr"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.emailstring
Format: email
data.phonestring
Accepts null
data.languagestring
Only in GET /who-i-am.
HTTP status codes and errors
HTTP Description / constraints
200Administrator created and linked 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
API resources Customers Contracts, parameters and examples for this resource.
GET List company customers #
https://api.invoicing.plus/v1/customers
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
pageinteger
Optional Requested page
Minimum: 1 Default value: 1
limitinteger
Optional Results per page
Minimum: 1 Maximum: 1000 Default value: 1000
searchstring
Optional Search by name or document reference
statusstring
Optional Status filter
active · inactive
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customers' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customers", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customers')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].namestring
data[].company_namestring
data[].codestring
data[].account_codestring
data[].emailstring
data[].phonestring
data[].crnstring
data[].nicstring
data[].vatstring
data[].billing_address_1string
data[].billing_zipstring
data[].billing_citystring
data[].is_webboolean
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/customer/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
https://api.invoicing.plus/v1/customer/{id}
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Optional
company_namestring
Optional
codestring
Optional
Accepts null
sequencenumber
Optional
Accepts null
account_codestring
Optional
Accepts null
emailstring
Optional
Accepts null
phonestring
Optional
Accepts null
crnstring
Optional
Accepts null
nicstring
Optional
Accepts null
vatstring
Optional
Accepts null
nafUnspecified
Optional
Accepts null
billing_address_1string
Optional
Accepts null
billing_address_2string
Optional
Accepts null
billing_zipstring
Optional
Accepts null
billing_citystring
Optional
Accepts null
billing_country_idinteger
Optional
Accepts null
billing_countrystring
Optional
Accepts null
is_webboolean
Optional
Accepts null
is_private_personboolean
Optional
Accepts null
civilitystring
Optional
Accepts null
activitystring
Optional
Accepts null
ibanstring
Optional
Accepts null
bicstring
Optional
Accepts null
rumstring
Optional
Accepts null
rum_xml_typestring
Optional
Accepts null
rum_datestring
Optional
Format: date Accepts null
notesstring
Optional
Accepts null
payment_method_idinteger
Optional
Accepts null
currency_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"email": "demo@example.com"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/customer/123', ['json' => array (
'name' => 'Atelier Exemple',
'email' => 'demo@example.com',
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
https://api.invoicing.plus/v1/customer/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/customer/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": "Deleted."
}
Documented response fields
Name Type Description / constraints
datastring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/customer
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
company_namestring
Optional
Accepts null
codestring
Optional
Accepts null
sequencenumber
Optional
Accepts null
account_codestring
Optional
Accepts null
emailstring
Optional
Accepts null
phonestring
Optional
Accepts null
crnstring
Optional
Accepts null
nicstring
Optional
Accepts null
vatstring
Optional
Accepts null
nafUnspecified
Optional
Accepts null
billing_address_1string
Optional
Accepts null
billing_address_2string
Optional
Accepts null
billing_zipstring
Optional
Accepts null
billing_citystring
Optional
Accepts null
billing_country_idinteger
Optional
Accepts null
billing_countrystring
Optional
Accepts null
is_webboolean
Optional
Accepts null
is_private_personboolean
Optional
Accepts null
civilitystring
Optional
Accepts null
activitystring
Optional
Accepts null
ibanUnspecified
Optional
Accepts null
bicUnspecified
Optional
Accepts null
rumstring
Optional
Accepts null
rum_xml_typestring
Optional
Accepts null
rum_datestring
Optional
Format: date Accepts null
notesstring
Optional
Accepts null
payment_method_idinteger
Optional
Accepts null
currency_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/customer' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/customer', ['json' => array (
'name' => 'Atelier Exemple',
'company_name' => 'SAS Atelier Exemple',
'email' => 'demo@example.com',
'billing_country' => 'FR',
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
GET Find a customer by code #
https://api.invoicing.plus/v1/customer/code/{code}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
codestring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customer/code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/code/DEMO-001')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
GET Find a customer by account-code #
https://api.invoicing.plus/v1/customer/account-code/{code}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
codestring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customer/account-code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/account-code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/account-code/DEMO-001')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
GET Find a customer by email #
https://api.invoicing.plus/v1/customer/email/{email}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
emailstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customer/email/demo%40example.com' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/customer/email/demo%40example.com", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/customer/email/demo%40example.com')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
API resources Contacts Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/contact
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
firstnamestring
Optional
Accepts null
lastnamestring
Optional
Accepts null
emailstring
Optional
Accepts null
phonestring
Optional
Accepts null
phone2Unspecified
Optional
Accepts null
auto_recipient_emailboolean
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/contact' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"firstname": "Camille",
"lastname": "Exemple",
"email": "demo@example.com",
"phone": "0102030405"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/contact", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"firstname": "Camille",
"lastname": "Exemple",
"email": "demo@example.com",
"phone": "0102030405"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/contact', ['json' => array (
'name' => 'Camille Exemple',
'firstname' => 'Camille',
'lastname' => 'Exemple',
'email' => 'demo@example.com',
'phone' => '0102030405',
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
POST Link a contact to a customer #
https://api.invoicing.plus/v1/contact/{id}/customer/{target}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
targetstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/contact/123/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/contact/123/customer/123", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/contact/123/customer/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
API resources Products and services Contracts, parameters and examples for this resource.
GET List company products #
https://api.invoicing.plus/v1/items
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/items' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/items", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/items')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
]
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].namestring
data[].descriptionstring
data[].codestring
data[].account_codestring
data[].pricenumber
data[].ecotaxenumber
data[].default_tax_idinteger
data[].default_tax_namestring
data[].unit_idinteger
data[].unit_namestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Documented response fields
Name Type Description / constraints
dataobject
Product or service. Prices are expressed in currency units, not cents. Tax and unit names are conditional; currency contains id and name if a currency exists.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Optional
Accepts null
descriptionstring
Optional
Accepts null
codestring
Optional
Accepts null
account_codestring
Optional
Accepts null
pricenumber
Optional
Accepts null
default_tax_idinteger
Optional
Accepts null
unit_idinteger
Optional
Accepts null
currency_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"price": 80
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"price": 80
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/item/123', ['json' => array (
'price' => 80,
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Documented response fields
Name Type Description / constraints
dataobject
Product or service. Prices are expressed in currency units, not cents. Tax and unit names are conditional; currency contains id and name if a currency exists.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/item/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/item/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
Documented response fields
Name Type Description / constraints
datastring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
descriptionstring
Optional
Accepts null
codestring
Optional
Accepts null
account_codestring
Optional
Accepts null
pricenumber
Optional
Accepts null
default_tax_idinteger
Optional
Accepts null
unit_idinteger
Optional
Accepts null
currency_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/item' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/item', ['json' => array (
'name' => 'Conseil technique',
'code' => 'DEMO-001',
'price' => 75.5,
'default_tax_id' => 12,
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Documented response fields
Name Type Description / constraints
dataobject
Product or service. Prices are expressed in currency units, not cents. Tax and unit names are conditional; currency contains id and name if a currency exists.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item/name/{name}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
namestring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/item/name/Atelier%20Exemple' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item/name/Atelier%20Exemple", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/name/Atelier%20Exemple')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Documented response fields
Name Type Description / constraints
dataobject
Product or service. Prices are expressed in currency units, not cents. Tax and unit names are conditional; currency contains id and name if a currency exists.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/item/code/{code}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
codestring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/item/code/DEMO-001' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/item/code/DEMO-001", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/item/code/DEMO-001')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Prestation de conseil",
"description": "Conseil technique",
"code": "P001",
"account_code": "706001",
"price": 75.5,
"ecotaxe": 0,
"default_tax_id": 12,
"default_tax_name": "TVA 20 %",
"unit_id": 3,
"unit_name": "heure"
}
}
Documented response fields
Name Type Description / constraints
dataobject
Product or service. Prices are expressed in currency units, not cents. Tax and unit names are conditional; currency contains id and name if a currency exists.
data.idinteger
data.namestring
data.descriptionstring
data.codestring
data.account_codestring
data.pricenumber
data.ecotaxenumber
data.default_tax_idinteger
data.default_tax_namestring
data.unit_idinteger
data.unit_namestring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
API resources Tax rates Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/tax-types
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/tax-types' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/tax-types", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/tax-types')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/tax-type
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
percentnumber
Required
account_codestring
Optional
codestring
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/tax-type' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/tax-type", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/tax-type', ['json' => array (
'name' => 'TVA 8.5 %',
'percent' => 8.5,
'account_code' => '445664',
'code' => '1',
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
https://api.invoicing.plus/v1/tax-type/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Optional
percentnumber
Optional
account_codestring
Optional
codestring
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/tax-type/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/tax-type/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "TVA 8.5 %",
"percent": 8.5,
"account_code": "445664",
"code": "1"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/tax-type/123', ['json' => array (
'name' => 'TVA 8.5 %',
'percent' => 8.5,
'account_code' => '445664',
'code' => '1',
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
API resources Units Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/units
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/units' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/units", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/units')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/unit
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
pluralstring
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/unit' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "forfait",
"plural": "forfaits"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/unit", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "forfait",
"plural": "forfaits"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/unit', ['json' => array (
'name' => 'forfait',
'plural' => 'forfaits',
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
API resources Estimates Contracts, parameters and examples for this resource.
The API exposes listing, retrieval, creation and PDF download. No public estimate update or arbitrary status-change route is exposed. CURRENT includes DRAFT, ACCEPTED, ORDERED and PARTIAL_INVOICED.
https://api.invoicing.plus/v1/estimates
For periodic tracking, use status=ALL and iterate through all pages. from_date and to_date filter the document date, not the status change date.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
statusstring
Optional ALL: all statuses; CURRENT: DRAFT, ACCEPTED, ORDERED, PARTIAL_INVOICED. Without a filter, all statuses are returned.
CURRENT · ALL
searchstring
Optional Search by estimate number or customer name.
pageinteger
Optional Requested page.
Minimum: 1 Default value: 1
limitinteger
Optional Documents per page.
Minimum: 1 Maximum: 1000 Default value: 1000
from_datestring
Optional Filter estimates from this date (YYYY-MM-DD).
Format: date
to_datestring
Optional Filter estimates up to this date (YYYY-MM-DD).
Format: date
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/estimates' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/estimates", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimates')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 123,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "DEV20260001",
"reference": "AFFAIRE-001",
"status": "ACCEPTED",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
]
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].customer_idinteger
data[].customerobject
data[].customer.namestring
data[].estimate_datestring
Format: date
data[].expiry_datestring
Format: date Accepts null
data[].estimate_numberstring
Document number: DEVxxxx for an estimate, COMxxxx for an order (the field name remains estimate_number).
data[].referencestring
Free-form document reference, separate from the original estimate.
Accepts null
data[].statusstring
Current business status, returned as stored. Orders may have DRAFT, PARTIAL_INVOICED, INVOICED, ARCHIVED or DELIVERED status; estimates may also have SENT, VIEWED, EXPIRED, ACCEPTED, REJECTED or ORDERED status depending on their lifecycle.
data[].status_changed_atstring
Format: date-time Accepts null
data[].updated_atstring
Format: date-time Accepts null
data[].titlestring
Accepts null
data[].notesstring
Accepts null
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].payment_method_idinteger
Accepts null
data[].linesarray
data[].lines[].line_numberinteger
1-based position in the lines array, including heading lines. This number may change when a line is added, deleted or moved and is not a stable identifier.
Minimum: 1
data[].lines[].item_idinteger
Accepts null
data[].lines[].is_titleboolean
Accepts null
data[].lines[].titlestring
Accepts null
data[].lines[].namestring
Accepts null
data[].lines[].replace_namestring
Accepts null
data[].lines[].descriptionstring
Accepts null
data[].lines[].quantitynumber
Accepts null
data[].lines[].unitstring
Unit stored on the document line (flat rate, item, hour, etc.), independently of the current product unit.
Accepts null
data[].lines[].pricenumber
Accepts null
data[].lines[].discount_typestring
Accepts null
data[].lines[].discountnumber
Accepts null
data[].lines[].is_ttcboolean
Accepts null
data[].lines[].sub_totalnumber
Accepts null
data[].lines[].taxnumber
Accepts null
data[].lines[].totalnumber
Accepts null
data[].lines[].tax_type_idinteger
Accepts null
data[].lines[].tax_typeobject
Accepts null
data[].lines[].tax_type.idinteger
data[].lines[].tax_type.namestring
data[].lines[].tax_type.percentnumber
data[].lines[].tax_type.amountnumber
Present for legacy lines using the taxes relationship.
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 200OK 429Default public API limit: 240 requests per minute, shared across endpoints and companies for the same authenticated user (by IP for unauthenticated requests). A temporary server-side allowance may be configured for initial data imports and expires automatically. X-RateLimit-Limit indicates the effective limit. A few requests every fifteen minutes per company fit within the standard quota. After HTTP 429, wait for Retry-After before retrying. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/estimate/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/estimate/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/estimate/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimate/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "DEV20260001",
"reference": "AFFAIRE-001",
"status": "ACCEPTED",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
]
}
}
Documented response fields
Name Type Description / constraints
dataobject
Estimate or order. Amounts are expressed in currency units (e.g. euros), not cents. status_changed_at is the last status change recorded since tracking was introduced; null for older documents without a new status change. updated_at reflects any modification and is not a status change date. Timestamps use ISO 8601 in UTC.
data.idinteger
data.customer_idinteger
data.customerobject
data.customer.namestring
data.estimate_datestring
Format: date
data.expiry_datestring
Format: date Accepts null
data.estimate_numberstring
Document number: DEVxxxx for an estimate, COMxxxx for an order (the field name remains estimate_number).
data.referencestring
Free-form document reference, separate from the original estimate.
Accepts null
data.statusstring
Current business status, returned as stored. Orders may have DRAFT, PARTIAL_INVOICED, INVOICED, ARCHIVED or DELIVERED status; estimates may also have SENT, VIEWED, EXPIRED, ACCEPTED, REJECTED or ORDERED status depending on their lifecycle.
data.status_changed_atstring
Format: date-time Accepts null
data.updated_atstring
Format: date-time Accepts null
data.titlestring
Accepts null
data.notesstring
Accepts null
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.payment_method_idinteger
Accepts null
data.linesarray
data.lines[].line_numberinteger
1-based position in the lines array, including heading lines. This number may change when a line is added, deleted or moved and is not a stable identifier.
Minimum: 1
data.lines[].item_idinteger
Accepts null
data.lines[].is_titleboolean
Accepts null
data.lines[].titlestring
Accepts null
data.lines[].namestring
Accepts null
data.lines[].replace_namestring
Accepts null
data.lines[].descriptionstring
Accepts null
data.lines[].quantitynumber
Accepts null
data.lines[].unitstring
Unit stored on the document line (flat rate, item, hour, etc.), independently of the current product unit.
Accepts null
data.lines[].pricenumber
Accepts null
data.lines[].discount_typestring
Accepts null
data.lines[].discountnumber
Accepts null
data.lines[].is_ttcboolean
Accepts null
data.lines[].sub_totalnumber
Accepts null
data.lines[].taxnumber
Accepts null
data.lines[].totalnumber
Accepts null
data.lines[].tax_type_idinteger
Accepts null
data.lines[].tax_typeobject
Accepts null
data.lines[].tax_type.idinteger
data.lines[].tax_type.namestring
data.lines[].tax_type.percentnumber
data.lines[].tax_type.amountnumber
Present for legacy lines using the taxes relationship.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 200OK 429Default public API limit: 240 requests per minute, shared across endpoints and companies for the same authenticated user (by IP for unauthenticated requests). A temporary server-side allowance may be configured for initial data imports and expires automatically. X-RateLimit-Limit indicates the effective limit. A few requests every fifteen minutes per company fit within the standard quota. After HTTP 429, wait for Retry-After before retrying. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
https://api.invoicing.plus/v1/estimate
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
estimate_datestring
Optional
Format: date Accepts null
expiry_datestring
Optional
Format: date Accepts null
customer_idinteger
Required
titleUnspecified
Optional
Accepts null
notesUnspecified
Optional
Accepts null
referenceUnspecified
Optional
Accepts null
linesarray
Required
lines[].is_titleboolean
Optional
Accepts null
lines[].item_idinteger
Optional Condition: required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Optional
Accepts null
lines[].titleUnspecified
Optional
Accepts null
lines[].is_ttcUnspecified
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].quantitynumber
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional
Accepts null
lines[].discount_typestring
Optional
Accepts null
lines[].discountnumber
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/estimate' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/estimate", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/estimate', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
POST Create an estimate with automatic customer matching by email and automatic product matching by product code #
https://api.invoicing.plus/v1/estimate/effortless
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
estimate_datestring
Optional
Format: date Accepts null
expiry_datestring
Optional
Format: date Accepts null
customer_emailstring
Required
Format: email
customerobject
Required
customer.namestring
Required
customer.company_namestring
Optional
Accepts null
customer.codestring
Optional
Accepts null
customer.account_codestring
Optional
Accepts null
customer.phoneUnspecified
Optional
Accepts null
customer.crnUnspecified
Optional
Accepts null
customer.vatUnspecified
Optional
Accepts null
customer.billing_address_1string
Optional
Accepts null
customer.billing_address_2string
Optional
Accepts null
customer.billing_zipstring
Optional
Accepts null
customer.billing_citystring
Optional
Accepts null
customer.is_webboolean
Optional
Accepts null
titleUnspecified
Optional
Accepts null
notesUnspecified
Optional
Accepts null
referenceUnspecified
Optional
Accepts null
linesarray
Required
lines[].is_titleboolean
Optional
Accepts null
lines[].item_codestring
Optional Condition: required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Optional
Accepts null
lines[].tax_percentnumber
Optional
Accepts null
lines[].titleUnspecified
Optional
Accepts null
lines[].is_ttcUnspecified
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].quantitynumber
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional
Accepts null
lines[].discount_typestring
Optional
Accepts null
lines[].discountnumber
Optional
Accepts null
lines[].itemobject
Optional
lines[].item.namestring
Optional Condition: required_if:lines.*.is_title,false
lines[].item.descriptionUnspecified
Optional
Accepts null
lines[].item.account_codeUnspecified
Optional
Accepts null
lines[].item.tax_percentnumber
Optional
Accepts null
lines[].item.priceUnspecified
Optional
Accepts null
lines[].item.tax_type_idinteger
Optional
Accepts null
lines[].item.unit_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/estimate/effortless' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/estimate/effortless", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/estimate/effortless', ['json' => array (
'customer_email' => 'demo@example.com',
'customer' =>
array (
'name' => 'Atelier Exemple',
),
'lines' =>
array (
0 =>
array (
'item_code' => 'DEMO-001',
'item' =>
array (
'name' => 'Conseil technique',
),
'quantity' => 2,
'price' => 75.5,
'tax_percent' => 20,
),
),
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/estimate/{id}/pdf
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idUnspecified
Required ID of the estimate to send
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/estimate/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/estimate/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/estimate/123/pdf')
->throw()
->body();
Response example HTTP 200
Binary application/pdf response. Save the response body to a PDF file.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
API resources Orders Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/orders
By default, returns DRAFT and PARTIAL_INVOICED orders. To track all statuses periodically, use status=ALL and iterate through all pages: an invoiced order disappears from the CURRENT list. Date filters apply to the document date, not the status change date.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
from_datestring
Optional Earliest document date, inclusive.
Format: date
to_datestring
Optional Latest document date, inclusive.
Format: date
statusstring
Optional CURRENT: DRAFT and PARTIAL_INVOICED; ALL: all statuses.
Default value: CURRENT CURRENT · ALL
searchstring
Optional Search by order number or customer name.
pageinteger
Optional Requested page.
Minimum: 1 Default value: 1
limitinteger
Optional Documents per page.
Minimum: 1 Maximum: 1000 Default value: 1000
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/orders' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/orders", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/orders')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 124,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "COM20260001",
"reference": "AFFAIRE-001",
"status": "DRAFT",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
],
"previous_document": {
"type": "estimate",
"number": "DEV20260001",
"reference": "AFFAIRE-001",
"sub_total": 100
},
"estimate_id": 123,
"estimate": {
"id": 123,
"estimate_number": "DEV20260001"
}
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].customer_idinteger
data[].customerobject
data[].customer.namestring
data[].estimate_datestring
Format: date
data[].expiry_datestring
Format: date Accepts null
data[].estimate_numberstring
data[].referencestring
Free-form document reference, separate from the original estimate.
Accepts null
data[].statusstring
data[].status_changed_atstring
Format: date-time Accepts null
data[].updated_atstring
Format: date-time Accepts null
data[].titlestring
Accepts null
data[].notesstring
Accepts null
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].payment_method_idinteger
Accepts null
data[].linesarray
data[].lines[].line_numberinteger
1-based position in the lines array, including heading lines. This number may change when a line is added, deleted or moved and is not a stable identifier.
Minimum: 1
data[].lines[].item_idinteger
Accepts null
data[].lines[].is_titleboolean
Accepts null
data[].lines[].titlestring
Accepts null
data[].lines[].namestring
Accepts null
data[].lines[].replace_namestring
Accepts null
data[].lines[].descriptionstring
Accepts null
data[].lines[].quantitynumber
Accepts null
data[].lines[].unitstring
Unit stored on the document line (flat rate, item, hour, etc.), independently of the current product unit.
Accepts null
data[].lines[].pricenumber
Accepts null
data[].lines[].discount_typestring
Accepts null
data[].lines[].discountnumber
Accepts null
data[].lines[].is_ttcboolean
Accepts null
data[].lines[].sub_totalnumber
Accepts null
data[].lines[].taxnumber
Accepts null
data[].lines[].totalnumber
Accepts null
data[].lines[].tax_type_idinteger
Accepts null
data[].lines[].tax_typeobject
Accepts null
data[].lines[].tax_type.idinteger
data[].lines[].tax_type.namestring
data[].lines[].tax_type.percentnumber
data[].lines[].tax_type.amountnumber
Present for legacy lines using the taxes relationship.
data[].previous_documentobject
Accessible original estimate, using the same format as invoices. Omitted if no estimate is accessible. sub_total is expressed in currency units, not cents.
data[].previous_document.typestring
estimate
data[].previous_document.numberstring
data[].previous_document.referencestring
Accepts null
data[].previous_document.sub_totalnumber
data[].estimate_idinteger
ID of the accessible original estimate; otherwise null.
Accepts null
data[].estimateobject
Original estimate accessible in the company and to the current user; otherwise null.
Accepts null
data[].estimate.idinteger
data[].estimate.estimate_numberstring
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 200OK 429Default public API limit: 240 requests per minute, shared across endpoints and companies for the same authenticated user (by IP for unauthenticated requests). A temporary server-side allowance may be configured for initial data imports and expires automatically. X-RateLimit-Limit indicates the effective limit. A few requests every fifteen minutes per company fit within the standard quota. After HTTP 429, wait for Retry-After before retrying. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/order/{id}
The COM number is returned in estimate_number, as in the list. previous_document describes the original estimate using the same format as invoices (type, number, reference, sub_total) and is omitted if no estimate is accessible. estimate contains the original estimate ID and number, or null for an order without an accessible estimate.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/order/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/order/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/order/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 124,
"customer_id": 42,
"customer": {
"name": "Client de démonstration"
},
"estimate_date": "2026-10-21",
"expiry_date": "2026-11-21",
"estimate_number": "COM20260001",
"reference": "AFFAIRE-001",
"status": "DRAFT",
"status_changed_at": "2026-10-21T14:30:00.000000Z",
"updated_at": "2026-10-21T14:30:00.000000Z",
"title": "Découpe de pièces",
"notes": "",
"sub_total": 100,
"tax": 20,
"total": 120,
"payment_method_id": 1,
"lines": [
{
"line_number": 1,
"item_id": 7,
"is_title": false,
"title": "",
"name": "Pièce découpée",
"replace_name": "",
"description": "",
"quantity": 1,
"unit": "pièce",
"price": 100,
"discount_type": "fixed",
"discount": 0,
"is_ttc": false,
"sub_total": 100,
"tax": 20,
"total": 100,
"tax_type_id": 1,
"tax_type": {
"id": 1,
"name": "TVA 20 %",
"percent": 20,
"amount": 20
}
}
],
"previous_document": {
"type": "estimate",
"number": "DEV20260001",
"reference": "AFFAIRE-001",
"sub_total": 100
},
"estimate_id": 123,
"estimate": {
"id": 123,
"estimate_number": "DEV20260001"
}
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.customer_idinteger
data.customerobject
data.customer.namestring
data.estimate_datestring
Format: date
data.expiry_datestring
Format: date Accepts null
data.estimate_numberstring
data.referencestring
Free-form document reference, separate from the original estimate.
Accepts null
data.statusstring
data.status_changed_atstring
Format: date-time Accepts null
data.updated_atstring
Format: date-time Accepts null
data.titlestring
Accepts null
data.notesstring
Accepts null
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.payment_method_idinteger
Accepts null
data.linesarray
data.lines[].line_numberinteger
1-based position in the lines array, including heading lines. This number may change when a line is added, deleted or moved and is not a stable identifier.
Minimum: 1
data.lines[].item_idinteger
Accepts null
data.lines[].is_titleboolean
Accepts null
data.lines[].titlestring
Accepts null
data.lines[].namestring
Accepts null
data.lines[].replace_namestring
Accepts null
data.lines[].descriptionstring
Accepts null
data.lines[].quantitynumber
Accepts null
data.lines[].unitstring
Unit stored on the document line (flat rate, item, hour, etc.), independently of the current product unit.
Accepts null
data.lines[].pricenumber
Accepts null
data.lines[].discount_typestring
Accepts null
data.lines[].discountnumber
Accepts null
data.lines[].is_ttcboolean
Accepts null
data.lines[].sub_totalnumber
Accepts null
data.lines[].taxnumber
Accepts null
data.lines[].totalnumber
Accepts null
data.lines[].tax_type_idinteger
Accepts null
data.lines[].tax_typeobject
Accepts null
data.lines[].tax_type.idinteger
data.lines[].tax_type.namestring
data.lines[].tax_type.percentnumber
data.lines[].tax_type.amountnumber
Present for legacy lines using the taxes relationship.
data.previous_documentobject
Accessible original estimate, using the same format as invoices. Omitted if no estimate is accessible. sub_total is expressed in currency units, not cents.
data.previous_document.typestring
estimate
data.previous_document.numberstring
data.previous_document.referencestring
Accepts null
data.previous_document.sub_totalnumber
data.estimate_idinteger
ID of the accessible original estimate; otherwise null.
Accepts null
data.estimateobject
Original estimate accessible in the company and to the current user; otherwise null.
Accepts null
data.estimate.idinteger
data.estimate.estimate_numberstring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Default public API limit: 240 requests per minute, shared across endpoints and companies for the same authenticated user (by IP for unauthenticated requests). A temporary server-side allowance may be configured for initial data imports and expires automatically. X-RateLimit-Limit indicates the effective limit. A few requests every fifteen minutes per company fit within the standard quota. After HTTP 429, wait for Retry-After before retrying.
View contract in Swagger ↗
https://api.invoicing.plus/v1/order/{id}/pdf
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idUnspecified
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/order/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/order/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/order/123/pdf')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
API resources Pre-billings Contracts, parameters and examples for this resource.
GET List pre-billing documents #
https://api.invoicing.plus/v1/pre-billings
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
customer_idinteger
Optional
statusstring
Optional
from_datestring
Optional
Format: date
to_datestring
Optional
Format: date
limitinteger
Optional
Maximum: 100 Default value: 20
pageinteger
Optional
Default value: 1
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/pre-billings' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billings", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/pre-billings')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200Paginated list 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
GET Get a pre-billing document #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/pre-billing/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
PUT Replace a draft pre-billing document that is not linked to an invoice #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Required
pre_billing_datestring
Optional Pre-billing date (default: today)
Format: date Accepts null
referencestring
Optional
Accepts null
titlestring
Optional
Accepts null
notesstring
Optional
Accepts null
refundboolean
Optional
Default value: false
linesarray
Required
lines[].item_idinteger
Optional Company product, required except for a heading line
lines[].is_titleboolean
Optional
Default value: false
lines[].titlestring
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].name2string
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional Unit price in currency units (default: product price)
lines[].ecotaxenumber
Optional Unit environmental levy in currency units (default: product value)
lines[].quantitynumber
Optional
Default value: 1
lines[].nkpnumber
Optional
Default value: 1
lines[].tax_type_idinteger
Optional Company tax rate; default: product tax rate; null: no VAT
Accepts null
lines[].discount_typestring
Optional
Default value: fixed fixed · percentage
lines[].discountnumber
Optional Unit discount in currency units or as a percentage
Default value: 0
lines[].is_ttcboolean
Optional
Default value: false
lines[].is_freeboolean
Optional
Default value: false
lines[].deboursboolean
Optional
Default value: false
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/pre-billing/123', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company. 409Pre-billing document already invoiced or archived 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
DELETE Delete a draft pre-billing document that is not linked to an invoice #
https://api.invoicing.plus/v1/pre-billing/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/pre-billing/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/pre-billing/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200Deleted 404Resource not found or not visible in the selected company. 409Pre-billing document already invoiced or archived
View contract in Swagger ↗
POST Create a pre-billing document #
https://api.invoicing.plus/v1/pre-billing
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Required
pre_billing_datestring
Optional Pre-billing date (default: today)
Format: date Accepts null
referencestring
Optional
Accepts null
titlestring
Optional
Accepts null
notesstring
Optional
Accepts null
refundboolean
Optional
Default value: false
linesarray
Required
lines[].item_idinteger
Optional Company product, required except for a heading line
lines[].is_titleboolean
Optional
Default value: false
lines[].titlestring
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].name2string
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional Unit price in currency units (default: product price)
lines[].ecotaxenumber
Optional Unit environmental levy in currency units (default: product value)
lines[].quantitynumber
Optional
Default value: 1
lines[].nkpnumber
Optional
Default value: 1
lines[].tax_type_idinteger
Optional Company tax rate; default: product tax rate; null: no VAT
Accepts null
lines[].discount_typestring
Optional
Default value: fixed fixed · percentage
lines[].discountnumber
Optional Unit discount in currency units or as a percentage
Default value: 0
lines[].is_ttcboolean
Optional
Default value: false
lines[].is_freeboolean
Optional
Default value: false
lines[].deboursboolean
Optional
Default value: false
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pre-billing' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billing", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"lines": [
{
"item_id": 123,
"quantity": 2
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pre-billing', ['json' => array (
'customer_id' => 42,
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
),
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201Created 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
POST Duplicate a pre-billing document with today's date #
https://api.invoicing.plus/v1/pre-billing/{id}/duplicate
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pre-billing/123/duplicate' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pre-billing/123/duplicate", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/pre-billing/123/duplicate')
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201Draft duplicated with today's date 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
API resources Invoices Contracts, parameters and examples for this resource.
Creation produces a DRAFT with paid_status=UNPAID. PUT /invoice/{id} only updates drafts. POST /invoice/{id}/validation validates to DONE subject to configured date, tax and numbering checks. due_date carries the due date; no generic multi-installment management API is documented.
An update without lines preserves stored lines and amounts. When lines is supplied, the list replaces all existing lines and amounts are recalculated. Applying due_date depends on invoice_set_due_date_automatically=YES. Retrieve and check the invoice after updating.
https://api.invoicing.plus/v1/invoices
Each invoice line exposes unit (the unit stored on the line, nullable) and line_number (1-based position, including heading lines). line_number may change when the document is edited and is not a stable identifier.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
from_datestring
Optional Filter invoices from this date (YYYY-MM-DD).
Format: date
to_datestring
Optional Filter invoices up to this date (YYYY-MM-DD).
Format: date
pageinteger
Optional Requested page
Minimum: 1 Default value: 1
limitinteger
Optional Results per page
Minimum: 1 Maximum: 1000 Default value: 1000
searchstring
Optional Search by name or document reference
statusstring
Optional Status filter
DONE · DRAFT
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoices')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].customer_idinteger
data[].invoice_datestring
Format: date
data[].due_datestring
Format: date
data[].invoice_numberstring
data[].referencestring
data[].statusstring
data[].paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data[].refundboolean
data[].depositboolean
data[].finalboolean
data[].sub_totalnumber
data[].taxnumber
data[].totalnumber
data[].linesarray
data[].lines[].line_numberinteger
data[].lines[].item_idinteger
data[].lines[].quantitynumber
data[].lines[].unitstring
Accepts null
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/invoice/{id}
Each invoice line exposes unit (the unit stored on the line, nullable) and line_number (1-based position, including heading lines). line_number may change when the document is edited and is not a stable identifier.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Documented response fields
Name Type Description / constraints
dataobject
Main invoice fields. Amounts are expressed in currency units, not cents. The full response also includes customer, lines, currency, payment method and any custom fields.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
PUT Update a draft invoice #
https://api.invoicing.plus/v1/invoice/{id}
Only DRAFT invoices can be updated; a validated invoice returns 404. Without lines, stored lines and amounts are preserved. When lines is supplied, all existing lines are replaced and amounts recalculated. due_date is applied only when invoice_set_due_date_automatically is YES. Amounts are in currency units.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
invoice_datestring
Optional
Format: date
due_datestring
Optional
Format: date
customer_idinteger
Optional
payment_method_idinteger
Optional
titlestring
Optional
notesstring
Optional
referencestring
Optional
refundboolean
Optional
period_startstring
Optional
Format: date
period_endstring
Optional
Format: date
currency_idinteger
Optional
linesarray
Optional
lines[].is_titleboolean
Optional
lines[].item_idinteger
Optional
lines[].tax_type_idinteger
Optional
lines[].titlestring
Optional
lines[].is_ttcboolean
Optional
lines[].namestring
Optional
lines[].descriptionstring
Optional
lines[].quantitynumber
Optional
lines[].unitstring
Optional
lines[].pricenumber
Optional
lines[].discount_typestring
Optional
lines[].discountnumber
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"reference": "DEMO-ORDER-42"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"reference": "DEMO-ORDER-42"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/invoice/123', ['json' => array (
'reference' => 'DEMO-ORDER-42',
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Documented response fields
Name Type Description / constraints
dataobject
Main invoice fields. Amounts are expressed in currency units, not cents. The full response also includes customer, lines, currency, payment method and any custom fields.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
DELETE Delete a draft invoice #
https://api.invoicing.plus/v1/invoice/{id}
Only drafts are actually deleted. A 200 response does not prove that a validated invoice was deleted; retrieve the resource again.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/invoice/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": "Deleted."
}
Documented response fields
Name Type Description / constraints
datastring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/invoice
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
invoice_datestring
Optional
Format: date Accepts null
due_datestring
Optional
Format: date Accepts null
customer_idinteger
Required
related_customer_idinteger
Optional
Accepts null
payment_method_idinteger
Optional Payment method belonging to the selected company.
Accepts null
titlestring
Optional
Accepts null
notesstring
Optional
Accepts null
referencestring
Optional
Accepts null
refundboolean
Optional
Accepts null
period_startstring
Optional
Format: date Accepts null
period_endstring
Optional
Format: date Accepts null
linesarray
Required
lines[].is_titleboolean
Optional
Accepts null
lines[].item_idinteger
Optional Condition: required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Optional Tax rate belonging to the selected company.
Accepts null
lines[].titlestring
Optional Text for a heading line.
Accepts null
lines[].is_ttcUnspecified
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].quantitynumber
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional Unit price in currency units.
Accepts null
lines[].discount_typestring
Optional
Accepts null
lines[].discountnumber
Optional
Accepts null
lines[].group_keystring
Optional
Accepts null
group_linesarray
Optional
Accepts null
group_lines[].keystring
Required
group_lines[].namestring
Required
group_lines[].descriptionstring
Optional
Accepts null
group_lines[].quantitynumber
Required
group_lines[].unitstring
Optional
Accepts null
currency_idinteger
Optional
Accepts null
invoice_type_idinteger
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice', ['json' => array (
'customer_id' => 42,
'invoice_date' => '2026-10-28',
'due_date' => '2026-11-28',
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 2,
),
1 =>
array (
'item_id' => 124,
'quantity' => 1,
),
),
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Documented response fields
Name Type Description / constraints
dataobject
Main invoice fields. Amounts are expressed in currency units, not cents. The full response also includes customer, lines, currency, payment method and any custom fields.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
POST Create an invoice with automatic customer matching by email and automatic product matching by product code #
https://api.invoicing.plus/v1/invoice/effortless
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
invoice_datestring
Optional
Format: date Accepts null
due_datestring
Optional
Format: date Accepts null
customer_emailstring
Required
Format: email
customerobject
Required
customer.namestring
Required
customer.company_namestring
Optional
Accepts null
customer.codestring
Optional
Accepts null
customer.account_codestring
Optional
Accepts null
customer.phoneUnspecified
Optional
Accepts null
customer.crnUnspecified
Optional
Accepts null
customer.vatUnspecified
Optional
Accepts null
customer.billing_address_1string
Optional
Accepts null
customer.billing_address_2string
Optional
Accepts null
customer.billing_zipstring
Optional
Accepts null
customer.billing_citystring
Optional
Accepts null
customer.is_webboolean
Optional
Accepts null
titleUnspecified
Optional
Accepts null
notesUnspecified
Optional
Accepts null
referenceUnspecified
Optional
Accepts null
refundboolean
Optional
Accepts null
period_startstring
Optional
Format: date Accepts null
period_endstring
Optional
Format: date Accepts null
linesarray
Required
lines[].is_titleboolean
Optional
Accepts null
lines[].item_codestring
Optional Condition: required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Optional Condition: required_if:lines.*.tax_type_id,false
Accepts null
lines[].tax_percentnumber
Optional
Accepts null
lines[].titleUnspecified
Optional
Accepts null
lines[].is_ttcUnspecified
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].quantitynumber
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional
Accepts null
lines[].discount_typestring
Optional
Accepts null
lines[].discountnumber
Optional
Accepts null
lines[].group_keystring
Optional
Accepts null
lines[].itemobject
Optional
lines[].item.namestring
Optional Condition: required_if:lines.*.is_title,false
lines[].item.descriptionUnspecified
Optional
Accepts null
lines[].item.account_codeUnspecified
Optional
Accepts null
lines[].item.tax_percentnumber
Optional
Accepts null
lines[].item.priceUnspecified
Optional
Accepts null
lines[].item.tax_type_idinteger
Optional
Accepts null
lines[].item.unit_idinteger
Optional
Accepts null
group_linesarray
Optional
Accepts null
group_lines[].keystring
Required
group_lines[].namestring
Required
group_lines[].descriptionstring
Optional
Accepts null
group_lines[].quantitynumber
Required
group_lines[].unitstring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice/effortless' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/effortless", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_email": "demo@example.com",
"customer": {
"name": "Atelier Exemple"
},
"lines": [
{
"item_code": "DEMO-001",
"item": {
"name": "Conseil technique"
},
"quantity": 2,
"price": 75.5,
"tax_percent": 20
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/effortless', ['json' => array (
'customer_email' => 'demo@example.com',
'customer' =>
array (
'name' => 'Atelier Exemple',
),
'lines' =>
array (
0 =>
array (
'item_code' => 'DEMO-001',
'item' =>
array (
'name' => 'Conseil technique',
),
'quantity' => 2,
'price' => 75.5,
'tax_percent' => 20,
),
),
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"invoice_number": "FAC-2026-00123",
"reference": "COMMANDE-42",
"status": "DRAFT",
"paid_status": "UNPAID",
"refund": false,
"deposit": false,
"final": false,
"sub_total": 100,
"tax": 20,
"total": 120,
"lines": [
{
"line_number": 1,
"item_id": 123,
"quantity": 2,
"unit": "heure"
}
]
}
}
Documented response fields
Name Type Description / constraints
dataobject
Main invoice fields. Amounts are expressed in currency units, not cents. The full response also includes customer, lines, currency, payment method and any custom fields.
data.idinteger
data.customer_idinteger
data.invoice_datestring
Format: date
data.due_datestring
Format: date
data.invoice_numberstring
data.referencestring
data.statusstring
data.paid_statusstring
UNPAID · PARTIALLY_PAID · PAID
data.refundboolean
data.depositboolean
data.finalboolean
data.sub_totalnumber
data.taxnumber
data.totalnumber
data.linesarray
data.lines[].line_numberinteger
data.lines[].item_idinteger
data.lines[].quantitynumber
data.lines[].unitstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/invoice/{id}/validation
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idUnspecified
Required ID of the invoice to validate
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice/123/validation' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/validation", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/123/validation')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/invoice/{id}/pdf
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idUnspecified
Required ID of the invoice to send
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123/pdf')
->throw()
->body();
Response example HTTP 200
Binary application/pdf response. Save the response body to a PDF file.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/invoice/{id}/send
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idUnspecified
Required ID of the invoice to send
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
tostring
Optional
subjectstring
Required
from_namestring
Required
from_emailstring
Required
bodystring
Optional
ccstring
Optional
bccstring
Optional
to_arrayarray
Optional
to_array[].namestring
Required
to_array[].emailstring
Required
Format: email
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice/123/send' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"to": "demo@example.com",
"subject": "Votre facture",
"from_name": "Camille Exemple",
"from_email": "demo@example.com"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/send", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"to": "demo@example.com",
"subject": "Votre facture",
"from_name": "Camille Exemple",
"from_email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/invoice/123/send', ['json' => array (
'to' => 'demo@example.com',
'subject' => 'Votre facture',
'from_name' => 'Camille Exemple',
'from_email' => 'demo@example.com',
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"message": "Queued."
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.messagestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 404Resource not found or not visible in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
GET Generate and download the PDF #
https://api.invoicing.plus/v1/invoice/{id}/stream-pdf
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/stream-pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/invoice/123/stream-pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const pdf = await response.blob();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/invoice/123/stream-pdf')
->throw()
->body();
Response example HTTP 200
Binary application/pdf response. Save the response body to a PDF file.
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
API resources Recurring invoices Contracts, parameters and examples for this resource.
GET List your recurring invoices #
https://api.invoicing.plus/v1/recurring-invoices
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/recurring-invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/recurring-invoices')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
GET Recurring invoice data #
https://api.invoicing.plus/v1/recurring-invoice/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/recurring-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/recurring-invoice/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
POST Create a recurring invoice #
https://api.invoicing.plus/v1/recurring-invoice
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Required
frequencystring
Required
M · T · Q · S · A · H
statusstring
Optional
ACTIVE · INACTIVE Accepts null
referenceUnspecified
Optional
Accepts null
generation_datestring
Required
Format: date
invoice_datestring
Required
Format: date
due_datestring
Required
Format: date
init_datestring
Optional
Format: date Accepts null
end_datestring
Optional
Format: date Accepts null
period_startstring
Optional
Format: date Accepts null
period_endstring
Optional
Format: date Accepts null
generate_pre_billingsboolean
Optional Include the pre-billing document when generating recurring invoices.
Accepts null
payment_method_idinteger
Optional
Accepts null
titleUnspecified
Optional
Accepts null
notesUnspecified
Optional
Accepts null
linesarray
Optional
Accepts null
lines[].is_titleboolean
Optional
Accepts null
lines[].item_idinteger
Optional Condition: required_if:lines.*.is_title,false
lines[].tax_type_idinteger
Optional
Accepts null
lines[].titleUnspecified
Optional
Accepts null
lines[].is_ttcUnspecified
Optional
Accepts null
lines[].namestring
Optional
Accepts null
lines[].name2string
Optional
Accepts null
lines[].descriptionstring
Optional
Accepts null
lines[].quantitynumber
Optional
Accepts null
lines[].unitstring
Optional
Accepts null
lines[].pricenumber
Optional
Accepts null
lines[].discount_typestring
Optional
Accepts null
lines[].discountnumber
Optional
Accepts null
lines[].is_percentboolean
Optional
Accepts null
lines[].percentnumber
Optional
Accepts null
lines[].line_percentarray
Optional
Accepts null
lines[].updownstring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/recurring-invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"frequency": "M",
"generation_date": "2026-11-01",
"invoice_date": "2026-11-01",
"due_date": "2026-11-30",
"lines": [
{
"item_id": 123,
"quantity": 1
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/recurring-invoice", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 42,
"frequency": "M",
"generation_date": "2026-11-01",
"invoice_date": "2026-11-01",
"due_date": "2026-11-30",
"lines": [
{
"item_id": 123,
"quantity": 1
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/recurring-invoice', ['json' => array (
'customer_id' => 42,
'frequency' => 'M',
'generation_date' => '2026-11-01',
'invoice_date' => '2026-11-01',
'due_date' => '2026-11-30',
'lines' =>
array (
0 =>
array (
'item_id' => 123,
'quantity' => 1,
),
),
)])
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
API resources Payments Contracts, parameters and examples for this resource.
Prefer a validated invoice with an outstanding balance. Send an explicit amount in currency units. Negative amounts and amounts above the balance are rejected. GET /invoice/{id} exposes paid_status (UNPAID, PARTIALLY_PAID, PAID), and GET /payments retrieves payments. InvoiceResource does not expose due_amount: do not assume it is present in the response.
https://api.invoicing.plus/v1/payments
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/payments' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payments", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payments')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
]
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].customer_idinteger
data[].payment_numberstring
data[].payment_datestring
data[].amountnumber
data[].invoice_idinteger
Accepts null
data[].refund_invoice_idinteger
Accepts null
data[].payment_method_idinteger
Accepts null
data[].notesstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
https://api.invoicing.plus/v1/payment/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idstring
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/payment/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.customer_idinteger
data.payment_numberstring
data.payment_datestring
data.amountnumber
data.invoice_idinteger
Accepts null
data.refund_invoice_idinteger
Accepts null
data.payment_method_idinteger
Accepts null
data.notesstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
https://api.invoicing.plus/v1/payment/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/payment/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/payment/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": "Deleted"
}
Documented response fields
Name Type Description / constraints
datastring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/payment
Provide invoice_id for an invoice or refund_invoice_id for a credit note. Amounts are in currency units. Without amount, the remaining balance is used. The amount must not be negative or exceed the balance. The actual response is HTTP 200.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
invoice_idinteger
Optional Invoice in the selected company; use this ID for an invoice payment.
refund_invoice_idinteger
Optional Credit note in the selected company, used instead of invoice_id.
payment_datestring
Optional
Format: date
amountnumber
Optional
payment_method_idinteger
Optional
currency_idinteger
Optional
notesstring
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/payment' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/payment', ['json' => array (
'invoice_id' => 123,
'payment_date' => '2026-10-28',
'amount' => 120,
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 321,
"customer_id": 42,
"payment_number": "REG-2026-00321",
"payment_date": "2026-10-28",
"amount": 120,
"invoice_id": 123,
"payment_method_id": 3
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.customer_idinteger
data.payment_numberstring
data.payment_datestring
data.amountnumber
data.invoice_idinteger
Accepts null
data.refund_invoice_idinteger
Accepts null
data.payment_method_idinteger
Accepts null
data.notesstring
Accepts null
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
API resources Payment methods Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/payment-methods
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/payment-methods' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment-methods", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment-methods')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
]
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].namestring
data[].account_codestring
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user.
View contract in Swagger ↗
GET Retrieve a payment method #
https://api.invoicing.plus/v1/payment-method/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/payment-method/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment-method/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/payment-method/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.account_codestring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
DELETE Delete a payment method #
https://api.invoicing.plus/v1/payment-method/{id}
Deletion returns 403 when payments or expenses are attached.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/payment-method/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment-method/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/payment-method/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": "Deleted"
}
Documented response fields
Name Type Description / constraints
datastring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
POST Create a payment method #
https://api.invoicing.plus/v1/payment-method
The name must be unique within the company. Creation returns HTTP 200.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
account_codestring
Optional
filebankboolean
Optional
accountingboolean
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/payment-method' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Virement Démo",
"account_code": "512000",
"filebank": false,
"accounting": false
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/payment-method", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Virement Démo",
"account_code": "512000",
"filebank": false,
"accounting": false
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/payment-method', ['json' => array (
'name' => 'Virement Démo',
'account_code' => '512000',
'filebank' => false,
'accounting' => false,
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 3,
"name": "Virement Démo",
"account_code": "512000"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.account_codestring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
API resources Purchases Contracts, parameters and examples for this resource.
GET List purchases submitted by the authenticated user #
https://api.invoicing.plus/v1/purchase-invoices
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
pageinteger
Optional
Minimum: 1
limitinteger
Optional
Minimum: 1 Maximum: 50
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoices", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoices')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200User purchases, newest first
View contract in Swagger ↗
POST Import a supplier invoice or receipt #
https://api.invoicing.plus/v1/purchase-invoice/import
Stores the attachment. If supplier_id is provided, an accounting entry is prepared for completion. When ocr is omitted, all companies temporarily receive automatic extraction for supported formats when the service is available. Otherwise, the attachment is kept for manual entry. ocr=true/false remain available for existing integrations.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required Let the HTTP client generate the multipart boundary.
multipart/form-data
Request body multipart/form-data
Name Type Required Description / constraints
filestring
Required PDF, image, Word, Excel, PowerPoint or OpenDocument file (20 MB maximum).
Format: binary
ocrboolean
Optional Optional: when omitted, the backend automatically enables OCR for supported formats when the service is available. true explicitly requests OCR; false keeps the document for manual entry. OCR is temporarily available to all companies. HEIC/HEIF and ODS/ODP remain standard documents in automatic mode.
supplier_idinteger
Optional Optional ID of a supplier belonging to the company.
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/purchase-invoice/import' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--form 'file=@/path/to/document.pdf'
JavaScript · fetch Copy
const form = new FormData();
form.append('file', fileInput.files[0]);
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/import", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
},
body: form
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
$file = fopen('/path/to/document.pdf', 'r');
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->attach('file', $file, 'document.pdf')
->send('POST', 'https://api.invoicing.plus/v1/purchase-invoice/import')
->throw()
->json();
Response example HTTP 201
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 201Document imported 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
GET Get a purchase and its OCR result #
https://api.invoicing.plus/v1/purchase-invoice/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoice/123')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200Purchase, attachment and OCR status 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
DELETE Delete your submission that has not been posted to accounting #
https://api.invoicing.plus/v1/purchase-invoice/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/purchase-invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/purchase-invoice/123')
->throw()
->json();
Response example HTTP 204
Response with no content.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 204Submission and attachment deleted 404Resource not found or not visible in the selected company. 409Submission already posted to accounting
View contract in Swagger ↗
GET Download the original purchase attachment #
https://api.invoicing.plus/v1/purchase-invoice/{id}/pdf
Returns the original PDF unchanged (including Factur-X). For images or Office documents, returns the file in its original format without conversion.
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/purchase-invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/purchase-invoice/123/pdf", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/purchase-invoice/123/pdf')
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
403Authenticated user with insufficient permissions in the selected company. 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200Original file 404Resource not found or not visible in the selected company.
View contract in Swagger ↗
API resources Validation examples Contracts, parameters and examples for this resource.
These educational routes demonstrate validation. Deliberately invalid examples are expected to produce errors; they are not templates for creating business documents.
POST Submit JSON with valid types: numbers, dates and strings #
https://api.invoicing.plus/v1/pass-good-data
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Optional
invoice_datestring
Optional
Format: date
namestring
Optional
linesarray
Optional Lines
lines[].item_idinteger
Optional
lines[].quantitynumber
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pass-good-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"lines": [
{
"item_id": 54321,
"quantity": 7.5
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pass-good-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"lines": [
{
"item_id": 54321,
"quantity": 7.5
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-good-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => '2026-10-28',
'name' => 'Avignon',
'lines' =>
array (
0 =>
array (
'item_id' => 54321,
'quantity' => 7.5,
),
),
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
POST Submit JSON with invalid types to inspect validation errors #
https://api.invoicing.plus/v1/pass-bad-data
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Optional
invoice_datestring
Optional
Format: date
namestring
Optional
linesarray
Optional Lines
lines[].item_idinteger
Optional
lines[].quantitynumber
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pass-bad-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "lundi",
"name": "Avignon",
"lines": [
{
"item_id": 54321.9,
"quantity": 7.5
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pass-bad-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "lundi",
"name": "Avignon",
"lines": [
{
"item_id": 54321.9,
"quantity": 7.5
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-bad-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => 'lundi',
'name' => 'Avignon',
'lines' =>
array (
0 =>
array (
'item_id' => 54321.9,
'quantity' => 7.5,
),
),
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
POST Submit JSON with unexpected properties #
https://api.invoicing.plus/v1/pass-unexpected-data
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
customer_idinteger
Optional
invoice_datestring
Optional
Format: date
namestring
Optional
citystring
Optional
linesarray
Optional Lines
lines[].item_idinteger
Optional
lines[].quantitynumber
Optional
lines[].tax_namestring
Optional
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pass-unexpected-data' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"city": "Marseille",
"lines": [
{
"item_id": "54321",
"quantity": "7.5",
"tax_name": "TVA 20%"
},
{
"item_id": "98760",
"quantity": "12",
"measure": "100cm",
"negative": "false"
}
]
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pass-unexpected-data", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({
"customer_id": 123,
"invoice_date": "2026-10-28",
"name": "Avignon",
"city": "Marseille",
"lines": [
{
"item_id": "54321",
"quantity": "7.5",
"tax_name": "TVA 20%"
},
{
"item_id": "98760",
"quantity": "12",
"measure": "100cm",
"negative": "false"
}
]
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-unexpected-data', ['json' => array (
'customer_id' => 123,
'invoice_date' => '2026-10-28',
'name' => 'Avignon',
'city' => 'Marseille',
'lines' =>
array (
0 =>
array (
'item_id' => '54321',
'quantity' => '7.5',
'tax_name' => 'TVA 20%',
),
1 =>
array (
'item_id' => '98760',
'quantity' => '12',
'measure' => '100cm',
'negative' => 'false',
),
),
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
POST Submit malformed JSON to inspect the error (remove the closing quote after titi) #
https://api.invoicing.plus/v1/pass-bad-json
Authentication : No authentication required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Content-Typestring
Required
application/json
Request body application/json
No documented parameters.
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/pass-bad-json' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/pass-bad-json", {
method: 'POST',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/pass-bad-json', ['json' => (object) array(
)])
->throw()
->json();
Response example HTTP 200
No verified response example is available in the OpenAPI contract. Consult Swagger and check the result in your dedicated environment.
HTTP status codes and errors
HTTP Description / constraints
429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 200OK 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors. 503Service Unavailable
View contract in Swagger ↗
API resources Credit notes Credit notes use the invoice resource.
Create a credit note with POST /invoice and refund: true. The document is a draft and its response has refund: true. List or retrieve credit notes using GET /invoices and the refund field, or GET /invoice/{id}. There is no /credit-notes endpoint.
The public creation controller accepts no field that links this credit note to an original invoice. Responses may expose previous_document for links created by other workflows, but this is not a public creation parameter. For a credit-note payment, POST /payment accepts refund_invoice_id.
API resources Projects Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/projects
search filters the name; status accepts DONE or CURRENT. from_date and to_date are validated but not applied by the current controller.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
pageinteger
Optional
Minimum: 1 Default value: 1
limitinteger
Optional
Minimum: 1 Maximum: 1000 Default value: 1000
searchstring
Optional
statusstring
Optional
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/projects' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/projects", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/projects')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].namestring
data[].descriptionstring
Accepts null
data[].zipstring
Accepts null
data[].citystring
Accepts null
data[].statusstring
data[].photoobject
Accepts null
data[].photo.idinteger
data[].photo.thumbstring
Format: uri
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/project/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/project/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepts null
data.zipstring
Accepts null
data.citystring
Accepts null
data.statusstring
data.photoobject
Accepts null
data.photo.idinteger
data.photo.thumbstring
Format: uri
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/project/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
descriptionstring
Optional
Accepts null
zipstring
Optional
Accepts null
citystring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request PUT 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Projet de démonstration"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'PUT',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Projet de démonstration"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('PUT', 'https://api.invoicing.plus/v1/project/123', ['json' => array (
'name' => 'Projet de démonstration',
)])
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepts null
data.zipstring
Accepts null
data.citystring
Accepts null
data.statusstring
data.photoobject
Accepts null
data.photo.idinteger
data.photo.thumbstring
Format: uri
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
https://api.invoicing.plus/v1/project/{id}
Authentication : Bearer token required
Path parameters
Name Type Required Description / constraints
idinteger
Required
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request DELETE 'https://api.invoicing.plus/v1/project/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/project/123", {
method: 'DELETE',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('DELETE', 'https://api.invoicing.plus/v1/project/123')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": "Deleted."
}
Documented response fields
Name Type Description / constraints
datastring
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries.
View contract in Swagger ↗
https://api.invoicing.plus/v1/project
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
descriptionstring
Optional
Accepts null
zipstring
Optional
Accepts null
citystring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/project' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Projet de démonstration"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/project", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Projet de démonstration"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/project', ['json' => array (
'name' => 'Projet de démonstration',
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 123,
"name": "Projet de démonstration",
"status": "CURRENT"
}
}
Documented response fields
Name Type Description / constraints
dataobject
data.idinteger
data.namestring
data.descriptionstring
Accepts null
data.zipstring
Accepts null
data.citystring
Accepts null
data.statusstring
data.photoobject
Accepts null
data.photo.idinteger
data.photo.thumbstring
Format: uri
HTTP status codes and errors
HTTP Description / constraints
201OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
API resources Leads Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/lead
name sets the contact name; the current controller takes the lead name from company_name. super_name is required. Public validation does not accept address fields.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
No documented parameters.
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Content-Typestring
Required
application/json
Request body application/json
Name Type Required Description / constraints
namestring
Required
super_namestring
Required
company_namestring
Optional
emailstring
Optional
phonestring
Optional
Accepts null
notesstring
Optional
Accepts null
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/lead' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Camille Exemple",
"super_name": "Prospect Démo",
"company_name": "Atelier Exemple",
"email": "demo@example.com"
}'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/lead", {
method: 'POST',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Camille Exemple",
"super_name": "Prospect Démo",
"company_name": "Atelier Exemple",
"email": "demo@example.com"
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
'Content-Type' => 'application/json',
))
->send('POST', 'https://api.invoicing.plus/v1/lead', ['json' => array (
'name' => 'Camille Exemple',
'super_name' => 'Prospect Démo',
'company_name' => 'Atelier Exemple',
'email' => 'demo@example.com',
)])
->throw()
->json();
Response example HTTP 201
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": {
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
}
Documented response fields
Name Type Description / constraints
dataobject
Customer details. May also include contacts, custom_fields, currency, payment method and billing country.
data.idinteger
data.namestring
data.company_namestring
data.codestring
data.account_codestring
data.emailstring
data.phonestring
data.crnstring
data.nicstring
data.vatstring
data.billing_address_1string
data.billing_zipstring
data.billing_citystring
data.is_webboolean
HTTP status codes and errors
HTTP Description / constraints
201OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
API resources Artisans Contracts, parameters and examples for this resource.
https://api.invoicing.plus/v1/artisans
status accepts active or inactive; search filters the name or email. The list excludes vintage and is_web records.
Authentication : Bearer token required
Path parameters
No documented parameters.
Query parameters
Name Type Required Description / constraints
pageinteger
Optional
Minimum: 1 Default value: 1
limitinteger
Optional
Minimum: 1 Maximum: 1000 Default value: 1000
statusstring
Optional
searchstring
Optional
Headers
Name Type Required Description / constraints
Acceptstring
Required
application/json
Authorizationstring
Required Bearer YOUR_API_TOKEN
X-Companystring
Required
Request example
cURL
JavaScript · fetch
PHP · Laravel
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/artisans' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
JavaScript · fetch Copy
const response = await fetch("https://api.invoicing.plus/v1/artisans", {
method: 'GET',
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN",
"X-Company": "YOUR_COMPANY_ID"
}
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const result = response.status === 204 ? null : await response.json();
PHP · Laravel Copy
\Illuminate\Support\Facades\Http::withHeaders(array (
'Accept' => 'application/json',
'Authorization' => 'Bearer YOUR_API_TOKEN',
'X-Company' => 'YOUR_COMPANY_ID',
))
->send('GET', 'https://api.invoicing.plus/v1/artisans')
->throw()
->json();
Response example HTTP 200
Illustrative excerpt based on documented fields. Full responses may contain additional fields. IDs are fictional.
JSON Copy
{
"data": [
{
"id": 42,
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"code": "C0001",
"account_code": "411001",
"email": "demo@example.com",
"phone": "0102030405",
"crn": "123456789",
"nic": "00012",
"vat": "FR00123456789",
"billing_address_1": "10 rue des Ateliers",
"billing_zip": "75001",
"billing_city": "Paris",
"is_web": false
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"total": 1,
"has_more": false
}
}
Documented response fields
Name Type Description / constraints
dataarray
data[].idinteger
data[].namestring
data[].company_namestring
data[].codestring
data[].account_codestring
data[].emailstring
data[].phonestring
data[].crnstring
data[].nicstring
data[].vatstring
data[].billing_address_1string
data[].billing_zipstring
data[].billing_citystring
data[].is_webboolean
metaobject
meta.current_pageinteger
meta.last_pageinteger
meta.totalinteger
meta.has_moreboolean
HTTP status codes and errors
HTTP Description / constraints
200OK 401Missing, invalid or expired token; or missing, unknown or inaccessible X-Company for this user. 403Authenticated user with insufficient permissions in the selected company. 404Resource not found or not visible in the selected company. 429Rate limit exceeded. Wait Retry-After seconds before retrying; avoid immediate retries. 422Malformed JSON, invalid field or unexpected attribute. api_validation uses debug.errors, debug.fatal_error or debug.unexpected_attributes; Laravel Form Requests use message and errors.
View contract in Swagger ↗
Integration guides Get API access From an existing account to your first customer request.
Prerequisites: an existing account, its credentials and company access. Use HTTPS and store the token on your server.
Result: a data response containing customers of the selected company.
Errors: 401 for invalid credentials or company context; 403 if customer access is denied; 429 when rate limited.
Steps
1 POST /token Obtain data.token. This example requests a 30-minute token.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}'
JSON Copy
{
"email": "demo@example.com",
"password": "YOUR_ACCOUNT_PASSWORD",
"short_token": true
}
Obtain a personal token →
3 GET /customers Send the token and X-Company to retrieve customers.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customers' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
List company customers →
Integration guides Create a customer Create the customer for your documents.
Prerequisites: token, X-Company and create-customer permission. name is required; choose other fields as needed.
Result: HTTP 201 on creation and HTTP 200 when retrieving the same customer.
Errors: 422 for a missing name, invalid email or unexpected attribute; 401/403 depending on access.
Steps
1 POST /customer Send a fictional name and contact details. Save data.id.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/customer' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}'
JSON Copy
{
"name": "Atelier Exemple",
"company_name": "SAS Atelier Exemple",
"email": "demo@example.com",
"billing_country": "FR"
}
Create a customer →
2 GET /customer/{id} Replace 123 with data.id to verify the new customer.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/customer/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Get customer details →
Integration guides Create an item with its tax rate Reuse items in your document lines.
Prerequisites: token, X-Company and item creation permission. Tax and unit IDs must belong to the company.
Result: HTTP 201 with a price in currency units and the item ID.
Errors: 422 for a missing name or invalid tax/unit reference; 403 if permission is missing.
Steps
1 GET /tax-types Retrieve the desired tax-rate ID.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/tax-types' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
List tax rates →
2 POST /item Replace default_tax_id with that ID, create the item and save data.id.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/item' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}'
JSON Copy
{
"name": "Conseil technique",
"code": "DEMO-001",
"price": 75.5,
"default_tax_id": 12
}
Create a product →
Integration guides Create a multi-line invoice From a customer and items to a draft you can check.
Prerequisites: a customer and two existing items in the same company, a token and create-invoice permission. Replace customer_id and both item_id values.
Result: a DRAFT. Validation is not automatic; after checking the draft, validate separately through POST /invoice/{id}/validation if you have validate-invoice permission.
Errors: 422 for a customer/item not found in the company, an unexpected field or invalid body; 403 for missing permission.
Steps
1 POST /invoice Create two lines with explicit quantities. The API uses item prices and taxes unless you override them.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}'
JSON Copy
{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
]
}
Create an invoice →
2 GET /invoice/{id} Replace 123 with data.id and check DRAFT, lines, amounts and due_date.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Invoice data →
Integration guides Retrieve and track an invoice Read the state stored by the server.
Prerequisites: a token, X-Company, an invoice ID and view-invoice permission.
Result: HTTP 200 and data with the current state visible to the user.
Errors: 404 if the invoice is not visible; 401/403 depending on context and permissions.
Steps
1 GET /invoice/{id} Read status, paid_status, due_date, total and lines.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Invoice data →
2 GET /invoices For overall tracking, iterate through pages and use document-date filters with care.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoices' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
List your invoices →
Integration guides Download an invoice PDF Retrieve a binary document without parsing JSON.
Prerequisites: a token, X-Company, an accessible invoice ID and view-invoice permission.
Result: HTTP 200 and PDF bytes. Estimates and orders also have documented PDF endpoints.
Errors: 404 if the document is missing or invisible; 422 or other documented errors if generation fails.
Steps
1 GET /invoice/{id}/pdf Download the application/pdf body. With cURL, add --output invoice.pdf; fetch uses response.blob() and Laravel uses body().
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123/pdf' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
View an invoice PDF →
Integration guides Record a payment Record a payment against an existing invoice.
Prerequisites: a validated invoice with an outstanding balance, its ID, a token, X-Company and create-payment permission. The amount is in currency units.
Result: the payment is recorded and the internal balance is updated. This endpoint does not trigger a bank debit.
Errors: 422 for a negative or excessive amount or an already paid invoice; 401/403/404 for access checks.
Steps
1 POST /payment Replace invoice_id and amount. Save the payment data.id. Creation returns 200.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/payment' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}'
JSON Copy
{
"invoice_id": 123,
"payment_date": "2026-10-28",
"amount": 120
}
Create a payment →
2 GET /invoice/{id} Read paid_status again; do not resend the payment without checking existing payments.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Invoice data →
Integration guides Create a credit note Use the invoice creation contract.
Prerequisites: a customer, company items and the required permissions. Linking to an original invoice is not a public parameter of this creation.
Result: a draft credit note available through invoice endpoints.
Errors: 422 for invalid references or lines; 403 if creation/validation permission is missing.
Steps
1 POST /invoice Reuse the invoice example and add "refund": true to the JSON body.
cURL Copy
curl --request POST 'https://api.invoicing.plus/v1/invoice' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID' \
--header 'Content-Type: application/json' \
--data '{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
],
"refund": true
}'
JSON Copy
{
"customer_id": 42,
"invoice_date": "2026-10-28",
"due_date": "2026-11-28",
"lines": [
{
"item_id": 123,
"quantity": 2
},
{
"item_id": 124,
"quantity": 1
}
],
"refund": true
}
Create an invoice →
2 GET /invoice/{id} Retrieve the new document and check refund: true. Validating a credit note requires validate-refund.
cURL Copy
curl --request GET 'https://api.invoicing.plus/v1/invoice/123' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'X-Company: YOUR_COMPANY_ID'
Invoice data →
Activez JavaScript pour naviguer et rechercher. Le guide complet est disponible au format PDF. PDF