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

# Crear Credenciales en Lote

> Crea hasta 200 credenciales SII en una sola llamada. La respuesta confirma de inmediato que el formato de la solicitud es válido y devuelve un `batch_id`; la validación real contra el SII ocurre de forma asíncrona y el resultado final de cada credencial se notifica por webhook (`credential.validated` / `credential.invalid`).

## Que hace

* Crea hasta 200 credenciales SII en una sola llamada
* Valida el formato de cada credencial de inmediato (RUTs, tipo de credencial soportado, contraseña no vacia) y responde con el `batch_id` apenas el formato es correcto
* Valida cada credencial contra el SII de forma asincrona, sin bloquear la respuesta
* Notifica el resultado final de cada credencial por [webhook](/user-guide/webhooks) (`credential.validated` o `credential.invalid`)
* Crea automaticamente la entidad maestra (`master_entity_rut`) si aun no existe en Tupana

## Ejemplos de uso

* Migrar o dar de alta el portafolio completo de un contador/gestora de una sola vez
* Reintentar credenciales que quedaron invalidas para varios clientes
* Integrar un onboarding masivo de empresas sin esperar la validacion SII en el mismo request

## Tipos de credenciales soportados

Este endpoint solo admite credenciales SII (no certificados digitales ni credenciales de otros proveedores, que se crean con [POST /credentials](/api-reference/credentials/create)):

| Tipo (`credential_type`) | Descripcion                                                |
| ------------------------ | ---------------------------------------------------------- |
| `SII`                    | Servicio de Impuestos Internos (clave tributaria personal) |
| `sii_company`            | SII a nivel de empresa (clave de empresa)                  |

## Flujo del batch

1. **Respuesta inmediata (`201`)**: confirma que el formato de cada credencial es valido y devuelve `batch_id` + un `item_id` por credencial, en el mismo orden enviado.
2. **Procesamiento asincrono**: cada credencial se valida contra el SII por separado. Una credencial con error no afecta a las demas del mismo lote.
3. **Notificacion por webhook**: cuando una credencial termina de procesarse, se dispara:
   * `credential.validated` si el login al SII fue exitoso
   * `credential.invalid` si la clave es incorrecta o la cuenta esta bloqueada

### Idempotency-Key

Envia `idempotency_key` en el body para evitar crear un batch duplicado si reintentas la misma solicitud (por ejemplo, tras un timeout de red). Si ya existe un batch con esa clave, se devuelve el batch existente en vez de crear uno nuevo.

### Errores de formato (`422`)

Si alguna credencial del lote no pasa la validacion de formato, la respuesta es `422` y **no se crea ningun batch**. Los errores se devuelven por indice, en el mismo orden del array `credentials` enviado.


## OpenAPI

````yaml POST /credentials/batch
openapi: 3.0.0
info:
  title: Tupana API
  description: API para integración con el sistema Tupana - Facturación Electrónica
  version: 1.0.0
servers:
  - url: https://api.tupana.ai/v1
    description: Servidor de producción
security:
  - apiKeyAuth: []
paths:
  /credentials/batch:
    post:
      tags:
        - Credenciales
      summary: Crear credenciales en lote
      description: >-
        Crea hasta 200 credenciales SII en una sola llamada. La respuesta
        confirma de inmediato que el formato de la solicitud es válido y
        devuelve un `batch_id`; la validación real contra el SII ocurre de forma
        asíncrona y el resultado final de cada credencial se notifica por
        webhook (`credential.validated` / `credential.invalid`).
      operationId: createCredentialsBatch
      requestBody:
        description: Lote de credenciales a crear/validar
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - credentials
              properties:
                credentials:
                  type: array
                  minItems: 1
                  maxItems: 200
                  items:
                    type: object
                    required:
                      - master_entity_rut
                      - credential_type
                      - user_rut
                      - password
                    properties:
                      master_entity_rut:
                        type: string
                        description: >-
                          RUT de la entidad maestra a la que se asociará la
                          credencial. Si no existe una entidad con ese RUT en
                          Tupana, se crea automáticamente.
                        example: 76.123.456-0
                      credential_type:
                        type: string
                        description: >-
                          Tipo de credencial. Solo se admiten credenciales SII
                          en este endpoint.
                        enum:
                          - SII
                          - sii_company
                        example: sii_company
                      user_rut:
                        type: string
                        description: RUT del usuario del SII
                        example: 12.345.678-5
                      password:
                        type: string
                        description: Contraseña del usuario en el SII
                        example: mi_password_segura
                idempotency_key:
                  type: string
                  description: >-
                    Clave opcional que previene la creación de lotes duplicados.
                    Si se repite, se devuelve el batch ya creado en vez de uno
                    nuevo.
                  example: batch_credenciales_2026_01_15_001
            example:
              credentials:
                - master_entity_rut: 76.123.456-0
                  credential_type: sii_company
                  user_rut: 12.345.678-5
                  password: mi_password_segura
                - master_entity_rut: 77.698.843-K
                  credential_type: SII
                  user_rut: 11.111.111-1
                  password: otra_password
      responses:
        '201':
          description: >-
            Solicitud aceptada. El formato de cada credencial es válido; el
            resultado de cada una se notificará por webhook.
          content:
            application/json:
              schema:
                type: object
                properties:
                  batch_id:
                    type: string
                    format: uuid
                    description: >-
                      ID único del batch, usado para consultarlo en GET
                      /credentials/batch/{batch_id}
                    example: 550e8400-e29b-41d4-a716-446655440000
                  status:
                    type: string
                    description: Estado del batch
                    enum:
                      - processing
                      - completed
                      - partial
                      - failed
                    example: processing
                  items:
                    type: array
                    description: >-
                      Un item por cada credencial recibida, en el mismo orden
                      del request
                    items:
                      type: object
                      properties:
                        item_id:
                          type: string
                          format: uuid
                          example: 6b1f3c2e-9a4d-4e7a-8e2a-1a2b3c4d5e6f
                        index:
                          type: integer
                          description: >-
                            Posición de la credencial dentro del array
                            `credentials` enviado
                          example: 0
              example:
                batch_id: 550e8400-e29b-41d4-a716-446655440000
                status: processing
                items:
                  - item_id: 6b1f3c2e-9a4d-4e7a-8e2a-1a2b3c4d5e6f
                    index: 0
                  - item_id: 8c2d4b1a-3f5e-4a6b-9c7d-2e3f4a5b6c7d
                    index: 1
        '401':
          description: No autorizado - API key inválida o faltante
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Prohibido - Sin permisos para crear credenciales
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            Cuerpo malformado o alguna credencial del lote no pasó la validación
            de formato (RUT inválido, `credential_type` no soportado, contraseña
            vacía, más de 200 items, etc.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                credentials:
                  - {}
                  - master_entity_rut:
                      - RUT de la entidad inválido.
      security:
        - apiKeyAuth: []
components:
  schemas:
    Error:
      required:
        - error
        - message
      type: object
      properties:
        error:
          type: string
          description: Código de error
          example: VALIDATION_ERROR
          enum:
            - VALIDATION_ERROR
            - AUTHENTICATION_ERROR
            - AUTHORIZATION_ERROR
            - NOT_FOUND
            - SII_ERROR
            - INTERNAL_ERROR
        message:
          type: string
          description: Mensaje de error
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API Key para autenticación. Debe proporcionarse en el header
        Authorization con el formato: 'Api-Key YOUR-API-KEY' (incluye el prefijo
        'Api-Key ' seguido de tu API key)

````