XmlPeruDevDocs

Quién firma

Elige si firmamos nosotros o el XML llega ya firmado desde el sistema de la empresa.

Autenticación: token Bearer de cuenta (empresas:manage).

Consideraciones

  • provider (por defecto): firmamos con nuestro certificado de PSE. Cada emisión consume una firma del plan.
  • external: el XML llega ya firmado y solo lo transportamos. No consume firmas ni plataforma; por eso exige destination: provider_ose, lo único que entonces consume la empresa. Con otro destino responde 422.
  • El certificado propio (own_certificate en la respuesta) no se elige aquí: se carga con POST /v1/companies/{ruc}/certificate y la firma pasa a consumir menos.
  • Con firma externa no hay PSE que autorizar ante SUNAT: sunat_procedures.pse viene null.
PATCHhttps://api.xmlperu.dev/v1/companies/{ruc}/signingCopiar

Las tres formas de firmar

signing Qué es Qué consume
provider Por defecto. Firmamos nosotros como PSE. Una firma del plan por comprobante
own_certificate La empresa subió su certificado y firma con su identidad. Menos que una firma completa: sigue usando la plataforma
external El XML llega ya firmado desde el sistema de la empresa. Solo el paquete de envíos por nuestro OSE

Este endpoint alterna entre provider y external. El certificado propio se activa solo: al cargarlo, la respuesta pasa a decir own_certificate.

Por qué la firma externa exige nuestro OSE

Quien firma fuera no consume plataforma ni firmas del PSE: de nosotros usa solo la salida. Si además saliera directo a SUNAT o por su propio OSE, no quedaría nada que cobrar — no sería una combinación barata, sería gratis. Por eso external solo se acepta con destination: provider_ose, y el orden importa: primero el destino, luego la firma.

Cómo se emite con firma externa

El comprobante se manda firmado, por el proxy SOAP compatible con SUNAT (/ol-ti-itcpe/billService) con las credenciales de la empresa. No pasa por POST /v1/cpe, que es quien firma.

Headers

NameTypeDescription
Acceptstringapplication/json
Content-Typestringapplication/json
AuthorizationstringBearer <token>. Genéralo desde tu panel, en Tokens de API.

Parámetros de URL

NameTypeDescription
ruc*stringRUC de 11 dígitos de la empresa.

Body

NameTypeDescription
signing*stringprovider (por defecto) · external.

Ejemplo de solicitud

Copiar
curl -X PATCH https://api.xmlperu.dev/v1/companies/20123456789/signing \
  -H "Authorization: Bearer $TOKEN_CUENTA" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
  "signing": "external"
}'

Respuesta

200 Actualizadoapplication/json
{
  "success": true,
  "message": "Firma actualizada.",
  "data": {
    "company": {
      "ruc": "20123456789",
      "business_name": "MI EMPRESA SAC",
      "plan_type": "01",
      "environment": "02",
      "environment_name": "production",
      "destination": "provider_ose",
      "signing": "external",
      "sol_credentials": false,
      "sunat_procedures": { "pse": null, "ose": "not_started" },
      "is_active": true
    }
  }
}
422 Combinación inválidaapplication/json
Firma externa con un destino distinto de provider_ose. Cambia primero el destino.
{
  "success": false,
  "message": "La firma en el sistema del cliente (signing: external) solo está disponible enviando por nuestro OSE (destination: provider_ose): es lo único que entonces consume la empresa."
}