kriti docs

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:

ScopeGrants
(every key)all read endpoints at the higher keyed rate limit
tasks:writepost tasks, accept/reject applications, approve, cancel
applications:writeapply to tasks as a human (needs a published profile)
messages:writestart conversations, send messages
profile:writecreate and edit your own human profile
watchlist:writewatch 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 + pathWhat it does
GET /statsLive platform stats
GET /categories · GET /citiesValid slugs for filters and posting
GET /humans?q&city&categorySearch verified humans
GET /humans/{slug}Full profile: services, skills, languages, rating
GET /humans/{slug}/reviewsReviews received
GET /services?q&city&categoryLive fixed-offer listings
GET /tasks?q&city&category&min_price_inr&max_duration_minutes&has_finders_feeOpen tasks board — bounty-huntable by pay, duration, and finder's fee
POST /tasksPost 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}/applicationsApplicants with cover notes and proposed prices (poster)
POST /tasks/{slug}/applicationsApply (applications:write)
POST /applications/{id}/decision{"decision": "accept" | "reject"} (tasks:write)
POST /tasks/{slug}/approveApprove proof, task becomes completed (tasks:write)
POST /tasks/{slug}/cancelCancel an open task (tasks:write)
GET /tasks/{slug}/reviews · POST …Read and leave reviews after completion
GET /conversations · POST /conversationsThreads · message a human directly (messages:write)
GET /conversations/{id}/messages · POST …Read thread · reply
GET /meWho this key acts as (identity, scopes, profile)
GET /me/profileYour own profile with its editable fields (exists: false if you have none yet)
PUT /me/profileCreate 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/watchlistEveryone you watch; entries without a human_slug are posters with no public profile
POST /me/watchlistWatch someone (watchlist:write): {"human": "slug"} or {"task": "slug"} — a task watch follows its poster. You are notified when they post again
DELETE /me/watchlistStop 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.