RIKAISO
  1. Home

Help Content API

Read published documentation and manage content programmatically. Write calls require an API key issued by an administrator.

OpenAPI specification: https://rikaiso.com/api/help/v1/openapi.json

Authentication

Send your key as a bearer token: Authorization: Bearer rk_help_… . Read endpoints are public; every write endpoint requires a valid key.

Keys are issued by a RIKAISO administrator.

OAuth 2.1 (sign in with your editor account)

The same endpoints accept OAuth access tokens as Authorization: Bearer <access_token>. The authorization server supports dynamic client registration, PKCE (S256), refresh-token rotation and revocation; consent is limited to accounts with the admin or editor role. Scopes: help:read (reads, including drafts) and help:write (every write).

https://rikaiso.com/.well-known/oauth-authorization-server
https://rikaiso.com/.well-known/oauth-protected-resource

In claude.ai, add a custom connector with the URL https://rikaiso.com/api/mcp and “Requires sign-in” switched on; leave the client id and secret empty. You are sent to the RIKAISO sign-in and consent page, and the connector then lists every tool. With “Requires sign-in” off the connector connects anonymously and lists the read tools only. Claude Desktop connects the same way through its connector settings.

MCP server

Claude Code, Claude Desktop and SDK clients can maintain this content through the@rikaiso/help-mcpMCP server, a thin client over this API. It runs over stdio (npx -y @rikaiso/help-mcp) or remotely at the endpoint below: anonymously (read tools, published content), with a Help API key, or after signing in through OAuth (claude.ai custom connector with “Requires sign-in”).

POST https://rikaiso.com/api/mcp
Authorization: Bearer rk_help_xxx   (or an OAuth access token; omit for anonymous read-only access)

Publishing

Published versions can be locked so that they only change through a reviewed pull request in the content repository (docs-as-code). While that mode is on,GET /whoami reportspublishViaPr: true and every write to a published version, including setting a draft's status to published, answers403 { error: { code: "published_read_only" } }unless the caller is a publisher key. Drafts stay editable directly.

  1. POST /versions/{v}/working-copyduplicates a published version into the hidden draft{v}-wip. New versions are plain drafts and need no working copy.
  2. Edit the draft or working copy with the normal write endpoints.
  3. POST /versions/{v}/publish-request?dryRun=truerenders the version as version.jsonplus one Markdown file with frontmatter per node and language, validates them and returns the counts; without dryRun it commits them to a publish/… branch and opens the pull request. One open request per target version.
  4. After approval and merge the repository's Action posts the files toPOST /versions/{v}/import-fileswith the publisher key; the version goes live, the working copy is deleted and the request becomes imported.

GET /publish-requests lists requests with their pull-request links; DELETE on one cancels it. Hidden working copies appear inGET /versions only withincludeWorkingCopies=true.

Shareable PDF links

PDFs are rendered in the visitor's browser. To hand someone a download link, point them at a topic page with the export parameters; the portal opens the download dialog pre-filled and starts at once. Omit topics for the full document.

/support/{version}/{slug}?pdf=1&lang=de&topics=welcome,webhooks

Endpoints

gethttps://rikaiso.com/api/help/v1/versions

List versions

Returns every published documentation version, newest first. With a valid bearer key, draft and archived versions are included too (each object carries `status`). Hidden working copies (`hidden: true`, `workingCopyOf`) are listed only with `includeWorkingCopies=true`.

ParameterInRequiredDescription
includeWorkingCopiesquerynotrue to include hidden working copies (authenticated callers only).

Responses

200  Array of version objects.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions"
posthttps://rikaiso.com/api/help/v1/versionsAPI key

Create a version

Creates a documentation version. Answers 409 `conflict` when the slug already exists (use PATCH /versions/{version} to change one).

Request body

{
  "slug": "string, e.g. 2026.1",
  "label": "string, display label",
  "status": "draft (default) | published | archived",
  "languages": "array of language codes (default [en]); the first one is the primary language",
  "sortOrder": "number, optional",
  "isLatest": "boolean, optional — marks this published version as latest"
}

Responses

