Cotizaciones

El corazón transaccional de Cord. Crea propuestas, obtén sus links públicos y adminístralas.

Descripción General

El objeto Cotizacion (quote) representa una propuesta comercial hacia un cliente. Usando la API de Cord, puedes inyectar cotizaciones directamente desde un ERP, CRM o generar flujos automatizados de carritos de compra.

Todas las cotizaciones generadas vía API quedan registradas en el registro de auditoría (audit_log) etiquetadas automáticamente como provenientes de tu Clave de API.

Crear una Cotización

Para crear un borrador de cotización, debes realizar un POST /api/v1/cotizaciones enviando el detalle comercial.

Petición:

curl -X POST "https://cordhq.app/api/v1/cotizaciones" \
     -H "Authorization: Bearer sk_live_tU..." \
     -H "Content-Type: application/json" \
     -d '{
       "cliente_id": "cus_9x8f7",
       "terminos": "net30",
       "vigencia_dias": 15,
       "notas": "Proyecto anual",
       "base_currency": "EUR",
       "items": [
         {
           "descripcion": "Licencia anual — plan Pro",
           "cantidad": 12,
           "precio_unitario": 500
         }
       ]
     }'

Cada línea de items requiere descripcion, cantidad y precio_unitario. producto_id es opcional (referencia un producto de tu catálogo para heredar su nombre y precio de lista) y precio_negociado permite capturar un precio con descuento distinto al de lista. No existe un campo sku: si quieres enlazar la línea a un producto, usa su producto_id.

base_currency es la divisa en la que el cliente ve y paga la cotización (ISO 4217, ej. MXN, USD, EUR, GBP). Es opcional — si la omites, Cord usa la divisa contable de tu organización — pero la API es agnóstica de país: una cuenta en Madrid, Austin o Bogotá cotiza en su propia divisa sin ningún parámetro adicional.

Respuesta Exitosa:

Cord te devuelve no solo el ID interno de la base de datos, sino también el Token Público (link_publico) preconstruido, ya absoluto, para que se lo envíes a tu cliente inmediatamente vía WhatsApp, SMS o un motor de correos externo.

{
  "data": {
    "id": "qte_2a9d8",
    "folio": "COT-00104",
    "token": "tok_x8Yj9Z...",
    "link_publico": "https://cordhq.app/q/tok_x8Yj9Z...",
    "needs_approval": false
  }
}

Si la cotización requiere aprobación interna antes de enviarse (por ejemplo, un descuento fuera de umbral), needs_approval viene en true y motivo describe la razón.

Listar Cotizaciones

Puedes recuperar tu historial paginado de cotizaciones o filtrar por estado (por ejemplo, buscar todas las cotizaciones enviadas o pagadas).

Petición:

curl -X GET "https://cordhq.app/api/v1/cotizaciones?status=paid&limit=10" \
     -H "Authorization: Bearer sk_live_tU..."

El valor de status es el estado interno tal cual (en inglés, no traducido): draft, sent, viewed, approved, rejected, expired, paid o invoiced. Para buscar una cotización por su folio usa folio=COT-00104: compara el folio completo sin distinguir mayúsculas.

{
  "data": [
    {
      "id": "qte_2a9d8",
      "folio": "COT-00104",
      "cliente": "Stark Industries",
      "status": "paid",
      "total": 6000,
      "terminos": "net30",
      "vigencia": "2026-09-10",
      "creada": "2026-08-20T14:32:00.000Z",
      "link_publico": "/q/tok_x8Yj9Z..."
    }
  ],
  "meta": { "limit": 10, "offset": 0, "total": 1 }
}

Nota: en el listado, link_publico es una ruta relativa (/q/<token>); en la respuesta de creación viene absoluta. Para el detalle de una sola cotización (líneas, eventos, aprobación), usa GET /api/v1/cotizaciones/{id}.

Cambiar el estado de una cotización

Con una llave de escritura (write) puedes mover la cotización por su ciclo de vida con POST /api/v1/cotizaciones/{id}:

curl -X POST "https://cordhq.app/api/v1/cotizaciones/qte_2a9d8" \
     -H "Authorization: Bearer sk_live_tU..." \
     -H "Content-Type: application/json" \
     -H "Idempotency-Key: aprobar-COT-00104" \
     -d '{ "action": "approve" }'
action Desde el estado Resultado
send draft Envía la cotización al cliente (correo y link). En el plan Gratis consume uno de los envíos del mes.
resend sent, viewed, expired La reenvía al cliente.
approve sent, viewed La marca como aprobada.
reject sent, viewed La marca como rechazada.
mark_paid approved, invoiced Registra el pago. Acepta payment_method opcional (por defecto transferencia). Los cobros en línea pendientes de esa cotización se cancelan.

La respuesta es { "data": { "ok": true, "status": "approved" } }. Si la cotización no está en un estado desde el que se pueda aplicar la acción, o si otra petición la cambió al mismo tiempo, recibes 409 con code: "invalid_state" y no se aplica nada. Cada cambio queda en el registro de auditoría con tu llave como actor y dispara su evento de webhook.

Emitir la factura no está disponible por esta ruta: las facturas se crean y emiten con POST /api/v1/facturas y POST /api/v1/facturas/{id}.

Eliminar un borrador

DELETE /api/v1/cotizaciones/{id} elimina una cotización que nunca se envió (draft). Cualquier otro estado responde 409.