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 APIMarketplace API
AudienceSingle vendor with own siteMulti-merchant platform
MerchantsNot needed — you are the shipperCRUD merchants under your platform
Prefix/vendor-api/platform-api
API key prefixvk_ / vs_pk_ / sk_

Who this is for

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
The secret is shown only once when generated. Store it securely; if lost, rotate the key.

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.

GET /vendor-api/pickup-addresses/
POST /vendor-api/pickup-addresses/
GET /vendor-api/pickup-addresses/{id}/
PATCH /vendor-api/pickup-addresses/{id}/
DELETE /vendor-api/pickup-addresses/{id}/

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

POST /vendor-api/shipping/calculate/

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

TypeHow cost is computed
fixedFlat fixed_price (never below min_price).
formulabase_fee + (price_per_km × distance_km) + (price_per_kg × weight_kg)
weight_rangePrice of the tier where min_weight ≤ weight ≤ max_weight (open-ended max allowed).
Pricing is configured per vendor by your Fast Link account manager. This endpoint is an estimate — it does not create an order.

Orders

Create and manage delivery (shipping) orders from your own system.

GET /vendor-api/orders/
POST /vendor-api/orders/
GET /vendor-api/orders/{id}/
POST /vendor-api/orders/{id}/cancel/

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

GET /vendor-api/orders/{id}/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) */ }
}
EventWhen
order.createdAn order was created for your vendor.
order.status_changedThe order status changed (confirmed → … → delivered / cancelled).
order.assignedA 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

StatusMeaning
pendingReceived, awaiting operations.
confirmed / preparingAccepted / being prepared.
arrived_at_pickup / in_transit / out_for_deliveryIn progress.
deliveredCompleted.
postponed / no_response / failedDelivery issues.
cancelledCancelled.

Errors

Standard HTTP status codes are used. Error bodies contain a detail message (or a field-keyed object for validation errors).

CodeMeaning
200 / 201Success.
400Validation error — check the body.
401Missing/invalid API key, secret, or token.
403Vendor deactivated or insufficient access.
404Resource not found (or not on your vendor).

Recommended integration flow

  1. Receive API key + secret from Fast Link; store the secret securely.
  2. POST /vendor-api/pickup-addresses/ — register your warehouse(s), mark one default.
  3. At checkout: POST /vendor-api/shipping/calculate/ — show the quote to the customer.
  4. On payment success: POST /vendor-api/orders/ with items + optional shipping_cost.
  5. Store Fast Link order.id / order_number against your external_order_id.
  6. Listen to webhooks (or poll /orders/{id}/tracking/) to update your UI.
  7. Cancel via API only while status is pending / confirmed / preparing.