Jamdesk Documentation logo

Docs Search API

Search your Jamdesk docs programmatically. Power chatbots, Slack bots, custom search, and AI agents with up-to-date answers.

The Docs Search API gives you programmatic access to your documentation content via semantic search. One endpoint (POST /_api/search) takes a natural language query and returns the most relevant passages from your docs, ranked by relevance.

Use Cases

Support Chatbots

Connect Intercom Fin, Zendesk AI, or a custom chatbot to your docs so it answers questions with accurate, cited content.

Slack Bots

Build a /docs Slack command that searches your documentation and posts the top results to any channel.

Custom Search

Add a search interface to your product, dashboard, or internal tools that surfaces relevant docs in context.

AI Agents

Give AI agents like Claude or GPT a tool that retrieves up-to-date documentation, not stale training data.

Quick Start

1
Generate an API key

Go to Project Settings → API Keys in the Jamdesk dashboard. Click Generate Key, give it a name, and copy the key. It starts with jd_live_ followed by 32 hex characters (40 chars total) and is only shown once.

2
Make your first search request

Send a POST request to /_api/search on your docs subdomain:

curl -X POST https://your-project.jamdesk.app/_api/search \
  -H "Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a" \
  -H "Content-Type: application/json" \
  -d '{"query": "How do I set up a custom domain?", "limit": 5, "language": "en"}'
3
Use the results

The response returns an array of matching passages with relevance scores and page metadata:

{
  "query": "How do I set up a custom domain?",
  "language": "en",
  "results": [
    {
      "title": "Custom Domains",
      "section": "Step 4: Deploy",
      "slug": "deploy/custom-domains",
      "content": "To add a custom domain, go to Project Settings and enter your domain. You'll need to add a CNAME record pointing to your Jamdesk subdomain.",
      "url": "https://your-project.jamdesk.app/deploy/custom-domains",
      "score": 0.94
    }
  ],
  "total": 1,
  "durationMs": 85
}

Authentication

All requests require a Bearer token in the Authorization header.

Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a

Generating API Keys

1
Open Project Settings

In the Jamdesk dashboard, navigate to your project and click Settings.

2
Go to API Keys

Select the API Keys tab.

3
Create a key

Click Generate Key, enter a descriptive name (e.g. "Intercom chatbot"), and click Create.

4
Copy the key

Copy the key immediately. It starts with jd_live_ followed by 32 hex characters and is shown only once. Store it in your secrets manager or environment variables.

Key Management

API keys are scoped to a single project. A key for acme.jamdesk.app cannot query a different project's documentation.

RuleDetail
Formatjd_live_<32 hex chars> (40 chars total, never expires)
ScopeOne key per project (cannot access other projects)
RotationRevoke and regenerate anytime from Project Settings
StorageStore in environment variables or a secrets manager; never commit to source control

Revoking Keys

To revoke a key, go to Project Settings → API Keys, find the key by name, and click Revoke. Revoked keys stop working immediately. Generate a new key to replace it.

Rate Limits

Requests are rate-limited per API key.

PlanLimit
Pro60 requests / minute
EnterpriseCustom; contact support

When you exceed the limit, the API returns 429 Too Many Requests with a Retry-After: 60 header and {"error": "Rate limit exceeded"} in the body.

If you need higher rate limits for a production integration, contact us to discuss Enterprise options.

Query Limits

Each request accepts a limit parameter controlling how many results to return. The maximum is 20, the default is 5, and the minimum is 1. There is no pagination; all matching results come back in a single response. If you need more context, try a more specific query rather than increasing the limit.

A query with no matches returns HTTP 200 with an empty results array:

{"query": "quantum entanglement", "results": [], "total": 0, "durationMs": 48}

Filtering by language

If your docs site supports multiple languages, the API filters results to a single language per request. Pass language in the request body with a BCP-47 code (e.g. en, es, fr, pt-BR, zh-Hans).

curl -X POST https://your-project.jamdesk.app/_api/search \
  -H "Authorization: Bearer jd_live_c83003a54ae0a83123454c3f7ec82f0a" \
  -H "Content-Type: application/json" \
  -d '{"query": "¿Cómo configuro un dominio personalizado?", "language": "es"}'
