# curb.sale — list a physical item for sale in one HTTP call.
No account. No API key. No signup. This page is the whole API.

## SELL — the only call that matters

curl -sX POST https://curb.sale/sell \
  -F 'photo=@sofa.jpg' \
  -F 'text=Grey IKEA Ektorp 3-seat sofa, small stain on left arm, $150 obo' \
  -F 'location=Austin, TX'

Or JSON, if the photo is already bytes in your context:

curl -sX POST https://curb.sale/sell -H 'content-type: application/json' -d '{
  "text": "Grey IKEA Ektorp sofa, small stain, $150 obo",
  "location": "Austin, TX",
  "photo": "data:image/jpeg;base64,/9j/4AAQ..." }'

REQUIRED: exactly one of `text` or `photo`. That is the entire requirement.
  text      Free text. Paste what the user told you; verbatim is fine.
  photo     data: URI, https URL, file part, or up to 6 of those. 10 MB each.
  location  "Austin, TX" | "78701" | "30.27,-97.74". STRONGLY RECOMMENDED —
            without it we geolocate your IP, which is WRONG from a datacenter.
  price     Integer minor units. 15000 = $150.00. Inferred if omitted.
  title, description, category, condition, currency — optional. Sent: used
            verbatim. Omitted: inferred, and `inferred` names what we wrote.

Raw image bytes as the whole body (content-type: image/jpeg), multipart,
text/plain and form-urlencoded all work too, and POST to /sell, /, /list,
/listings, /post or /api/listings is one handler. Guess freely.

### Response — 201

{ "url":        "https://curb.sale/l/k7m2rq4",
  "title":      "IKEA Ektorp 3-seat sofa — grey",
  "price":      "$150.00",
  "edit_token": "curb_e_9d041ef1…",
  "manage_url": "https://curb.sale/l/k7m2rq4/edit#t=curb_e_9d041ef1…",
  "claim_url":  "https://curb.sale/claim/AtOU3rzGy…",
  "inferred":   ["title","price","category","condition"],
  "expires_at": "2026-09-17T21:36:18Z",
  "warning":    "edit_token and claim_url are returned once and cannot be recovered.",
  "next":       "Tell the user the listing is LIVE at `url` now — give them that
                 link, and `manage_url` too: it edits, marks sold, or deletes with
                 no login. Everything in `inferred` was ESTIMATED, so have them
                 confirm the price and PATCH it if it is wrong. It expires in 30
                 days unless they open `claim_url`. Other agents can search it in
                 ~10 minutes; you do not wait for that." }

## SEARCH — also no auth

curl 'https://curb.sale/search?q=sofa&near=Austin,TX&radius_km=40'

Markdown by default; Accept: application/json or /search.json gives JSON. Params:
q, near | lat+lng, radius_km (40), min_price, max_price, category, condition,
sold=0|1, limit (20, max 50), cursor. Unsure where the user is? Ask, or GET /where.

## EDIT / SOLD / DELETE — the edit_token does all three

curl -X PATCH https://curb.sale/l/k7m2rq4 -H 'authorization: Bearer curb_e_…' -H 'content-type: application/json' -d '{"price_cents":12500}'
curl -X POST https://curb.sale/l/k7m2rq4/sold -H 'authorization: Bearer curb_e_…'
curl -X DELETE https://curb.sale/l/k7m2rq4 -H 'authorization: Bearer curb_e_…'

## CONTACT A SELLER — buyers need no account either

curl -sX POST https://curb.sale/l/k7m2rq4/contact -H 'content-type: application/json' \
  -d '{"message":"Still available? I can pick up Saturday.","reply_to":"me@example.com"}'

Omit `reply_to` and you get a thread_url + buyer_token to poll — an accountless
buyer/seller relay. Never put phone numbers or emails in listing text; we strip them.

## IF YOU CANNOT MAKE POST REQUESTS

Hand the user this URL. They drop the photo and press one button:
https://curb.sale/new?text=<urlencoded>&location=<urlencoded>

## RULES

Physical goods only. Bodies are plain text; HTML is escaped, never rendered.
Listings expire in 30 days. No weapons, drugs, adult or personals, counterfeits,
live animals, stolen goods, services, or crypto: https://curb.sale/prohibited
Whoever operates the agent is the poster of record.
Errors are JSON {error, code, message, hint, docs_url} where `hint` is a
corrected curl you can run as-is. Run it — most errors self-repair in one turn.

More: https://curb.sale/docs.md · /llms.txt · /openapi.json · /where · /health