200  The stored version object.
401  Missing or invalid API key.
409  A version with this slug already exists.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"slug":"string, e.g. 2026.1","label":"string, display label","status":"draft (default) | published | archived","languages":"array of language codes (default [en]); the first one is the primary language","sortOrder":"number, optional","isLatest":"boolean, optional — marks this published version as latest"}'
patchhttps://rikaiso.com/api/help/v1/versions/{version}API key

Update a version

Partially updates label, status, languages, sort order or latest flag: only the fields in the body change. `isLatest: true` needs a published version (clears the previous latest). Setting the status of a published version to `archived` unpublishes it.

ParameterInRequiredDescription
versionpathyesVersion slug, e.g. 2026.1

Request body

{
  "label": "string, optional",
  "status": "draft | published | archived, optional",
  "languages": "array of language codes, optional",
  "sortOrder": "number, optional",
  "isLatest": "boolean, optional"
}

Responses

200  The updated version object.
404  Unknown version.

Example

curl -X PATCH "https://rikaiso.com/api/help/v1/versions/{version}" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"label":"string, optional","status":"draft | published | archived, optional","languages":"array of language codes, optional","sortOrder":"number, optional","isLatest":"boolean, optional"}'
deletehttps://rikaiso.com/api/help/v1/versions/{version}API key

Delete a version

Removes a version and every node and translation beneath it.

ParameterInRequiredDescription
versionpathyesVersion slug.

Responses

200  { ok: true }
404  Unknown version.

Example

curl -X DELETE "https://rikaiso.com/api/help/v1/versions/{version}" \
  -H "Authorization: Bearer rk_help_xxx"
gethttps://rikaiso.com/api/help/v1/versions/{version}/tree

Get the contents tree

Returns the nested section/topic tree of a published version. With a valid bearer key, draft and archived versions can be read as well.

ParameterInRequiredDescription
versionpathyesVersion slug.
languagequerynoLanguage code, default en.

Responses

200  { version, tree }
404  Version not published.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/tree"
gethttps://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}

Get a topic

Returns one topic with its Markdown body, breadcrumbs, neighbours and `versionStatus`. Falls back to English when the requested language is missing. With a valid bearer key, topics of draft and archived versions can be read as well.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesTopic slug.
languagequerynoLanguage code, default en.

Responses

200  Topic object.
404  Topic not found.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}"
posthttps://rikaiso.com/api/help/v1/versions/{version}/nodesAPI key

Create a node

Creates a section or topic in the version with its translations. Every translation language must be enabled on the version and the version's primary language (`languages[0]`) is required. Answers 409 `conflict` when the slug exists. The response carries the node's `updatedAt` and one per translation language, all valid as `expectedUpdatedAt` for follow-up writes.

ParameterInRequiredDescription
versionpathyesVersion slug.

Request body

{
  "slug": "string, unique within the version",
  "kind": "section | topic",
  "parentSlug": "string or null",
  "icon": "icon name or null",
  "sortOrder": "number",
  "translations": "object keyed by language: { title, summary, bodyMd }"
}

Responses

200  { id, slug, kind, parentSlug, icon, sortOrder, updatedAt, translations: { [lang]: { updatedAt } } }
400  A translation language is not enabled on the version, or the primary language is missing.
401  Missing or invalid API key.
409  A node with this slug already exists.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/nodes" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"slug":"string, unique within the version","kind":"section | topic","parentSlug":"string or null","icon":"icon name or null","sortOrder":"number","translations":"object keyed by language: { title, summary, bodyMd }"}'
gethttps://rikaiso.com/api/help/v1/versions/{version}/nodes

List nodes with translation status

Flat list of every node in document order with id, slug, kind, parentSlug, sortOrder, icon, updatedAt and `translations` keyed by language ({ title, summary, updatedAt, bodyChars }). Published versions are public (no bodies); with a credential drafts are visible and `include=bodies` adds bodyMd.

ParameterInRequiredDescription
versionpathyesVersion slug.
includequeryno`bodies` to add bodyMd to every translation.

Responses

200  { version, status, nodes }
404  Unknown version.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/nodes"
patchhttps://rikaiso.com/api/help/v1/versions/{version}/nodes/{slug}API key

Update a node

Partially updates a node (only the fields in the body change) and merges any supplied translations, whose languages must be enabled on the version. Supports `expectedUpdatedAt` / If-Unmodified-Since (409 on conflict); the response carries kind, icon, parentSlug, sortOrder and `updatedAt`.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesNode slug.

