ARCA {API}
CUITs y certificados

Certificado

Cargá el certificado que emitió ARCA a partir del CSR, o un par .crt + .key propio, y dalo de baja.

Las dos operaciones requieren scope read_write y no consumen cuota.

Cargar el certificado

POST /api/cuits/{cuit}/{environment}/certificado

El body es JSON y los PEM van como texto, con sus saltos de línea escapados (\n). Hay dos formas, según de dónde salió el certificado. Cada PEM puede pesar hasta 64 KB.

Cumplir el CSR pendiente

Es el camino normal: el .crt que ARCA emitió a partir del CSR que generamos. No mandás la clave privada: la tenemos nosotros desde que generamos el CSR.

curl -X POST https://arca.api.com.ar/api/cuits/20123456789/produccion/certificado \
  -H "Authorization: Bearer ak_TuSecretoAqui" \
  -H "Content-Type: application/json" \
  -d '{ "crtPem": "-----BEGIN CERTIFICATE-----\nMIIDXT...\n-----END CERTIFICATE-----\n" }'
CampoTipoDescripción
crtPemstringObligatorio. El certificado (.crt / .pem) que devolvió ARCA. Empieza con -----BEGIN CERTIFICATE-----

Validamos que el certificado salga de ese CSR, que sea del CUIT y del entorno de la ruta y que esté vigente. Si pasa, queda activo —reemplazando al anterior si el CUIT estaba renovando— y el CSR queda cumplido.

Si el CUIT no tiene un CSR pendiente responde 409: generá uno con POST .../csr, o subí el par completo.

Subir un par propio

Para un certificado generado por fuera de arca.api —por ejemplo, el que tu cliente ya usaba con otro proveedor—, mandá también su clave privada.

curl -X POST https://arca.api.com.ar/api/cuits/20123456789/produccion/certificado \
  -H "Authorization: Bearer ak_TuSecretoAqui" \
  -H "Content-Type: application/json" \
  -d '{
    "crtPem": "-----BEGIN CERTIFICATE-----\nMIIDXT...\n-----END CERTIFICATE-----\n",
    "keyPem": "-----BEGIN PRIVATE KEY-----\nMIIEvQ...\n-----END PRIVATE KEY-----\n"
  }'
CampoTipoDescripción
crtPemstringObligatorio. El certificado
keyPemstringObligatorio en esta forma. La clave privada que corresponde al certificado
passphrasestring (opcional)Si la clave está protegida por passphrase

El par queda activo, reemplaza al certificado anterior si había uno, y cancela el CSR pendiente del CUIT. La clave se guarda cifrada y nunca se registra en logs ni se devuelve.

Respuesta exitosa

Status: 200 · El objeto CUIT actualizado, más deteccionPtoVta:

{
  "cuit": "20123456789",
  "environment": "produccion",
  "estado": "vigente",
  "pasosPendientes": [],
  "certificado": {
    "serialNumber": "5f3a9c1e2b7d4a60",
    "subjectCn": "facturacion-acme",
    "validFrom": "2026-10-22T12:00:00.000Z",
    "validTo": "2028-10-21T12:00:00.000Z",
    "fingerprintSha256": "AB:CD:...:EF",
    "issuerEnvironment": "produccion"
  },
  "csrPendiente": null,
  "ptoVta": 4,
  "ptoVtaOrigen": "arca",
  "ptoVtaHabilitado": true,
  "...": "...",
  "deteccionPtoVta": { "estado": "detectado", "ptoVta": 4 }
}

Apenas el certificado queda activo le preguntamos a ARCA por los puntos de venta del CUIT. deteccionPtoVta es el desenlace (o null si la detección no llegó a correr):

