invoicepdfs-com Compliance API

The compliance API from invoicepdfs-com — 3 operation(s) for compliance.

Operations 3

POST /api/v1/documents/validate-compliance Validate Compliance #
POST /api/v1/documents/xml Render Document Xml #
GET /api/v1/documents/{document_id}/xml Download Document Xml #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/invoicepdfs-com:invoicepdfs-com-compliance-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

invoicepdfs-com-compliance-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Invoicepdfs Com Compliance API
  version: 0.3.0
  contact:
    name: InvoicePDFs
    url: https://invoicepdfs.com/
  license:
    name: MIT
  description: 'Operations tagged compliance across 2 of this provider''s published API definitions: openapi.json, invoicepdfs-com-openapi.json. Each path carries the servers of the definition it was published in.'
tags:
- name: Compliance
paths:
  /api/v1/documents/validate-compliance:
    post:
      tags:
      - Compliance
      summary: Validate Compliance
      description: 'Check a document against an e-invoicing ruleset without rendering it.


        Costs no renders: nothing is stored and no PDF is produced, so a caller can

        check every invoice they are about to send rather than discovering the

        problem from a rejection weeks later.


        Two tiers run, and both are reported. The mandatory-field check names a

        field of the request you can go and change. Schematron then serializes the

        document and runs the **published rules at a pinned version** over the

        result — the same artefacts an access point runs — so a finding here quotes

        the rule id a rejection notice would quote.


        Read `valid` together with `fully_checked`: `valid` says nothing fatal was

        found, and `rulesets` says what actually ran to find it.'
      operationId: validate_compliance
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentComplianceRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DocumentComplianceResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
      security:
      - HTTPBearer: []
      x-visibility: public
  /api/v1/documents/xml:
    post:
      tags:
      - Compliance
      summary: Render Document Xml
      description: 'The e-invoicing XML for a document, without storing anything.


        Takes the same body as `/validate-compliance`, and the pairing is the point:

        check first, then take the XML once it passes. Nothing here validates

        against the ruleset — a document missing mandatory fields serialises to XML

        missing those elements, which is a more useful artefact to look at than a

        refusal, and `/validate-compliance` is where the refusal belongs.


        The syntax is not a parameter. It follows from the profile, because a

        profile already is a syntax plus a ruleset, and asking a caller for both is

        asking them to know that Peppol means UBL.'
      operationId: render_document_xml
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocumentComplianceRequest'
        required: true
      responses:
        '200':
          description: The document as XML, in the syntax the chosen profile is expressed in — UBL for Peppol BIS, CII for Factur-X.
          content:
            application/xml:
              schema:
                type: string
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
      security:
      - HTTPBearer: []
      x-visibility: public
  /api/v1/documents/{document_id}/xml:
    get:
      tags:
      - Compliance
      summary: Download Document Xml
      description: 'The e-invoicing XML for a document already stored here.


        Reads `data_json` directly rather than going through the render path''s

        reconstruction: the status, the logo and the source document''s number are

        all attached there for the *PDF*, and none of them belong in the XML. The

        credit note''s BG-3 reference is already in the stored payload, resolved when

        the document was written.'
      operationId: download_document_xml
      security:
      - HTTPBearer: []
      parameters:
      - name: document_id
        in: path
        required: true
        schema:
          type: string
          title: Document Id
      - name: profile
        in: query
        required: true
        schema:
          type: string
          description: 'Which ruleset to write this against. No default: a document valid under one can be rejected by another, so the choice is the request.'
          examples:
          - peppol_bis_billing_3
          title: Profile
        description: 'Which ruleset to write this against. No default: a document valid under one can be rejected by another, so the choice is the request.'
      responses:
        '200':
          description: The stored document as XML, in the syntax the chosen profile is expressed in — UBL for Peppol BIS, CII for Factur-X.
          content:
            application/xml:
              schema:
                type: string
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
      x-visibility: public
