Snuggoo Deliveries · Peer to peer

Send a package.
Escrow-protected, code-settled.

Hire a nearby peer shipper for any parcel, even one sold outside Snuggoo (your own store, Instagram, WhatsApp). Your fee sits in escrow, the shipper posts the item's value as an insurance deposit, and a one-time delivery code settles the handoff.

  • Fee held in escrow
  • Parcel value insured
  • Proof at pickup

Track a delivery

Enter your delivery id (it looks like DLV-…). Shows the stage and city route only, never names, phones, or addresses.

Escrowed feePaid only on delivery
Value insuredShipper posts a deposit
Code handoff6-digit settle code
Pickup proofPhoto or video required
How it works

Four steps, fully protected

Every step moves money only through escrow. Nobody is paid until the parcel is where it should be.

STEP 1

Post the package

Add pickup and receiver contacts, item details, the declared value, and the fee you'll pay. The fee is frozen from your Snuggoo wallet the moment you post.

STEP 2

A shipper accepts

Shippers covering your route are alerted. To accept, a shipper must freeze the FULL declared item value from their own wallet as an insurance deposit.

STEP 3

Pickup with proof

The shipper collects the parcel and uploads pickup proof (a photo or a short clip) before the job moves in transit.

STEP 4

The code settles it

You share the 6-digit code with the receiver. The shipper enters it at handoff: they get the fee plus their deposit back, instantly. No code? Confirm from your delivery page instead.

Protection

Why it's safe

Both sides have real money at stake, held by Snuggoo, so honesty is the only profitable strategy.

Escrowed fee

Your delivery fee is held by Snuggoo at posting. The shipper is paid only when the delivery settles. Cancel while the job is still open and the fee returns in full.

Insurance deposit

The shipper freezes the parcel's declared value before they can touch it. If the delivery fails, the deposit is forfeited to you and your fee refunds, so a lost parcel is covered up to the value you declared.

Delivery code

A 6-digit code only you (the poster) can see. Hand it to the recipient; the shipper settles only by entering it at handoff. A wrong code changes nothing.

Pickup proof

Photo or video proof is required at pickup, so there's a record of the parcel's condition when it left your hands.

Earn with Snuggoo

Become a shipper

Anyone with a Snuggoo account can earn by delivering on routes they already travel.

  • Opt in under  Settings → P2P shipping  and pick the routes you cover.
  • Get alerted the moment a matching package is posted.
  • Accepting freezes the declared value from your wallet as the insurance deposit; it thaws the moment the delivery settles, together with your fee.
  • Deliveries are local: you can only accept jobs posted in your own country.
Start earning
For platforms

The same protection, as an API

Selling on your own website or another marketplace? Create deliveries programmatically and track them from your system. Same product: escrowed fee, insurance deposit, delivery code, pickup proof.

You need a Snuggoo API key with the deliveries.create permission (create one under Settings → Developer on snuggoo.com). Keys support IP allowlists and per-currency spend caps, so a leaked key has a bounded blast radius. Full reference: developers.snuggoo.com.

POST/v1/deliveries

Create a delivery: pickup + dropoff contact blocks, a parcel, the declared value, your fee, and useDeliveryCode (on by default). Returns the delivery plus the deliveryCode, readable on every later GET, for your system only, never the shipper.

GET/v1/deliveries/:id

Track it: stage (open → pickup → in-transit → delivered → completed), the shipper once accepted, pickup proof, and the event timeline.

POST/v1/deliveries/:id/confirm

Confirm receipt: pays the shipper's fee and thaws their deposit. Only needed when the delivery code wasn't used at handoff.

POST/v1/deliveries/:id/cancel

Cancel while still open (no shipper yet). The escrowed fee refunds in full. Mutual-cancel and return-leg endpoints cover the later stages.

Webhooks instead of polling

Set a webhookUrl on your API key and Snuggoo pushes signed events as your deliveries move. Each POST carries X-Snuggoo-Signature: t=…,v1=…, an HMAC-SHA256 of <t>.<rawBody> with your webhook secret.

EventFired when
delivery.acceptedA shipper accepted and froze the insurance deposit.
delivery.picked_upPickup proof uploaded; parcel is in transit.
delivery.deliveredMarked delivered without a code; your confirmation is awaited.
delivery.reopenedThe shipper withdrew before pickup; the job is open again.
delivery.returningA mutual cancel was agreed in transit; the parcel is coming back.
delivery.completedSettled: fee paid, deposit thawed.
delivery.failedFailed: deposit forfeited to you, fee refunded.
delivery.cancelledYou cancelled an open delivery; fee refunded.
Respond 2xx quickly. Snuggoo retries twice on network errors and 5xx; a 4xx is treated as a rejection and not retried. Events are best-effort: keep GET /v1/deliveries/:id as your source of truth.
Quickstart · curl
# 1. Create a delivery (fee is escrowed from your wallet)
curl -X POST https://api.snuggoo.com/v1/deliveries \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "pickup":  { "name": "Ada Store", "phone": "+2348010000001",
                 "country": "ng", "state": "Lagos", "city": "Ikeja",
                 "address": "Warehouse 4" },
    "dropoff": { "name": "Chidi Okafor", "phone": "+2348010000002",
                 "country": "ng", "state": "Lagos", "city": "Lekki",
                 "address": "Block 12, Admiralty Way" },
    "parcel":  { "description": "Sneakers, boxed", "weight": "1.2kg" },
    "value": 45000,
    "fee": 2500
  }'

# → { "ok": true,
#     "delivery": { "id": "DLV-…", "stage": "open", … },
#     "deliveryCode": "482913" }
# Give the deliveryCode to your buyer; the
# shipper enters it at handoff.

# 2. Track it
curl https://api.snuggoo.com/v1/deliveries/DLV-… \
  -H "Authorization: Bearer sk_live_…"
Verify a webhook · Node.js
const crypto = require('crypto');

function verifySnuggoo(rawBody, sigHeader, secret) {
  const parts = Object.fromEntries(
    sigHeader.split(',').map(p => p.split('=')));
  const expected = crypto
    .createHmac('sha256', secret)
    .update(parts.t + '.' + rawBody)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(parts.v1 || ''));
}
FAQ

Questions, answered

Who pays what?

You (the poster) pay the delivery fee. The shipper earns it at settlement. Snuggoo holds both the fee and the shipper's deposit in escrow while the job runs.

What currency does it run in?

Your local Snuggoo wallet currency. The fee, the deposit, and every refund move in that one currency.

What if the parcel never arrives?

The shipper marks the job failed (or you dispute it): their deposit, equal to the value you declared, is forfeited to you, and your fee is refunded.

Can a delivery be cancelled after a shipper accepts?

Yes, by mutual agreement. Either side can request a cancel and the other accepts or declines. Before pickup the job simply reopens or unwinds; in transit the parcel is returned to you, and the money only unwinds once you confirm the return. A co-operative cancel never forfeits the shipper's deposit; marking the job failed does.

Is this live everywhere?

Deliveries roll out market by market. When the module isn't enabled yet for the platform, the API answers 403 module_disabled and the Deliveries page on snuggoo.com says so.