Invoicing Flow

Summary

This page shows the invoicing leg of the Vertex API flow: how a client submits an invoice and
gets back a compliant e-invoice, once tax amounts are already known. Applies across Vertex's LatAm coverage:
The endpoints, call types, and webhook contract are the same regardless of country; only the
payload fields and the local tax authority differ.

Key things to know before reading the diagram:

  1. Invoices are issued one by one, not in bulk. Each POST /invoices call submits exactly
    one invoice. There is no batch-submission endpoint — if you need to issue 500 invoices, that's
    500 separate calls.
  2. Your systems always initiate the request. Vertex only calls you back once, via webhook, to
    confirm the outcome.
  3. The webhook — not the sync response to POST /invoices — is what tells you whether the
    invoice actually succeeded. The sync response only confirms the request was well-formed.

Call sequence

sequenceDiagram
    autonumber
    participant Client
    participant Vertex
    participant Auth as Tax Authority

    Client->>Vertex: POST /invoices
    Vertex-->>Client: 200 status "received" / 400-500 schema error

    rect rgba(168,118,15,0.08)
    Note over Vertex,Auth: async backend — no client-facing call
    Vertex->>Auth: transmit invoice to the local tax authority
    Auth-->>Vertex: accept / reject
    end

    rect rgba(46,125,82,0.09)
    Note over Client,Vertex: Scenario: created invoice
    Vertex--)Client: webhook — status: created
    Client->>Vertex: GET /invoices/{invoice_id}
    Vertex-->>Client: invoice_key, documents, country fields
    end

    rect rgba(178,58,58,0.09)
    Note over Client,Vertex: Scenario: failed invoice
    Vertex--)Client: webhook — status: failed
    end

Every call above the shaded amber band is client-initiated and synchronous. Inside that band,
Vertex talks to the local tax authority with no client visibility. The webhook is the only call
Vertex initiates, and it always carries one of exactly two outcomes — created or failed —
shown above as two mutually exclusive scenarios. created ends after the GET in step 5;
failed ends at the webhook itself.

Step reference

endpoints as called against api.brinta.com

#EndpointDirectionTypeNotes
1POST /invoicesClient → VertexSYNCSubmit invoice. Sync response is a schema check only: valid → status: received; invalid → 400/500.
2—Vertex → Tax AuthorityASYNCVertex transmits the invoice to the local tax authority.
3—Tax Authority → VertexASYNCAuthority accepts or rejects.
4WebhookVertex → ClientWEBHOOKThe only call Vertex initiates. Payload: invoice_id, invoice_external_id, status. 2 possible outcomes: created (tax authority accepted) or failed (rejected). For rejected invoices, errors will be sent in the webhook body
5GET /invoices/{invoice_id}Client → VertexSYNCOnly when step 4's status is created — a failed webhook is terminal, there's nothing to fetch. Works with invoice_id, or with invoice_external_id by adding ?use_external_id=true (docs). Returns invoice_key, documents (PDF/XML or country equivalent), and country-specific fields.

Vertex API · api.brinta.com — request examples: Postman collection


Did this page help you?