Official PHP SDK for Facturapi.
Language: English | Español
composer require facturapi/facturapi-phpWithout Composer (supported workaround):
require_once __DIR__ . '/path/to/facturapi-php/src/Facturapi.php';Requirements:
- PHP
>=8.2
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Facturapi\Facturapi;
$apiKey = getenv('FACTURAPI_KEY') ?: 'YOUR_API_KEY';
$facturapi = new Facturapi($apiKey);
$customer = $facturapi->Customers->create([
'email' => 'walterwhite@gmail.com',
'legal_name' => 'Walter White',
'tax_id' => 'WIWA761018',
'address' => [
'zip' => '06800',
'street' => 'Av. de los Rosales',
'exterior' => '123',
'neighborhood' => 'Tepito',
],
]);Constructor signature:
new Facturapi(string $apiKey, ?array $config = null)Supported config keys:
apiVersion(string, default:v2)timeout(int|float, default:360seconds)httpClient(Psr\Http\Client\ClientInterface, advanced)
Example:
use Facturapi\Facturapi;
$facturapi = new Facturapi($apiKey, [
'apiVersion' => 'v2',
'timeout' => 420,
]);The SDK works out of the box with its internal Guzzle-based client.
If you provide httpClient, pass any PSR-18 compatible client and configure its timeout values in that client:
use Facturapi\Facturapi;
use GuzzleHttp\Client;
$httpClient = new Client([
'timeout' => 420,
]);
$facturapi = new Facturapi($apiKey, [
'httpClient' => $httpClient,
]);$product = $facturapi->Products->create([
'product_key' => '4319150114',
'description' => 'Apple iPhone 8',
'price' => 345.60,
]);$invoice = $facturapi->Invoices->create([
'customer' => 'YOUR_CUSTOMER_ID',
'items' => [[
'quantity' => 1,
'product' => 'YOUR_PRODUCT_ID',
]],
'payment_form' => \Facturapi\PaymentForm::EFECTIVO,
'folio_number' => '581',
'series' => 'F',
]);$zipBytes = $facturapi->Invoices->downloadZip('INVOICE_ID');
$pdfBytes = $facturapi->Invoices->downloadPdf('INVOICE_ID');
$xmlBytes = $facturapi->Invoices->downloadXml('INVOICE_ID');downloadPdf() returns raw PDF bytes (binary string), not base64.
file_put_contents('invoice.pdf', $pdfBytes);$facturapi->Invoices->sendByEmail('INVOICE_ID');$results = $facturapi->ComercioExteriorCatalogs->searchTariffFractions([
'q' => '0101',
'page' => 0,
'limit' => 10,
]);On non-2xx responses, the SDK throws Facturapi\Exceptions\FacturapiException.
The exception includes:
getMessage(): API error message when present.getStatusCode(): HTTP status code.getErrorData(): decoded JSON error payload (full API shape).getRawBody(): raw response body string.
use Facturapi\Exceptions\FacturapiException;
try {
$facturapi->Invoices->create($payload);
} catch (FacturapiException $e) {
$status = $e->getStatusCode();
$error = $e->getErrorData(); // Full API error shape when body is valid JSON.
$firstDetail = $error['details'][0] ?? null; // e.g. ['path' => 'items.0.quantity', 'message' => '...', 'code' => '...']
}- Minimum PHP version is now
>=8.2. - Removed support for the positional
apiVersionconstructor argument. - Composer projects: no loader changes needed; keep using
vendor/autoload.php. - Non-Composer projects can keep using the SDK by loading
src/Facturapi.phpdirectly. - Snake_case method aliases are deprecated in v4 and will be removed in v5.
Facturapi\\Exceptions\\Facturapi_Exceptionis deprecated in v4 and will be removed in v5.- Use
Facturapi\\Exceptions\\FacturapiException.
Full docs: https://docs.facturapi.io
- Issues: open a GitHub issue
- Email:
contacto@facturapi.io