Skip to content
For your ERP

Connect any system to DGII electronic invoicing.

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.

Versioned REST API Event-driven webhooks Included in the Corporativo plan DGII sandbox on every account
app.factura.com.do/producto
  1. 01 E31 Tax credit invoice
  2. 02 E32 Consumer invoice
  3. 03 E34 Credit note
  4. 04 E46 Exports
  5. 05 E47 Payments abroad
Architecture

factura.com.do at the center. Your system around it.

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.

factura.com.do
REST API Versioned endpoints under /api/v1/, authentication with X-Api-Key.
Webhooks 28 events by subscription: quotes, e-CF, expenses, acknowledgements.
API reference Endpoints, authentication and examples in the developer section.
Corporativo plan The REST API and webhooks are included in the Corporativo plan.
testecf sandbox Every account starts in the DGII testecf environment before going to production.
DGII The real destination. factura.com.do signs and sends every e-CF.
Enterprise ERP Any ERP that can make HTTPS calls connects via the REST API.
Accounting Accounting systems that export or receive JSON use the same endpoints.
E-commerce Shopify, WooCommerce, VTEX or custom stores issue e-CF when an order closes.
Point of sale Retail, restaurant or service POS systems when the receipt prints.
CRM HubSpot, Salesforce, Pipedrive and similar tools issue from the won opportunity.
In-house system Internal builds in any language with a standard HTTP client.
  • DGII: The real destination. factura.com.do signs and sends every e-CF.
  • Enterprise ERP: Any ERP that can make HTTPS calls connects via the REST API.
  • Accounting: Accounting systems that export or receive JSON use the same endpoints.
  • E-commerce: Shopify, WooCommerce, VTEX or custom stores issue e-CF when an order closes.
  • Point of sale: Retail, restaurant or service POS systems when the receipt prints.
  • CRM: HubSpot, Salesforce, Pipedrive and similar tools issue from the won opportunity.
  • In-house system: Internal builds in any language with a standard HTTP client.
  • REST API: Versioned endpoints under /api/v1/, authentication with X-Api-Key.
  • Webhooks: 28 events by subscription: quotes, e-CF, expenses, acknowledgements.
  • API reference: Endpoints, authentication and examples in the developer section.
  • Corporativo plan: The REST API and webhooks are included in the Corporativo plan.
  • testecf sandbox: Every account starts in the DGII testecf environment before going to production.
How data travels

From the event in your ERP to the DGII acknowledgement.

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.

  1. 01

    Event in your system

    Your ERP, e-commerce or POS approves an invoice. The event triggers an outbound call with the receipt payload.

  2. 02

    POST to factura.com.do

    Your system sends POST /api/v1/<receipt> with the X-Api-Key header. We validate, persist and respond with the DocumentId and query URL.

  3. 03

    Sign and submit to the DGII

    We generate the XML, sign it with your digital certificate and submit to the DGII service in your environment (testecf, certecf or ecf).

  4. 04

    Webhook with the response

    When the DGII responds approved, rejected, in process or conditionally accepted, we send you a webhook with the corresponding dgii.* event.

  5. 05

    Your system reconciles

    Your ERP receives the webhook, updates the document's fiscal status and releases the flow to accounting or collections.

Technical capabilities

What your team needs to see before integrating.

No proprietary SDK, no custom format, no protocol negotiation. What you already know: HTTPS, JSON, headers.

Connectivity
REST

Versioned REST API

Versioned endpoints under /api/v1/, with X-Api-Key authentication. Available on the Corporativo plan.

JSON

Webhooks for 28 events

Quotes, invoices, notes, expenses, customers, products, suppliers and the four DGII response states.

DGII sandbox on every account

Every company starts in the testecf environment. You switch to certecf and ecf by changing the company configuration, with no credential migration.

For developers
Docs

API reference

Endpoints, authentication and examples documented in the developer section. Any HTTP client can consume it.

Online RNC validation

GET /api/v1/rnc/{rnc} queries the DGII taxpayer registry directly. Useful for validating contributors before issuing.

Test endpoint for webhooks

Trigger a test delivery from the panel and review request, response, status and duration before activating the integration in production.

Operations

Per-attempt audit log

Each webhook delivery records method, headers, body, status and duration. Traceable for technical and fiscal audits.

Automatic DGII status checks

If the DGII responds "In Process", our background process checks the status at configured intervals until the final response arrives.

Custom headers per webhook

Configure the headers your receiver needs to validate (for example, a shared secret) and they are sent on every delivery.

Connected systems

