> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usecroma.com/llms.txt
> Use this file to discover all available pages before exploring further.

# El Salvador Hacienda DTE Verification

> Verify an electronic tax document (DTE) issued in El Salvador against the Ministerio de Hacienda by its código de generación, or the link printed in its QR code: whether Hacienda holds it, its status (`received`, `received_with_notes`, `adjusted`, `rejected`, `invalidated`), the sello de recepción, the número de control, its type, issue date and time, when Hacienda processed it, the totals and taxes, and every line. Read live from Hacienda on each call. The receptor's identity is never returned.



## OpenAPI

````yaml /api-reference/openapi.json post /sv/hacienda-sv/dte/v1
openapi: 3.1.0
info:
  title: Croma Marketplace API
  version: 1.0.0
  description: >-
    Government-data APIs for Colombia, Peru, Mexico, United States, Brazil, El
    Salvador, Bolivia, and Japan, plus global web search. Croma normalizes
    public-sector data into structured JSON for product teams and AI agents.


    Every operation is a POST with a JSON body and an organization API key as a
    bearer token; every operation is an idempotent lookup and accepts an
    optional `Idempotency-Key` header. Paths carry their major version (`/v1`);
    the versioning and deprecation policy, including the `Deprecation` and
    `Sunset` headers a retiring endpoint sends, is at
    https://docs.usecroma.com/versioning. Rate limits are per organization and
    reported on every response (`RateLimit-Policy`, `X-RateLimit-*`):
    https://docs.usecroma.com/rate-limits.
  termsOfService: https://usecroma.com/en/terms
  contact:
    name: Croma support
    url: https://usecroma.com/en/support
    email: support@usecroma.com
servers:
  - url: https://api.croma.run
