BillingSoft API

Issue and follow Dominican e-CF documents on behalf of one Organization. Authenticate with `Authorization: Bearer <API key>` (create keys in the dashboard, under Integraciones). Amounts are decimal strings, never numbers. Additive changes keep `/v1`; breaking ones go to `/v2`. A key acts for its whole Organization.

Machine-readable: openapi.json. Webhook events: document.accepted, document.rejected, document.conditionally_accepted, document.received, contingency.entered, contingency.regularized, sequence.low.

POST /v1/invoices

Issue an invoice

A credit-fiscal invoice (31) or a consumer invoice (32). A consumer invoice under DOP 250,000 reaches DGII as its summary (RFCE).

Example request

{
  "type": "31",
  "buyer": {
    "name": "Hotel Ejemplo, S.A.",
    "rnc": "101000002",
    "email": "cuentas@hotel.example"
  },
  "incomeType": "01",
  "payment": {
    "type": "credit",
    "dueOn": "2026-11-30"
  },
  "lines": [
    {
      "name": "Suscripción mensual BillingSoft",
      "kind": "service",
      "quantity": "1",
      "unitPrice": "2500.00",
      "tax": "itbis18"
    }
  ]
}
Request schema
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "31",
        "32"
      ]
    },
    "buyer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 150
        },
        "rnc": {
          "type": "string",
          "pattern": "^(\\d{9}|\\d{11})$"
        },
        "foreignId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "email": {
          "type": "string",
          "maxLength": 80,
          "pattern": "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
        },
        "address": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "required": [
        "name"
      ]
    },
    "reference": {
      "type": "object",
      "properties": {
        "ncf": {
          "type": "string",
          "minLength": 1
        },
        "issuedOn": {
          "type": "string",
          "format": "date",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        },
        "modification": {
          "type": "string",
          "enum": [
            "void",
            "correctsText",
            "correctsAmounts",
            "replacesContingency",
            "consumerInvoice"
          ]
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 90
        }
      },
      "required": [
        "ncf",
        "issuedOn",
        "modification"
      ]
    },
    "incomeType": {
      "type": "string",
      "enum": [
        "01",
        "02",
        "03",
        "04",
        "05",
        "06"
      ]
    },
    "payment": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "cash"
            }
          },
          "required": [
            "type"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "credit"
            },
            "dueOn": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          "required": [
            "type",
            "dueOn"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "free"
            }
          },
          "required": [
            "type"
          ]
        }
      ]
    },
    "lines": {
      "minItems": 1,
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "kind": {
            "type": "string",
            "enum": [
              "good",
              "service"
            ]
          },
          "quantity": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
          },
          "unitPrice": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,4})?$"
          },
          "tax": {
            "type": "string",
            "enum": [
              "itbis18",
              "itbis16",
              "itbis0",
              "exempt"
            ]
          },
          "withholding": {
            "type": "object",
            "properties": {
              "itbis": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              },
              "isr": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              }
            }
          }
        },
        "required": [
          "name",
          "kind",
          "quantity",
          "unitPrice",
          "tax"
        ]
      }
    }
  },
  "required": [
    "type",
    "payment",
    "lines"
  ]
}

POST /v1/credit-notes

Issue a credit note

Type 34. `reference` names the document it modifies; a credit note cannot credit more than that document, when it is one issued through BillingSoft.

Example request

