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

# Validar documento

> Valida un documento con las mismas reglas que la emisión, **sin emitirlo**: recibe el mismo cuerpo que `POST /api/invoices` y no registra el documento, no consume folio ni lo envía a la autoridad tributaria.

Responde `valid: true`, o `valid: false` con **todos** los errores en `validation_errors`, incluidos los que en la emisión rechazan el documento (`DUPLICATE_EXTERNAL_REFERENCE`, `CERTIFICATE_NOT_FOUND`).

`valid: true` no garantiza que el documento se emita: no cubre la validación de esquema que se hace al firmarlo, la disponibilidad de folios ni el criterio de la autoridad tributaria.



## OpenAPI

````yaml /api-reference/openapi.json post /api/invoices/validate
openapi: 3.1.0
info:
  title: Emify API
  description: >-
    API pública de Emify para la emisión y gestión de documentos tributarios
    electrónicos (DTE) en Chile.
  version: 1.0.0
  contact:
    name: Soporte Emify
    email: soporte@emify.co
servers:
  - url: https://api.emify.co
    description: Producción
  - url: http://localhost:8080
    description: Desarrollo local
security: []
tags:
  - name: Services
    description: >-
      Utilidades públicas de la plataforma (validación de documentos, tipos de
      cambio)
  - name: Certificates
    description: Gestión de certificados digitales por empresa
  - name: Legal Entities
    description: Tipos de persona jurídica / persona natural por país
  - name: Tax Identification Documents
    description: Documentos de identificación tributaria por país
  - name: Purchases (Receptions)
    description: Gestión de documentos recibidos (compras y recepciones)
  - name: Legal Activities
    description: Actividades económicas / giros por país
  - name: Tax Information
    description: Información fiscal de referencia por país
  - name: Additional Export Info
    description: Información adicional para documentos de exportación por país
  - name: Enumeration (CAF)
    description: Gestión de folios (CAF) y enumeración de documentos por empresa
  - name: Currencies
    description: Monedas disponibles por país
  - name: Document Cancellation Reasons
    description: Razones de anulación de documentos por país
  - name: Document Types
    description: Tipos de documentos tributarios por país
  - name: Document Reference Types
    description: Tipos de documento que solo se pueden referenciar, nunca emitir
  - name: Companies
    description: Gestión de empresas emisoras de documentos tributarios
  - name: Measurement Units
    description: Unidades de medida por país
  - name: Users
    description: Operaciones de usuario autenticado
  - name: Company Settings
    description: Configuración operacional de la empresa
  - name: Item Code Types
    description: Tipos de código de ítem por país
  - name: Invoices
    description: Emisión y gestión de facturas y documentos tributarios electrónicos
  - name: Countries
    description: Listado de países soportados
  - name: Tax Types
    description: Tipos de impuesto por país
  - name: Taxpayers
    description: Consulta de datos de contribuyentes en entes tributarios
  - name: Webhooks
    description: Suscripción del cliente a eventos de todas sus empresas vía webhooks
  - name: Payment Types
    description: Tipos de pago por país
paths:
  /api/invoices/validate:
    post:
      tags:
        - Invoices
      summary: Validar documento
      description: >-
        Valida un documento con las mismas reglas que la emisión, **sin
        emitirlo**: recibe el mismo cuerpo que `POST /api/invoices` y no
        registra el documento, no consume folio ni lo envía a la autoridad
        tributaria.


        Responde `valid: true`, o `valid: false` con **todos** los errores en
        `validation_errors`, incluidos los que en la emisión rechazan el
        documento (`DUPLICATE_EXTERNAL_REFERENCE`, `CERTIFICATE_NOT_FOUND`).


        `valid: true` no garantiza que el documento se emita: no cubre la
        validación de esquema que se hace al firmarlo, la disponibilidad de
        folios ni el criterio de la autoridad tributaria.
      operationId: validateInvoice
      parameters:
        - name: apiKey
          in: query
          required: true
          schema:
            $ref: '#/components/schemas/AuthenticatedApiKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateInvoiceApiRequest'
        required: true
      responses:
        '200':
          description: 'Documento evaluado: `valid` indica si pasa las validaciones'
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/ValidateInvoiceApiResponse'
        '400':
          description: Datos del documento inválidos o empresa suspendida
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/ValidateInvoiceApiResponse'
        '401':
          description: API key inválida o ausente
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/ValidateInvoiceApiResponse'
        '403':
          description: Sin acceso a esta empresa
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/ValidateInvoiceApiResponse'
        '404':
          description: Empresa o tipo de documento inexistente
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/ValidateInvoiceApiResponse'
      security:
        - ApiKey: []
