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

# Empieza a construir con Ryvo

> Todo lo que necesitas para integrar agentes de voz IA en tus apps. Desde tu primera petición hasta producción.

<div className="not-prose grid grid-cols-1 gap-8 lg:grid-cols-12 lg:gap-10 items-start mt-2 mb-16">
  <div className="flex flex-col gap-6 lg:col-span-5">
    <p className="text-base leading-relaxed opacity-70">
      Conecta tu CRM, herramientas internas o automatizaciones a tus agentes
      de voz IA. Sin intermediarios, sin n8n configurado a mano.
    </p>

    <div className="flex flex-wrap gap-2">
      <a href="/quickstart" className="hero-btn">
        Quickstart
      </a>

      <a href="https://app.ryvo.so/developers" className="hero-btn">
        Crear API key
      </a>

      <a href="/api-reference" className="hero-btn">
        Referencia API
      </a>
    </div>
  </div>

  <div className="lg:col-span-7 min-w-0 w-full">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.ryvo.so/v1/calls \
        -H "Authorization: Bearer ryvo_live_..." \
        -H "Content-Type: application/json" \
        -d '{
          "agent_id": "agent_xxx",
          "to": "+5215555550100"
        }'
      ```

      ```javascript Node.js theme={null}
      const res = await fetch("https://api.ryvo.so/v1/calls", {
        method: "POST",
        headers: {
          "Authorization": `Bearer ${process.env.RYVO_API_KEY}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          agent_id: "agent_xxx",
          to: "+5215555550100",
        }),
      })
      const call = await res.json()
      ```

      ```python Python theme={null}
      import os, requests

      res = requests.post(
          "https://api.ryvo.so/v1/calls",
          headers={
              "Authorization": f"Bearer {os.environ['RYVO_API_KEY']}",
              "Content-Type": "application/json",
          },
          json={"agent_id": "agent_xxx", "to": "+5215555550100"},
      )
      call = res.json()
      ```

      ```go Go theme={null}
      payload := strings.NewReader(`{"agent_id":"agent_xxx","to":"+5215555550100"}`)
      req, _ := http.NewRequest("POST", "https://api.ryvo.so/v1/calls", payload)
      req.Header.Set("Authorization", "Bearer "+os.Getenv("RYVO_API_KEY"))
      req.Header.Set("Content-Type", "application/json")
      res, _ := http.DefaultClient.Do(req)
      ```

      ```ruby Ruby theme={null}
      require "net/http"
      require "json"

      uri = URI("https://api.ryvo.so/v1/calls")
      res = Net::HTTP.post(
        uri,
        { agent_id: "agent_xxx", to: "+5215555550100" }.to_json,
        "Authorization" => "Bearer #{ENV['RYVO_API_KEY']}",
        "Content-Type" => "application/json",
      )
      ```
    </CodeGroup>
  </div>
</div>

<div className="not-prose mt-20 mb-8">
  <p className="text-xs uppercase tracking-wider opacity-50 mb-2">Plataforma</p>
  <h2>Elige cómo construir</h2>

  <p className="opacity-70 mt-2 max-w-2xl">
    Conecta tu CRM, automatización o herramienta interna a Ryvo. Sin
    intermediarios, sin n8n configurado a mano.
  </p>
</div>

<CardGroup cols={2}>
  <Card title="API REST" icon="code" href="/quickstart">
    Disparar llamadas salientes desde tu CRM o backend con un POST a `/v1/calls`. Reusa toda tu infra existente.

    [Quickstart](/quickstart) · [Autenticación](/authentication) · [Referencia API](/api-reference)
  </Card>

  <Card title="Webhooks" icon="bolt" href="/webhooks/overview">
    Recibe eventos firmados con HMAC cada vez que una llamada termina. Retry exponencial automático.

    [Configurar webhook](https://app.ryvo.so/developers) · [Verificar firmas](/webhooks/signature-verification)
  </Card>
</CardGroup>

<div className="not-prose mt-20 mb-8">
  <p className="text-xs uppercase tracking-wider opacity-50 mb-2">Integraciones</p>
  <h2>Conéctala a las herramientas que ya usas</h2>
</div>

<CardGroup cols={3}>
  <Card title="n8n" icon="circle-nodes">
    Llama al endpoint `/v1/calls` desde un nodo HTTP Request con tu API key como Bearer.
  </Card>

  <Card title="Leadway" icon="rocket">
    Usa el Webhook action de un workflow para disparar llamadas con datos del contacto.
  </Card>

  <Card title="Zapier / Make" icon="bolt-lightning">
    Cualquier plataforma de no-code que mande un POST con headers funciona out of the box.
  </Card>
</CardGroup>

<div className="not-prose mt-20 mb-8">
  <p className="text-xs uppercase tracking-wider opacity-50 mb-2">Conceptos</p>
  <h2>Lo esencial para producción</h2>
</div>

<CardGroup cols={2}>
  <Card title="Idempotencia" icon="repeat" href="/idempotency">
    Manda `Idempotency-Key` para que reintentos no disparen llamadas duplicadas.
  </Card>

  <Card title="Errores" icon="triangle-exclamation" href="/errors">
    Códigos estables que no cambian entre versiones, con `request_id` para soporte.
  </Card>

  <Card title="Rate limits" icon="gauge" href="/rate-limits">
    10 peticiones/min por API key. Backoff exponencial recomendado.
  </Card>

  <Card title="Verificar firmas" icon="signature" href="/webhooks/signature-verification">
    Snippets en Node, Python, Ruby y Go para validar el HMAC de cada evento.
  </Card>
</CardGroup>