RuleDetail
Defaulten (English). Omit the field, or pass null, to use the default.
FormatBCP-47 (^[a-zA-Z]{2,3}([-_][a-zA-Z]{2,4})?$). Examples: en, es, fr, pt-BR, zh-Hans.
ValidationMalformed values return 400 with {"error": "Invalid language code"}.
3-segment tagsNot currently supported. Codes like zh-Hant-HK and sr-Latn-RS return 400. Contact support if you need them.
Multi-language projectsThe filter is strict — only chunks tagged with the requested language are returned. A request for de against a project that only has English and French returns an empty result set, not a 400.
Single-language projectsThe filter is ignored; you always get the full result set. Sending language is harmless — not an error.
Echoed in responseEvery successful response includes a language field with the value the server resolved (request value, or en default).

A project is multi-language when its docs.json has a navigation.languages array with two or more entries. To check whether your site is multi-language, open the Settings → Languages tab in the dashboard, or open docs.json directly.

The default en applies even on projects that don't have an English version. If your multi-language project is e.g. French and Spanish only, calling the endpoint without a language field will filter for en and return an empty result set. Always pass an explicit language from non-English-only sites.

Error Handling

All error responses include a machine-readable error field you can branch on programmatically.

Statuserror valueMeaningAction
400Missing or empty "query" fieldRequest body is missing or has no queryAdd a non-empty query string
400Invalid language codeThe language field is not a string or doesn't match the BCP-47 pattern (null is fine; empty/whitespace strings and 3-segment tags are not)Use a valid 1- or 2-segment code like en, es, fr, or pt-BR
401invalid_key_formatAuthorization header is missing or the key doesn't match jd_live_<32 hex>Check the header format; it must be Bearer jd_live_...
401invalid_keyKey is not recognised or has been revokedGenerate a new key in the dashboard
403wrong_projectKey is valid but was generated for a different projectUse a key that matches the project slug in the URL
429Rate limit exceededExceeded 60 requests per minuteWait the number of seconds in the Retry-After header
502Search temporarily unavailableVector search backend is downRetry after a short backoff
503lookup_failed or redis_unavailableKey verification backend is unreachableRetry after a short backoff

401 and 403 are permanent failures. Retrying with the same key won't help. 429, 502, and 503 are transient, so retry with exponential backoff.

CORS

CORS is enabled on all endpoints. Browser-based clients (single-page apps, browser extensions, static sites) can call /_api/search directly without a backend proxy. All origins are allowed.

SDKs

There are no official language SDKs at this time. Use the REST API directly via fetch, requests, curl, or any HTTP client. The Postman collection below provides ready-to-fork examples.

Versioning

The API is currently at v1.0.0. Breaking changes (field renames, removed endpoints, changed auth) will be announced via the Jamdesk blog and a deprecation notice in the X-Deprecation response header at least 90 days before removal.

OpenAPI Specification

The full OpenAPI 3.1 spec is available as YAML. Import it into your codegen tool, API client, or contract-testing pipeline.

Download OpenAPI YAML

docs-search-api.yaml — OpenAPI 3.1, always in sync with the latest published version.

Browse on GitHub

Read the spec source, file issues, or watch for changes.

Postman Collection

We publish an official Postman workspace with the full OpenAPI spec and a ready-to-fork collection so you can test requests in the Postman UI without writing any code.

Jamdesk Docs API workspace

Fork the collection and run requests in Postman. Includes a Getting Started folder and working examples.

All Jamdesk APIs

Browse every public Jamdesk API workspace and stay current as new APIs ship.

After forking the collection, you must update two collection variables before any request will work:

  • baseUrl: set to your own Jamdesk docs site. For most customers this is https://your-project.jamdesk.app (replace your-project with your project slug). Custom-domain customers use their own host. Customers serving docs under a sub-path include the full path (e.g. https://example.com/docs).
  • apiKey: replace the placeholder with a real key generated in Dashboard → Project Settings → API Keys.

Next Steps

Search Endpoint

Full reference with request/response schemas and interactive playground

Integration Guides

Step-by-step guides for Intercom, Zendesk, Slack bots, and custom chatbots