Request body

{
  "slug": "string, optional — renames the node",
  "kind": "section | topic, optional",
  "parentSlug": "string or null, optional",
  "icon": "icon name or null, optional",
  "sortOrder": "number, optional",
  "translations": "object keyed by language, optional"
}

Responses

200  { id, slug, kind, parentSlug, icon, sortOrder, updatedAt, translations: { [lang]: { updatedAt } } }
404  Unknown node.
409  The node changed after expectedUpdatedAt, or the new slug is taken.

Example

curl -X PATCH "https://rikaiso.com/api/help/v1/versions/{version}/nodes/{slug}" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"slug":"string, optional — renames the node","kind":"section | topic, optional","parentSlug":"string or null, optional","icon":"icon name or null, optional","sortOrder":"number, optional","translations":"object keyed by language, optional"}'
deletehttps://rikaiso.com/api/help/v1/versions/{version}/nodes/{slug}API key

Delete a node

Removes a node and its descendants; the response lists the removed slugs.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesNode slug.

Responses

200  { ok: true, removed: [slug] }
404  Unknown node.

Example

curl -X DELETE "https://rikaiso.com/api/help/v1/versions/{version}/nodes/{slug}" \
  -H "Authorization: Bearer rk_help_xxx"
gethttps://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}

Get one translation

Returns the stored title, summary, bodyMd and updatedAt of one translation plus the node's availableLanguages. Draft and archived versions need a bearer key.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesNode slug.
langpathyesLanguage code.

Responses

200  Translation object.
404  Unknown version, node or translation.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}"
puthttps://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}API key

Replace one translation

Full replacement of a translation (created when missing); the language must be enabled on the version. Supports `expectedUpdatedAt` / If-Unmodified-Since (409 on conflict). Use PATCH /nodes/{slug} with `translations` to merge several languages.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesNode slug.
langpathyesLanguage code.

Request body

{
  "title": "string, 1–200 characters",
  "summary": "string, optional",
  "bodyMd": "Markdown string, optional",
  "expectedUpdatedAt": "ISO timestamp, optional"
}

Responses

200  { translation: { slug, language, title, summary, bodyMd, updatedAt, created } }
404  Unknown node.
409  The translation changed after expectedUpdatedAt.

Example

curl -X PUT "https://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"title":"string, 1–200 characters","summary":"string, optional","bodyMd":"Markdown string, optional","expectedUpdatedAt":"ISO timestamp, optional"}'
deletehttps://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}API key

Delete one translation

Removes one language of a node; the response lists the remaining languages.

ParameterInRequiredDescription
versionpathyesVersion slug.
slugpathyesNode slug.
langpathyesLanguage code.

Responses

200  { ok: true, remainingLanguages }
404  Translation not found.

Example

curl -X DELETE "https://rikaiso.com/api/help/v1/versions/{version}/topics/{slug}/translations/{lang}" \
  -H "Authorization: Bearer rk_help_xxx"
posthttps://rikaiso.com/api/help/v1/versions/{version}/reorderAPI key

Move and reorder nodes

Applies parent and sort order for the listed slugs in one call. Every slug must exist and no node may end up inside its own subtree (400 with code `cycle`); if any row fails the previous order is restored. Returns the new flat order.

ParameterInRequiredDescription
versionpathyesVersion slug.

Request body

{
  "items": "array of { slug, parentSlug: string | null, sortOrder: number }"
}

Responses

200  { version, items: [{ slug, parentSlug, sortOrder }] } in document order.
400  Unknown slug, unknown parent or cycle.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/reorder" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"items":"array of { slug, parentSlug: string | null, sortOrder: number }"}'
posthttps://rikaiso.com/api/help/v1/versions/{version}/duplicateAPI key

Duplicate a version

Deep-copies every node and translation into a new version (draft unless `status` says otherwise). The copy is never marked latest.

ParameterInRequiredDescription
versionpathyesSource version slug.

Request body

{
  "slug": "string, new version slug",
  "label": "string, display label",
  "status": "draft | published | archived, optional (default draft)"
}

Responses

