GuíaEjemplosReferencia API
apisunat.netIngresar

Primeros pasos

  • API SUNAT
  • Inicio rápido
  • Integra con IA
  • Autenticación
  • Planes y límites

Configurar el RUC

  • Emisores
  • Establecimientos y series

Emitir

  • Documentos
  • Idempotencia
  • Estados
  • Correos
  • Catálogos

Integración

  • Errores
  • Webhooks
  • Cambios

Emisores

Registra tu RUC en modo prueba o producción, guarda sus credenciales, valídalo y habilita producción.

Un emisor es un RUC de tu workspace. Cada RUC pertenece a un modo, igual que las claves, los documentos y los webhooks:

  • Un RUC de prueba se crea con una clave asu_test_, solo lo ven las claves de prueba y emite en SUNAT beta, sin validez tributaria.
  • Un RUC de producción se crea con una clave asu_live_, solo lo ven las claves de producción y emite comprobantes reales cuando tiene producción habilitada ("productionEnabled": true). Sin eso, la clave live responde 403 PRODUCTION_NOT_ENABLED.

El mismo número de RUC se puede registrar una vez en cada modo. Son dos registros independientes: cada uno tiene sus credenciales, series, establecimientos, validaciones y documentos. Una clave de prueba nunca ve ni usa un RUC de producción, y al revés: para esa clave el RUC responde 404 ISSUER_NOT_FOUND o 403 ISSUER_FORBIDDEN.

El límite de RUC del plan (1 en Gratis y Básico) cuenta solo los RUC de producción. Los RUC de prueba no tienen cupo.

RUC de prueba

  1. 1

    Registra el RUC con tu clave test

    bash
    curl https://api.apisunat.net/api/v1/issuer/issuers \
      -H "X-API-Key: $APISUNAT_TEST_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "ruc": "20123456789",
        "legalName": "MI EMPRESA S.A.C.",
        "tradeName": "Mi Empresa",
        "fiscalAddress": "Av. Larco 123",
        "fiscalUbigeo": "150122",
        "fiscalDepartment": "Lima",
        "fiscalProvince": "Lima",
        "fiscalDistrict": "Miraflores"
      }'

    Responde 201 con el emisor ("livemode": false). Queda en el modo de la clave que lo creó.

  2. 2

    Sube solo el certificado

    bash
    curl -X PUT https://api.apisunat.net/api/v1/issuer/issuers/20123456789/credentials \
      -H "X-API-Key: $APISUNAT_TEST_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "certificateBase64": "MIIK...",
        "certificatePassword": "clave-del-pfx"
      }'

    El RUC de prueba solo necesita tu certificado digital (.pfx o .p12 en base64) y su clave. No envíes usuario ni clave SOL: SUNAT beta firma con el usuario genérico MODDATOS y tu certificado.

  3. 3

    Valida en beta

    bash
    curl -X POST https://api.apisunat.net/api/v1/issuer/issuers/20123456789/validations/beta \
      -H "X-API-Key: $APISUNAT_TEST_KEY" \
      -H "Content-Type: application/json" \
      -d '{}'

    Emite una boleta de prueba en SUNAT beta y comprueba que tu certificado funciona. Responde 202. status es accepted, validating (SUNAT sigue procesando; vuelve a consultar) o rejected:

    json
    {
      "environment": "beta",
      "status": "accepted",
      "documentNumber": "B001-90000001",
      "voidNumber": null,
      "message": "Credenciales SUNAT aceptadas."
    }

    Desde ahí tus claves asu_test_ emiten con este RUC. Los comprobantes de prueba numeran desde 90000001 y no consumen tu plan. Ver Sandbox.

Un RUC de prueba no tiene prueba real ni habilitación: validations/produccion y POST /production responden 409 TEST_MODE_ISSUER. Al revés, validations/beta sobre un RUC de producción responde 409 LIVE_MODE_ISSUER.