components:
  schemas:
    DocumentBrandingInput:
      properties:
        logo_file_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Logo File Id
        primary_color:
          type: string
          title: Primary Color
          default: '#111827'
        accent_color:
          type: string
          title: Accent Color
          default: '#111827'
        font_family:
          anyOf:
          - type: string
          - type: 'null'
          title: Font Family
        footer_text:
          type: string
          title: Footer Text
          default: Generated by InvoicePDFs
        hide_invoicepdfs_branding:
          type: boolean
          title: Hide Invoicepdfs Branding
          default: false
      type: object
      title: DocumentBrandingInput
    PostalAddress:
      properties:
        line1:
          type: string
          title: Line1
          examples:
          - 1 Main St
        line2:
          anyOf:
          - type: string
          - type: 'null'
          title: Line2
          examples:
          - Suite 200
        city:
          anyOf:
          - type: string
          - type: 'null'
          title: City
          examples:
          - San Francisco
        state:
          anyOf:
          - type: string
          - type: 'null'
          title: State
          examples:
          - CA
        postal_code:
          anyOf:
          - type: string
          - type: 'null'
          title: Postal Code
          examples:
          - '94105'
        country:
          anyOf:
          - type: string
          - type: 'null'
          title: Country
          examples:
          - US
      type: object
      required:
      - line1
      title: PostalAddress
    DocumentDiscountInput:
      properties:
        type:
          type: string
          enum:
          - percentage
          - fixed
          title: Type
          default: percentage
        value:
          type: string
          title: Value
          examples:
          - '10'
        reason:
          anyOf:
          - type: string
          - type: 'null'
          title: Reason
          examples:
          - Loyalty discount
      type: object
      required:
      - value
      title: DocumentDiscountInput
    DocumentShippingInput:
      properties:
        description:
          type: string
          title: Description
          default: Shipping
        amount:
          type: string
          title: Amount
          examples:
          - '9.99'
        taxable:
          type: boolean
          title: Taxable
          default: false
      type: object
      required:
      - amount
      title: DocumentShippingInput
    DocumentInvoiceDataInput:
      properties:
        invoice_number:
          type: string
          title: Invoice Number
          examples:
          - INV-2026-001
        issue_date:
          type: string
          format: date
          title: Issue Date
          examples:
          - '2026-07-20'
        due_date:
          anyOf:
          - type: string
            format: date
          - type: 'null'
          title: Due Date
          examples:
          - '2026-08-19'
        currency:
          type: string
          title: Currency
          examples:
          - USD
        seller:
          $ref: '#/components/schemas/DocumentPartyInput'
        buyer:
          $ref: '#/components/schemas/DocumentPartyInput'
        ship_to:
          anyOf:
          - $ref: '#/components/schemas/DocumentPartyInput'
          - type: 'null'
        tax_scheme:
          anyOf:
          - type: string
          - type: 'null'
          title: Tax Scheme
          description: 'UNCL5153 — what kind of tax this invoice states. One document, one answer: an invoice is issued under a tax regime, not a different one per line. Optional, and deliberately not defaulted, because a PDF does not need it and assuming `VAT` would put a claim in a tax document that you did not make. Required to produce or check an e-invoice, where it must be `VAT` — every ruleset built on EN 16931 describes VAT and tests for that string literally, so a document stating anything else is refused rather than relabelled.'
          examples:
          - VAT
        delivery_date:
          anyOf:
          - type: string
            format: date
          - type: 'null'
          title: Delivery Date
          description: When the goods or services were actually supplied (BT-72). Not the issue date, and it is what decides the VAT period. XRechnung requires this, an invoicing period, or a period on every line.
          examples:
          - '2026-09-30'
        buyer_reference:
          anyOf:
          - type: string
          - type: 'null'
          title: Buyer Reference
          description: BT-10. Mandatory in Peppol BIS unless an order reference is present — often the buyer's own PO or cost-centre string.
          examples:
          - PO-4711
        preceding_invoice_number:
          anyOf:
          - type: string
          - type: 'null'
          title: Preceding Invoice Number
          description: BT-25. The number of the invoice a credit note corrects. Supplied directly here because this path stores nothing to look it up in.
          examples:
          - INV-2026-001
        line_items:
          items:
            $ref: '#/components/schemas/DocumentLineItemInput'
          type: array
          title: Line Items
        discounts:
          items:
            $ref: '#/components/schemas/DocumentDiscountInput'
          type: array
          title: Discounts
        shipping:
          anyOf:
          - $ref: '#/components/schemas/DocumentShippingInput'
          - type: 'null'
        custom_fields:
          items:
            $ref: '#/components/schemas/DocumentCustomFieldInput'
          type: array
          title: Custom Fields
        payment:
          anyOf:
          - $ref: '#/components/schemas/DocumentPaymentInput'
          - type: 'null'
        branding:
          anyOf:
          - $ref: '#/components/schemas/DocumentBrandingInput'
          - type: 'null'
      type: object
      required:
      - invoice_number
      - issue_date
      - currency
      - seller
      - buyer
      - line_items
      title: DocumentInvoiceDataInput
    DocumentComplianceResponse:
      properties:
        data:
          $ref: '#/components/schemas/ComplianceCheckOut'
      type: object
      required:
      - data
      title: DocumentComplianceResponse
    ComplianceRulesetOut:
      properties:
        id:
          type: string
          title: Id
          examples:
          - peppol-en16931-ubl
        label:
          type: string
          title: Label
          examples:
          - Peppol BIS Billing 3.0
        version:
          type: string
          title: Version
          description: The upstream release of the rules. Empty for checks with no version of their own.
          default: ''
          examples:
          - 3.0.20
        ran:
          type: boolean
          title: Ran
          description: False when this ruleset could not be run at all. A ruleset that did not run is not a pass — `valid` only reports what was checked.
        reason:
          anyOf:
          - type: string
          - type: 'null'
          title: Reason
          description: Why it did not run, when it did not.
      type: object
      required:
      - id
      - label
      - ran
      title: ComplianceRulesetOut
      description: One ruleset the document was held to, and whether it actually ran.
    DocumentLineItemInput:
      properties:
        name:
          type: string
          title: Name
          examples:
          - Web Development
        description:
          anyOf:
          - type: string
          - type: 'null'
          title: Description
          examples:
          - Frontend redesign project
        quantity:
          type: string
          title: Quantity
          examples:
          - '2'
        unit_price:
          type: string
          title: Unit Price
          description: Decimal string in major units
          examples:
          - '150.00'
        unit:
          anyOf:
          - type: string
          - type: 'null'
          title: Unit
          examples:
          - hours
        unit_code:
          anyOf:
          - type: string
          - type: 'null'
          title: Unit Code
          description: BT-130. UN/ECE Rec 20 code for the unit — HUR for hours, C62 for each. Separate from `unit`, which is the label printed on the PDF.
          examples:
          - HUR
        sku:
          anyOf:
          - type: string
          - type: 'null'
          title: Sku
          examples:
          - SVC-WEB-001
        discount:
          anyOf:
          - $ref: '#/components/schemas/DocumentDiscountInput'
          - type: 'null'
        taxes:
          items:
            $ref: '#/components/schemas/DocumentLineItemTaxInput'
          type: array
          title: Taxes
      type: object
      required:
      - name
      - quantity
      - unit_price
      title: DocumentLineItemInput
    DocumentLineItemTaxInput:
      properties:
        name:
          type: string
          title: Name
          examples:
          - Sales Tax
        rate:
          type: string
          title: Rate
          examples:
          - '8.875'
        inclusive:
          type: boolean
          title: Inclusive
          default: false
        category:
          anyOf:
          - $ref: '#/components/schemas/TaxCategory'
          - type: 'null'
          description: How this tax is treated — required for e-invoicing formats, which keep zero-rated, exempt and reverse-charge in separate VAT groups.
      type: object
      required:
      - name
      - rate
      title: DocumentLineItemTaxInput
    InvoiceBankAccountInput:
      properties:
        bank_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Bank Name
          examples:
          - First National Bank
        account_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Account Name
          examples:
          - Acme Corp
        account_number:
          anyOf:
          - type: string
          - type: 'null'
          title: Account Number
          examples:
          - '1234567890'
        routing_number:
          anyOf:
          - type: string
          - type: 'null'
          title: Routing Number
          examples:
          - '021000021'
        swift:
          anyOf:
          - type: string
          - type: 'null'
          title: Swift
          examples:
          - FNBKUS33
        iban:
          anyOf:
          - type: string
          - type: 'null'
          title: Iban
          examples:
          - US82FNBK0000001234567890
      type: object
      title: InvoiceBankAccountInput
    ComplianceCheckOut:
      properties:
        profile:
          type: string
          title: Profile
          examples:
          - peppol_bis_billing_3
        ruleset_version:
          type: string
          title: Ruleset Version
          description: The version these rules came from. Worth recording alongside any document you file — rulesets revise, and 'which rules did this pass?' is what an audit asks years later. `rulesets` breaks the same answer down per ruleset.
          examples:
          - EN16931-UBL 1.3.16 + Peppol BIS Billing 3.0.20
        valid:
          type: boolean
          title: Valid
          description: Nothing fatal was found. Read it with `fully_checked` — on its own it says what was checked came back clean, not that everything was checked.
        in_scope:
          type: boolean
          title: In Scope
          description: 'Whether any of these rulesets is likely to apply to this document at all. False when neither party is in a country that uses one — these are European e-invoicing rulesets, and for a wholly domestic US invoice, say, `valid` is answering a question nobody asked. Advisory: it never changes the verdict or withholds the check, because an open network means a US seller invoicing a Dutch buyer genuinely needs it.'
          default: true
        fully_checked:
          type: boolean
          title: Fully Checked
          description: Every ruleset that applies to this profile ran. False means at least one could not, and `rulesets` says which and why.
          default: true
        rulesets:
          items:
            $ref: '#/components/schemas/ComplianceRulesetOut'
          type: array
          title: Rulesets
          description: Every ruleset the document was held to, including the mandatory-field check, at the version that ran.
        violations:
          items:
            $ref: '#/components/schemas/ComplianceViolationOut'
          type: array
          title: Violations
          description: Every violation found, not the first — fixing one field per round trip is the experience this avoids. Ordered mandatory-field findings first, since those name a field you can go and change.
      type: object
      required:
      - profile
      - ruleset_version
      - valid
      title: ComplianceCheckOut
    DocumentCustomFieldInput:
      properties:
        label:
          type: string
          title: Label
          examples:
          - PO Number
        value:
          type: string
          title: Value
          examples:
          - PO-2026-001
      type: object
      required:
      - label
      - value
      title: DocumentCustomFieldInput
    DocumentComplianceRequest:
      properties:
        document_type:
          type: string
          enum:
          - invoice
          - credit_note
          - debit_note
          - quote
          - receipt
          - proforma
          - purchase_order
          - delivery_note
          title: Document Type
          default: invoice
        data:
          $ref: '#/components/schemas/DocumentInvoiceDataInput'
        profile:
          type: string
          title: Profile
          description: 'Which ruleset to hold the document to. Rulesets differ: a document valid under one can be rejected by another, so there is no default.'
          examples:
          - peppol_bis_billing_3
      type: object
      required:
      - data
      - profile
      title: DocumentComplianceRequest
    DocumentPartyInput:
      properties:
        name:
          type: string
          title: Name
          examples:
          - Acme Corp
        legal_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Legal Name
          examples:
          - Acme Corp Inc.
        contact_name:
          anyOf:
          - type: string
          - type: 'null'
          title: Contact Name
          description: Who to ask about an invoice — a person or a department, not the company. EN 16931 calls it the contact point (BT-41 for the seller, BT-56 for the buyer); some national rulesets require it.
          examples:
          - Accounts Receivable
        email:
          anyOf:
          - type: string
          - type: 'null'
          title: Email
          examples:
          - billing@acme.com
        phone:
          anyOf:
          - type: string
          - type: 'null'
          title: Phone
          examples:
          - +1-555-123-4567
        website:
          anyOf:
          - type: string
          - type: 'null'
          title: Website
          examples:
          - https://acme.com
        tax_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Tax Id
          examples:
          - US-EIN-12-3456789
        registration_number:
          anyOf:
          - type: string
          - type: 'null'
          title: Registration Number
          examples:
          - REG-2024-00123
        address:
          anyOf:
          - $ref: '#/components/schemas/PostalAddress'
          - type: 'null'
        bank_account:
          anyOf:
          - $ref: '#/components/schemas/InvoiceBankAccountInput'
          - type: 'null'
        electronic_address:
          anyOf:
          - $ref: '#/components/schemas/ElectronicAddress'
          - type: 'null'
          description: Network address for e-invoicing. Required by Peppol; not the tax id.
      type: object
      required:
      - name
      title: DocumentPartyInput
    DocumentPaymentInput:
      properties:
        bank_account:
          anyOf:
          - $ref: '#/components/schemas/InvoiceBankAccountInput'
          - type: 'null'
        payment_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Payment Url
          examples:
          - https://pay.acme.com/inv-001
        accepted_methods:
          items:
            type: string
          type: array
          title: Accepted Methods
          examples:
          - - bank_transfer
            - credit_card
        instructions:
          anyOf:
          - type: string
          - type: 'null'
          title: Instructions
          examples:
          - Please pay within 30 days
      type: object
      title: DocumentPaymentInput
    ApiErrorResponse:
      type: object
      title: ApiErrorResponse
      properties:
        error:
          type: object
          properties:
            status:
              type: integer
              example: 422
              description: HTTP status, mirroring the response status line.
            code:
              type: string
              example: unprocessable_entity
            message:
              type: string
              example: Request validation failed
            request_id:
              type: string
              nullable: true
              description: Trace id for this request; also returned as X-Trace-Id.
            details:
              type: object
              nullable: true
              description: Error-specific context. Validation failures carry `fields`.
          required:
          - status
          - code
          - message
      required:
      - error
    TaxCategory:
      properties:
        code:
          type: string
          minLength: 1
          title: Code
          description: UNCL5305 tax category code — S standard, Z zero-rated, E exempt, AE reverse charge, K intra-community, G export, O outside scope
          examples:
          - S
        exemption_reason:
          anyOf:
          - type: string
          - type: 'null'
          title: Exemption Reason
          description: Required by EN 16931 whenever the category is not standard.
          examples:
          - Reverse charge
        exemption_reason_code:
          anyOf:
          - type: string
          - type: 'null'
          title: Exemption Reason Code
          examples:
          - VATEX-EU-AE
      type: object
      required:
      - code
      title: TaxCategory
      description: 'How a tax is treated, as opposed to what it is called.


        `name` and `rate` do not say this: two taxes at 0% may be zero-rated,

        exempt, reverse-charge or outside scope, and EN 16931 keeps them in

        separate VAT breakdown groups with different mandatory fields. Optional,

        so an invoice that never mentions a category calculates exactly as before.'
    ComplianceViolationOut:
      properties:
        rule:
          type: string
          title: Rule
          description: The identifier the standard uses — a business term from the mandatory-field check, a rule id from Schematron. A rule id is what a rejection notice from an access point quotes.
          examples:
          - BT-130
          - PEPPOL-EN16931-R003
        path:
          type: string
          title: Path
          description: Where the problem is. The mandatory-field check names a field of the request; Schematron names the node in the generated XML.
          examples:
          - lines[1].unit_code
          - /Invoice[1]/TaxTotal[1]
        message:
          type: string
          title: Message
          examples:
          - A coded unit is required.
        severity:
          type: string
          title: Severity
          description: '`fatal` would get the document rejected. `warning` is a recommendation — both EN 16931 and Peppol grade a large share of their rules as advisory, and `valid` ignores those.'
          default: fatal
          examples:
          - fatal
          - warning
        ruleset:
          type: string
          title: Ruleset
          description: Which ruleset found it — matches an `id` in `rulesets`.
          default: semantic
          examples:
          - semantic
          - peppol-en16931-ubl
      type: object
      required:
      - rule
      - path
      - message
      title: ComplianceViolationOut
    ElectronicAddress:
      properties:
        value:
          type: string
          minLength: 1
          title: Value
          examples:
          - '9482348239'
        scheme_id:
          type: string
          minLength: 1
          title: Scheme Id
          description: EAS code list identifier — 0088 is GLN, 9930 a German VAT number.
          examples:
          - 0088
      type: object
      required:
      - value
      - scheme_id
      title: ElectronicAddress
      description: 'BT-34 / BT-49 — where a document is routed on Peppol or DBNA.


        Both halves are required: an identifier without its scheme cannot be

        resolved, because the same string means different things in different code

        lists. This is not the tax id, which identifies a company to a tax

        authority rather than a mailbox on a network.'
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer
x-refined-from:
- openapi.json
- invoicepdfs-com-openapi.json
x-internal-tags:
- auth
- jobs
- logs