deteccionPtoVta.estadoQué pasóQué hacer
detectadoNo había punto de venta guardado y ARCA habilita uno solo: quedó guardadoNada
confirmadoEl punto de venta guardado está habilitadoNada
eleccion_pendienteARCA habilita varios (en habilitados) y no elegimos por tu clienteFijá uno con PATCH { "ptoVta": n }, o dejalo en resolución automática
no_habilitadoEl punto de venta guardado no está entre los habilitadosVer habilitar_punto_venta
sin_puntosARCA no informa ninguno para Web ServicesTu cliente tiene que dar de alta uno. Ver habilitar_punto_venta
no_disponibleARCA no respondióReintentá más tarde con POST .../verificar

La situación fiscal del contribuyente (datosFiscales, y si autoriza la constancia) se resuelve en segundo plano después de responder: consultá el CUIT unos segundos después para verla.

Errores de carga

Status: 422 · El request está bien armado, pero el certificado o la clave se rechazaron. El body trae un code estable para que tu sistema reaccione sin parsear el mensaje:

{
  "error": "Ese archivo es el CSR (la solicitud de certificado), no el certificado. Pegá el CSR en ARCA y subí acá el .crt que ARCA te devuelve.",
  "code": "CSR_INSTEAD_OF_CRT"
}

Si el rechazo es al cumplir un CSR, el CSR sigue pendiente: sirve para volver a intentarlo con el archivo correcto.

codeQué significaQué corregir
CSR_INSTEAD_OF_CRTMandaste como crtPem el CSR, no el certificadoEl CSR va hacia ARCA; lo que va en crtPem es el .crt que ARCA devuelve (empieza con -----BEGIN CERTIFICATE-----)
INVALID_CRT_FORMATcrtPem no es un certificado X.509 en PEMMandá el contenido del .crt tal cual, con sus saltos de línea
INVALID_KEY_FORMATkeyPem no es una clave privada en PEMMandá el contenido del .key tal cual
KEY_PASSPHRASE_REQUIREDLa clave está protegida y no mandaste passphraseAgregá passphrase
KEY_PASSPHRASE_INCORRECTLa passphrase no abre la claveRevisá la passphrase
KEY_CERT_MISMATCHEl certificado y la clave no son par. Al cumplir un CSR: el .crt no salió de ese CSRMandá el .crt emitido a partir del CSR pendiente, o el par completo si el certificado se generó con otra clave
CUIT_MISMATCHEl certificado es de otro CUITVerificá que tu cliente haya tramitado el certificado con el CUIT de la ruta
CERT_EXPIREDEl certificado ya vencióTramitá uno nuevo con POST .../csr
ENTORNO_MISMATCHLo emitió la autoridad del otro entorno (homologación vs. producción)Tramitalo en el entorno de la ruta: producción en Administración de Certificados Digitales, homologación en el WSASS. Ver Mezclaste homologación y producción

Errores

StatusDescripción
400Falta crtPem, un campo no es texto, o un PEM supera los 64 KB
401API key ausente, inválida o revocada
403La API key es de solo lectura
404El CUIT no existe en ese entorno, es de otra cuenta o fue dado de baja
409Sólo crtPem y el CUIT no tiene CSR pendiente
422El certificado o la clave se rechazaron

Dar de baja el certificado

DELETE /api/cuits/{cuit}/{environment}/certificado
curl -X DELETE https://arca.api.com.ar/api/cuits/20123456789/produccion/certificado \
  -H "Authorization: Bearer ak_TuSecretoAqui"

Da de baja el certificado activo y descarta su clave privada. Conservamos sus datos públicos (serie, vigencia, huella), pero el certificado ya no se puede volver a usar: para que el CUIT emita de nuevo hay que cargar otro. Mientras tanto, emitir con ese CUIT como representada responde 403.

No toca el CSR pendiente, si había uno.

Status: 200 · El objeto CUIT actualizado, con certificado: null.

Errores

StatusDescripción
401API key ausente, inválida o revocada
403La API key es de solo lectura
404El CUIT no existe en ese entorno, o no tiene certificado activo

En esta página