200  { version } — the new version object.
409  The target slug already exists.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/duplicate" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"slug":"string, new version slug","label":"string, display label","status":"draft | published | archived, optional (default draft)"}'
gethttps://rikaiso.com/api/help/v1/versions/{version}/search

Search a version

Case-insensitive match on title, summary and body text; up to 50 hits in document order with a snippet. Published versions are public; drafts need a bearer key.

ParameterInRequiredDescription
versionpathyesVersion slug.
qqueryyesSearch text (1–200 characters).
langquerynoLanguage code, default en.

Responses

200  { version, language, query, hits: [{ slug, title, summary, snippet }] }
404  Unknown version.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/search"
gethttps://rikaiso.com/api/help/v1/versions/{version}/export

Export a version

Full JSON document: { version, nodes } where every node carries slug, kind, parentSlug, icon, sortOrder and all translations including bodies. Published versions are public; drafts need a credential. Large for big versions.

ParameterInRequiredDescription
versionpathyesVersion slug.

Responses

200  Export document.
404  Unknown version.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/export"
posthttps://rikaiso.com/api/help/v1/versions/{version}/importAPI key

Import a version document

Applies an export document to the version. `merge` upserts nodes and translations; `replace` also deletes nodes and translations the document omits. With `dryRun: true` nothing is written and the diff summary (created/updated/unchanged/deleted slugs) is returned.

ParameterInRequiredDescription
versionpathyesVersion slug.

Request body

{
  "mode": "merge | replace",
  "dryRun": "boolean, optional",
  "nodes": "array of export nodes (or wrap them in `document: { nodes }`)"
}

Responses

200  { dryRun, mode, diff: { created, updated, unchanged, deleted, updatedTranslations: [{ slug, language }], deletedTranslations: [{ slug, language }] }, version }
400  Invalid document (unknown parent, duplicate slug, cycle, or a translation language the version does not enable — `offending` lists the { slug, language } pairs).

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/import" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"mode":"merge | replace","dryRun":"boolean, optional","nodes":"array of export nodes (or wrap them in `document: { nodes }`)"}'
posthttps://rikaiso.com/api/help/v1/versions/{version}/import-filesAPI key

Import a version from content files

Docs-as-code import used by the content repository's GitHub Action: `{ files: [{ path, content }] }` holding `version.json` and every `{lang}/{slug}.md` of the version (paths may be repository-relative). Files are parsed server-side; `dryRun=true` validates and reports `{ created, updated, deleted }` without writing. A real run replaces the version, marks it published, applies `isLatest`, deletes its working copy and closes matching publish requests. While publishing through pull requests is enabled, a real run needs a publisher key. At most 2,000 files / 10 MB.

ParameterInRequiredDescription
versionpathyesVersion slug.
dryRunquerynotrue to validate only.

Request body

{
  "files": "array of { path, content }",
  "dryRun": "boolean, optional"
}

Responses

200  { dryRun, summary: { created, updated, deleted, unchanged, slugs }, warnings, version: { slug, exists, status, isLatest }, workingCopyDeleted, requestsImported }
400  { error: { code: 'invalid_content', errors: [{ path, line?, message }], warnings } }
403  { error: { code: 'published_read_only' } } — a real run without a publisher key.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/import-files" \
  -H "Authorization: Bearer rk_help_xxx" \
  -H "Content-Type: application/json" \
  -d '{"files":"array of { path, content }","dryRun":"boolean, optional"}'
posthttps://rikaiso.com/api/help/v1/versions/{version}/working-copyAPI key

Create a working copy

Duplicates a published version into the hidden draft `{version}-wip` (its `workingCopyOf` points at the original) so it can be edited and published back through a pull request. Returns the existing copy when one already exists. Requires publishing through pull requests to be enabled.

ParameterInRequiredDescription
versionpathyesPublished version slug.

Responses

200  { version, existed: true }
201  { version, existed: false }
409  Publishing through pull requests is disabled.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/working-copy" \
  -H "Authorization: Bearer rk_help_xxx"
deletehttps://rikaiso.com/api/help/v1/versions/{version}/working-copyAPI key

Discard a working copy

Deletes the working copy of the version. Refused while a publish request for it is open.

ParameterInRequiredDescription
versionpathyesOriginal or working-copy slug.

Responses

200  { ok: true, discarded }
409  An open publish request exists.