RUC de producción

  1. 1

    Registra el RUC con tu clave live

    Es la misma petición POST /issuers, con una clave asu_live_. Responde 201 con "livemode": true. Si tu plan ya usa todos sus RUC de producción, responde 402 ISSUER_LIMIT_REACHED.

  2. 2

    Guarda tus credenciales completas

    bash
    curl -X PUT https://api.apisunat.net/api/v1/issuer/issuers/20123456789/credentials \
      -H "X-API-Key: $APISUNAT_LIVE_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "solUser": "TUUSUARIO",
        "solPassword": "tu-clave-sol",
        "certificateBase64": "MIIK...",
        "certificatePassword": "clave-del-pfx",
        "greClientId": "tu-client-id",
        "greClientSecret": "tu-client-secret"
      }'

    Tu usuario SOL secundario y su clave, tu certificado digital y, si emites guías, el client id y secret de la API de guías. El certificado debe pertenecer al mismo RUC. En el panel puedes copiar el certificado que ya subiste al RUC de prueba con el mismo número.

    El campo environment ya no se usa. Si lo envías, se ignora.

  3. 3

    Haz la prueba real

    bash
    curl -X POST https://api.apisunat.net/api/v1/issuer/issuers/20123456789/validations/produccion \
      -H "X-API-Key: $APISUNAT_LIVE_KEY" \
      -H "Content-Type: application/json" \
      -d '{ "confirmation": "EMITIR PRUEBA REAL" }'
    Emite un comprobante real

    La prueba real emite una factura de S/ 1.18 con la serie FPR1 y la anula enseguida con una comunicación de baja. Por eso exige confirmation: "EMITIR PRUEBA REAL". No consume operaciones de tu plan.

    Si SUNAT todavía procesa la baja, status es validating. Vuelve a llamar al mismo endpoint para consultar el resultado. No hace falta validar antes en beta.

  4. 4

    Habilita producción

    bash
    curl -X POST https://api.apisunat.net/api/v1/issuer/issuers/20123456789/production \
      -H "X-API-Key: $APISUNAT_LIVE_KEY"

    Solo funciona cuando la factura y la baja de la prueba real tienen CDR aceptado. Desde ese momento las claves asu_live_ emiten comprobantes reales con este RUC.

Al registrar un RUC se crean automáticamente las series F001 (facturas), B001 (boletas), FC01 y BC01 (notas de crédito), FD01 y BD01 (notas de débito), T001 (guías) y R001 (retenciones).

Habilitar producción

Resumen de requisitos, todos con una clave asu_live_ sobre un RUC de producción:

  1. Credenciales completas guardadas con PUT /issuers/{ruc}/credentials.
  2. Prueba real aceptada (POST /issuers/{ruc}/validations/produccion).
  3. POST /issuers/{ruc}/production.

Cambiar las credenciales invalida la prueba real: hay que repetirla.

Recurso Issuer

json
{
  "ruc": "20123456789",
  "legalName": "MI EMPRESA S.A.C.",
  "tradeName": "Mi Empresa",
  "address": {
    "line": "Av. Larco 123",
    "ubigeo": "150122",
    "department": "Lima",
    "province": "Lima",
    "district": "Miraflores"
  },
  "active": true,
  "isDefault": true,
  "livemode": true,
  "environment": "produccion",
  "productionEnabled": true,
  "status": "ready",
  "credentials": {
    "beta": {
      "configured": true,
      "solUser": "MODDATOS",
      "hasSolPassword": true,
      "hasCertificate": true,
      "certificateExpiresAt": "2027-05-10T00:00:00.000Z",
      "validatedAt": "2026-10-21T09:10:00.000Z",
      "lastError": null
    },
    "produccion": {
      "configured": true,
      "solUser": "USUARIO1",
      "hasSolPassword": true,
      "hasCertificate": true,
      "certificateExpiresAt": "2027-05-10T00:00:00.000Z",
      "validatedAt": "2026-10-21T09:30:00.000Z",
      "lastError": null
    }
  },
  "createdAt": "2026-10-20T13:55:00.000Z",
  "updatedAt": "2026-10-21T09:31:00.000Z"
}

Las contraseñas y el certificado nunca se devuelven: solo hasSolPassword y hasCertificate. livemode indica el modo del RUC (true producción, false prueba). En un RUC de producción, credentials.produccion es el juego que guardas. En un RUC de prueba solo importa el certificado y credentials.beta.validatedAt es su última validación en beta. productionEnabled indica si las claves asu_live_ pueden emitir con un RUC de producción; en un RUC de prueba siempre es false.

Otras operaciones

OperaciónEndpoint
Listar los RUC del modo de la claveGET /issuers
Consultar un RUCGET /issuers/{ruc}
Activar o desactivar un RUCPATCH /issuers/{ruc} con { "active": false }

Credenciales de guías (GRE)

Para emitir guías reales, SUNAT exige además las credenciales de la API de guías. Envíalas en el PUT /issuers/{ruc}/credentials del RUC de producción con greClientId y greClientSecret.

Logo del PDF

Envía logoBase64 en PUT /issuers/{ruc}/credentials con un data URI PNG o JPEG (data:image/png;base64,...). Un formato distinto responde INVALID_LOGO.

Elegir el RUC en cada petición

Si el modo de tu clave tiene un solo RUC activo, no hace falta indicarlo. Con varios, envía ruc en el cuerpo de los POST y ?ruc= en las consultas. Un RUC que no es del workspace responde 403 ISSUER_FORBIDDEN; uno que existe solo en el otro modo responde 404 ISSUER_NOT_FOUND o 403 ISSUER_FORBIDDEN.

Planes y límites< PreviousEstablecimientos y seriesNext >

Powered by heyo

On this page

RUC de pruebaRUC de producciónHabilitar producciónRecurso IssuerOtras operacionesCredenciales de guías (GRE)Logo del PDFElegir el RUC en cada petición