> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cobrix.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> Primera integración firmada y primer documento de cobro público

## Requisitos

<Check>Una empresa activa en sandbox</Check>
<Check>Un partner con `source` estable</Check>
<Check>Una llave `cbx_live_…` con los scopes necesarios</Check>
<Check>Un cliente HTTP capaz de conservar el cuerpo JSON exacto</Check>

## Opción A: API de integraciones

Esta API exige Bearer, timestamp, firma HMAC e idempotencia en `POST`.

```javascript Node.js theme={null}
import crypto from 'node:crypto'

const baseUrl = 'https://sandbox-api.cobrix.co/api'
const companyId = process.env.COBRIX_COMPANY_ID
const secret = process.env.COBRIX_API_KEY
const path = `/integrations/v1/${companyId}/customers/upsert`
const body = JSON.stringify({
  source: 'erp_acme',
  externalCustomerId: 'customer-1001',
  type: 'individual',
  name: 'Cliente de prueba',
  email: 'cliente@example.com'
})
const timestamp = Math.floor(Date.now() / 1000).toString()
const signed = `${timestamp}.POST.${path}.${body}`
const signature = crypto.createHmac('sha256', secret).update(signed).digest('hex')

const response = await fetch(`${baseUrl}${path}`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${secret}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID(),
    'Cobrix-Timestamp': timestamp,
    'Cobrix-Signature': `v1=${signature}`
  },
  body
})

console.log(response.status, await response.json())
```

## Opción B: API pública de documentos de cobro

```bash cURL theme={null}
curl --request POST "https://sandbox-api.cobrix.co/api/v1/invoices" \
  --header "Authorization: Bearer $COBRIX_API_KEY" \
  --header "Content-Type: application/json" \
  --header "x-idempotency: $(uuidgen)" \
  --data '{
    "reference": "INV-EXT-1001",
    "provider": "erp_acme",
    "provider_id": "1001",
    "amount": 20.25,
    "name": "Plan mensual de internet",
    "email": "cliente@example.com",
    "due_date": "2026-08-15"
  }'
```

Una creación correcta responde `201` y devuelve `payment.payment_link`. Repetir el mismo cuerpo con la misma clave de idempotencia reproduce el resultado original.

## Siguiente paso

Configura webhooks para confirmar pagos y cambios de estado sin consultar continuamente la API. Consulta [Webhooks](/guides/webhooks/overview).
