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

# Inicio rápido: envía tu primer SMS, llamada o correo electrónico

> Envía tu primer SMS, llamada de voz o correo electrónico a través de Orbit en menos de cinco minutos utilizando la API o un SDK, con fragmentos listos para copiar y pegar en cada lenguaje.

# Inicio rápido

## Paso 1: Crear una cuenta

Regístrate en [orbit.devotel.io/signup](https://orbit.devotel.io/signup). El
panel te redirigirá automáticamente a la URL preferida según tu localidad.
No se requiere tarjeta de crédito — verificar tu correo electrónico es todo
lo necesario para desbloquear el sandbox en el siguiente paso.

## Paso 2: Obtener una clave API de sandbox

Ve a **Configuración > Claves API**, crea una clave nueva y establece su
modo en **Pruebas**. Las claves de sandbox tienen el prefijo `dv_test_sk_`,
funcionan inmediatamente sin KYC ni paso de aprobación, y cuestan
**0 \$** — cada envío de sandbox se simula internamente y nunca llega a un
operador real ni toca Stripe. Mantén la clave solo en el lado del servidor.

(Las claves de producción tienen el prefijo `dv_live_sk_` y facturan
tráfico real — consulta el [Paso 5: Pasar a producción](#step-5-go-live)
cuando estés listo para números de producción.)

## Paso 3: Envía tu primer mensaje (sandbox)

La misma forma de endpoint `/messages/<channel>` funciona para SMS,
WhatsApp, correo electrónico, RCS, Viber y los demás canales de mensajería —
elige el canal que vayas a integrar primero. La voz es un caso aparte: realiza
llamadas con `POST /voice/calls` (consulta el ejemplo de Voz más abajo).
Utiliza tu clave `dv_test_sk_` del paso 2 como `$ORBIT_API_KEY` a continuación —
el envío es gratuito e instantáneo, sin riesgo de tráfico real.

### cURL

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/messages/sms \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "from": "+14155551234",
    "body": "Hello from Orbit!"
  }'
```

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/messages/whatsapp \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "type": "template",
    "template": {
      "name": "hello_world",
      "language": { "code": "en" }
    }
  }'
```

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/messages/email \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "user@example.com",
    "from": "hello@yourdomain.com",
    "subject": "Welcome",
    "html": "<h1>Welcome to Acme</h1>"
  }'
```

### SDK de Node.js

`@devotel-orbit/node` reemplaza esas tres llamadas curl por métodos tipados — referencia completa en el [SDK de Node.js](/sdks/node).

```typescript theme={null}
import { Orbit } from '@devotel-orbit/node';

const orbit = new Orbit({
  apiKey: process.env.ORBIT_API_KEY!,
});

// SMS
await orbit.messages.send({
  channel: 'sms',
  to: '+14155552671',
  body: 'Hello from Orbit!',
});

// WhatsApp template
await orbit.messages.sendWhatsApp({
  to: '+14155552671',
  type: 'template',
  template: {
    name: 'hello_world',
    language: { code: 'en' },
  },
});

// Email
await orbit.messages.sendEmail({
  to: 'user@example.com',
  from: 'hello@yourdomain.com',
  subject: 'Welcome',
  html: '<h1>Welcome to Acme</h1>',
});
```

### SDK de Python

```bash theme={null}
# Not yet on PyPI — install from the workspace package:
#   pip install ./packages/sdk-python
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```python theme={null}
from orbit_sdk import OrbitClient, OrbitError

client = OrbitClient.from_env()

try:
    result = client.messages.send_sms(
        to="+14155552671",
        body="Hello from Orbit!",
    )
    print("queued:", result["data"]["id"])
except OrbitError as exc:
    print("send failed:", exc.code, exc.message)
```

