Démarrer
Démarrage rapide
De la clé d'API au premier colis enlevé, en cinq étapes.
1. Obtenez une clé d'API
Depuis la console Rapidy, ouvrez Développeur → Clés API et créez une clé. Elle commence par pk_live_.
Le tenant est dérivé de la clé. Aucun en-tête d'organisation à fournir : la clé dit à elle seule pour quelle organisation vous parlez.
>
Pas encore de clés de test. L'API refusepk_test_(403,SANDBOX_KEY_NOT_SUPPORTED) tant que l'environnement d'essai n'est pas isolé — un appel de test créerait sinon de vrais envois et de vrais SMS. Voir la page Support, section « Environnements », pour la façon de valider votre intégration d'ici là.
Ne la mettez jamais dans un dépôt, ni dans un bundle JavaScript servi au navigateur : une clé d'API vaut un accès complet à votre organisation.
2. Installez le SDK
Installation
# Rien à installer : l'API est du HTTP + JSON.
curl --versionnpm install @rapidy/sdk
# ou : pnpm add @rapidy/sdkpip install rapidy-sdkcomposer require rapidy/sdkgem install rapidy
# ou, dans un Gemfile : gem 'rapidy'go get github.com/Smartdev-Africa/rapidy/sdks/go<dependency>
<groupId>net.rapidy</groupId>
<artifactId>rapidy-sdk</artifactId>
<version>0.1.0</version>
</dependency>dotnet add package Rapidy.Sdkdart pub add rapidy_sdk
# Flutter : flutter pub add rapidy_sdk
Aucun SDK n'est obligatoire : l'API est du HTTP et du JSON. Choisissez cURL dans le sélecteur pour voir les requêtes brutes.
3. Construisez le client
Configuration du client
# La clé voyage dans l'en-tête X-Api-Key. Le tenant en est DÉRIVÉ :
# aucun en-tête d'organisation à fournir.
export RAPIDY_API_KEY="pk_live_…"
export RAPIDY_API_URL="https://api.rapidy.net"import { RapidyClient } from '@rapidy/sdk';
const rapidy = new RapidyClient({
apiKey: process.env.RAPIDY_API_KEY!,
baseUrl: 'https://api.rapidy.net',
// Si votre suivi public est servi sur son propre domaine :
// trackingBaseUrl: 'https://track.rapidy.net',
});import os
from rapidy_sdk import RapidyClient
rapidy = RapidyClient(
api_key=os.environ["RAPIDY_API_KEY"],
base_url="https://api.rapidy.net",
# tracking_base_url="https://track.rapidy.net",
)use Rapidy\Sdk\RapidyClient;
$rapidy = new RapidyClient(
apiKey: getenv('RAPIDY_API_KEY'),
baseUrl: 'https://api.rapidy.net',
);require 'rapidy'
rapidy = Rapidy::Client.new(
api_key: ENV.fetch('RAPIDY_API_KEY'),
base_url: 'https://api.rapidy.net'
)import "github.com/Smartdev-Africa/rapidy/sdks/go/rapidy"
client, err := rapidy.New(rapidy.Options{
APIKey: os.Getenv("RAPIDY_API_KEY"),
BaseURL: "https://api.rapidy.net",
})
if err != nil {
log.Fatal(err)
}import net.rapidy.sdk.RapidyClient;
RapidyClient rapidy = RapidyClient.builder()
.apiKey(System.getenv("RAPIDY_API_KEY"))
.baseUrl("https://api.rapidy.net")
.build();using Rapidy.Sdk;
var rapidy = new RapidyClient(
apiKey: Environment.GetEnvironmentVariable("RAPIDY_API_KEY")!,
baseUrl: "https://api.rapidy.net");import 'package:rapidy_sdk/rapidy_sdk.dart';
final rapidy = RapidyClient(
apiKey: const String.fromEnvironment('RAPIDY_API_KEY'),
baseUrl: 'https://api.rapidy.net',
);
trackingBaseUrl n'est utile que si votre suivi public est servi sur son propre domaine. Sinon, il retombe sur baseUrl.
4. Faites partir un colis
Devis → envoi → prêt à enlever
# 1. Devis — `city` est le QUARTIER, pas la ville.
QUOTE=$(curl -s -X POST "$RAPIDY_API_URL/v1/quotes" \
-H "X-Api-Key: $RAPIDY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pickup": { "city": "Médina", "address": "Rue 11 x Blaise Diagne" },
"dropoff": { "city": "Ouakam", "address": "Cité Avion, villa 12" },
"parcel": { "weight_kg": 2 }
}')
QUOTE_ID=$(echo "$QUOTE" | jq -r .quote_id)
# 2. Envoi — `external_order_id` est VOTRE référence.
SHIPMENT=$(curl -s -X POST "$RAPIDY_API_URL/v1/shipments" \
-H "X-Api-Key: $RAPIDY_API_KEY" \
-H "Content-Type: application/json" \
-d "{ \"quote_id\": \"$QUOTE_ID\", \"external_order_id\": \"CMD-2026-42\" }")
SHIPMENT_ID=$(echo "$SHIPMENT" | jq -r .shipment_id)
# 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
curl -s -X POST "$RAPIDY_API_URL/v1/shipments/$SHIPMENT_ID/mark-ready" \
-H "X-Api-Key: $RAPIDY_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "by": "mon-back-office" }'// 1. Devis — `city` est le QUARTIER, pas la ville.
const quote = await rapidy.createQuote({
pickup: { city: 'Médina', address: 'Rue 11 x Blaise Diagne' },
dropoff: { city: 'Ouakam', address: 'Cité Avion, villa 12' },
parcel: { weightKg: 2 },
});
// 2. Envoi — `externalOrderId` est VOTRE référence de commande.
const shipment = await rapidy.createShipment({
quoteId: quote.id,
externalOrderId: 'CMD-2026-42',
});
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
await rapidy.markReady(shipment.id, 'mon-back-office');
console.log(shipment.publicTrackingUrl); // à partager au client final# 1. Devis — `city` est le QUARTIER, pas la ville.
quote = rapidy.create_quote(
pickup={"city": "Médina", "address": "Rue 11 x Blaise Diagne"},
dropoff={"city": "Ouakam", "address": "Cité Avion, villa 12"},
parcel={"weight_kg": 2},
)
# 2. Envoi — `external_order_id` est VOTRE référence de commande.
shipment = rapidy.create_shipment(
quote_id=quote["quote_id"],
external_order_id="CMD-2026-42",
)
# 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
rapidy.mark_ready(shipment_id=shipment["shipment_id"], by="mon-back-office")// 1. Devis — `city` est le QUARTIER, pas la ville.
$quote = $rapidy->createQuote([
'pickup' => ['city' => 'Médina', 'address' => 'Rue 11 x Blaise Diagne'],
'dropoff' => ['city' => 'Ouakam', 'address' => 'Cité Avion, villa 12'],
'parcel' => ['weight_kg' => 2],
]);
// 2. Envoi — `external_order_id` est VOTRE référence de commande.
$shipment = $rapidy->createShipment([
'quote_id' => $quote['quote_id'],
'external_order_id' => 'CMD-2026-42',
]);
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
$rapidy->markReady($shipment['shipment_id'], by: 'mon-back-office');# 1. Devis — `city` est le QUARTIER, pas la ville.
quote = rapidy.create_quote(
pickup: { city: 'Médina', address: 'Rue 11 x Blaise Diagne' },
dropoff: { city: 'Ouakam', address: 'Cité Avion, villa 12' },
parcel: { weight_kg: 2 }
)
# 2. Envoi — `external_order_id` est VOTRE référence de commande.
shipment = rapidy.create_shipment(
quote_id: quote['quote_id'],
external_order_id: 'CMD-2026-42'
)
# 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
rapidy.mark_ready(shipment_id: shipment['shipment_id'], by: 'mon-back-office')ctx := context.Background()
// 1. Devis — `city` est le QUARTIER, pas la ville.
quote, err := client.CreateQuote(ctx, map[string]any{
"pickup": map[string]any{"city": "Médina", "address": "Rue 11 x Blaise Diagne"},
"dropoff": map[string]any{"city": "Ouakam", "address": "Cité Avion, villa 12"},
"parcel": map[string]any{"weight_kg": 2},
})
// 2. Envoi — `external_order_id` est VOTRE référence de commande.
shipment, err := client.CreateShipment(ctx, map[string]any{
"quote_id": quote["quote_id"],
"external_order_id": "CMD-2026-42",
})
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
_, err = client.MarkReady(ctx, shipment["shipment_id"].(string), "mon-back-office")// 1. Devis — `city` est le QUARTIER, pas la ville.
Map<String, Object> quote = rapidy.createQuote(Map.of(
"pickup", Map.of("city", "Médina", "address", "Rue 11 x Blaise Diagne"),
"dropoff", Map.of("city", "Ouakam", "address", "Cité Avion, villa 12"),
"parcel", Map.of("weight_kg", 2)));
// 2. Envoi — `external_order_id` est VOTRE référence de commande.
Map<String, Object> shipment = rapidy.createShipment(Map.of(
"quote_id", quote.get("quote_id"),
"external_order_id", "CMD-2026-42"));
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
rapidy.markReady((String) shipment.get("shipment_id"), "mon-back-office");// 1. Devis — `city` est le QUARTIER, pas la ville.
var quote = await rapidy.CreateQuoteAsync(new Dictionary<string, object>
{
["pickup"] = new Dictionary<string, object> { ["city"] = "Médina", ["address"] = "Rue 11 x Blaise Diagne" },
["dropoff"] = new Dictionary<string, object> { ["city"] = "Ouakam", ["address"] = "Cité Avion, villa 12" },
["parcel"] = new Dictionary<string, object> { ["weight_kg"] = 2 },
});
// 2. Envoi — `external_order_id` est VOTRE référence de commande.
var shipment = await rapidy.CreateShipmentAsync(new Dictionary<string, object>
{
["quote_id"] = quote["quote_id"]!,
["external_order_id"] = "CMD-2026-42",
});
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
await rapidy.MarkReadyAsync((string)shipment["shipment_id"]!, "mon-back-office");// 1. Devis — `city` est le QUARTIER, pas la ville.
final quote = await rapidy.createQuote(CreateQuoteRequest(
pickup: Address(city: 'Médina', address: 'Rue 11 x Blaise Diagne'),
dropoff: Address(city: 'Ouakam', address: 'Cité Avion, villa 12'),
parcel: Parcel(weightKg: 2),
));
// 2. Envoi — `externalOrderId` est VOTRE référence de commande.
final shipment = await rapidy.createShipment(
CreateShipmentRequest.fromQuote(quoteId: quote.id, externalOrderId: 'CMD-2026-42'),
);
// 3. Prêt à enlever — SANS CE GESTE, AUCUNE COURSE NE PART.
await rapidy.markReady(shipmentId: shipment.id, by: 'mon-back-office');
Trois choses méritent votre attention dans cet extrait :
cityest le quartier, pas la ville. C'est lui qui porte la zone tarifaire.external_order_idest VOTRE référence. Elle vous permet de retrouver l'envoi plus tard sans stocker nos identifiants — voirgetShipmentByExternalOrder.markReadydéclenche l'affectation. Sans lui, rien ne part.
5. Suivez la course
Deux surfaces, deux usages :
- Vous interrogez
getShipmentavec votre clé, ou — mieux — vous recevez des webhooks plutôt que d'interroger en boucle. - Votre client ouvre l'URL de suivi public. Elle est anonyme, expurgée de toute donnée personnelle de tiers, et n'exige aucune clé.