Versioned REST API
Versioned endpoints under /api/v1/, with X-Api-Key authentication. Available on the Corporativo plan.
A versioned REST API and event-driven webhooks, on the Corporativo plan. Your ERP talks to factura.com.do, and factura.com.do talks to the DGII.
The inner ring is what we speak: REST, webhooks, the API reference, the Corporativo plan that enables it and the testecf sandbox. The outer ring is the DGII and the system families that connect through those protocols. One API that covers the entire flow.
A single HTTPS flow. Your system fires the event, we sign and submit to the DGII, and we notify you by webhook when there is a response.
Your ERP, e-commerce or POS approves an invoice. The event triggers an outbound call with the receipt payload.
Your system sends POST /api/v1/<receipt> with the X-Api-Key header. We validate, persist and respond with the DocumentId and query URL.
We generate the XML, sign it with your digital certificate and submit to the DGII service in your environment (testecf, certecf or ecf).
When the DGII responds approved, rejected, in process or conditionally accepted, we send you a webhook with the corresponding dgii.* event.
Your ERP receives the webhook, updates the document's fiscal status and releases the flow to accounting or collections.
No proprietary SDK, no custom format, no protocol negotiation. What you already know: HTTPS, JSON, headers.
Versioned endpoints under /api/v1/, with X-Api-Key authentication. Available on the Corporativo plan.
Quotes, invoices, notes, expenses, customers, products, suppliers and the four DGII response states.
Every company starts in the testecf environment. You switch to certecf and ecf by changing the company configuration, with no credential migration.
Endpoints, authentication and examples documented in the developer section. Any HTTP client can consume it.
GET /api/v1/rnc/{rnc} queries the DGII taxpayer registry directly. Useful for validating contributors before issuing.
Trigger a test delivery from the panel and review request, response, status and duration before activating the integration in production.
Each webhook delivery records method, headers, body, status and duration. Traceable for technical and fiscal audits.
If the DGII responds "In Process", our background process checks the status at configured intervals until the final response arrives.
Configure the headers your receiver needs to validate (for example, a shared secret) and they are sent on every delivery.
We do not publish a native connector marketplace. We publish a REST API and webhooks: any system in these categories integrates the same way.
SAP Business One, NetSuite, Dynamics 365 Business Central and similar systems connect via REST API.
Accounting systems that export or receive JSON consume the same endpoints.
Stores on Shopify, WooCommerce, VTEX or custom platforms issue e-CF when the order closes.
Retail, restaurant or service POS systems trigger issuance when printing the ticket.
HubSpot, Salesforce, Pipedrive, Zoho and similar tools send invoices from the won opportunity.
In-house builds in any language consume the API with a standard HTTP client.
Working with a specific system and need implementation support? We coordinate it on the enterprise plan.
Create an invoice, listen for the response webhook and type your client. The rest is what you already do in any HTTPS integration.
curl -X POST https://tuempresa.factura.com.do/api/v1/consumer-invoices \
-H "X-Api-Key: <TU_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"branchId": "b1a2c3d4-e5f6-4789-abcd-1234567890ab",
"sequence": "E320000000001",
"issuedAt": "2026-05-08T10:00:00Z",
"paymentTermId": 1,
"limitDate": "2026-05-08T10:00:00Z",
"currencyId": 1,
"currencyRate": 1,
"lines": [
{
"code": "SRV-001",
"order": 1,
"description": "Consultoría",
"isService": true,
"quantity": 1,
"unitId": 1,
"unitPrice": 4500.00,
"isExempt": false,
"taxes": [{ "taxId": "3a5e98e0-33ff-44be-bd37-e3f9b35a25e2", "rate": 18.0, "taxTypeId": 1 }]
}
],
"payments": [
{ "reference": "REF-1", "amount": 5310.00 }
]
}' // Types you define in your integration from the API reference.
import type {
ConsumerInvoiceRequest,
ConsumerInvoiceResponse,
} from "./types/factura";
export async function issueConsumerInvoice(
apiKey: string,
body: ConsumerInvoiceRequest,
): Promise<ConsumerInvoiceResponse> {
const res = await fetch(
"https://tuempresa.factura.com.do/api/v1/consumer-invoices",
{
method: "POST",
headers: {
"X-Api-Key": apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
},
);
if (!res.ok) {
throw new Error(`factura.com.do: ${res.status} ${await res.text()}`);
}
return res.json() as Promise<ConsumerInvoiceResponse>;
} import type { Request, Response } from "express";
const SHARED_SECRET = process.env.FACTURA_WEBHOOK_SECRET!;
export function handleWebhook(req: Request, res: Response) {
// BYO-auth validation: the secret travels in a header
// you configure when registering the webhook.
if (req.header("X-Webhook-Secret") !== SHARED_SECRET) {
return res.status(401).end();
}
const { Event, Timestamp, data } = req.body;
switch (Event) {
case "dgii.aprobado":
// mark the receipt as accepted in your ERP
break;
case "dgii.rechazado":
// trigger manual review or credit note
break;
case "dgii.aceptado_condicional":
// accept with observations, log in audit trail
break;
case "dgii.en_proceso":
// keep as "pending DGII" until next event
break;
}
res.status(200).end();
} Five concrete differences between operating against the DGII portal manually and delegating integration to an API that signs, submits and notifies by event.
We connected our ERP to factura.com.do in one week. The finance team stopped downloading XML and the operations team stopped copying numbers by hand. The e-CF cycle is now invisible to them.
Tell us how much you invoice today and we'll deliver an estimate of how much you save in Dominican pesos, along with a clear implementation schedule. No commitment.