SNUGGOO DELIVERIES · P2P

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 delivery fee sits in escrow, the shipper posts the item's value as an insurance deposit, and a one-time delivery code settles the handoff.

How it works

1

Post the package

Pickup and drop-off contacts, what's inside, the declared item value, and the fee you'll pay. The fee is frozen from your Snuggoo wallet the moment you post.

2

A shipper accepts

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

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.

4

Code settles it

You share the 6-digit delivery code with the recipient. The shipper enters it at handoff: the fee pays out and their deposit thaws, instantly. No code? You confirm from your delivery page instead.

Why it's safe

ProtectionWhat it means
Escrowed feeYour 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 depositThe 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 is refunded, so a lost parcel is covered up to the value you declared.
Delivery codeA 6-digit code only you (the poster) can see. Hand it to the recipient; the shipper can settle only by entering it at handoff. A wrong code changes nothing.
Pickup proofPhoto or video proof is required at pickup, so there's a record of the parcel's condition when it left your hands.

Become a shipper

Anyone with a Snuggoo account can earn by delivering. Opt in under Settings → P2P shipping, pick the routes you cover, and you'll be alerted when 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.

For platforms (the API)

Selling on your own website or another marketplace? Create deliveries programmatically and track them from your system. The API is the same delivery 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 API reference: developers.snuggoo.com.

POST/v1/deliveries

Create a delivery. Body: pickup + dropoff contact blocks ({ name, phone, country, state, city, address }), a parcel ({ description, weight? }), the declared value, your fee, and useDeliveryCode (default true). Returns the delivery plus the deliveryCode; the code also stays readable on every later GET, for your system only, never the shipper.

GET/v1/deliveries/:id

Track a delivery: 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.

Quickstart

# 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_…"

Webhooks

Instead of polling, set a webhookUrl on your API key (Settings → Developer). You'll receive a webhookSecret once; store it. Snuggoo then pushes signed events as your deliveries move:

EventFired when
delivery.acceptedA shipper accepted and froze the insurance deposit.
delivery.picked_upPickup proof uploaded; parcel is in transit.
delivery.deliveredShipper marked delivered without a code; your confirmation is awaited.
delivery.completedSettled: fee paid, deposit thawed (code entered or you confirmed).
delivery.failedDelivery failed: deposit forfeited to you, fee refunded.
delivery.cancelledYou cancelled an open delivery; fee refunded.

Each POST carries X-Snuggoo-Signature: t=<unixSecs>,v1=<hex>, an HMAC-SHA256 of <t>.<rawBody> with your webhook secret. Verify before trusting:

// 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 || ''));
}
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.

FAQ

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.

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.