Endpoints
GET /listingslistings:read
Search live listings across 99ropani.
- q
- Keywords, in English or Nepali
- purpose
- sale or rent
- type
- One or more property types, comma separated
- province, district
- Ids from /districts
- min_price, max_price
- NPR
- min_bedrooms
- Whole number
- sort
- relevance, newest, price_asc or price_desc
- limit, offset
- Up to 50 per page
curl "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/listings?purpose=rent&type=flat&district=27&max_price=50000" \
-H "X-API-Key: $ROPANI_API_KEY"
{
"data": [{ "id": "…", "title": "2 BHK flat in Jhamsikhel", "price_npr": 45000, "purpose": "rent", … }],
"total": 31, "limit": 20, "offset": 0
}
GET /listings/{id}listings:read
One listing with its photos. Any live listing, or one of yours in any status.
curl "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/listings/2f1c…" -H "X-API-Key: $ROPANI_API_KEY"
{ "data": { "id": "2f1c…", "status": "active", "url": "https://99ropani.com/listings/2f1c…", "media": [ … ], … } }
GET /my/listingslistings:read
Your listings. For an agency owner or manager, every agent's listings too.
- status
- draft, pending_review, active, sold, rented, expired, archived…
- limit, offset
- Up to 100 per page
curl "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/my/listings?status=active" -H "X-API-Key: $ROPANI_API_KEY"
{ "data": [ … ], "total": 12, "limit": 20, "offset": 0 }
POST /my/listingslistings:write
Create a draft listing. It is yours (or your agency's) exactly as if you posted it on the website.
curl -X POST "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/my/listings" \
-H "X-API-Key: $ROPANI_API_KEY" -H "Content-Type: application/json" \
-d '{"purpose":"rent","property_type":"flat","title":"2 BHK flat in Jhamsikhel",
"price_npr":45000,"price_basis":"per_month","bedrooms":2,
"province_id":3,"district_id":27,"area_name":"Jhamsikhel"}'
201 Created
{ "data": { "id": "9b0e…", "status": "draft", … } }
PATCH /my/listings/{id}listings:write
Change any listing field. Editing the title, price or location of a live listing sends it back for a quick review. Mark it sold or rented with status.
curl -X PATCH "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/my/listings/9b0e…" \
-H "X-API-Key: $ROPANI_API_KEY" -H "Content-Type: application/json" \
-d '{"status":"rented"}'
{ "data": { "id": "9b0e…", "status": "rented", … } }
POST /my/listings/{id}/submitlistings:write
Publish a draft. With a plan it goes live (or to a quick review); if a listing fee is due, status is awaiting_payment and you pay it in the dashboard.
curl -X POST "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/my/listings/9b0e…/submit" -H "X-API-Key: $ROPANI_API_KEY"
{ "data": { "status": "active", "requires_payment": false } }
GET /leadsleads:read
People who messaged, called or tapped WhatsApp on your listings, newest activity first. Poll with since to get only new ones.
- since
- ISO 8601 time, e.g. 2026-10-21T00:00:00Z
- limit, offset
- Up to 200 per page
curl "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/leads?since=2026-10-21T00:00:00Z" -H "X-API-Key: $ROPANI_API_KEY"
{
"data": [{ "id": "…", "listing_title": "2 BHK flat in Jhamsikhel", "source": "whatsapp", "stage": "new",
"contact": { "name": "Sita Sharma", "phone": "+97798…", "email": null }, "last_activity_at": "…" }],
"limit": 50, "offset": 0
}
GET /districtsany key
All 77 districts with their province, for filters and new listings.
curl "https://dhdhzhcjhszjuygszyrl.supabase.co/functions/v1/public-api/v1/districts" -H "X-API-Key: $ROPANI_API_KEY"
{ "data": [{ "id": 27, "province_id": 3, "name_en": "Lalitpur", "name_ne": "ललितपुर" }, … ] }