> ## 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.

# Démarrage rapide : envoyez votre premier SMS, appel ou e-mail

> Envoyez votre premier SMS, appel vocal ou e-mail via Orbit en moins de cinq minutes grâce à l'API ou à un SDK, avec des extraits prêts à copier-coller dans chaque langage.

# Démarrage rapide

## Étape 1 : Créer un compte

Inscrivez-vous sur [orbit.devotel.io/signup](https://orbit.devotel.io/signup). Le
tableau de bord vous redirige automatiquement vers l'URL adaptée à votre
locale. Aucune carte bancaire requise — la vérification de votre e-mail
suffit à débloquer le sandbox à l'étape suivante.

## Étape 2 : Obtenir une clé API sandbox

Accédez à **Paramètres > Clés API**, créez une nouvelle clé et définissez
son mode sur **Test**. Les clés sandbox portent le préfixe `dv_test_sk_`,
fonctionnent immédiatement sans KYC ni étape d'approbation, et coûtent
**0 \$** — chaque envoi sandbox est simulé en interne et n'atteint jamais un
opérateur réel ni Stripe. Conservez la clé uniquement côté serveur.

(Les clés de production portent le préfixe `dv_live_sk_` et facturent du
trafic réel — consultez [Étape 5 : Passer en production](#step-5-go-live)
lorsque vous êtes prêt pour les numéros de production.)

## Étape 3 : Envoyez votre premier message (sandbox)

La même forme d'endpoint `/messages/<channel>` fonctionne pour les SMS,
WhatsApp, les e-mails, RCS, Viber et les autres canaux de messagerie —
choisissez le canal que vous intégrez en premier. La voix est un cas à
part : passez des appels avec `POST /voice/calls` (voir l'exemple Voix
ci-dessous). Utilisez votre clé `dv_test_sk_` de l'étape 2 comme
`$ORBIT_API_KEY` ci-dessous — l'envoi est gratuit et instantané, sans
aucun risque de trafic réel.

### 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 Node.js

`@devotel-orbit/node` remplace ces trois appels curl par des méthodes typées — référence complète dans le [SDK 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 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>
  Le SDK Python a une portée de base et n'est pas publié — les envois de
  SMS, WhatsApp et d'e-mails fonctionnent aujourd'hui ; les surfaces plus
  avancées (enregistrements vocaux, conférences, IVR, dialer) sont
  intentionnellement hors de portée. Pour celles-ci, utilisez le SDK Node
  ci-dessus ou appelez directement l'API REST via la porte de sortie bas
  niveau `client.request(method, path, ...)` — consultez
  [Portée des SDK par langage](/sdks#python-core-scope-not-full-parity).
</Note>

### SDK 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>
  Le SDK Go a une portée de base et n'est pas publié — `client.Messages()`

  * `client.Voice()` fonctionnent aujourd'hui ; les conférences vocales,
    l'IVR, le dialer et les enregistrements sont hors de portée. Pour
    celles-ci, utilisez le SDK Node ou la porte de sortie bas niveau
    `client.Request(ctx, method, path, ...)` — consultez
    [Portée des SDK par langage](/sdks#go-core-scope-not-full-parity).
</Note>

### SDK 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>
  Le SDK Ruby a une portée de base et n'est pas publié — les envois via
  `client.messages` + `client.voice` fonctionnent aujourd'hui ; les
  enregistrements/transcriptions/conférences/IVR/dialer sont hors de
  portée. Pour celles-ci, utilisez le SDK Node ou la porte de sortie bas
  niveau `client.request(method, path, **opts)` — consultez
  [Portée des SDK par langage](/sdks#ruby-core-scope-not-full-parity).
</Note>

### SDK 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>
  Le SDK PHP a une portée de base et n'est pas publié — les envois via
  `$client->messages` + `$client->voice` fonctionnent aujourd'hui ; les
  conférences, l'IVR, le dialer, les trunks SIP et les enregistrements
  sont hors de portée. Pour celles-ci, utilisez le SDK Node ou la porte de
  sortie bas niveau `OrbitClient::request(method: ..., path: ..., ...)` —
  consultez
  [Portée des SDK par langage](/sdks#php-core-scope-not-full-parity).
</Note>

### SDK 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>
  Le SDK Java a une portée de base et n'est pas publié — les envois via
  `client.messages` + `client.voice` fonctionnent aujourd'hui ; les
  enregistrements/transcriptions/conférences/IVR/dialer et les composants
  des templates WhatsApp sont hors de portée. Pour celles-ci, utilisez le
  SDK Node ou la porte de sortie bas niveau
  `client.request(method, path, ...)` — consultez
  [Portée des SDK par langage](/sdks#java-core-scope-not-full-parity).
</Note>

### SDK 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>
  Le SDK .NET a une portée de base et n'est pas publié — les envois via
  `client.Messages` + `client.Voice` fonctionnent aujourd'hui ; les
  enregistrements/transcriptions/conférences/IVR/dialer sont hors de
  portée. Pour celles-ci, utilisez le SDK Node ou la porte de sortie bas
  niveau `client.RequestAsync(method, path, ...)` — consultez
  [Portée des SDK par langage](/sdks#net-core-scope-not-full-parity).
</Note>

### Voix

#### cURL

Passez un appel avec `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 Node.js

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

<Note>
  Les six autres SDK (Python, Go, Ruby, PHP, Java, C#) couvrent
  `POST /voice/calls` dans leur portée de base — consultez les sections
  par langage ci-dessus. Les enregistrements vocaux, les transcriptions,
  les conférences, l'IVR et le dialer sont hors de portée pour ces SDK ;
  utilisez le SDK Node ou l'API REST directement via la porte de sortie
  bas niveau `request(...)` de chaque langage — consultez
  [Portée des SDK par langage](/sdks).
</Note>

> Vous partez de zéro avec la voix ? Suivez le
> [Guide de démarrage Voix](/voice/quickstart) dédié — il couvre
> l'attribution d'un numéro, la configuration d'un agent avec un prompt
> système, les tests via le micro du navigateur et l'abonnement aux
> événements SSE, le tout en moins de 5 minutes.

> Remplacez `$ORBIT_API_KEY` par la clé de l'étape 2 (ou exportez-la dans
> votre shell). Ne collez pas votre clé directement dans des extraits
> partagés.

## Étape 4 : Vérifier la réponse

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

Félicitations — vous avez envoyé votre premier message avec Orbit,
gratuitement, en moins de 5 minutes. Un envoi sandbox conserve son statut
honnête `test_sent` au lieu d'être promu en `delivered`/`failed` — pour
déclencher à la demande un accusé de réception spécifique (delivered,
undelivered, expired et 7 autres), envoyez vers un numéro destinataire
dont le dernier chiffre correspond ; consultez
[Numéros magiques du sandbox](/sandbox/magic-numbers). Ajoutez ensuite un
webhook de livraison : consultez [Webhooks](/webhooks/overview).

## Étape 5 : Passer en production

Le trafic sandbox n'atteint jamais un opérateur réel : c'est donc le moyen
le plus rapide de construire et de tester votre intégration — mais passer
en production exige deux choses supplémentaires :

1. **Vérification KYC.** Soumettez vos documents d'entreprise sous
   **Paramètres > KYC**. Une fois qu'un administrateur a approuvé votre
   organisation, l'envoi en production est débloqué — mais Orbit fonctionne
   en paiement à l'usage sans crédit d'essai automatique, donc votre solde
   de production reste **0 \$** jusqu'à ce que vous ajoutiez des fonds sous
   **Paramètres > Facturation**. Les SMS (US ou internationaux), WhatsApp
   et la voix exigent tous un KYC approuvé et un solde approvisionné avant
   de pouvoir être envoyés.
2. **Enregistrement 10DLC pour les SMS vers les États-Unis.** L'envoi de
   SMS vers des numéros américains avec du trafic réel exige également un
   enregistrement de marque + campagne 10DLC — une étape de conformité
   supplémentaire qui s'ajoute au KYC, sans s'y substituer. Consultez
   [Enregistrement de l'identifiant d'expéditeur](/compliance/sender-id-registration).

Une fois le KYC approuvé, générez une clé de production (préfixe
`dv_live_sk_`) sous **Paramètres > Clés API** et remplacez-la par la clé
`dv_test_sk_` utilisée ci-dessus — la forme de la requête ne change pas.
