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}/certificadoEl 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" }'| Campo | Tipo | Descripción |
|---|---|---|
crtPem | string | Obligatorio. 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"
}'| Campo | Tipo | Descripción |
|---|---|---|
crtPem | string | Obligatorio. El certificado |
keyPem | string | Obligatorio en esta forma. La clave privada que corresponde al certificado |
passphrase | string (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.estado | Qué pasó | Qué hacer |
|---|---|---|
detectado | No había punto de venta guardado y ARCA habilita uno solo: quedó guardado | Nada |
confirmado | El punto de venta guardado está habilitado | Nada |
eleccion_pendiente | ARCA habilita varios (en habilitados) y no elegimos por tu cliente | Fijá uno con PATCH { "ptoVta": n }, o dejalo en resolución automática |
no_habilitado | El punto de venta guardado no está entre los habilitados | Ver habilitar_punto_venta |
sin_puntos | ARCA no informa ninguno para Web Services | Tu cliente tiene que dar de alta uno. Ver habilitar_punto_venta |
no_disponible | ARCA 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.
code | Qué significa | Qué corregir |
|---|---|---|
CSR_INSTEAD_OF_CRT | Mandaste como crtPem el CSR, no el certificado | El CSR va hacia ARCA; lo que va en crtPem es el .crt que ARCA devuelve (empieza con -----BEGIN CERTIFICATE-----) |
INVALID_CRT_FORMAT | crtPem no es un certificado X.509 en PEM | Mandá el contenido del .crt tal cual, con sus saltos de línea |
INVALID_KEY_FORMAT | keyPem no es una clave privada en PEM | Mandá el contenido del .key tal cual |
KEY_PASSPHRASE_REQUIRED | La clave está protegida y no mandaste passphrase | Agregá passphrase |
KEY_PASSPHRASE_INCORRECT | La passphrase no abre la clave | Revisá la passphrase |
KEY_CERT_MISMATCH | El certificado y la clave no son par. Al cumplir un CSR: el .crt no salió de ese CSR | Mandá el .crt emitido a partir del CSR pendiente, o el par completo si el certificado se generó con otra clave |
CUIT_MISMATCH | El certificado es de otro CUIT | Verificá que tu cliente haya tramitado el certificado con el CUIT de la ruta |
CERT_EXPIRED | El certificado ya venció | Tramitá uno nuevo con POST .../csr |
ENTORNO_MISMATCH | Lo 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
| Status | Descripción |
|---|---|
400 | Falta crtPem, un campo no es texto, o un PEM supera los 64 KB |
401 | API key ausente, inválida o revocada |
403 | La API key es de solo lectura |
404 | El CUIT no existe en ese entorno, es de otra cuenta o fue dado de baja |
409 | Sólo crtPem y el CUIT no tiene CSR pendiente |
422 | El certificado o la clave se rechazaron |
Dar de baja el certificado
DELETE /api/cuits/{cuit}/{environment}/certificadocurl -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
| Status | Descripción |
|---|---|
401 | API key ausente, inválida o revocada |
403 | La API key es de solo lectura |
404 | El CUIT no existe en ese entorno, o no tiene certificado activo |