REST API
Six endpoints over your account, with a live request builder for each.
The REST API exposes an account's retained activity, library, tool catalogue, usage and connected clients as JSON. Its base URL is:
https://omniio.dev/api/v1The API publishes six endpoint shapes and one write: the enabled switch on a server that needs no credential. OAuth, bearer credentials, client revocation and secret issuance stay behind a signed-in session.
Authentication#
Create a named key under Settings → API keys. It starts
with omn_, is shown once, and is stored as a SHA-256 digest. An account may
hold up to ten live keys; revocation takes effect on the next request while the
retired row remains visible for review.
curl -H "Authorization: Bearer omn_…" \ "https://omniio.dev/api/v1/usage"Every successful request updates that key's last used time.
The OAuth token held by an MCP client is not accepted. It is resource-bound to
https://mcp.omniio.dev; accepting it at /api/v1 would break that audience
boundary. An API key cannot call the MCP endpoint either.
Rate limits and CORS#
REST requests are counted in a fixed clock-minute window per API key. The published ceilings are 120/min on Free, 300 on Pro, 600 on Scale and 1,200 on Business; Enterprise is negotiated. REST reads are not MCP calls and are not billed as such.
Every metered response includes:
- X-RateLimit-Limitinteger
- Requests this key may make in the minute.
- X-RateLimit-Remaininginteger
- Requests left, floored at zero.
- X-RateLimit-ResetUnix seconds
- The start of the next clock-minute window.
- Retry-Afterseconds · 429 only
- How long to wait before repeating the request.
Browser access allows any origin, the documented methods, and the
Authorization and Content-Type headers. Credentials mode is not enabled: no
page can borrow an Omniio session cookie. Preflight responses may be cached for
600 seconds.
Errors#
Every failure is JSON with a stable code and a human-readable message:
{ "error": "invalid_request", "message": "\"limit\" must be a whole number between 1 and 200."}| Code | HTTP | Meaning |
|---|---|---|
unauthorized | 401 | Missing, malformed, invalid or revoked API key. |
invalid_request | 400, 409 | A parameter or body is invalid, or the requested state conflicts with the resource. |
not_found | 404 | No resource with that identifier exists in this account. |
rate_limited | 429 | This key spent its minute; obey Retry-After. |
method_not_allowed | 405 | The verb is not published; Allow lists the accepted methods. |
server_error | 500 | Omniio failed unexpectedly; retry safely and report a persistent failure with its time. |
Numeric parameters outside their published range are refused, not silently clamped.
Activity#
GET/activity
Returns retained run_tool audit rows newest first.
- limitinteger · 1–200 · default 50
- Rows in this page.
- cursorISO 8601
- The previous response's `nextCursor`; exclusive.
- clientstring
- Only rows attributed to this client ID.
The response contains data, nextCursor, and retentionDays. Each call
includes id, createdAt, client and server identity, qualifiedName, ok,
durationMs, error, stored arguments and result, redacted, and
injectionFindings.
Pagination uses the row timestamp rather than an offset so new calls arriving while an export runs do not shift rows between pages.
curl -H "Authorization: Bearer omn_…" \ "https://omniio.dev/api/v1/activity?limit=50"Servers#
GET/servers
Returns the complete library as this account sees it, with catalogue defaults already resolved.
- statusenabled | pending | disabled
- Optional status filter.
- categorystring
- Optional catalogue category; use a value returned on a server.
There is no pagination. Each row contains slug, name, description,
category, resolved status, authType, upstream endpoint, toolCount,
lastAttemptAt, lastError, and owned.
GETPATCH/servers/{slug}
GET returns that same server shape. PATCH accepts exactly one field:
{"enabled": true}Only servers with authType: "none" can be switched through the API. A server
requiring OAuth or a bearer token answers 409 because connecting a credential is
a signed-in app action. Enabling starts a catalogue warm-up and returns the
fresh resolved server.
Tools#
GET/tools
Returns the qualified tool names currently available from enabled servers.
- serverstring
- Optional server-slug filter.
- limitinteger · 1–500 · default 100
- Tools in this page.
- offsetinteger · 0–100,000
- How many matching tools to skip.
- schemaboolean · default false
- Set to true to include each full input JSON Schema.
The response contains data, total, and nextOffset. A tool carries
qualifiedName, unqualified name, server identity, title, description,
and inputSchema only when requested. The catalogue answers from cache and
refreshes stale servers after the response.
Usage#
GET/usage
Returns the UTC month, call count, reset time, team name where the allowance is pooled, and the complete plan limits used by enforcement.
The plan object includes id, name, includedCalls, hardLimit,
overageEurPer1k, burstPerMinute, apiPerMinute, and
auditRetentionDays. blocked is true only when a hard-limited plan has spent
its included calls.
Clients#
GET/clients
Returns authorized, seen and revoked MCP connections.
- activetrue | false
- Optional filter for live versus revoked connections.
Each row includes client ID, chosen label, registered name, active status,
authorization and activity timestamps, retained attributed call count, and last
call time. The response also states total and the retention window behind its
call counts. Client revocation remains a signed-in app action.
Next: TypeScript SDK.