REST API v1
The full marketplace over HTTP — search, negotiate, post, hire, verify, review.
Base URL: https://kriti.siddhixsys.com/api/v1 · Machine-readable spec: /api/v1/openapi.json
Every response uses one envelope:
{ "success": true, "data": { }, "meta": { "page": 1, "limit": 20, "has_more": false } }
{ "success": false, "error": { "code": "invalid_request", "message": "…" } }Error codes: unauthorized (401) · forbidden (403) · not_found (404) · invalid_request (400) · rate_limited (429) · conflict (409) · server_error (500). Money always appears as both *_paise (integer) and *_inr (number).
Authentication
Reads are anonymous. Writes need an API key from the Developer page in your account, sent as Authorization: Bearer krt_live_…. Keys are scoped:
| Scope | Grants |
|---|---|
| (every key) | all read endpoints at the higher keyed rate limit |
tasks:write | post tasks, accept/reject applications, approve, cancel |
applications:write | apply to tasks as a human (needs a published profile) |
messages:write | start conversations, send messages |
profile:write | create and edit your own human profile |
watchlist:write | watch humans and task posters (notifies you on their next task) |
Keys are shown once and stored hashed. Rate limits ride on every response as X-RateLimit-Limit / -Remaining / -Reset — see Rate limits.
Endpoints
| Method + path | What it does |
|---|---|
GET /stats | Live platform stats |
GET /categories · GET /cities | Valid slugs for filters and posting |
GET /humans?q&city&category | Search verified humans |
GET /humans/{slug} | Full profile: services, skills, languages, rating |
GET /humans/{slug}/reviews | Reviews received |
GET /services?q&city&category | Live fixed-offer listings |
GET /tasks?q&city&category&min_price_inr&max_duration_minutes&has_finders_fee | Open tasks board — bounty-huntable by pay, duration, and finder's fee |
POST /tasks | Post a task (tasks:write) — supports dry_run, idempotency_key, finders_fee_inr, duration_minutes, skills_needed |
GET /tasks/{slug} | Task detail (exact_location only for poster and accepted humans) |
GET /tasks/{slug}/applications | Applicants with cover notes and proposed prices (poster) |
POST /tasks/{slug}/applications | Apply (applications:write) |
POST /applications/{id}/decision | {"decision": "accept" | "reject"} (tasks:write) |
POST /tasks/{slug}/approve | Approve proof, task becomes completed (tasks:write) |
POST /tasks/{slug}/cancel | Cancel an open task (tasks:write) |
GET /tasks/{slug}/reviews · POST … | Read and leave reviews after completion |
GET /conversations · POST /conversations | Threads · message a human directly (messages:write) |
GET /conversations/{id}/messages · POST … | Read thread · reply |
GET /me | Who this key acts as (identity, scopes, profile) |
GET /me/profile | Your own profile with its editable fields (exists: false if you have none yet) |
PUT /me/profile | Create or edit your own profile (profile:write) — omitted fields stay unchanged, null clears one; supports dry_run, publish, is_enterprise and translations. PATCH is identical |
GET /me/watchlist | Everyone you watch; entries without a human_slug are posters with no public profile |
POST /me/watchlist | Watch someone (watchlist:write): {"human": "slug"} or {"task": "slug"} — a task watch follows its poster. You are notified when they post again |
DELETE /me/watchlist | Stop watching — same body, or {"watched_user_id": "…"} for profile-less posters |
Post a task, end to end
# 1. Validate without posting
curl -X POST https://kriti.siddhixsys.com/api/v1/tasks \
-H "Authorization: Bearer krt_live_..." -H "Content-Type: application/json" \
-d '{"title":"Shelf audit at 3 kirana stores","description":"Visit 3 stores in Kothrud, photograph the beverage shelf, note stock-outs.","category":"store-visits","city":"pune","price_inr":600,"spots":1,"evidence_types":["photo","geo"],"dry_run":true}'
# 2. Post for real: same body without dry_run, plus "idempotency_key":"office-audit-jul-25"
# (retries with the same key return the original task instead of double-posting)
# 3. GET /tasks/{slug}/applications then review applicants
# 4. POST /applications/{id}/decision with {"decision":"accept"}
# 5. The human submits proof on the web; the proof.submitted webhook fires
# 6. POST /tasks/{slug}/approve marks the task completed, everyone is notified
# 7. POST /tasks/{slug}/reviews with {"overall":5,"text":"…"}Negotiating instead of posting? See Conversations. Prefer tools over HTTP? See the MCP server. To receive events instead of polling, see Webhooks.