Upload sécurisé (multipart), réponse JSON structurée < 3 s, retry natif via Guzzle.

Intégrer FacturX API avec PHP

Envoyez vos PDF/XML Factur-X depuis un backend Laravel, Symfony ou WordPress en quelques lignes.

Compatible Laravel HTTP Client & Guzzle
Support natif des jobs/queues pour traiter des lots
Idéal pour automatiser Chorus Pro / PISTE

Exemple curl

multipart/form-data
curl -X POST https://api.facturxapi.com/api/v1/validate \
  -H "Authorization: Bearer $FACTURX_API_KEY" \
  -F "[email protected]" \
  -F "lang=fr"

Snippet PHP

Auth + appel /api/v1/validate
<?php

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.facturxapi.com',
    'timeout' => 15,
]);

$response = $client->request('POST', '/api/v1/validate', [
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('FACTURX_API_KEY'),
    ],
    'multipart' => [
        [
            'name' => 'file',
            'contents' => fopen(storage_path('invoices/FX-2024-0001.pdf'), 'r'),
        ],
        [
            'name' => 'lang',
            'contents' => 'fr',
        ],
    ],
]);

$payload = json_decode((string) $response->getBody(), true);
logger()->info('facturx.validation', $payload);

Checklist intégration

  • Centraliser la clé dans .env + config/cache Laravel

  • Utiliser Storage::disk pour les fichiers temporaires (< 10 MB)

  • Logger request_id pour corréler avec Plausible / billing

Retries & timeouts

Configurer Guzzle RetryMiddleware sur 429/500 avec backoff exponentiel (max 3 tentatives).

  • • Timeout réseau recommandé : 15 s
  • • Backoff : 1s, 3s, 9s
  • • Traiter 402 (quota) côté business avant retry

Erreurs fréquentes

Mappez vos logs aux codes pour des corrections rapides.

401 unauthorized

Clé API absente ou expirée (ex: variable d'environnement non chargée).

💡 Vérifiez FACTURX_API_KEY dans .env + config:cache après déploiement.

422 invalid_payload

PDF multi-fichier ou XML non Factur-X.

💡 Forcer le mime-type côté backend et valider la taille avant upload (max 10 MB).

429 rate_limited

Trop de validations simultanées.

💡 Activez la queue Laravel + backoff exponentiel sur 429.

FAQ

Puis-je déclencher la validation depuis une queue Horizon ?

Oui, l'upload est idempotent. Conservez seulement le request_id pour vos logs.

Comment associer un rapport à une facture ?

Utilisez vos identifiants (invoice_number) dans les métadonnées de job et stockez le JSON retourné.

Documentation API

Endpoints, schémas JSON et statuts

Obtenir une clé

10 validations gratuites/mois

Bibliothèque d'erreurs

Comprendre BR-CO-xx et BR-CL-xx