Example

curl -X DELETE "https://rikaiso.com/api/help/v1/versions/{version}/working-copy" \
  -H "Authorization: Bearer rk_help_xxx"
posthttps://rikaiso.com/api/help/v1/versions/{version}/publish-requestAPI key

Open a publish pull request

Exports a draft (new version) or a working copy (changes to its original) as content files, validates them, commits them to a `publish/{target}/{stamp}` branch of the content repository and opens a pull request titled `Publish {target}`. `dryRun=true` returns the validation result and counts without touching GitHub. One open request per target.

ParameterInRequiredDescription
versionpathyesDraft or working-copy slug.
dryRunquerynotrue to validate only.

Responses

200  { dryRun: true, targetSlug, summary: { created, updated, deleted, unchanged, slugs }, warnings, files }
201  { dryRun: false, request: { id, targetSlug, prNumber, prUrl, status, summary, … } }
400  invalid_content with the error list.
409  A request for the target is already open, or publishing is disabled.
502  GitHub refused the call (the request is recorded as failed).

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/publish-request" \
  -H "Authorization: Bearer rk_help_xxx"
gethttps://rikaiso.com/api/help/v1/publish-requestsAPI key

List publish requests

Publish requests newest first, optionally filtered by `target`. Each carries the PR number and URL, status (`open | merged | closed | imported | failed`), counts and timestamps.

ParameterInRequiredDescription
targetquerynoVersion slug.

Responses

200  { requests: [...] }

Example

curl -X GET "https://rikaiso.com/api/help/v1/publish-requests" \
  -H "Authorization: Bearer rk_help_xxx"
deletehttps://rikaiso.com/api/help/v1/publish-requests/{id}API key

Cancel a publish request

Closes the pull request, deletes its branch and marks the request `closed`.

ParameterInRequiredDescription
idpathyesRequest id.

Responses

200  { request }
409  The request is not open.

Example

curl -X DELETE "https://rikaiso.com/api/help/v1/publish-requests/{id}" \
  -H "Authorization: Bearer rk_help_xxx"
gethttps://rikaiso.com/api/help/v1/whoamiAPI key

Describe the API key

Returns { kind, keyName, keyPrefix, createdAt, lastUsedAt, scopes, canWritePublished, publishViaPr } for the credential in use. `publishViaPr` is true while published versions can only change through a merged pull request; writes to them then answer 403 `published_read_only` unless the key is a publisher key.

Responses

200  Key metadata.
401  Missing or invalid API key.

Example

curl -X GET "https://rikaiso.com/api/help/v1/whoami" \
  -H "Authorization: Bearer rk_help_xxx"
gethttps://rikaiso.com/api/help/v1/versions/{version}/pdf-bundle

Get the data for a PDF export

Returns { version, language, template, entries, fonts, filename } for a published version, or for a comma-separated selection of topics resolved to document order (sections expand to their descendants, ancestors appear as chapter headings, at most 200 topics). The portal renders the PDF in the browser from this bundle; shareable links look like /support/{version}/{slug}?pdf=1&lang=de&topics=a,b.

ParameterInRequiredDescription
versionpathyesVersion slug, or latest.
langquerynoLanguage code, default en.
topicsquerynoComma-separated topic or section slugs; omit for the full document.
limitquerynoKeep only the first N topics (1–200); used for template previews.

Responses

200  PDF bundle object.
400  Invalid selection or more than 200 topics.
404  Version not published.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/pdf-bundle"
gethttps://rikaiso.com/api/help/v1/versions/{version}/pdfDeprecated

Download a PDF (retired)

Rendering now happens in the browser; use /pdf-bundle and a client renderer.

ParameterInRequiredDescription
versionpathyesVersion slug.

Responses

410  Gone.

Example

curl -X GET "https://rikaiso.com/api/help/v1/versions/{version}/pdf"
posthttps://rikaiso.com/api/help/v1/versions/{version}/pdfDeprecated

Download a PDF (retired)

Rendering now happens in the browser; use /pdf-bundle and a client renderer.

ParameterInRequiredDescription
versionpathyesVersion slug.

Responses

410  Gone.

Example

curl -X POST "https://rikaiso.com/api/help/v1/versions/{version}/pdf"