{
  "buyer": {
    "name": "Hotel Ejemplo, S.A.",
    "rnc": "101000002"
  },
  "incomeType": "01",
  "payment": {
    "type": "cash"
  },
  "lines": [
    {
      "name": "Suscripción mensual BillingSoft",
      "kind": "service",
      "quantity": "1",
      "unitPrice": "1000.00",
      "tax": "itbis18"
    }
  ],
  "reference": {
    "ncf": "E310000000001",
    "issuedOn": "2026-10-22",
    "modification": "correctsAmounts",
    "reason": "Descuento acordado"
  }
}
Request schema
{
  "type": "object",
  "properties": {
    "type": {
      "default": "34",
      "type": "string",
      "enum": [
        "34"
      ]
    },
    "buyer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 150
        },
        "rnc": {
          "type": "string",
          "pattern": "^(\\d{9}|\\d{11})$"
        },
        "foreignId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "email": {
          "type": "string",
          "maxLength": 80,
          "pattern": "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
        },
        "address": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "required": [
        "name"
      ]
    },
    "reference": {
      "type": "object",
      "properties": {
        "ncf": {
          "type": "string",
          "minLength": 1
        },
        "issuedOn": {
          "type": "string",
          "format": "date",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        },
        "modification": {
          "type": "string",
          "enum": [
            "void",
            "correctsText",
            "correctsAmounts",
            "replacesContingency",
            "consumerInvoice"
          ]
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 90
        }
      },
      "required": [
        "ncf",
        "issuedOn",
        "modification"
      ]
    },
    "incomeType": {
      "type": "string",
      "enum": [
        "01",
        "02",
        "03",
        "04",
        "05",
        "06"
      ]
    },
    "payment": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "cash"
            }
          },
          "required": [
            "type"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "credit"
            },
            "dueOn": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          "required": [
            "type",
            "dueOn"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "free"
            }
          },
          "required": [
            "type"
          ]
        }
      ]
    },
    "lines": {
      "minItems": 1,
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "kind": {
            "type": "string",
            "enum": [
              "good",
              "service"
            ]
          },
          "quantity": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
          },
          "unitPrice": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,4})?$"
          },
          "tax": {
            "type": "string",
            "enum": [
              "itbis18",
              "itbis16",
              "itbis0",
              "exempt"
            ]
          },
          "withholding": {
            "type": "object",
            "properties": {
              "itbis": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              },
              "isr": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              }
            }
          }
        },
        "required": [
          "name",
          "kind",
          "quantity",
          "unitPrice",
          "tax"
        ]
      }
    }
  },
  "required": [
    "payment",
    "lines"
  ]
}

POST /v1/debit-notes

Issue a debit note

Type 33, with `reference` as a credit note.

Example request

{
  "buyer": {
    "name": "Hotel Ejemplo, S.A.",
    "rnc": "101000002"
  },
  "incomeType": "01",
  "payment": {
    "type": "cash"
  },
  "lines": [
    {
      "name": "Intereses por mora",
      "kind": "service",
      "quantity": "1",
      "unitPrice": "150.00",
      "tax": "exempt"
    }
  ],
  "reference": {
    "ncf": "E310000000001",
    "issuedOn": "2026-10-22",
    "modification": "correctsAmounts"
  }
}
Request schema
{
  "type": "object",
  "properties": {
    "type": {
      "default": "33",
      "type": "string",
      "enum": [
        "33"
      ]
    },
    "buyer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 150
        },
        "rnc": {
          "type": "string",
          "pattern": "^(\\d{9}|\\d{11})$"
        },
        "foreignId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "email": {
          "type": "string",
          "maxLength": 80,
          "pattern": "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
        },
        "address": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "required": [
        "name"
      ]
    },
    "reference": {
      "type": "object",
      "properties": {
        "ncf": {
          "type": "string",
          "minLength": 1
        },
        "issuedOn": {
          "type": "string",
          "format": "date",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        },
        "modification": {
          "type": "string",
          "enum": [
            "void",
            "correctsText",
            "correctsAmounts",
            "replacesContingency",
            "consumerInvoice"
          ]
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 90
        }
      },
      "required": [
        "ncf",
        "issuedOn",
        "modification"
      ]
    },
    "incomeType": {
      "type": "string",
      "enum": [
        "01",
        "02",
        "03",
        "04",
        "05",
        "06"
      ]
    },
    "payment": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "cash"
            }
          },
          "required": [
            "type"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "credit"
            },
            "dueOn": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          "required": [
            "type",
            "dueOn"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "free"
            }
          },
          "required": [
            "type"
          ]
        }
      ]
    },
    "lines": {
      "minItems": 1,
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "kind": {
            "type": "string",
            "enum": [
              "good",
              "service"
            ]
          },
          "quantity": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
          },
          "unitPrice": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,4})?$"
          },
          "tax": {
            "type": "string",
            "enum": [
              "itbis18",
              "itbis16",
              "itbis0",
              "exempt"
            ]
          },
          "withholding": {
            "type": "object",
            "properties": {
              "itbis": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              },
              "isr": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              }
            }
          }
        },
        "required": [
          "name",
          "kind",
          "quantity",
          "unitPrice",
          "tax"
        ]
      }
    }
  },
  "required": [
    "payment",
    "lines"
  ]
}

