API Technical Docs

Mantente al día con las innovaciones tecnológicas que están transformando el mercado.

Evidencias, OCR, reclamos y pendientes

Estado documental: Contrato propuesto. Las rutas, campos, límites y tiempos pasan a estado confirmado solo después de su implementación y verificación.

Objetivo: Documentar la carga de constancias, OCR, reclamos del comprador y resolución de casos pendientes.

Evidencia y OCR

Audiencia Método Ruta propuesta Uso Idempotencia Eventos o callbacks relacionados
Integración POST /v1/payment-orders/{id}/evidence Subir captura o fotografía. Obligatoria payment.evidence_received
Integración GET /v1/payment-orders/{id}/evidence Listar evidencias. No Ninguno
Integración GET /v1/payment-evidence/{evidence_id} Consultar metadatos. No Ninguno
Integración GET /v1/payment-evidence/{evidence_id}/ocr Consultar OCR normalizado. No Ninguno
Administración POST /v1/payment-evidence/{evidence_id}/reprocess Solicitar reproceso autorizado. Obligatoria payment.evidence_processing
Administración POST /v1/payment-evidence/{evidence_id}/reject Rechazar evidencia no utilizable. Obligatoria payment.evidence_rejected
Administración GET /v1/payment-evidence/{evidence_id}/history Consultar auditoría. No Ninguno

Ejemplo: subir constancia

POST /v1/payment-orders/ypt_01JXYZ/evidence
Authorization: Bearer <ACCESS_TOKEN>
Idempotency-Key: 8e0752b4-217e-4754-a57f-dabf83cc5b32
Content-Type: multipart/form-data
file=@payment-proof.jpg
evidence_type=payment_receipt
reported_by=seller
shift_id=shf_01JXYZ
device_id=dev_01JXYZ
{
  "result": "evidence_received",
  "evidence_id": "evi_01JXYZ",
  "payment_reported": true,
  "ocr": {
    "status": "queued"
  },
  "request_id": "req_01JXYZ"
}

Ejemplo: resultado OCR

{
  "evidence_id": "evi_01JXYZ",
  "status": "processed",
  "extracted": {
    "amount": "80.00",
    "currency": "PEN",
    "payment_method_candidate": "yape",
    "paid_at_candidate": "2026-07-20T14:37:00-05:00",
    "operation_reference_candidate": "12345678",
    "recipient_candidate": "EMPRESA EJEMPLO"
  },
  "confidence": {
    "amount": 0.98,
    "paid_at": 0.89
  },
  "request_id": "req_01JXYZ"
}

OCR aporta evidencia complementaria. No confirma por sí solo que el dinero llegó.

Estados OCR

queued
processing
processed
partial
unreadable
rejected
failed

Reclamos públicos protegidos

Audiencia Método Ruta propuesta Uso Idempotencia Eventos o callbacks relacionados
Público protegido POST /v1/public/payment-claims Crear reclamo con código público. claim.created
Público protegido GET /v1/public/payment-claims/{claim_token} Consultar seguimiento. No Ninguno
Público protegido POST /v1/public/payment-claims/{claim_token}/evidence Adjuntar constancia. claim.evidence_received
Público protegido POST /v1/public/payment-claims/{claim_token}/messages Añadir información. claim.message_received

Ejemplo: crear reclamo

{
  "transaction_code": "YP-7H2K9",
  "reason": "payment_not_confirmed",
  "buyer_name": "María Ramos",
  "contact": {
    "channel": "email",
    "value": "maria@example.com"
  }
}
{
  "claim_token": "<OPAQUE_CLAIM_TOKEN>",
  "claim_status": "created",
  "request_id": "req_01JXYZ"
}

Este flujo debe usar rate limiting, controles antiabuso, token opaco y exposición mínima de datos.

Gestión de reclamos por la empresa

Audiencia Método Ruta propuesta Uso Idempotencia Eventos o callbacks relacionados
Integración POST /v1/payment-orders/{id}/claims Crear reclamo vinculado. Obligatoria claim.created
Administración GET /v1/payment-claims Listar reclamos. No Ninguno
Administración GET /v1/payment-claims/{claim_id} Consultar reclamo. No Ninguno
Administración POST /v1/payment-claims/{claim_id}/acknowledge Registrar recepción. Obligatoria claim.acknowledged
Administración POST /v1/payment-claims/{claim_id}/assign Asignar responsable. Obligatoria claim.assigned
Administración POST /v1/payment-claims/{claim_id}/resolve Registrar resolución. Obligatoria claim.resolved
Administración GET /v1/payment-claims/{claim_id}/history Consultar auditoría. No Ninguno

Casos pendientes

Tipos principales:

late_payment
amount_difference
underpayment
overpayment
ambiguous_payment
evidence_review
cancelled_order_with_payment
refund_required
delivery_failure
unresolved_payment
operational_error
Audiencia Método Ruta propuesta Uso Idempotencia Eventos o callbacks relacionados
Integración GET /v1/pending-cases Listar pendientes. No Ninguno
Integración GET /v1/pending-cases/{case_id} Consultar caso. No Ninguno
Integración GET /v1/pending-cases/summary Consultar totales y antigüedad. No Ninguno
Administración POST /v1/pending-cases/{case_id}/acknowledge Registrar que fue visto. Obligatoria case.acknowledged
Administración POST /v1/pending-cases/{case_id}/assign Asignar responsable. Obligatoria case.assigned
Administración POST /v1/pending-cases/{case_id}/request-evidence Solicitar constancia. Obligatoria case.evidence_requested
Administración POST /v1/pending-cases/{case_id}/evidence Añadir evidencia. Obligatoria payment.evidence_received
Administración POST /v1/pending-cases/{case_id}/notes Registrar nota. Obligatoria case.note_added
Administración POST /v1/pending-cases/{case_id}/resolve Resolver el caso. Obligatoria case.resolved
Administración GET /v1/pending-cases/{case_id}/history Consultar auditoría. No Ninguno

Ejemplo: resolver un caso

POST /v1/pending-cases/case_01JXYZ/resolve
{
  "resolution": "accept_late_payment",
  "reason": "La empresa confirmó que la venta continúa vigente.",
  "evidence_ids": [
    "evi_01JXYZ"
  ]
}
{
  "case_id": "case_01JXYZ",
  "status": "resolved",
  "resolved_at": "2026-07-20T16:30:00-05:00",
  "request_id": "req_01JXYZ"
}

Resoluciones permitidas

confirm_reconciliation
maintain_pending
request_more_evidence
mark_unresolved
accept_late_payment
reject_commercial_operation
create_supplemental_order
create_refund_case
close_without_financial_match

Errores principales

HTTP Código Descripción
415 evidence_not_supported Formato no admitido.
413 evidence_too_large Archivo excede el límite.
422 evidence_unreadable La imagen no puede interpretarse.
500 ocr_failed El procesamiento falló.
404 pending_case_not_found Caso inexistente.
409 pending_case_already_resolved Caso ya cerrado.
409 resolution_not_allowed Resolución incompatible.
429 rate_limit_exceeded Demasiadas solicitudes públicas.