> ## 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.

# Estado del Enrolamiento

> Devuelve el estado del enrolamiento iniciado con POST /credentials. Se consulta hasta que `status` deja de ser `pending`: el login contra el SII demora del orden de 15 segundos, así que basta con consultar cada 2-3 segundos.

## Que hace

* Devuelve el estado del enrolamiento iniciado con `POST /credentials`
* Entrega la credencial cuando el SII ya validó la clave
* Distingue una clave rechazada por el SII de una falla temporal reintentable

## Por que existe

El login contra el SII se hace con un navegador real, fuera del request HTTP.
Por eso `POST /credentials` no puede devolver la credencial: responde `202` con
un `enrollment_id` y este endpoint entrega el resultado cuando está listo.

## Estados

| `status` | Significado | Que hacer |
| - | - | - |
| `pending` | El login contra el SII sigue en curso | Volver a consultar en 2-3 segundos |
| `valid` | La credencial quedó enrolada | Leer `credential` en la respuesta |
| `invalid` | El SII rechazó la clave | Mostrar `error` al usuario y pedir la clave de nuevo |
| `error` | No se pudo preguntarle al SII (falla temporal) | Reintentar el enrolamiento más tarde; la clave NO fue rechazada |

## Cuanto tarda

El login demora del orden de **15 segundos**. Consultar cada 2-3 segundos es
suficiente; no es necesario consultar más seguido.

## Ejemplo

```bash theme={null}
curl https://api.tupana.ai/v1/credentials/enrollments/cenr_3940730445066399260/ \
  -H "Authorization: Api-Key TU_API_KEY"
```

```json theme={null}
{
  "enrollment_id": "cenr_3940730445066399260",
  "status": "valid",
  "user_rut": "12345678-9",
  "error": null,
  "credential": {
    "id": "cred_3940730445066399260",
    "user": "12345678-9",
    "status": "VALID"
  },
  "created_at": "2026-09-17T11:20:20.429990-03:00",
  "finished_at": "2026-09-17T11:20:34.493000-03:00"
}
```


## OpenAPI

````yaml GET /credentials/enrollments/{enrollment_id}
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/enrollments/{enrollment_id}:
    get:
      tags:
        - Credenciales
      summary: Estado del enrolamiento
      description: >-
        Devuelve el estado del enrolamiento iniciado con POST /credentials. Se
        consulta hasta que `status` deja de ser `pending`: el login contra el
        SII demora del orden de 15 segundos, así que basta con consultar cada
        2-3 segundos.
      operationId: getCredentialEnrollment
      parameters:
        - name: enrollment_id
          in: path
          required: true
          schema:
            type: string
          description: Identificador devuelto por POST /credentials
          example: cenr_3940730445066399260
      responses:
        '200':
          description: Estado del enrolamiento
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CredentialEnrollment'
              example:
                enrollment_id: cenr_3940730445066399260
                status: valid
                user_rut: 12345678-9
                error: null
                credential:
                  id: cred_3940730445066399260
                  user: 12345678-9
                  status: VALID
                ws_channel: cred-validation-129816
                created_at: '2026-09-17T11:20:20.429990-03:00'
                finished_at: '2026-09-17T11:20:34.493000-03:00'
        '401':
          description: No autorizado - API key inválida o faltante
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Enrolamiento no encontrado o de una entidad sin acceso
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - apiKeyAuth: []
components:
  schemas:
    CredentialEnrollment:
      type: object
      properties:
        enrollment_id:
          type: string
          description: Identificador del enrolamiento
          example: cenr_3940730445066399260
        status:
          type: string
          enum:
            - pending
            - valid
            - invalid
            - error
          description: >-
            pending: el login sigue en curso. valid: la credencial quedó
            enrolada. invalid: el SII rechazó la clave. error: no se pudo
            preguntarle al SII (reintentable).
          example: pending
        user_rut:
          type: string
          description: RUT de la credencial que se está enrolando
          example: 12345678-9
        error:
          type: string
          nullable: true
          description: Mensaje del SII cuando status es invalid o error
          example: null
        credential:
          type: object
          nullable: true
          description: La credencial creada; sólo viene cuando status es valid
        ws_channel:
          type: string
          description: Canal WebSocket con el avance en vivo (lo usa el frontend)
          example: cred-validation-129816
        created_at:
          type: string
          format: date-time
        finished_at:
          type: string
          format: date-time
          nullable: true
    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)

````

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