If your system speaks HTTPS, it connects to factura.com.do.

We do not publish a native connector marketplace. We publish a REST API and webhooks: any system in these categories integrates the same way.

Enterprise ERP

SAP Business One, NetSuite, Dynamics 365 Business Central and similar systems connect via REST API.

Accounting and finance

Accounting systems that export or receive JSON consume the same endpoints.

E-commerce

Stores on Shopify, WooCommerce, VTEX or custom platforms issue e-CF when the order closes.

Point of sale

Retail, restaurant or service POS systems trigger issuance when printing the ticket.

CRM and operations

HubSpot, Salesforce, Pipedrive, Zoho and similar tools send invoices from the won opportunity.

Custom systems

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.

Snippets

Three calls, one integration.

Create an invoice, listen for the response webhook and type your client. The rest is what you already do in any HTTPS integration.

bash crear-factura.sh
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 }
    ]
  }'
Create a consumer invoice (e-CF type E32). Returns DocumentId and query URL. Replace “tuempresa” with your subdomain.
ts src/factura-client.ts
// 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>;
}
Typed call with fetch and your own integration types.
ts src/webhook-handler.ts
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();
}
Webhook receiver with BYO-auth validation via shared header.
Before and now

From manual export to continuous sync.

Five concrete differences between operating against the DGII portal manually and delegating integration to an API that signs, submits and notifies by event.

  • Monthly manual export You generate XML from the ERP, sign locally and upload file by file to the DGII portal.
    Continuous sync via API Your ERP POSTs to /api/v1/<receipt>; we sign and submit to the DGII in the same call.
  • Monthly manual export You collect the DGII response by opening each document on their portal and copying the status to the ERP.
    Continuous sync via API You receive the dgii.aprobado, dgii.rechazado, dgii.en_proceso or dgii.aceptado_condicional event by webhook.
  • Monthly manual export When a document is rejected, the correction depends on who reads the accountant's email.
    Continuous sync via API The webhook triggers the credit or debit note from the ERP automatically.
  • Monthly manual export The final acknowledgement is reconciled at month-end, with penalty risk if it stayed pending.
    Continuous sync via API The status is checked in the background; the fiscal status is always current in your system.
  • Monthly manual export Each customer who requires e-CF needs a separate technical project.
    Continuous sync via API The same workflow covers the tax credit, consumer, export, government and special-regime e-CF.
Technical case
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.
Anonymous customer Technology team · Wholesale distributor · Confidential customer
Request a demo
1 week
From legacy ERP to signed e-CF accepted by the DGII
Frequently asked questions

What your technical team asks.

Do you have a native connector for my ERP (SAP, Odoo, Dynamics, other)?
We do not publish native connectors. We expose a REST API and event-driven webhooks, on the Corporativo plan. Any ERP that can make an HTTPS call and receive a webhook integrates the same way. If your team needs support, we coordinate it on the enterprise plan.
How do you handle communication errors with the DGII?
When you create a receipt via API, we sign it and submit it to the DGII in the same call. If the DGII receives it, the document stays "In Process" and our background process checks its status; if the submission fails, it is marked with the error and is not retried automatically. When there is a response, we fire the webhook dgii.aprobado, dgii.rechazado, dgii.en_proceso or dgii.aceptado_condicional.
Is there a sandbox for pre-production testing?
Yes. Every account starts in the DGII testecf environment, the official sandbox. When you are ready for production, the environment is switched to ecf from the company settings. The API credentials are the same; only the DGII environment changes, not the tenant.
How much does API access cost? Is there a call limit?
API access is available only on the Corporativo plan (see /planes). We do not publish a fixed calls-per-second limit. If your integration will sustain more than a few calls per second (bulk load, reconciliation), talk to our team to allocate capacity and track the integration.
Which events trigger webhooks?
28 events: quotes, invoices, credit notes, debit notes, expenses, customers, products, suppliers and the four DGII response states (in process, accepted, conditionally accepted and rejected). The full list, with the payload shape, lives in the documentation.
How do I verify that a webhook comes from you?
Configure custom headers when registering the webhook (for example, a shared secret in X-Webhook-Secret) and validate them in your receiver. We do not currently apply HMAC signing; if your audit requires it, flag it on the integration form for product evaluation.
Is there an official SDK?
We do not distribute an official SDK or a downloadable client. The API is REST with JSON and X-Api-Key authentication, so any HTTP client in any language can consume it. The reference is in the developer section.
Custom demo in under 24 hours

Start issuing your e-CF this week.

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.

By submitting you accept Nubeteck's privacy policy.