security: []
paths:
  /sv/hacienda-sv/dte/v1:
    post:
      tags:
        - El Salvador
        - Ministerio de Hacienda de El Salvador
      summary: El Salvador Hacienda DTE Verification
      description: >-
        Verify an electronic tax document (DTE) issued in El Salvador against
        the Ministerio de Hacienda by its código de generación, or the link
        printed in its QR code: whether Hacienda holds it, its status
        (`received`, `received_with_notes`, `adjusted`, `rejected`,
        `invalidated`), the sello de recepción, the número de control, its type,
        issue date and time, when Hacienda processed it, the totals and taxes,
        and every line. Read live from Hacienda on each call. The receptor's
        identity is never returned.
      operationId: hacienda_sv_dte
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - generation_code
              properties:
                generation_code:
                  type: string
                  minLength: 36
                  maxLength: 500
                  description: >-
                    The document's código de generación, a UUID such as
                    `3F2504E0-4F89-41D3-9A0C-0305E82C3301`, or the link printed
                    in its QR code.
                environment:
                  type: string
                  enum:
                    - production
                    - test
                  default: production
                  description: >-
                    `production` (the default) for real documents, `test` for
                    documents issued in Hacienda's test environment.
              additionalProperties: false
            example:
              generation_code: 3F2504E0-4F89-41D3-9A0C-0305E82C3301
      responses:
        '200':
          description: Successful response
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            X-Cache:
              $ref: '#/components/headers/X-Cache'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HaciendaSvDteResponse'
        '400':
          description: Invalid request body
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: Missing or invalid API key
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '429':
          description: Rate limit exceeded
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '500':
          description: Internal error
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '502':
          description: Upstream source returned an error
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            Idempotency-Key:
              $ref: '#/components/headers/Idempotency-Key'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
      security:
        - bearerAuth: []
      externalDocs:
        description: Interactive documentation and examples
        url: https://docs.usecroma.com/guides/el-salvador/facturacion-electronica
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      description: >-
        Optional client-chosen key for this request (any string up to 255
        characters, e.g. a UUID). Every Croma operation is an idempotent lookup:
        repeating a request with the same body returns the same result and
        creates nothing, so retrying after a timeout or network failure is
        always safe. The key is echoed back in the `Idempotency-Key` response
        header so you can correlate a retry with its first attempt. Each attempt
        that reaches the API counts against the rate limit.
      schema:
        type: string
        maxLength: 255
        example: 0f8e9a42-6b7c-4d1e-9a3f-2c5d7e8f9a0b
  headers:
    X-Request-Id:
      description: Unique id for the request (req_…). Include it in support reports.
      schema:
        type: string
    RateLimit-Policy:
      description: >-
        Quota policy for this endpoint as an IETF RateLimit-Policy structured
        field, e.g. `"default";q=100;w=86400` (100 requests per 86400-second
        window per organization). Endpoints with an extra hourly ceiling list
        both policies, e.g. `"webSearch";q=100;w=3600, "default";q=100;w=86400`.
        Present on every response, including 401 and 429.
      schema:
        type: string
        example: '"default";q=100;w=86400'
    Idempotency-Key:
      description: >-
        The `Idempotency-Key` the request carried, echoed back unchanged. Absent
        when the request sent none.
      schema:
        type: string
    Deprecation:
      description: >-
        Present only on an endpoint version scheduled for removal: the date the
        deprecation took effect (RFC 9745). A `Sunset` header and a `Link` with
        `rel="successor-version"` accompany it. Policy:
        https://docs.usecroma.com/versioning
      schema:
        type: string
        example: '@1767225600'
    Sunset:
      description: >-
        Present only on an endpoint version scheduled for removal: the date
        after which it answers 410 (RFC 8594). Announced in the changelog at
        least 90 days ahead.
      schema:
        type: string
        format: date-time
        example: Wed, 01 Apr 2026 00:00:00 GMT
    X-RateLimit-Limit:
      description: Requests allowed in the current window.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Requests left before you are throttled.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: ISO 8601 timestamp when the window resets.
      schema:
        type: string
        format: date-time
    X-Cache:
      description: >-
        HIT or MISS. Cached hits spend no credits, but still count toward an
        hourly ceiling.
      schema:
        type: string
        enum:
          - HIT
          - MISS
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
  schemas:
    HaciendaSvDteResponse:
      type: object
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/HaciendaSvDteData'
    ApiError:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - code
            - message
          properties:
            type:
              type: string
              description: >-
                Broad category: invalid_request_error, authentication_error,
                not_found_error, rate_limit_error, upstream_error, api_error.
            code:
              type: string
              description: Machine-readable specific code.
            message:
              type: string
              description: Human-readable explanation, safe to surface in UI.
            param:
              type: string
              description: Field that triggered the error. Present on validation errors.
            details:
              type: object
              description: Free-form structured detail.
    HaciendaSvDteData:
      type: object
      properties:
        found:
          type: boolean
          description: False when Hacienda has no document under that code.
        generation_code:
          type: string
          description: The code that was looked up, normalized to upper case.
        environment:
          type: string
          enum:
            - production
            - test
        status:
          anyOf:
            - type: string
              enum:
                - received
                - received_with_notes
                - adjusted
                - rejected
                - invalidated
                - unknown
            - type: 'null'
          description: >-
            `received` (transmitted and accepted), `received_with_notes`,
            `adjusted`, `rejected`, `invalidated`, or `unknown` for a status
            Croma does not map yet. Null when not found.
        status_code:
          anyOf:
            - type: string
            - type: 'null'
          description: Hacienda's own status code, e.g. "SR".
        status_label:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Hacienda's status as it words it, e.g. "Transmitido
            Satisfactoriamente".
        description:
          anyOf:
            - type: string
            - type: 'null'
          description: Hacienda's description of the status.
        invalidated:
          type: boolean
          description: Whether the issuer has invalidated the document.
        document:
          anyOf:
            - type: object
              properties:
                generation_code:
                  type: string
                  description: The document's código de generación.
                control_number:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: >-
                    The número de control, e.g.
                    "DTE-03-S008P001-000000000014012".
                type_code:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: >-
                    The DTE type: "01" factura, "03" comprobante de crédito
                    fiscal, "05" nota de crédito, "14" factura de sujeto
                    excluido, and so on.
                type:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: >-
                    The DTE type as Hacienda names it, e.g. "COMPROBANTE DE
                    CREDITO FISCAL".
                version:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The schema version the document follows.
                issued_date:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: '`yyyy-mm-dd` the document was issued.'
                issued_time:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: '`hh:mm:ss` it was issued.'
                processed_at:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: When Hacienda processed it, as Hacienda reports it.
                reception_seal:
                  anyOf:
                    - type: string
                    - type: 'null'
                  description: The sello de recepción Hacienda gave the document.
                currency:
                  type: string
                  const: USD
                subtotal:
                  anyOf:
                    - type: number
                    - type: 'null'
                taxed_total:
                  anyOf:
                    - type: number
                    - type: 'null'
                exempt_total:
                  anyOf:
                    - type: number
                    - type: 'null'
                non_subject_total:
                  anyOf:
                    - type: number
                    - type: 'null'
                discount_total:
                  anyOf:
                    - type: number
                    - type: 'null'
                taxes:
                  type: array
                  items:
                    type: object
                    properties:
                      code:
                        type: string
                        description: The tax code, e.g. "20" for IVA.
                      description:
                        anyOf:
                          - type: string
                          - type: 'null'
                      amount:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: In US dollars.
                    required:
                      - code
                      - description
                      - amount
                income_tax_withheld:
                  anyOf:
                    - type: number
                    - type: 'null'
                vat_withheld:
                  anyOf:
                    - type: number
                    - type: 'null'
                vat_perceived:
                  anyOf:
                    - type: number
                    - type: 'null'
                operation_total:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The operation's total.
                total:
                  anyOf:
                    - type: number
                    - type: 'null'
                  description: The total to pay.
                total_in_words:
                  anyOf:
                    - type: string
                    - type: 'null'
                payment_condition:
                  anyOf:
                    - type: string
                      enum:
                        - cash
                        - credit
                        - other
                    - type: 'null'
                items:
                  type: array
                  items:
                    type: object
                    properties:
                      number:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: The line's position on the document.
                      code:
                        anyOf:
                          - type: string
                          - type: 'null'
                        description: The issuer's product or service code.
                      description:
                        anyOf:
                          - type: string
                          - type: 'null'
                      quantity:
                        anyOf:
                          - type: number
                          - type: 'null'
                      unit_price:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: In US dollars.
                      discount:
                        anyOf:
                          - type: number
                          - type: 'null'
                      taxed_sale:
                        anyOf:
                          - type: number
                          - type: 'null'
                        description: Sale subject to IVA, in US dollars.
                      exempt_sale:
                        anyOf:
                          - type: number
                          - type: 'null'
                      non_subject_sale:
                        anyOf:
                          - type: number
                          - type: 'null'
                    required:
                      - number
                      - code
                      - description
                      - quantity
                      - unit_price
                      - discount
                      - taxed_sale
                      - exempt_sale
                      - non_subject_sale
                  description: Every line of the document.
              required:
                - generation_code
                - control_number
                - type_code
                - type
                - version
                - issued_date
                - issued_time
                - processed_at
                - reception_seal
                - currency
                - subtotal
                - taxed_total
                - exempt_total
                - non_subject_total
                - discount_total
                - taxes
                - income_tax_withheld
                - vat_withheld
                - vat_perceived
                - operation_total
                - total
                - total_in_words
                - payment_condition
                - items
            - type: 'null'
        checked_at:
          type: string
          description: When Hacienda was asked.
      required:
        - found
        - generation_code
        - environment
        - status
        - status_code
        - status_label
        - description
        - invalidated
        - document
        - checked_at
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Use Authorization: Bearer YOUR_API_KEY'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.