POST /v1/other

Issue a purchase, minor-expense, special-regime, government, export or payment-abroad document

Types 41, 43, 44, 45, 46 and 47: `type` is required, and each admits the fields its rules say (buyer, withholding, taxes, income type).

Example request

{
  "type": "43",
  "payment": {
    "type": "cash"
  },
  "lines": [
    {
      "name": "Peaje",
      "kind": "service",
      "quantity": "2",
      "unitPrice": "100.00",
      "tax": "exempt"
    }
  ]
}
Request schema
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "41",
        "43",
        "44",
        "45",
        "46",
        "47"
      ]
    },
    "buyer": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 150
        },
        "rnc": {
          "type": "string",
          "pattern": "^(\\d{9}|\\d{11})$"
        },
        "foreignId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "email": {
          "type": "string",
          "maxLength": 80,
          "pattern": "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
        },
        "address": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        }
      },
      "required": [
        "name"
      ]
    },
    "reference": {
      "type": "object",
      "properties": {
        "ncf": {
          "type": "string",
          "minLength": 1
        },
        "issuedOn": {
          "type": "string",
          "format": "date",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        },
        "modification": {
          "type": "string",
          "enum": [
            "void",
            "correctsText",
            "correctsAmounts",
            "replacesContingency",
            "consumerInvoice"
          ]
        },
        "reason": {
          "type": "string",
          "minLength": 1,
          "maxLength": 90
        }
      },
      "required": [
        "ncf",
        "issuedOn",
        "modification"
      ]
    },
    "incomeType": {
      "type": "string",
      "enum": [
        "01",
        "02",
        "03",
        "04",
        "05",
        "06"
      ]
    },
    "payment": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "cash"
            }
          },
          "required": [
            "type"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "credit"
            },
            "dueOn": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          "required": [
            "type",
            "dueOn"
          ]
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "free"
            }
          },
          "required": [
            "type"
          ]
        }
      ]
    },
    "lines": {
      "minItems": 1,
      "maxItems": 1000,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "kind": {
            "type": "string",
            "enum": [
              "good",
              "service"
            ]
          },
          "quantity": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
          },
          "unitPrice": {
            "type": "string",
            "pattern": "^\\d{1,16}(\\.\\d{1,4})?$"
          },
          "tax": {
            "type": "string",
            "enum": [
              "itbis18",
              "itbis16",
              "itbis0",
              "exempt"
            ]
          },
          "withholding": {
            "type": "object",
            "properties": {
              "itbis": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              },
              "isr": {
                "type": "string",
                "pattern": "^\\d{1,16}(\\.\\d{1,2})?$"
              }
            }
          }
        },
        "required": [
          "name",
          "kind",
          "quantity",
          "unitPrice",
          "tax"
        ]
      }
    }
  },
  "required": [
    "type",
    "payment",
    "lines"
  ]
}

GET /v1/documents/{id}

Get a document

Its status, e-NCF, security code, lines, DGII submissions and answers, and the notes issued on it.

GET /v1/documents/{id}/xml

Download the signed XML

GET /v1/documents/{id}/pdf

Download the printed representation

POST /v1/documents/{id}/refresh-status

Ask DGII for the verdict now

BillingSoft polls DGII itself and tells your webhook; use this to look sooner. 502 `DGII_ERROR` if DGII could not be asked.

POST /v1/sequences/annul

Cancel unused e-NCFs

Cancels numbers never used, and documents signed but never sent. A document that was sent is voided with a credit note instead.

Example request

{
  "ranges": [
    {
      "documentType": "31",
      "from": 90,
      "to": 100
    }
  ]
}
Request schema
{
  "type": "object",
  "properties": {
    "ranges": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "documentType": {
            "type": "string",
            "enum": [
              "31",
              "32",
              "33",
              "34",
              "41",
              "43",
              "44",
              "45",
              "46",
              "47"
            ]
          },
          "from": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          },
          "to": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "documentType",
          "from",
          "to"
        ]
      }
    }
  },
  "required": [
    "ranges"
  ]
}

GET /v1/config/test

Check the API key

Which Organization the key acts for, its DGII environment and whether it can sign and number documents.

GET /v1/directory

Look up an electronic issuer in DGII’s directory