components:
  schemas:
    AuthenticatedApiKey:
      type: object
      properties:
        apiKeyId:
          type: string
        clientId:
          type: string
        role:
          type: string
          enum:
            - OWNER
            - ADMIN
            - MEMBER
        accessibleCompanyIds:
          type: array
          items:
            type: string
    CreateInvoiceApiRequest:
      type: object
      properties:
        branch_office:
          type: integer
          format: int32
          description: Código de la sucursal emisora
          example: 0
        serie:
          type: string
          description: Serie del documento (si aplica)
          example: A
        invoice_type:
          type: string
          description: 'Tipo de documento tributario (ej: 33, 39, 61)'
          example: 33
        invoice_date:
          type: string
          format: date
          description: Fecha de emisión del documento
          example: '2024-03-15'
        payment_due_date:
          type: string
          format: date
          description: Fecha de vencimiento del pago
          example: '2024-04-15'
        service_start_date:
          type: string
          format: date
          description: Fecha de inicio del período de servicio
          example: '2024-03-01'
        service_end_date:
          type: string
          format: date
          description: Fecha de fin del período de servicio
          example: '2024-03-31'
        service_indicator:
          type: integer
          format: int32
          description: Indicador de servicio (específico por país)
          example: 1
        concept:
          type: integer
          format: int32
          description: Concepto del documento (específico por país)
          example: 1
        reason_code:
          type: string
          description: Código del motivo de anulación (para notas de crédito/débito)
          example: 1
        cancellation_date:
          type: string
          format: date
          description: Fecha de anulación del documento
          example: '2024-03-20'
        observations:
          type: string
          description: Observaciones adicionales del documento
          example: Pago a 30 días
        external_reference:
          type: string
          description: Referencia externa del documento en el sistema del cliente
          example: OC-2024-001
        issuer:
          $ref: '#/components/schemas/PartyInfo'
          description: Información del emisor del documento
        recipient:
          $ref: '#/components/schemas/PartyInfo'
          description: Información del receptor del documento
        currency:
          $ref: '#/components/schemas/CurrencyRequest'
          description: Información de la moneda del documento
        export_payment_method_code:
          type: string
          description: >-
            Código del método de pago de exportación (específico para facturas
            de exportación)
          example: 21
        payment_method:
          $ref: '#/components/schemas/PaymentMethodRequest'
          description: Método de pago del documento
        items:
          type: array
          description: Lista de ítems del documento
          items:
            $ref: '#/components/schemas/InvoiceItemRequest'
        global_taxes:
          type: array
          description: Impuestos globales aplicados al documento
          items:
            $ref: '#/components/schemas/GlobalTaxRequest'
        billing_reference:
          type: array
          description: >-
            Referencias a documentos relacionados (ej: factura original para
            notas de crédito)
          items:
            $ref: '#/components/schemas/BillingReferenceRequest'
        totals:
          $ref: '#/components/schemas/TotalsRequest'
          description: Totales del documento
        additional_header_info:
          type: array
          description: Información adicional en el encabezado del documento
          items:
            $ref: '#/components/schemas/AdditionalInfoRequest'
        additional_footer_info:
          type: array
          description: Información adicional en el pie del documento
          items:
            $ref: '#/components/schemas/AdditionalInfoRequest'
        additional_export_info:
          type: array
          items:
            $ref: '#/components/schemas/AdditionalInfoRequest'
          description: >-
            Información adicional de exportación, como lista de pares
            clave/valor. Las claves `transport.*` arman el bloque Aduana del DTE
            chileno y se validan contra el catálogo del país: una clave
            `transport.*` desconocida, un valor que no respeta el tipo
            declarado, un peso o monto en cero o negativo, un peso sin su unidad
            de medida, o un código fuera de la tabla de Aduana correspondiente
            (modalidad de venta, cláusula de compraventa, vía de transporte)
            devuelven 422. Los códigos de país aceptan tanto el ISO 3166-1
            alpha-2 como el número de Aduana, y uno que no resuelve también
            devuelve 422 en vez de viajar al ente. Una exportación de bienes
            (documentos 110, 111 y 112 sin `service_indicator` entre 3 y 6) debe
            declarar ocho claves: `transport.sales_modality_code`,
            `transport.sales_clause_code`, `transport.transport_mode_code`,
            `transport.port_shipment_code`, `transport.port_discharge_code`,
            `transport.gross_weight`, `transport.total_packages` y
            `transport.packages_type.packages_type_code`. Una exportación de
            servicios no requiere ninguna.
      required:
        - branch_office
        - currency
        - invoice_date
        - invoice_type
        - items
        - recipient
        - totals
    ValidateInvoiceApiResponse:
      type: object
      properties:
        valid:
          type: boolean
          description: >-
            true si el documento pasa las validaciones de Emify. No garantiza
            que la autoridad tributaria lo acepte
          example: false
        validation_errors:
          type: array
          description: >-
            Todos los errores de validación del documento. Solo presente cuando
            `valid` es false. Son los mismos que reportaría la emisión del mismo
            documento.
          items:
            $ref: '#/components/schemas/CreateInvoiceValidationError'
    PartyInfo:
      type: object
      properties:
        legal_name:
          type: string
        document_type:
          type: string
        document_number:
          type: string
        internal_code:
          type: string
        address:
          $ref: '#/components/schemas/AddressInfo'
        tax_information:
          $ref: '#/components/schemas/TaxInformationInfo'
      required:
        - document_number
        - document_type
        - legal_name
    CurrencyRequest:
      type: object
      properties:
        code:
          type: string
        exchange_rate:
          type: number
      required:
        - code
    PaymentMethodRequest:
      type: object
      properties:
        code:
          type: string
        description:
          type: string
    InvoiceItemRequest:
      type: object
      properties:
        quantity:
          type: number
        code_unit_of_measure:
          type: string
        unit_price:
          type: number
        discount_amount:
          type: number
        description:
          type: string
          maxLength: 1000
          minLength: 0
        code:
          $ref: '#/components/schemas/ItemCodeRequest'
        taxes:
          type: array
          items:
            $ref: '#/components/schemas/ItemTaxRequest'
        additional_info:
          $ref: '#/components/schemas/ItemAdditionalInfoRequest'
      required:
        - description
        - quantity
        - unit_price
    GlobalTaxRequest:
      type: object
      properties:
        type:
          type: string
        description:
          type: string
        base_amount:
          type: number
        rate:
          type: number
          description: >-
            Tasa del impuesto (porcentaje). Opcional: si el tipo toma la tasa
            del catálogo (`rate_source` `CATALOG` en `GET /api/tax-types`) se
            usa la del catálogo y esta se ignora; si la informa el cliente
            (`rate_source` `CLIENT`) es obligatoria, y sin ella la creación
            falla con `TAX_RATE_REQUIRED`.
        amount:
          type: number
      required:
        - amount
        - base_amount
        - type
    BillingReferenceRequest:
      type: object
      properties:
        invoice_type:
          type: string
        branch_office:
          type: integer
          format: int32
        number:
          type: integer
          format: int64
        invoice_date:
          type: string
          format: date
        cae:
          type: string
      required:
        - invoice_type
    TotalsRequest:
      type: object
      properties:
        sub_total:
          type: number
        discount:
          type: number
        taxes:
          type: array
          items:
            $ref: '#/components/schemas/TotalTaxRequest'
        total:
          type: number
      required:
        - sub_total
        - total
    AdditionalInfoRequest:
      type: object
      properties:
        key:
          type: string
        value:
          type: string
    CreateInvoiceValidationError:
      type: object
      properties:
        field:
          type: string
          description: Campo del request al que corresponde el error
          example: total
        code:
          type: string
          description: Código del error
          example: INVOICE_TOTALS_MISMATCH
        message:
          type: string
          description: Descripción del error
          example: >-
            Invoice total (40000.0) does not match calculated total (39951.0):
            sub_total + totalTaxes - totalDiscount
    AddressInfo:
      type: object
      properties:
        address:
          type: string
        city:
          type: string
          description: Comuna en Chile, localidad en Argentina.
          example: Providencia
        state:
          type: string
          description: >-
            Código ISO 3166-2 de la subdivisión: región en Chile, provincia en
            Argentina, departamento en Uruguay. Es un código, no un nombre. Se
            acepta también con el nombre `region`, que queda deprecado.
          example: CL-RM
        country:
          type: string
          description: >-
            País del domicilio. Se acepta el código ISO 3166-1 alpha-2 (`AR`,
            `CL`, `US`) o el código numérico del ente aduanero, y se valida
            contra el catálogo de países del país emisor. **Obligatorio en los
            documentos de exportación de Chile (110, 111 y 112)**: es la
            nacionalidad del receptor que el SII exige en el bloque
            `Extranjero`, y no puede ser la del propio emisor.
          example: AR
        phone:
          type: string
          description: >-
            Teléfono de contacto. En las boletas de Chile (39 y 41) se imprime
            en el campo Contacto del documento, junto al `email` si viene.
          example: '+56912345678'
        email:
          type: string
          format: email
          maxLength: 80
          description: >-
            Email de contacto del receptor. Opcional. En las boletas de Chile
            (39 y 41) se imprime junto al teléfono en el campo Contacto del
            documento, como `{phone} / {email}`, y la combinación no puede
            superar los 80 caracteres (si la supera, el alta responde 422). En
            los demás documentos se guarda pero no se emite. En el emisor se
            ignora.
          example: juan.perez@example.com
    TaxInformationInfo:
      type: object
      properties:
        tax_condition:
          type: string
        start_activities_date:
          type: string
          format: date
        activity:
          type: string
        activity_codes:
          type: array
          items:
            type: integer
            format: int32
        resolution_date:
          type: string
        resolution_number:
          type: string
        cbu:
          type: string
          description: >-
            Argentina, solo emisor de Clase A (FCA, NDA, NCA). CBU del emisor
            (22 dígitos) habilitado por ARCA a emitir con la leyenda "PAGO EN
            CBU INFORMADA" (RG 5762). El comprobante se autoriza con los códigos
            A comunes (1/2/3) y el PDF imprime la leyenda y la CBU junto a la
            letra. Excluyente con subject_to_retention.
          example: '2850590940090418135201'
        subject_to_retention:
          type: boolean
          description: >-
            Argentina, solo emisor de Clase A (FCA, NDA, NCA). true si ARCA
            habilitó al emisor a emitir con la leyenda "OPERACIÓN SUJETA A
            RETENCIÓN" (RG 5762): el comprobante se autoriza con los códigos
            51/52/53 de la ex-Factura M y numera en esa serie; el invoice_type
            sigue siendo FCA/NDA/NCA. Excluyente con cbu.
          example: false
    ItemCodeRequest:
      type: object
      properties:
        type:
          type: string
        value:
          type: string
    ItemTaxRequest:
      type: object
      properties:
        type:
          type: string
        amount:
          type: number
        rate:
          type: number
          description: >-
            Tasa del impuesto (porcentaje). Opcional: si el tipo toma la tasa
            del catálogo (`rate_source` `CATALOG` en `GET /api/tax-types`) se
            usa la del catálogo y esta se ignora; si la informa el cliente
            (`rate_source` `CLIENT`) es obligatoria, y sin ella la creación
            falla con `TAX_RATE_REQUIRED`.
      required:
        - amount
        - type
    ItemAdditionalInfoRequest:
      type: object
      properties:
        customs_number:
          type: string
    TotalTaxRequest:
      type: object
      properties:
        type:
          type: string
        base_amount:
          type: number
        rate:
          type: number
          description: >-
            Tasa del impuesto (porcentaje). Opcional: si el tipo toma la tasa
            del catálogo (`rate_source` `CATALOG` en `GET /api/tax-types`) se
            usa la del catálogo y esta se ignora; si la informa el cliente
            (`rate_source` `CLIENT`) es obligatoria, y sin ella la creación
            falla con `TAX_RATE_REQUIRED`.
        amount:
          type: number
      required:
        - amount
        - base_amount
        - type
  securitySchemes:
    ApiKey:
      type: apiKey
      name: X-Api-Key
      in: header

````

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