Rapidy Développeurs

Démarrer

Vue d'ensemble

Rapidy est une infrastructure de livraison pilotable par API. Vous créez un envoi, nous trouvons le livreur, encaissons si besoin, et vous rendons l'argent.

Ce que Rapidy fait pour vous

Vous vendez. Le colis doit partir, arriver, et l'argent doit rentrer. Rapidy prend cette chaîne en charge de bout en bout, et vous la pilotez par API — sans recruter de livreurs, sans gérer d'espèces, sans écrire de logique de dispatch.

Faire partir un colis

Un devis, un envoi, un signal « prêt ». Rapidy trouve le livreur, suit la course et prévient votre système à chaque étape.

Encaisser à la livraison

Paiement à la livraison, acompte puis solde, prépayé, compte entreprise. Neuf profils couvrent les cas réels du terrain.

Récupérer votre argent

L'espèce collectée est tracée jusqu'à sa remise, puis réconciliée et reversée. Vous voyez où en est chaque franc.

Le parcours minimal, en trois appels

Un envoi qui part tient en trois requêtes. Choisissez votre langage en haut de la page : tous les extraits de la documentation suivent ce choix.

Du devis au colis 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');

Le troisième appel n'est pas une formalité. markReady est le geste — et le seul — qui fait entrer la course dans la file d'affectation. Un envoi créé mais jamais déclaré prêt attend indéfiniment : aucun livreur ne se voit proposer la mission, et rien dans votre back-office ne le signale.

Trois choses à savoir avant d'écrire du code

city est le quartier

C'est l'erreur d'intégration la plus fréquente, et la plus coûteuse.

city désigne le quartier — « Médina », « Ouakam », « Pikine Est » — jamais « Dakar ». C'est le quartier qui détermine la zone tarifaire. Envoyer la ville fait sortir le tarif de repli, le plus élevé, et le client paie la différence sans que personne ne s'en aperçoive.

Les montants sont en XOF, sans sous-unité

Le franc CFA n'a pas de centimes. 10000 vaut dix mille francs — ne divisez jamais par 100 sur cette devise.

Les identifiants sont opaques

shp_7c1f4a2e, qte_…, drv_… : le préfixe dit le type, mais le reste ne veut rien dire. Stockez-les tels quels, ne les découpez pas, ne les devinez pas.

Où aller ensuite