<Note>
  El SDK de Python tiene alcance básico y no está publicado — los envíos de
  SMS, WhatsApp y correo electrónico funcionan hoy; las superficies más
  avanzadas (grabaciones de voz, conferencias, IVR, dialer) están
  intencionalmente fuera de alcance. Para ellas, utiliza el SDK de Node
  anterior o llama directamente a la API REST mediante la vía de escape de
  bajo nivel `client.request(method, path, ...)` — consulta
  [Alcance de los SDK por lenguaje](/sdks#python-core-scope-not-full-parity).
</Note>

### SDK de Go

```bash theme={null}
# Not yet on a public module proxy — go get the workspace module path:
#   go get github.com/devotel/orbit-go
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```go theme={null}
// go.mod: require github.com/devotel/orbit-go (module path, not yet on a public proxy)
package main

import (
	"context"
	"fmt"
	"os"
	"time"

	"github.com/devotel/orbit-go/orbit"
)

func main() {
	client, err := orbit.NewClient(os.Getenv("ORBIT_API_KEY"))
	if err != nil {
		panic(err)
	}

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	resp, err := client.Messages().SendSMS(ctx, orbit.SendSMSInput{
		To:   "+14155552671",
		Body: "Hello from Orbit!",
	})
	if err != nil {
		panic(err)
	}
	fmt.Println("queued:", resp.Data.ID)
}
```

<Note>
  El SDK de Go tiene alcance básico y no está publicado — `client.Messages()`

  * `client.Voice()` funcionan hoy; las conferencias de voz, IVR, dialer y
    grabaciones están fuera de alcance. Para ellas, utiliza el SDK de Node o
    la vía de escape de bajo nivel `client.Request(ctx, method, path, ...)` —
    consulta
    [Alcance de los SDK por lenguaje](/sdks#go-core-scope-not-full-parity).
</Note>

### SDK de Ruby

```bash theme={null}
# Not yet on RubyGems — add the workspace path to your Gemfile:
#   gem "orbit_sdk", path: "packages/sdk-ruby"
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```ruby theme={null}
require "orbit_sdk"

client = OrbitSdk::Client.from_env
begin
  result = client.messages.send_sms(
    to: "+14155552671",
    body: "Hello from Orbit!",
  )
  puts "queued: #{result.dig("data", "id")}"
rescue OrbitSdk::OrbitError => e
  warn "send failed: #{e.code} — #{e.message}"
end
```

<Note>
  El SDK de Ruby tiene alcance básico y no está publicado — los envíos con
  `client.messages` + `client.voice` funcionan hoy; las
  grabaciones/transcripciones/conferencias/IVR/dialer están fuera de
  alcance. Para ellas, utiliza el SDK de Node o la vía de escape de bajo
  nivel `client.request(method, path, **opts)` — consulta
  [Alcance de los SDK por lenguaje](/sdks#ruby-core-scope-not-full-parity).
</Note>

### SDK de PHP

```bash theme={null}
# Not yet on Packagist — vendor the SDK from the monorepo or call the
# REST API directly. Setup lives on the PHP SDK page:
#   https://orbit.devotel.io/sdks/php
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```php theme={null}
<?php
use Devotel\Orbit\Errors\OrbitError;
use Devotel\Orbit\OrbitClient;

try {
    $client = OrbitClient::fromEnv();
    $result = $client->messages->sendSms(
        to: '+14155552671',
        body: 'Hello from Orbit!',
    );
    printf("queued: %s\n", $result['data']['id'] ?? '?');
} catch (OrbitError $e) {
    fwrite(STDERR, "send failed: {$e->errorCode} — {$e->getMessage()}\n");
}
```

<Note>
  El SDK de PHP tiene alcance básico y no está publicado — los envíos con
  `$client->messages` + `$client->voice` funcionan hoy; las conferencias,
  IVR, dialer, troncos SIP y grabaciones están fuera de alcance. Para ellas,
  utiliza el SDK de Node o la vía de escape de bajo nivel
  `OrbitClient::request(method: ..., path: ..., ...)` — consulta
  [Alcance de los SDK por lenguaje](/sdks#php-core-scope-not-full-parity).
</Note>

### SDK de Java

```bash theme={null}
# Not yet on Maven Central — build + depend on the workspace module:
#   mvn -f packages/sdk-java/pom.xml install
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```java theme={null}
import io.devotel.orbit.OrbitClient;
import io.devotel.orbit.errors.OrbitError;

import java.util.Map;

OrbitClient client = OrbitClient.fromEnv();
try {
    Map<String, Object> result = client.messages.sendSms(
        "+14155552671",
        "Hello from Orbit!"
    );
    System.out.println("queued: " + result.get("data"));
} catch (OrbitError e) {
    System.err.println("send failed: " + e.getCode() + " — " + e.getMessage());
}
```

<Note>
  El SDK de Java tiene alcance básico y no está publicado — los envíos con
  `client.messages` + `client.voice` funcionan hoy; las
  grabaciones/transcripciones/conferencias/IVR/dialer y los componentes de
  plantillas de WhatsApp están fuera de alcance. Para ellas, utiliza el SDK
  de Node o la vía de escape de bajo nivel
  `client.request(method, path, ...)` — consulta
  [Alcance de los SDK por lenguaje](/sdks#java-core-scope-not-full-parity).
</Note>

### SDK de C\#

```bash theme={null}
# Not yet on NuGet — add the workspace project reference:
#   dotnet add reference packages/sdk-csharp
export ORBIT_API_KEY=dv_test_sk_your_key_here
```

```csharp theme={null}
// xmlns/pep: the .NET client ships as Orbit.Sdk in the monorepo.
using Orbit.Sdk;
using Orbit.Sdk.Errors;

try
{
    var client = OrbitClient.FromEnv();
    var result = await client.Messages.SendSmsAsync(
        "+14155552671",
        "Hello from Orbit!"
    );
    if (result.TryGetProperty("data", out var data) &&
        data.TryGetProperty("id", out var id))
        Console.WriteLine($"queued: {id.GetString()}");
}
catch (OrbitError e)
{
    Console.Error.WriteLine($"send failed: {e.Code} — {e.Message}");
}
```

<Note>
  El SDK de .NET tiene alcance básico y no está publicado — los envíos con
  `client.Messages` + `client.Voice` funcionan hoy; las
  grabaciones/transcripciones/conferencias/IVR/dialer están fuera de
  alcance. Para ellas, utiliza el SDK de Node o la vía de escape de bajo
  nivel `client.RequestAsync(method, path, ...)` — consulta
  [Alcance de los SDK por lenguaje](/sdks#net-core-scope-not-full-parity).
</Note>

### Voz

#### cURL

Realiza una llamada con `POST /voice/calls`:

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/voice/calls \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "from": "+14155551234",
    "agent_id": "agt_support_bot"
  }'
```

#### SDK de Node.js

```typescript theme={null}
const call = await orbit.voice.calls.create({
  to: '+14155552671',
  from: '+14155551234',
  agent_id: 'agt_support_bot',
});
```

<Note>
  Los otros seis SDK (Python, Go, Ruby, PHP, Java, C#) cubren
  `POST /voice/calls` dentro de su alcance básico — consulta las secciones
  por lenguaje anteriores. Las grabaciones de voz, las transcripciones, las
  conferencias, IVR y dialer están fuera de alcance para esos SDK; utiliza
  el SDK de Node o la API REST directamente mediante la vía de escape de
  bajo nivel `request(...)` de cada lenguaje — consulta
  [Alcance de los SDK por lenguaje](/sdks).
</Note>

> ¿Partes de cero con la voz? Recorre la
> [Guía de inicio rápido de Voz](/voice/quickstart) dedicada — cubre la
> aprovisionamiento de un número, la configuración de un agente con un
> prompt de sistema, las pruebas con el micrófono del navegador y la
> suscripción a eventos SSE, todo en menos de 5 minutos.

> Reemplaza `$ORBIT_API_KEY` con la clave del paso 2 (o expórtala en tu
> shell). No pegues tu clave directamente en fragmentos compartidos.

## Paso 4: Verificar la respuesta

```json theme={null}
{
  "data": {
    "id": "msg_abc123",
    "status": "queued",
    "channel": "sms"
  },
  "meta": {
    "request_id": "req_xyz789",
    "timestamp": "2026-03-08T00:00:00Z"
  }
}
```

Enhorabuena — has enviado tu primer mensaje con Orbit, gratis, en menos de
5 minutos. Un envío de sandbox conserva su estado honesto `test_sent` en
lugar de ser promovido a `delivered`/`failed` — para desencadenar a
demanda un resultado específico de acuse de recibo (delivered, undelivered,
expired y otros 7), envía a un número destinatario con el dígito final
correspondiente; consulta
[Números mágicos del sandbox](/sandbox/magic-numbers). Configura a
continuación un webhook de entrega: consulta [Webhooks](/webhooks/overview).

## Paso 5: Pasar a producción

El tráfico de sandbox nunca llega a un operador real, por lo que es la
forma más rápida de construir y probar tu integración — pero pasar a
producción requiere dos cosas más:

1. **Verificación KYC.** Envía tus documentos empresariales en
   **Configuración > KYC**. Una vez que un administrador apruebe tu
   organización, el envío en producción queda desbloqueado — pero Orbit
   funciona con pago por uso sin crédito de prueba automático, por lo que
   tu saldo de producción permanece en **0 \$** hasta que añadas fondos en
   **Configuración > Facturación**. Los SMS (de EE. UU. o internacionales),
   WhatsApp y la voz requieren KYC aprobado y un saldo financiado antes de
   poder enviarse.
2. **Registro 10DLC para SMS a EE. UU.** El envío de SMS a números
   estadounidenses con tráfico real también requiere un registro de marca
   * campaña 10DLC — un paso de cumplimiento adicional que se suma al KYC,
     sin sustituirlo. Consulta
     [Registro del ID de remitente](/compliance/sender-id-registration).

Una vez aprobado el KYC, genera una clave de producción (prefijo
`dv_live_sk_`) en **Configuración > Claves API** y sustitúyela por la clave
`dv_test_sk_` que utilizaste anteriormente — la forma de la solicitud no
cambia.
