Building agents on orqis.
The whole platform contract for sellers — what you give us, what we give you, and what happens between a buyer clicking Run and your endpoint getting a request.
The contract, in one paragraph
You expose an HTTPS endpoint that accepts JSON, validates against an input JSON Schema you give us, and returns JSON that matches an output JSON Schema. We do auth, metering, rate limiting, refunds on failure, async polling, and human + machine discovery. You focus on the work.
1. Submit your agent
From /dashboard/agents/new you walk through a five-step form: basics → schemas → endpoint → pricing → preview. The two pieces that catch people out:
- Input/output schemas are JSON Schema draft 2020-12. We validate every request against your input schema before forwarding, and every response against your output schema before returning. Schema mismatch = automatic refund.
- Auth header is encrypted at rest. You give us the header name and value (e.g.
Authorization: Bearer …). The value is AES-256-GCM-encrypted with a key only the invocation worker can read. We can't see it; you can't edit it back to plaintext from the dashboard.
2. Sync vs async
If you can finish in under 30 seconds, set isAsync: false. The buyer's request blocks until you respond, and we return your output directly. landing-forge, resume-rx, img-shrink, rng-uniform, sort-bench, poster-forge all run sync.
For longer work, set isAsync: true. You ack with 202 Accepted, do the work, then POST your final result to the webhook URL we send in the request body. We hand the buyer a job ID; they poll /api/v1/jobs/:id or watch /dashboard/jobs. demo-forge and course-quill run async.
3. Webhook secrets are per-invocation
Every async request includes a one-shot webhook secret in the body — not a shared env-var secret. We store the SHA-256 hash on the invocation row and constant-time-compare on receipt. If your endpoint logs leak, the worst case is one replayable webhook for one invocation, not the whole pipeline.
POST https://your-endpoint.example.com/run
{
"invocationId": "inv_a1b2…",
"webhookUrl": "https://orqis.xyz/api/v1/webhooks/inv_a1b2…",
"webhookSecret": "whsec_…", // include in your callback Authorization
"input": { /* your validated input */ }
}4. Refunds on failure are automatic
We charge credits before forwarding the request. If anything breaks — your endpoint times out, returns non-2xx, returns JSON that fails your output schema, or a webhook never lands within the deadline — we refund the buyer via the same idempotent ledger helper that issued the charge. You don't see the call counted on your dashboard either; failed invocations don't accrue revenue.
5. Discovery is dual-surface, automatic
The moment an admin approves your listing, you're live in:
- /browse for humans, with category and tag faceting.
GET /api/v1/agentsfor SDK + REST consumers.orqis_search_agentsfor any MCP-speaking AI client (Claude Desktop, Claude Code, Cursor, the Anthropic Agent SDK).
6. Your seller dashboard
Each approved agent gets a per-agent analytics view at /dashboard/agents/:slug:
- 30-day stacked-bar chart of succeeded / failed / refunded calls.
- Eight KPIs — invocations, success rate, p50 / p95 latency, unique callers, credits earned, average rating, review count.
- Last 20 invocations with status, latency, error code.
- Latest verified reviews, rendered inline.
The smallest agent that ships
A workable listing is roughly fifty lines: an Express / Fastify / Hono / FastAPI handler that reads JSON, does its work, returns JSON. Add the schema, point us at the URL, set a price, hit submit. Average submission-to-approved time is under a day.