Skip to main content

API Overview

The Inherent Public API provides programmatic access to your workspace's knowledge base. Use it to upload documents, perform semantic search, and retrieve document content and chunks.

The API is organized around REST. It accepts JSON-encoded request bodies (for search) and multipart/form-data (for uploads), returns JSON-encoded responses, and uses standard HTTP status codes.

Base URLs

EnvironmentBase URL
Productionhttps://api.inherent.systems
Developmenthttps://dev-api.inherent.systems

All versioned endpoints are prefixed with /api/v1/. Health check endpoints are at the root path.

https://api.inherent.systems/api/v1

API Versioning

The API is versioned via the URL path. The current version is v1.

Future versions will be introduced as /api/v2/, etc. Existing versions will continue to be supported with advance deprecation notice before removal.

Authentication

All API requests (except health checks) require authentication using an API key. Keys are prefixed with ink_ and can be created from the Inherent dashboard under Settings > API Keys.

Provide the key using either method:

MethodHeaderExample
API Key (preferred)X-API-KeyX-API-Key: ink_live_abc123...
Bearer TokenAuthorizationAuthorization: Bearer ink_live_abc123...
curl https://api.inherent.systems/api/v1/documents \
-H "X-API-Key: ink_live_abc123..."

If the key is missing or invalid, the API returns a 401 Unauthorized error.

API Key Permissions

Each API key is scoped with one or more permissions:

PermissionGrants access to
readList documents, get document details, get chunks
writeUpload documents
searchSemantic search

A request to an endpoint that requires a permission the key does not have returns 403 Forbidden.

Content Types

Content TypeWhen to use
application/jsonRequest and response bodies for all JSON endpoints
multipart/form-dataDocument uploads (POST /api/v1/documents)

Error Format

All errors follow the RFC 7807 Problem Details standard:

{
"type": "https://api.inherent.systems/errors/rate-limit-exceeded",
"title": "Rate Limit Exceeded",
"status": 429,
"detail": "You have exceeded the maximum of 100 requests per minute. Please retry after 23 seconds.",
"instance": "/api/v1/search",
"trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"timestamp": "2026-04-03T12:34:56.789Z"
}

Error Fields

FieldTypeDescription
typestringA URI reference that identifies the error type
titlestringA short, human-readable summary of the problem
statusintegerThe HTTP status code
detailstringA detailed, human-readable explanation specific to this occurrence
instancestringThe request path that produced the error
trace_idstringA UUID for tracing the request through logs and support
timestampstringISO 8601 timestamp of when the error occurred

Common HTTP Status Codes

StatusMeaning
200OK -- request succeeded
201Created -- resource was created
400Bad Request -- invalid or missing parameters
401Unauthorized -- missing or invalid API key
403Forbidden -- API key lacks the required permission
404Not Found -- the requested resource does not exist
413Payload Too Large -- uploaded file exceeds the 50 MB limit
422Unprocessable Entity -- request body failed validation
429Too Many Requests -- rate limit exceeded
500Internal Server Error

Rate Limiting

API requests are rate-limited per API key. The limits depend on your plan.

Every response includes rate limit headers:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp (seconds) when the current window resets
Retry-AfterSeconds to wait before retrying (included only on 429 responses)

Example response headers:

X-RateLimit-Limit: 300
X-RateLimit-Remaining: 297
X-RateLimit-Reset: 1743696000

When you exceed the rate limit, the API responds with HTTP 429:

{
"type": "https://api.inherent.systems/errors/rate-limit-exceeded",
"title": "Rate Limit Exceeded",
"status": 429,
"detail": "You have exceeded the maximum of 100 requests per minute. Please retry after 23 seconds.",
"instance": "/api/v1/search",
"trace_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"timestamp": "2026-04-03T12:34:56.789Z"
}

Pagination

List endpoints support offset-based pagination via query parameters:

ParameterTypeDefaultConstraintsDescription
pageinteger1Minimum 1Page number
page_sizeinteger20Minimum 1, maximum 100Number of items per page

Paginated responses include metadata alongside the results:

{
"documents": [ ... ],
"total": 142,
"page": 2,
"page_size": 20
}

API Endpoints

MethodEndpointDescription
POST/api/v1/searchSemantic search across workspace documents

Documents

MethodEndpointDescription
POST/api/v1/documentsUpload a document for ingestion
GET/api/v1/documentsList all documents
GET/api/v1/documents/:document_idGet a specific document

Chunks

MethodEndpointDescription
GET/api/v1/chunks/:document_idGet all chunks for a document
GET/api/v1/chunks/:document_id/contextGet full document context

Health

MethodEndpointDescription
GET/healthLiveness check (no auth)
GET/health/readyReadiness check (no auth)
GET/health/liveLiveness alias (no auth)