Vendor Shipping API
Connect your own website or store to Fast Link's delivery network. Create shipping orders, estimate cost, track deliveries, and receive status webhooks — without using Fast Link's vendor dashboard or storefront.
Introduction
The Vendor Shipping API is for businesses that already have their own website / e-commerce system and only need Fast Link as a shipping provider. You push delivery orders to Fast Link; our riders and shipping companies execute them; you get live tracking and webhooks.
You do not need Fast Link's vendor website, product catalog, or provider dashboard.
How this differs from the Marketplace API
| Vendor Shipping API | Marketplace API | |
|---|---|---|
| Audience | Single vendor with own site | Multi-merchant platform |
| Merchants | Not needed — you are the shipper | CRUD merchants under your platform |
| Prefix | /vendor-api | /platform-api |
| API key prefix | vk_ / vs_ | pk_ / sk_ |
Who this is for
- Online stores with their own checkout that need last-mile delivery
- Vendors who refuse to migrate products/catalog to Fast Link
- Any system that only needs: quote shipping → create order → track → webhook
Authentication
Two ways to authenticate — pick per use case:
1) API key (server-to-server) — recommended
Send both headers on every request. Keys are issued by your Fast Link account manager (or from your portal if enabled).
# headers
X-API-Key: vk_xxxxxxxxxxxxxxxx
X-API-Secret: vs_xxxxxxxxxxxxxxxx
2) Portal login (JWT)
A human portal user logs in and calls the same endpoints with a bearer token.
POST /vendor-api/auth/login/ { "phone": "+201000000000", "password": "••••••" } # response { "access": "eyJhbGci…", "refresh": "…", "vendor": { … } } # then send Authorization: Bearer <access token>
Base URL
https://backend.fastlink.cyparta.com
All endpoints below are prefixed with /vendor-api. Every request and response is JSON. Responses are scoped to your vendor automatically.
Pickup addresses
Register one or more pickup locations (عناوين الاستلام). When an order omits pickup details, your default pickup address is used.
Create a pickup address
{
"label": "Main warehouse",
"address": "Nasr City, Cairo",
"latitude": "30.05",
"longitude": "31.34",
"contact_phone": "+201111111111",
"is_default": true
}
Shipping cost
Estimate the shipping cost for a route using the pricing Fast Link configured for your account (fixed, distance/weight formula, or weight-range tiers).
Call this from your checkout before creating the order, then optionally pass the quoted shipping_cost when creating the order.
# request { "pickup": "30.05,31.34", "destination": "30.0444,31.2357", "weight": "2.5" // or "items": [{ "weight": 1.5, "quantity": 2 }] } # response { "currency": "EGP", "cost": "67.78", "distance_km": 10.08, "weight_kg": 2.5, "breakdown": { "type": "formula", "base_fee": "20.00", "price_per_km": "3.50", "price_per_kg": "5.00", "min_price": "25.00" } }
Pricing types
| Type | How cost is computed |
|---|---|
fixed | Flat fixed_price (never below min_price). |
formula | base_fee + (price_per_km × distance_km) + (price_per_kg × weight_kg) |
weight_range | Price of the tier where min_weight ≤ weight ≤ max_weight (open-ended max allowed). |
Orders
Create and manage delivery (shipping) orders from your own system.
Create a shipping order
{
"external_order_id": "ORD-1001",
"customer_name": "Ahmed Ali",
"phone_number": "+201234567890",
"email": "ahmed@example.com",
"delivery_address": "12 Tahrir St, Cairo",
"coordinates": "30.0444,31.2357",
"pickup_address": "Nasr City warehouse",
"pickup_coordinates": "30.05,31.34",
"delivery_notes": "Call before arrival",
"building_number": "12",
"floor": "3",
"apartment": "8",
"shipping_cost": "67.78",
"items": [
{
"product_name": "Wireless headphones",
"quantity": 1,
"weight": "0.8",
"price": "450.00"
},
{
"product_name": "Phone case",
"quantity": 2,
"weight": "0.1",
"price": "50.00"
}
]
}
The order is created and handed to Fast Link operations, then flows through the delivery lifecycle. Cancellation is allowed while the order is pending, confirmed, or preparing.
Cancel an order
POST /vendor-api/orders/{id}/cancel/
{ "reason": "Customer changed mind" }
Order tracking
Returns the order with its current status, driver and trip info, items, and the full status timeline.
{
"order_number": "…",
"external_order_id": "ORD-1001",
"status": "in_transit",
"shipping_cost": "67.78",
"rider": { "name": "…", "phone": "…", "vehicle_type": "…" },
"customer": { "name": "Ahmed Ali", "phone": "+201234567890" },
"pickup": { … },
"delivery": { … },
"items": [ … ],
"timeline": [
{ "old_status": "pending", "new_status": "confirmed", "created_at": "…" }
]
}
Webhooks
Register webhook URLs with your account manager (or via portal). Fast Link POSTs a JSON event to each active webhook on every order transition.
{
"event": "order.status_changed",
"sent_at": "2026-01-01T10:00:00Z",
"data": { /* full order payload (same shape as tracking) */ }
}
| Event | When |
|---|---|
order.created | An order was created for your vendor. |
order.status_changed | The order status changed (confirmed → … → delivered / cancelled). |
order.assigned | A rider or shipping company was assigned. |
Verifying signatures
If you set a signing secret on a webhook, each delivery includes an X-FastLink-Signature header — an HMAC-SHA256 of the raw request body using your secret. Recompute and compare to verify authenticity. The event type is also sent in X-FastLink-Event.
# Python example
import hmac, hashlib
def verify(secret, body_bytes, signature_header):
expected = hmac.new(secret.encode(), body_bytes, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature_header)
Order statuses
| Status | Meaning |
|---|---|
pending | Received, awaiting operations. |
confirmed / preparing | Accepted / being prepared. |
arrived_at_pickup / in_transit / out_for_delivery | In progress. |
delivered | Completed. |
postponed / no_response / failed | Delivery issues. |
cancelled | Cancelled. |
Errors
Standard HTTP status codes are used. Error bodies contain a detail message (or a field-keyed object for validation errors).
| Code | Meaning |
|---|---|
| 200 / 201 | Success. |
| 400 | Validation error — check the body. |
| 401 | Missing/invalid API key, secret, or token. |
| 403 | Vendor deactivated or insufficient access. |
| 404 | Resource not found (or not on your vendor). |
Recommended integration flow
- Receive API key + secret from Fast Link; store the secret securely.
POST /vendor-api/pickup-addresses/— register your warehouse(s), mark one default.- At checkout:
POST /vendor-api/shipping/calculate/— show the quote to the customer. - On payment success:
POST /vendor-api/orders/with items + optionalshipping_cost. - Store Fast Link
order.id/order_numberagainst yourexternal_order_id. - Listen to webhooks (or poll
/orders/{id}/tracking/) to update your UI. - Cancel via API only while status is
pending/confirmed/preparing.