Developers

The AskBase API and MCP server

Everything the dashboard does is an operation you can run yourself: from a script or CI with an API key, or from Claude, Cursor and other AI agents over MCP. This page is generated from the same list the server runs, so it's always current.

Authentication

An admin creates keys in the dashboard under Setup → API keys. A key belongs to one workspace, and that workspace is the only one it can see: there's no header or field that points it at another. The key is shown once, when it's created; AskBase keeps only a fingerprint of it.

Send it as a bearer token on every request:

Authorization: Bearer askbase_…

Each key has one of three levels of access, chosen when it's made:

AccessActs asWhat it can do
Read onlya viewerReads articles, conversations and insights, and can ask the assistant. Changes nothing.
Propose changesa contributorAlso drafts articles and proposes changes. A person approves them in Suggested changes before customers see anything.
Full accessa memberAlso publishes, approves changes and works the inbox, like a member. Never settings, email setup or the team.

A key is never an admin. Keys live in CI variables and scripts, where they leak more easily than a password, so the operations that could turn a leaked key into a takeover (inviting people, changing roles, connecting mailboxes, allowing widget websites, erasing customers) stay in the dashboard.

Its name, and its replies

A key's name is who it is inside AskBase. Its notes, replies, saved replies and changes show in conversations and their history as, say, Support agent (API key), never as the person who made it. Customers see none of that: a reply from a key comes from the same address with the same signature as any reply from your team.

Replies settingWhat conversation.reply does
Draft replies for approvalIts replies wait in the conversation for someone on the team to read, edit and send.
Send repliesIts replies go to the customer, with the same undo hold as anyone's. Only Full access keys can send.

In draft mode (the default), conversation.reply answers { "result": { "drafted": true, "sent": false, "conversationId": "…" } }: the reply waits above the composer in that conversation, marked as from the key, and the inbox shows it needs approval. Someone uses it (it becomes their reply to edit and send) or discards it. A sent reply answers "drafted": false with its messageId and delivery status, and honours holdSeconds, so conversation.cancelReply can take it back. Read only and Propose changes keys never send, whatever the setting.

Expiry and leavers

A key can have an expiry date. After it, requests get a 401 with code key_expired, and the key shows as expired in the list. When someone leaves the workspace, the keys they made keep working: admins see them listed for review, with when each was last used, and choose to keep or revoke each one.

Keep keys on a server. The API sends no CORS headers, so a browser won't send a key from a web page. Each key can make up to 300 requests a minute.

Making requests

Every operation is a POST to https://askbase.com/api/v1/ops/{name} with its input as a JSON object. A success answers { "result": … }.

# Which workspace this key is for, and its access
curl https://askbase.com/api/v1/me \
  -H "Authorization: Bearer $ASKBASE_API_KEY"

# Your help centres, for the kbId other operations take
curl -X POST https://askbase.com/api/v1/ops/kb.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"

# Search the published articles
curl -X POST https://askbase.com/api/v1/ops/search \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId": "…", "query": "export to CSV"}'

# Propose an article for review (needs Propose changes or Full access)
curl -X POST https://askbase.com/api/v1/ops/suggestions.propose \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId": "…", "title": "Export responses to CSV", "bodyMd": "…", "reason": "Shipped in v2.4"}'

GET https://askbase.com/api/v1/ops returns every operation below as JSON, with its input schema and whether your key can run it, for generating a client or handing to an agent.

Errors

A failure answers { "error": "…", "code": "…" }. The error is a sentence for a person; the code is for your program.

StatusCodeWhen
400invalid_input · invalid_jsonThe input doesn't match the operation's schema; the message names the field
401unauthenticatedThe key is missing, mistyped or revoked
401key_expiredThe key's expiry date has passed; make a new one
402limit_reachedThe plan's limit for this is used up
403forbiddenThe key's access doesn't allow it
404not_foundNo such operation, or no such thing in this workspace
405method_not_allowedOperations are POST; /me and /ops are GET
409conflictIt changed since you read it; read it again
429rate_limitedToo many requests; wait for the Retry-After seconds
502provider_errorAn AI provider failed; try again shortly
500internalSomething went wrong on our side

Something in another workspace is 404, never 403: from your key's point of view it doesn't exist.

Connect your AI agent

The MCP server lets Claude, Cursor and other agents work on your help centre as you: search and read articles, see unanswered questions and product screens, and propose new articles and updates. Proposals wait in Suggested changes for someone on your team to approve. No tool publishes, approves or deletes, and there's no key to look after: the agent signs in with your AskBase account, and you choose whether it may only read or also propose changes.

https://askbase.com/mcp

Claude

In Claude (web or desktop), open Settings → Connectors, choose Add custom connector, name it AskBase and paste the address above. Claude opens AskBase to sign in. On Team and Enterprise plans, an owner adds it for the organisation first.

Claude Code

claude mcp add --transport http askbase https://askbase.com/mcp

Then run /mcp in Claude Code and choose AskBase to sign in. Add --scope user to have it in every project.

Cursor

Add it to ~/.cursor/mcp.json (or .cursor/mcp.json in a project), then sign in from Cursor's MCP settings:

{
  "mcpServers": {
    "askbase": {
      "url": "https://askbase.com/mcp"
    }
  }
}

VS Code

Add it to .vscode/mcp.json:

{
  "servers": {
    "askbase": {
      "type": "http",
      "url": "https://askbase.com/mcp"
    }
  }
}

Other clients

Any client that speaks MCP over streamable HTTP with OAuth can connect to the address above; it finds where to sign in from the server's challenge. For a client that only runs local servers, bridge it with npx mcp-remote https://askbase.com/mcp.

Tools

What a connected agent sees. The ones marked proposes need the permission to propose changes when you connect.

list_help_centres

List help centres

The help centres you can reach, in every workspace you're in: id, name, workspace, your role there, and the public address.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

search_articles

Search articles

Full-text search over a help centre's published articles, with highlighted snippets. Use it to find what's already written before proposing anything.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "query": {
      "type": "string",
      "minLength": 1
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    }
  },
  "required": [
    "help_centre_id",
    "query"
  ]
}

list_articles

List articles

Every article in a help centre: id, title, path, status and when it was last updated.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    }
  },
  "required": [
    "help_centre_id"
  ]
}

read_article

Read an article

One article in full, as Markdown. Read an article before proposing an update to it: an update replaces the whole text.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "article_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "help_centre_id",
    "article_id"
  ]
}

list_product_screens

List the product's screens

Screens AskBase captured by signing in to the product: name, purpose, controls, how to reach each one, and a screenshot URL that stays current, to embed in articles with Markdown: ![Form builder](url).

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    }
  },
  "required": [
    "help_centre_id"
  ]
}

list_content_gaps

List content gaps

Questions customers asked in the last 30 days that the help centre couldn't answer, grouped and most asked first: good things to write about.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    }
  },
  "required": [
    "help_centre_id"
  ]
}

list_suggestions

List suggested changes

Changes waiting for review (or approved, or rejected), including ones you proposed: so you don't propose the same thing twice.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "approved",
        "rejected"
      ]
    }
  },
  "required": [
    "help_centre_id"
  ]
}

read_suggestion

Read a suggested change

One suggested change in full: the proposed text, the article it would replace, and its checklist.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "suggestion_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "help_centre_id",
    "suggestion_id"
  ]
}

propose_article

Propose a new article

Put a new article you wrote into the review queue. Nothing is published: a person approves it. Write for customers, in Markdown, without the title. Anything you couldn't confirm goes on its own line as '> **To check:** …'.

proposes
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "How a customer would ask or search"
    },
    "body_markdown": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60000
    },
    "category": {
      "description": "A short category, e.g. 'Forms'",
      "type": "string",
      "maxLength": 60
    },
    "reason": {
      "type": "string",
      "maxLength": 400,
      "description": "One sentence for the reviewer"
    },
    "sources": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "label"
        ]
      }
    }
  },
  "required": [
    "help_centre_id",
    "title",
    "body_markdown",
    "reason"
  ]
}

propose_article_update

Propose an update to an article

Put a rewrite of an existing article into the review queue. Read it with read_article first, then send the whole new text: it replaces the article when approved, and the reviewer sees the difference.

proposes
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "article_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "body_markdown": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60000,
      "description": "The whole article, not just the changed part"
    },
    "reason": {
      "type": "string",
      "maxLength": 400,
      "description": "One sentence for the reviewer: what changed and why"
    },
    "sources": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "label"
        ]
      }
    }
  },
  "required": [
    "help_centre_id",
    "article_id",
    "title",
    "body_markdown",
    "reason"
  ]
}

request_articles

Ask AskBase to draft articles

Have AskBase itself plan and draft up to six new articles or updates from a request in words ('document the form builder'), using the help centre, the company website and product screens. Runs in the background; check_requests says how it's going. Counts toward the plan's AI drafts.

proposes
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "request": {
      "type": "string",
      "minLength": 8,
      "maxLength": 1000
    }
  },
  "required": [
    "help_centre_id",
    "request"
  ]
}

check_requests

Check drafting requests

How recent request_articles runs are going: queued, running, done or failed, what was planned, and how many drafts are waiting for review.

reads
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    }
  },
  "required": [
    "help_centre_id"
  ]
}

dismiss_content_gap

Dismiss a content gap

Mark a content gap as not worth an article (spam, a one-off, handled elsewhere). It stays hidden until it's asked twice as often. Use the question and count from list_content_gaps.

proposes
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "question": {
      "type": "string",
      "minLength": 2
    },
    "times_asked": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "help_centre_id",
    "question",
    "times_asked"
  ]
}

upload_image

Upload an image

Store a screenshot or image (PNG, JPEG, GIF or WebP, up to 8 MB, base64) and get back a URL to embed in a proposed article with Markdown: ![What it shows](url).

proposes
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "help_centre_id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "From list_help_centres"
    },
    "data_base64": {
      "type": "string",
      "minLength": 16
    },
    "description": {
      "type": "string",
      "maxLength": 200
    }
  },
  "required": [
    "help_centre_id",
    "data_base64"
  ]
}

Agent skill

The AskBase skill teaches an agent how to work with your help centre through either of the above: keep articles current after you ship a feature (read the PR, find the affected articles, propose updates for review), fill the gaps customers keep asking about, and draft inbox answers from your articles.

https://askbase.com/skill.md

For Claude Code, save it as a personal skill:

mkdir -p ~/.claude/skills/askbase
curl -o ~/.claude/skills/askbase/SKILL.md https://askbase.com/skill.md

In Claude, put SKILL.md in a folder named askbase, zip the folder, and upload it from Customize → Skills (choose +, then Create skill, then Upload a skill). Skills need code execution, which is under Settings → Capabilities. For REST, set ASKBASE_API_KEY where the agent runs.

Inbox

inbox.list

List the inbox

Email conversations by status: open (needs someone), mine (open and assigned to the caller), unassigned, pending (waiting on the customer), snoozed, closed or spam. Optionally narrowed by search words (subject, customer, any message) or a tag. Each row has the customer, subject, assignee, tags and the latest message. A page at a time: pass `next` back as `after` for the one after it (null when there's no more).

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/inbox.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "filter": {
      "default": "open",
      "type": "string",
      "enum": [
        "open",
        "mine",
        "unassigned",
        "pending",
        "snoozed",
        "closed",
        "spam",
        "drafts"
      ]
    },
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "search": {
      "type": "string",
      "maxLength": 200
    },
    "tagId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "limit": {
      "default": 200,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    },
    "after": {
      "type": "string",
      "maxLength": 100
    }
  }
}

conversation.reply

Reply to a customer

Email a reply to the customer in a conversation, threaded onto their email so it shows as one thread in their mail client. Signed by the calling team member. From an API key it's sent only by a full-access key set to send replies; any other key's reply is saved as a draft for a teammate to approve and send, and the result says drafted: true. The text is markdown; bold, italics, links and lists are kept in the email. Afterwards the conversation is closed (the default), pending (waiting on the customer), or left open when a follow-up is still owed.

Propose changes keydrafts unless the key may send
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.reply \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","text":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    },
    "after": {
      "default": "closed",
      "type": "string",
      "enum": [
        "closed",
        "pending",
        "open"
      ]
    },
    "attachmentIds": {
      "default": [],
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      }
    },
    "expectedSeq": {
      "description": "The newest message seq the writer saw; refused with a conflict if someone wrote since",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "force": {
      "default": false,
      "description": "Send even if someone wrote since expectedSeq",
      "type": "boolean"
    },
    "draftId": {
      "description": "The AI draft this reply was written from, from conversation.draftReply",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "holdSeconds": {
      "default": 0,
      "description": "Hold it this long before it goes, so conversation.cancelReply can take it back; 0 sends now",
      "type": "integer",
      "minimum": 0,
      "maximum": 30
    },
    "cc": {
      "description": "People copied on this reply and later ones; omit to keep the conversation's list",
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320
      }
    }
  },
  "required": [
    "conversationId",
    "text"
  ]
}

conversation.cancelReply

Take back a reply

Undo send: take back a reply sent with holdSeconds that hasn't gone yet. It leaves the thread, its words and files go back into the writer's draft, and the conversation's status goes back to what it was. Refused once the reply is on its way.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.cancelReply \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "messageId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "messageId"
  ]
}

conversation.note

Add an internal note

A note on a conversation for the team only. Never emailed to the customer and never shown to the assistant. From an API key, it's shown as the key's name.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.note \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","text":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "text": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000
    }
  },
  "required": [
    "conversationId",
    "text"
  ]
}

conversation.assign

Assign a conversation

Give a conversation to a team member, or pass null to unassign it.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.assign \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","assigneeUserId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "assigneeUserId": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "conversationId",
    "assigneeUserId"
  ]
}

conversation.setStatus

Open, park or close a conversation

Set a conversation to open (needs someone), pending (waiting on the customer) or closed, or file it as spam. A customer replying to a closed conversation reopens it. Marking spam by hand files that sender's future emails as spam too.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.setStatus \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","status":"open"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "status": {
      "type": "string",
      "enum": [
        "open",
        "pending",
        "closed",
        "spam"
      ]
    }
  },
  "required": [
    "conversationId",
    "status"
  ]
}

conversation.retryDelivery

Retry sending a reply

Send a reply again after it failed to deliver, keeping its place in the thread.

Propose changes keydrafts unless the key may send
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.retryDelivery \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messageId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "messageId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "messageId"
  ]
}

conversation.draftReply

Draft a reply with AI

Draft the next reply to a conversation from the help centre's articles, for a person to review before sending. Links the articles it used, and marks anything the articles don't cover as [Needs your input: …]. Nothing is sent. With revise, writes a previous draft again with the team's feedback (which also counts as a thumbs down on it). Pass the returned draftId to conversation.reply when sending from it.

Propose changes keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.draftReply \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "revise": {
      "type": "object",
      "properties": {
        "draftId": {
          "type": "string",
          "format": "uuid",
          "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
        },
        "reasons": {
          "default": [],
          "maxItems": 5,
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "wrong",
              "missing",
              "outdated",
              "tone",
              "length"
            ]
          }
        },
        "feedback": {
          "type": "string",
          "maxLength": 1500
        }
      },
      "required": [
        "draftId"
      ]
    }
  },
  "required": [
    "conversationId"
  ]
}

conversation.rateDraft

Rate an AI draft

Thumbs up or down on a reply AskBase drafted, with what was wrong (wrong, missing, outdated, tone, length) and a note. A thumbs down about the content becomes suggested changes to the articles the draft came from, for review.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.rateDraft \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"draftId":"…","rating":"up"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "draftId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "rating": {
      "type": "string",
      "enum": [
        "up",
        "down"
      ]
    },
    "reasons": {
      "default": [],
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "wrong",
          "missing",
          "outdated",
          "tone",
          "length"
        ]
      }
    },
    "note": {
      "type": "string",
      "maxLength": 1500
    }
  },
  "required": [
    "draftId",
    "rating"
  ]
}

conversation.snooze

Snooze a conversation

Take an open or waiting conversation out of the queue until a time (ISO 8601), when it comes back open at the top of the inbox and its owner is emailed. A customer reply ends the snooze early. Pass until: null to wake it now.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.snooze \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","until":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "conversationId",
    "until"
  ]
}

contact.setName

Name a customer

Set the name for a customer's email address. Every conversation with that address in the workspace takes it, and new ones will too. An empty name clears it.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/contact.setName \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"…","name":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    },
    "name": {
      "type": "string",
      "maxLength": 120
    }
  },
  "required": [
    "email",
    "name"
  ]
}

team.assignees

List people who can be assigned

Team members who can own a conversation (everyone except viewers), for assigning.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/team.assignees \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Tags

tag.list

List tags

The organisation's conversation tags, with how many conversations carry each.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/tag.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

conversation.tag

Tag a conversation

Add a tag to a conversation by name. A tag that doesn't exist yet is created.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.tag \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","name":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    }
  },
  "required": [
    "conversationId",
    "name"
  ]
}

conversation.untag

Remove a tag from a conversation

Take a tag off one conversation. The tag itself, and other conversations with it, are kept.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.untag \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…","tagId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "tagId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "conversationId",
    "tagId"
  ]
}

tag.update

Rename or recolour a tag

Change a tag's name or colour. It changes on every conversation that has the tag.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/tag.update \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tagId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "tagId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    },
    "color": {
      "type": "string",
      "enum": [
        "zinc",
        "red",
        "amber",
        "green",
        "blue",
        "violet",
        "pink"
      ]
    }
  },
  "required": [
    "tagId"
  ]
}

tag.delete

Delete a tag

Delete a tag and remove it from every conversation that has it. The conversations are kept.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "tagId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "tagId"
  ]
}

Privacy

customer.erase

Erase a customer's data

Permanently delete every conversation with this email address in the organisation — messages, notes, attachments and activity — for a data-erasure request. It can't be undone.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    }
  },
  "required": [
    "email"
  ]
}

Saved replies

savedReply.list

List saved replies

The team's saved replies (reusable answers with placeholders like {first_name}), most used first.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/savedReply.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

savedReply.create

Save a reply

Save text the team sends often, to insert into replies later and edit before sending.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/savedReply.create \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"…","bodyMd":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "Markdown. {first_name}, {name}, {email}, {my_name}, {my_first_name} are filled in when used; {first_name|there} gives a fallback."
    }
  },
  "required": [
    "name",
    "bodyMd"
  ]
}

savedReply.update

Edit a saved reply

Change a saved reply's name or text. Replies already sent with it are unaffected.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/savedReply.update \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…","name":"…","bodyMd":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1,
      "maxLength": 20000,
      "description": "Markdown. {first_name}, {name}, {email}, {my_name}, {my_first_name} are filled in when used; {first_name|there} gives a fallback."
    }
  },
  "required": [
    "id",
    "name",
    "bodyMd"
  ]
}

savedReply.delete

Delete a saved reply

Remove a saved reply from the list. Replies already sent with it are unaffected.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/savedReply.delete \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

savedReply.use

Count a saved reply as used

Record that a saved reply was inserted, so the most used ones sort first.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/savedReply.use \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

Mailboxes

mailbox.list

List connected mailboxes

Support addresses connected to AskBase, each with its forwarding address, whether forwarding is working (an email has arrived through it), and whether its domain is verified for sending replies as that address.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/mailbox.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "description": "Limit to one help centre",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  }
}

mailbox.connect

Connect a support address

Connect an address like support@yourcompany.com. Returns a forwarding address to forward that inbox to, and the DNS records that let replies be sent as the address. Emails arriving through forwarding become conversations in the inbox.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre these conversations belong to"
    },
    "address": {
      "type": "string",
      "minLength": 3,
      "description": "The support address, e.g. support@acme.com"
    },
    "name": {
      "description": "What the team calls it, e.g. Support",
      "type": "string",
      "maxLength": 80
    },
    "fromName": {
      "description": "The sender name customers see",
      "type": "string",
      "maxLength": 80
    }
  },
  "required": [
    "kbId",
    "address"
  ]
}

mailbox.update

Change a mailbox's settings

Change what the team calls a mailbox, the sender name customers see on replies, the signature replies end with, or whether new conversations are assigned automatically, taking turns among team members who have auto-assign on.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mailboxId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "maxLength": 80
    },
    "fromName": {
      "type": "string",
      "maxLength": 80
    },
    "autoAssign": {
      "type": "boolean"
    },
    "signature": {
      "description": "What replies end with, using {name}, {first_name} and {company}. Null or empty for the default. A person's own signature wins.",
      "anyOf": [
        {
          "type": "string",
          "maxLength": 1000
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "mailboxId"
  ]
}

mailbox.checkDomain

Check a mailbox's DNS records

Ask the email provider whether the DNS records for a mailbox's domain are in place. Until they are, replies go out from AskBase on the mailbox's behalf rather than as the address itself.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mailboxId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "mailboxId"
  ]
}

mailbox.sendTest

Send a forwarding test

Email the mailbox's support address and watch for the copy to come back through forwarding. mailbox.list then shows the test as received, which means forwarding is working. Needs an email provider that really sends.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mailboxId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "mailboxId"
  ]
}

mailbox.remove

Disconnect a mailbox

Stop receiving email through a mailbox. Existing conversations and their history stay; new mail forwarded to its address is ignored.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mailboxId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "mailboxId"
  ]
}

Suggested changes

suggestions.list

List suggested changes

Changes AskBase has drafted for a help centre — new articles and revisions of existing ones — with why each was suggested and the evidence (customer questions, changed screens). Pending by default.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "approved",
        "rejected",
        "superseded"
      ]
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.get

Show a suggested change

One suggestion in full: the proposed article, the current article it would replace, and whether that article has changed since the draft.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"suggestionId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "suggestionId"
  ]
}

suggestions.edit

Edit a suggested change

Change a pending suggestion's title or text without deciding on it yet.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.edit \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"suggestionId":"…","title":"…","bodyMd":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "title": {
      "type": "string",
      "minLength": 1
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "suggestionId",
    "title",
    "bodyMd"
  ]
}

suggestions.approve

Approve a suggested change

Apply a suggestion to the help centre, optionally with edits. A new article is published; a revision replaces the article's text. Refused if the article changed since the draft unless overwrite is set, and — when the draft has things to check — unless checksConfirmed says they've been checked.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.approve \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"suggestionId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "title": {
      "type": "string"
    },
    "bodyMd": {
      "type": "string"
    },
    "overwrite": {
      "type": "boolean"
    },
    "checksConfirmed": {
      "type": "boolean"
    }
  },
  "required": [
    "suggestionId"
  ]
}

suggestions.approveReady

Approve the website drafts with nothing to check

Publish, in one go, the new articles AskBase drafted from the website that have nothing to check and wouldn't replace anyone's edits. The rest stay in Suggested changes for a person.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.approveReady \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.reject

Reject a suggested change

Turn a suggestion down, optionally saying why. The same signal isn't suggested again for 90 days.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.reject \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"suggestionId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "reason": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "suggestionId"
  ]
}

suggestions.redraft

Redraft a suggested change

Ask for a different draft of a pending suggestion, in plain words ("just add a section to the install article"), optionally naming the article to update. The new draft replaces this one in the queue.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.redraft \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"suggestionId":"…","instruction":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "instruction": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1500
    },
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "suggestionId",
    "instruction"
  ]
}

suggestions.draftForGap

Draft an article for a content gap

Draft a suggested change for a group of questions nothing answered: a section added to the closest article, or a new article. Lands in the queue for review. Counts toward the plan's AI-drafted changes.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.draftForGap \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","lead":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "lead": {
      "type": "string",
      "minLength": 2
    },
    "samples": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "count": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "missing": {
      "type": "string"
    }
  },
  "required": [
    "kbId",
    "lead"
  ]
}

suggestions.gaps

List content gaps

Questions customers asked in the last 30 days that the help centre couldn't answer, grouped by meaning and most asked first: each with the question, how often, similar wordings and what was missing. Dismissed gaps are left out; the dismissed ones are listed separately.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.gaps \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.dismissGap

Dismiss a content gap

Mark a content gap as not worth an article (spam, a one-off, handled elsewhere). It and questions meaning the same stay hidden, and aren't drafted automatically, until it's asked twice as often as now.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.dismissGap \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","lead":"…","count":1}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "lead": {
      "type": "string",
      "minLength": 2
    },
    "count": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "kbId",
    "lead",
    "count"
  ]
}

suggestions.restoreGap

Bring back a dismissed content gap

Undo a dismissal by its id (from suggestions.gaps), so the gap shows again and can be drafted, automatically or on request.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.restoreGap \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

suggestions.request

Ask for articles to be written or updated

Describe a change to the help centre in words, e.g. 'write an article about bulk QR codes' or 'update the pricing articles for the new Pro plan'. AskBase plans up to six new articles and updates, drafts each from the articles, the company website and product screens (with screenshots where they help), and puts them in the review queue. Runs in the background: check suggestions.requests. Each draft counts toward the plan's AI-drafted changes.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.request \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","request":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "request": {
      "type": "string",
      "minLength": 8,
      "maxLength": 1000
    }
  },
  "required": [
    "kbId",
    "request"
  ]
}

suggestions.requests

See how requests for articles are going

The latest requests made with suggestions.request in a help centre: what was asked, whether it's queued, running, done or failed, what AskBase planned, and how many suggestions it drafted into the review queue.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.requests \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.propose

Propose a new article or an update for review

Put a change you wrote into the review queue: a new article (omit articleId), or an existing article rewritten in full (read it first with article.get, then pass its articleId and the whole new Markdown). Nothing is published: a person approves, edits or rejects it in Suggested changes. Lines starting '> **To check:**' become a checklist the reviewer ticks off instead of staying in the article.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.propose \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","title":"…","bodyMd":"…","reason":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "articleId": {
      "description": "The article to update; omit for a new article",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60000,
      "description": "The whole article in Markdown, without the title"
    },
    "category": {
      "description": "For a new article: a short category, e.g. 'Forms'",
      "type": "string",
      "maxLength": 60
    },
    "reason": {
      "type": "string",
      "maxLength": 400,
      "description": "One sentence for the reviewer: why this change"
    },
    "sources": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "label"
        ]
      }
    }
  },
  "required": [
    "kbId",
    "title",
    "bodyMd",
    "reason"
  ]
}

suggestions.review

Review the help centre for changes now

Look for changes to suggest now instead of waiting for the monthly review: drafts for the top content gaps and for articles whose product screens changed. Paid plans; limited per month.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.review \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.reviewStatus

Check the latest review

The latest review of a help centre: when it ran, whether it's still running, and how many changes it suggested.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.reviewStatus \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

suggestions.structure

Suggest a tidier set of collections

Looks at every published article and its collection, and if things could be easier to find, adds one suggestion to rename collections and move articles. Nothing moves until it's approved. Returns the suggestion's id, or null when the structure is already clear.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/suggestions.structure \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

article.findScreenshots

Find screenshots for an article

Suggest live product screenshots for one article. Uses what AskBase has already captured of the product when it fits; otherwise does the article's task in the product step by step and suggests those steps' screenshots when it's done (the words are kept). Poll article.screenshotStatus. The result is a suggested change.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.findScreenshots \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "articleId"
  ]
}

article.screenshotStatus

Check on finding screenshots for an article

Whether AskBase is still doing an article's task in the product to find its screenshots, and the suggested change it produced, if any.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.screenshotStatus \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "articleId"
  ]
}

Product

product.get

Show the connected product

The product AskBase browses for a help centre: its address, when it was last explored, whether it's working, and the latest run's progress. The login itself is never returned.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/product.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

product.connect

Connect a product for AskBase to browse

Give AskBase a login to the product so it can sign in, walk the screens read-only, and screenshot them for the help centre. Use a dedicated demo account. The password is sealed so only the browser service can read it. Replaces any existing connection.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "appUrl": {
      "type": "string",
      "minLength": 4,
      "description": "Where the app lives, e.g. https://app.acme.com"
    },
    "loginUrl": {
      "description": "The sign-in page, if different",
      "type": "string"
    },
    "username": {
      "type": "string",
      "minLength": 1
    },
    "password": {
      "type": "string",
      "minLength": 1
    },
    "notes": {
      "type": "string",
      "maxLength": 1000
    },
    "excludePatterns": {
      "description": "Parts of addresses never to visit, e.g. /admin",
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "allowChanges": {
      "description": "Let AskBase save changes while recording tasks (use a test account)",
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "appUrl",
    "username",
    "password"
  ]
}

product.browse

Capture the product now

Sign in to the connected product and capture it: map its screens (screenshots update in place, changed screens are described again), then work out the tasks customers most need to see done, from the screens, the confirmed facts and the existing articles, and do each step by step with a screenshot of every step. Each task becomes a suggested change, and its steps are offered to other articles that show them. Set screensOnly to just refresh the screens, as the weekly run does.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/product.browse \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "screensOnly": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId"
  ]
}

product.screens

List the product's screens

Every screen AskBase found in the product: its name and purpose, the controls on it, how to reach it, when it last changed, whether the team hid it, and a screenshot address that stays current. Its capture key (screen:<id>) is what capture.hide and capture.addToArticle take.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/product.screens \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

product.remove

Disconnect the product

Delete the stored login, every screen and every screenshot. Articles keep their text.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

walkthrough.start

Record a walkthrough of one task

Do one named task in the product step by step, with screenshots, and write it up as a suggested change.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.start \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","goal":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "goal": {
      "type": "string",
      "minLength": 8,
      "maxLength": 200
    },
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId",
    "goal"
  ]
}

walkthrough.list

Walkthroughs recorded

Recent walkthroughs: the task, how far each got, how it ended, and the suggested change it became.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

walkthrough.get

Show a recorded task, step by step

One walkthrough: the task, how it ended, the suggested change it became, and every step with what was done and its screenshot (focused on the control used). Each step's capture key (step:<walkthrough>:<n>) is what capture.hide and capture.addToArticle take.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

walkthrough.redo

Record a task again, with a note

Record a walkthrough's task again, telling AskBase what to do differently ("Videos are under Library", "Stop after choosing the file"). The note guides the plan and every step. The new one replaces the old.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.redo \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…","note":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "note": {
      "type": "string",
      "minLength": 3,
      "maxLength": 1000
    }
  },
  "required": [
    "id",
    "note"
  ]
}

walkthrough.writeUp

Write a recorded task up from the steps kept

Write a walkthrough up as a suggested change from its steps that aren't hidden, even if the run stopped short or was judged not to have done the task. Replaces its write-up still waiting for review.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.writeUp \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

walkthrough.delete

Delete a recorded task

Delete a walkthrough and its screenshots. Its write-up, if still waiting for review, is closed, and its pictures come out of other suggested changes still waiting. Published articles keep what they show.

Propose changes keydestructive
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/walkthrough.delete \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "id"
  ]
}

product.setNotes

Set notes on using the product

Notes for every capture, one per line: how the product is used, what to ignore ("Ignore the Getting started panel", "New things are made from the + button"). Read when planning tasks and at every step.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/product.setNotes \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","notes":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "notes": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "kbId",
    "notes"
  ]
}

product.hideInScreenshots

Keep parts of the product out of screenshots

Sections to hide before every screenshot, one per entry: the text a section shows (its heading, e.g. "Get started with Acme"), whose panel is hidden, or a CSS selector. For banners and onboarding panels the built-in tidying doesn't recognise. Applies from the next capture.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/product.hideInScreenshots \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","entries":[]}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "entries": {
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      }
    }
  },
  "required": [
    "kbId",
    "entries"
  ]
}

product.allowChanges

Let AskBase save changes while recording

Whether AskBase may save changes in the connected account while recording walkthroughs (best with a test account): with it, tasks are done all the way through; without, each stops at the first save. It never deletes, cancels, pays or signs out either way.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "allow": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "allow"
  ]
}

capture.list

List everything captured of the product

Every picture AskBase has of the product, whichever way it was taken: the screens it mapped and each step of the tasks it recorded, with what each shows. Hidden ones only when asked for.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/capture.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "hidden": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId"
  ]
}

capture.hide

Hide a screenshot of the product, or bring it back

Hide a screen or a walkthrough step that isn't worth showing: it's no longer offered for articles or used in drafts, and it comes out of suggested changes still waiting for review. Published articles keep what they show. A hidden screen stays hidden when captured again. hidden: false brings it back.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/capture.hide \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","key":"…","hidden":true}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "key": {
      "type": "string",
      "maxLength": 100
    },
    "hidden": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "key",
    "hidden"
  ]
}

capture.addToArticle

Add screenshots of the product to an article

Put chosen screenshots (screens or walkthrough steps, by capture key) into an existing article, each after the step it shows and focused on that step's control, without changing the words. The result is a suggested change to review; suggestionId is null when none of them shows a step the article has.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/capture.addToArticle \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","articleId":"…","keys":[]}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "keys": {
      "minItems": 1,
      "maxItems": 8,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 100
      }
    }
  },
  "required": [
    "kbId",
    "articleId",
    "keys"
  ]
}

API keys

apiKey.list

List API keys

The workspace's API keys: name, access, who created each, when it was last used, and whether it's been revoked. Never the keys themselves — those are shown once, when created.

Not available to keysread-only
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

apiKey.create

Create an API key

Make a secret key for the public API, scoped to this workspace. The key is in the result and is never shown again: only a hash is kept. Choose the least access the integration needs.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Who it acts as, shown on everything it does: e.g. 'Support agent'"
    },
    "access": {
      "type": "string",
      "enum": [
        "read",
        "propose",
        "full"
      ],
      "description": "read: read everything and ask the assistant · propose: also draft and propose changes for review · full: also publish, answer the inbox and edit content"
    },
    "replies": {
      "default": "draft",
      "description": "draft: its replies wait for a teammate to approve and send · send: they go to the customer (full access only; other keys always draft)",
      "type": "string",
      "enum": [
        "draft",
        "send"
      ]
    },
    "expiresAt": {
      "description": "When it stops working; omit for never",
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
        },
        {
          "type": "string",
          "format": "date",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
        }
      ]
    }
  },
  "required": [
    "name",
    "access"
  ]
}

apiKey.revoke

Revoke an API key

Stop an API key working, immediately and for good. Anything using it starts getting 401s. Use apiKey.list for its id.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "keyId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "keyId"
  ]
}

apiKey.keep

Keep an API key after its creator left

Confirm an API key should keep working after the person who made it left the workspace, so it stops being listed for review. Revoke it instead (apiKey.revoke) if nobody knows what uses it.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "keyId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "keyId"
  ]
}

Team

team.list

List the team

Everyone in the organisation with their role, and invitations that haven't been accepted yet.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/team.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

team.invite

Invite someone to the team

Email an invitation to join the organisation with a role. Returns the invitation link as well, so it can be shared by hand when email isn't set up. Links last seven days.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "minLength": 3
    },
    "role": {
      "type": "string",
      "enum": [
        "owner",
        "admin",
        "member",
        "contributor",
        "viewer"
      ],
      "description": "owner: everything, including billing and owners · admin: settings and the team · member: answer and write · viewer: read only"
    }
  },
  "required": [
    "email",
    "role"
  ]
}

team.revokeInvite

Withdraw an invitation

Cancel a pending invitation so its link stops working. Use team.list to find its id.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "inviteId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "inviteId"
  ]
}

team.changeRole

Change someone's role

Give a team member a different role. The last owner can't be demoted.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "enum": [
        "owner",
        "admin",
        "member",
        "contributor",
        "viewer"
      ],
      "description": "owner: everything, including billing and owners · admin: settings and the team · member: answer and write · viewer: read only"
    }
  },
  "required": [
    "userId",
    "role"
  ]
}

team.remove

Remove someone from the team

Take someone out of the organisation. Conversations assigned to them become unassigned. The last owner can't be removed.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string"
    }
  },
  "required": [
    "userId"
  ]
}

team.setPreferences

Change someone's inbox settings

Whether a team member takes turns being auto-assigned new conversations, and which emails they get: new unassigned conversations, and conversations assigned to them. Anyone can change their own; admins can change anyone's, except a signature, which is only ever your own.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/team.setPreferences \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"userId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string"
    },
    "autoAssign": {
      "type": "boolean"
    },
    "notifyNew": {
      "type": "boolean"
    },
    "notifyMine": {
      "type": "boolean"
    },
    "notifyEmail": {
      "description": "Whether notifications come by email too; off leaves only alerts on their devices",
      "type": "boolean"
    },
    "signature": {
      "description": "Your own signature for replies, with {name}, {first_name} and {company}. Null or empty uses the mailbox's. Only your own.",
      "anyOf": [
        {
          "type": "string",
          "maxLength": 1000
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "userId"
  ]
}

Help centres

kb.list

List knowledge bases

List this organisation's knowledge bases with article and chunk counts, whether each is publicly readable, and when it was last crawled. Start here to find the id or slug other operations need.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

kb.import

Import an existing help centre

Create a help centre from a site that already has one: crawl it, extract every article, and keep each article at the path it already lives at so inbound links still work. Name, identifier and crawl settings are derived from the URL unless given. Takes a minute or two on a large site. Re-run source.crawl afterwards to pick up changes.

Not available to keysslow
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "url": {
      "description": "The help centre's address, e.g. https://help.example.com",
      "type": "string",
      "format": "uri"
    },
    "name": {
      "description": "Defaults to the site's name",
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "slug": {
      "description": "Defaults to a name derived from the host",
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[a-z0-9][a-z0-9-]*$"
    },
    "isPublic": {
      "default": true,
      "description": "Whether AskBase also publishes these articles as a help centre",
      "type": "boolean"
    },
    "maxPages": {
      "default": 1000,
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 20000
    }
  },
  "required": [
    "url"
  ]
}

kb.importStart

Start importing a help centre in the background

Create a help centre from a site that already has one and import its articles in the background. Returns straight away with the new help centre; poll kb.status (or its latest crawl) for progress. Each article keeps the path it already lives at.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "url"
  ]
}

kb.start

Start a help centre from scratch

Create an empty help centre to write articles in. Nothing is crawled. Articles written here are published by AskBase and are what the assistant answers from.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "slug": {
      "description": "Defaults to a name derived from the name",
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[a-z0-9][a-z0-9-]*$"
    },
    "isPublic": {
      "default": true,
      "type": "boolean"
    }
  },
  "required": [
    "name"
  ]
}

kb.create

Create a knowledge base

Create an empty knowledge base. Populate it afterwards by adding a source and crawling, or by writing articles directly.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[a-z0-9][a-z0-9-]*$",
      "description": "URL-safe identifier, unique within the organisation"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "siteUrl": {
      "description": "Where these articles live publicly, if they already live somewhere. Citation links are built from it. Omit for a help centre written here, and links point at the one AskBase publishes.",
      "type": "string",
      "format": "uri"
    },
    "isPublic": {
      "default": false,
      "description": "Whether the help centre is readable without signing in",
      "type": "boolean"
    }
  },
  "required": [
    "slug",
    "name"
  ]
}

kb.update

Update a knowledge base

Change a help centre's name, its address (slug), where citations link, whether it is published, or whether AskBase suggests changes from the team's answers to closed conversations. Changing the address keeps the old one working as a redirect, so shared links don't break.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "slug": {
      "description": "New address, e.g. acme-help. Typed text is tidied: 'Acme Help' becomes acme-help",
      "type": "string",
      "minLength": 1,
      "maxLength": 64
    },
    "siteUrl": {
      "type": "string",
      "format": "uri"
    },
    "isPublic": {
      "type": "boolean"
    },
    "learnFromReplies": {
      "description": "Suggest article changes from how the team answered closed email conversations",
      "type": "boolean"
    },
    "autoTickets": {
      "description": "Make a ticket of every real question the chat can't answer, asking the visitor for their email when it isn't known",
      "type": "boolean"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.status

Knowledge base status

Health of one knowledge base: article and chunk counts, how many chunks still lack an embedding, which embedding and answer providers are in use, whether any article has diverged from its source, and the last crawl result.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.status \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.domain

Show a help centre's custom domain

The help centre's own domain (like help.acme.com), whether it is live, and the DNS records to add, each marked with whether it was found at the last check.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.domain \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.setDomain

Use a custom domain for a help centre

Serve the published help centre at a domain you own, like help.acme.com. Returns the DNS records to add: a CNAME pointing at AskBase and a TXT proving ownership. It goes live after kb.checkDomain finds them. Replaces any domain the help centre had.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    },
    "domain": {
      "type": "string",
      "minLength": 4,
      "description": "e.g. help.acme.com"
    }
  },
  "required": [
    "kbId",
    "domain"
  ]
}

kb.checkDomain

Check a custom domain's DNS

Look up the custom domain's DNS records now. When the CNAME and ownership TXT are both found, the domain goes live and the help centre's other addresses redirect to it.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.removeDomain

Stop using a custom domain

Stop serving the help centre at its custom domain. It goes back to its AskBase address; links to the custom domain stop working once its DNS no longer points here.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.mount

Show where a help centre lives on your website

The path on the customer's own website the help centre is served under (like acme.com/help), where their server should forward it to, and whether a check has seen it working.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.mount \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.setMount

Serve a help centre under a path on your website

Serve the help centre at a path on a site you run, like https://acme.com/help. Your server forwards that path to the returned upstream address; once kb.checkMount sees it working, the help centre's other addresses redirect there. Pass url null to stop.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 4
        },
        {
          "type": "null"
        }
      ],
      "description": "e.g. https://acme.com/help, or null"
    }
  },
  "required": [
    "kbId",
    "url"
  ]
}

kb.checkMount

Check a help centre is served on your website

Load the help centre's path on the customer's site now. When it serves this help centre, that address becomes the one everything links and redirects to.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
      "description": "The help centre"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.draft

Draft help articles from a website or files

Write first drafts of the help articles a product's customers need, in the background, from its website, from files the team already has (PDF, Word .docx, Markdown or plain text: product guides, policies, onboarding documents), or both. Articles the help centre already has are left alone, so only what's missing is drafted. Nothing is published: every draft waits in Suggested changes, names the pages or files it came from, and leaves facts the sources don't state as 'To check' notes. A scanned PDF with no text is refused with the reason. To copy an existing help centre's articles as they are, use kb.import instead. Poll kb.draftStatus for progress.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.draft \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "website": {
      "description": "The product's website, e.g. acme.com",
      "type": "string",
      "minLength": 3
    },
    "files": {
      "description": "Up to 10 files, 25 MB in all. PDF, Word (.docx), Markdown and plain text files",
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "The file's name, with its extension: drafts cite it, and the extension says how to read it"
          },
          "content": {
            "type": "string",
            "maxLength": 13981016,
            "format": "base64",
            "contentEncoding": "base64",
            "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$",
            "description": "The file's bytes, base64-encoded. Up to 10 MB a file"
          }
        },
        "required": [
          "name",
          "content"
        ]
      }
    }
  },
  "required": [
    "kbId"
  ]
}

kb.draftStatus

Check a drafting run

The latest drafting run for a help centre: its stage (queued; waiting, while an import of the existing help centre finishes; reading, planning, writing; done or failed), the website and files it reads, pages and file sections read, articles planned and written, and the open questions the sources didn't answer. A done run can carry an error too: a note of what it couldn't read, such as a website that wouldn't load when there were files to draft from.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/kb.draftStatus \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

Sources

source.list

List sites being read

Sites AskBase crawls, with when each was last read and how many pages came from it. A source is either the help centre itself (isHelpCentre true, its pages become published articles) or a reference site such as a marketing or pricing page (isHelpCentre false, answered from but never published). Omit helpCentreId to list every source in the organisation.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/source.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "description": "Limit to one help centre",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  }
}

source.add

Add a crawl source

Register a site to crawl. Include and exclude patterns are regular expressions matched against the URL path. Restricting to article pages — for example '^/article/' — is usually right: category and collection index pages are navigation, and indexing them lets them outrank the page that actually answers a question.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "rootUrl": {
      "type": "string",
      "format": "uri"
    },
    "includePatterns": {
      "default": [],
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "excludePatterns": {
      "default": [],
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "isKb": {
      "default": true,
      "description": "False for a marketing site: used as retrieval context, not published",
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "rootUrl"
  ]
}

source.crawl

Crawl a source

Fetch a source's pages, extract them, and index the result. Articles edited in AskBase are never overwritten: if the source has also changed, the divergence is recorded for review and the local version keeps serving. Takes seconds per page, so expect a wait on a large site.

Not available to keysslow
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "sourceId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "force": {
      "default": false,
      "description": "Re-extract and re-index even when content is unchanged",
      "type": "boolean"
    },
    "maxPages": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 20000
    }
  },
  "required": [
    "sourceId"
  ]
}

source.remove

Stop reading a site

Remove a source and everything crawled from it. For a reference site that means the assistant stops answering from those pages. For a help centre's own source it means the articles stay but are no longer updated by a crawl.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "sourceId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "sourceId"
  ]
}

Widget

widget.list

List widget installs

A help centre's widgets, oldest (the help centre's own) first: the websites each appears on, its colours, wording and scope (which collections it answers from), and the snippet to paste into a site.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/widget.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.setHelpCentreChat

Show or hide the AI chat on the help centre

Turn the AI chat launcher on or off on the help centre's own pages. Turning it on creates the help centre's widget if there isn't one yet; its look is shared with the chat on your website. Returns the widget's id.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "enabled": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "enabled"
  ]
}

kb.setHandoffTriggers

Set the moments the assistant hands over to a person

Replace a help centre's handoff triggers: short keys with a plain description of the moment, like billing_dispute for "the customer disputes a charge or asks for a refund". The assistant tags a question that matches one, the widget passes the key to the site's escalationRequested handler, and a conversation handed to the team from it is tagged with the key.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "triggers": {
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_]{1,39}$"
          },
          "description": {
            "type": "string",
            "minLength": 8,
            "maxLength": 300
          }
        },
        "required": [
          "key",
          "description"
        ]
      }
    }
  },
  "required": [
    "kbId",
    "triggers"
  ]
}

kb.setHandoffEmail

Forward chat hand-overs to an existing help desk

When a customer asks the chat for a person, forward the conversation to this address (for example the support address of the help desk you already use), Reply-To the customer, instead of opening it in AskBase's inbox. Pass null to use the inbox again.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "email": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 254,
          "format": "email",
          "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "kbId",
    "email"
  ]
}

widget.create

Create a widget install

Create an embeddable widget and return its embed snippet. At least one allowed origin is required: the publishable key is public by design and carries no authority on its own, so the origin allowlist is what actually restricts use. Origins are matched exactly, including scheme and port.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "allowedOrigins": {
      "default": [],
      "description": "Where it may appear; add more later with widget.addWebsite",
      "type": "array",
      "items": {
        "type": "string",
        "format": "uri"
      }
    },
    "accentColor": {
      "default": "#111318",
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "launcherLabel": {
      "default": "Help",
      "type": "string",
      "maxLength": 40
    },
    "greeting": {
      "type": "string",
      "maxLength": 200
    },
    "suggestedQuestions": {
      "default": [],
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      }
    },
    "escalationUrl": {
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "kbId",
    "name"
  ]
}

widget.update

Update a widget install

Change a widget's copy, colours, suggested questions, whether it is enabled, or which collections it answers from (scope: only these, or all but these; null for everything).

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "installId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "isEnabled": {
      "type": "boolean"
    },
    "accentColor": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "launcherLabel": {
      "type": "string",
      "maxLength": 40
    },
    "placeholder": {
      "type": "string",
      "maxLength": 80
    },
    "greeting": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200
        },
        {
          "type": "null"
        }
      ]
    },
    "refusalMessage": {
      "type": "string",
      "maxLength": 300
    },
    "escalationUrl": {
      "anyOf": [
        {
          "type": "string",
          "format": "uri"
        },
        {
          "type": "null"
        }
      ]
    },
    "suggestedQuestions": {
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      }
    },
    "showBranding": {
      "description": "Show \"Powered by AskBase\" under the chat. Turning it off needs a paid plan.",
      "type": "boolean"
    },
    "scope": {
      "description": "Collections by category path, e.g. \"API\" or \"Billing/Invoices\"; a path covers the collections under it",
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "mode": {
              "type": "string",
              "enum": [
                "only",
                "except"
              ]
            },
            "categories": {
              "maxItems": 100,
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 200
              }
            }
          },
          "required": [
            "mode",
            "categories"
          ]
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "installId"
  ]
}

widget.install

Put the assistant on a website

Let the assistant appear on a website and return the snippet to paste into it. Give the address as a person would (acme.com). Both acme.com and www.acme.com are allowed. Reuses the help centre's widget if it has one, so calling this again with another site adds that site.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "website": {
      "type": "string",
      "minLength": 1,
      "description": "A website address as a person would type it: acme.com, www.acme.com, or a full URL"
    }
  },
  "required": [
    "kbId",
    "website"
  ]
}

widget.addWebsite

Let the assistant appear on another website

Allow a widget on one more website. Give the address as a person would (acme.com); both acme.com and www.acme.com are allowed. Pages on any other site that paste the snippet get nothing.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "installId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "website": {
      "type": "string",
      "minLength": 1,
      "description": "A website address as a person would type it: acme.com, www.acme.com, or a full URL"
    }
  },
  "required": [
    "installId",
    "website"
  ]
}

widget.removeWebsite

Stop the assistant appearing on a website

Remove a website from a widget. Takes effect on the next page load; conversations already open there end within two hours. Give the address as listed by widget.list, or as a person would type it.

Not available to keysdestructive
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "installId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "website": {
      "type": "string",
      "minLength": 1,
      "description": "A website address as a person would type it: acme.com, www.acme.com, or a full URL"
    }
  },
  "required": [
    "installId",
    "website"
  ]
}

Content

article.list

List articles

Articles in a knowledge base, with chunk counts and whether each was written here or crawled. Articles whose source has changed since a local edit are listed first, because those need a decision.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "limit": {
      "default": 200,
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 1000
    }
  },
  "required": [
    "kbId"
  ]
}

article.get

Read an article

Full markdown of one article, and its revision. Pass the revision to article.write when saving an edit so a change someone made in the meantime is not overwritten. When the source site has changed since a local edit, its current version is returned alongside so the two can be compared.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "articleId"
  ]
}

article.write

Write an article

Create or update an article, as markdown. To edit, read it with article.get, change the markdown, and pass back the whole body with the revision — the write is refused if someone saved in between. Saved as a draft unless status is published; the assistant answers from published text as soon as this returns. An article written or edited here is never overwritten by a later import. For a contributor, publishing or changing a live article sends it for review instead (returns submittedForReview), with the note for the reviewer.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.write \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"…","bodyMd":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "description": "Omit to create a new article",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "kbId": {
      "description": "Required when creating",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "path": {
      "description": "When creating: the address it is served at, e.g. /billing/refunds. Omit to derive one from the title, placed beside the help centre's other articles.",
      "type": "string"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1
    },
    "status": {
      "default": "draft",
      "type": "string",
      "enum": [
        "draft",
        "published",
        "archived"
      ]
    },
    "revision": {
      "description": "From article.get. Recommended when updating: refuses to overwrite a newer save",
      "type": "string"
    },
    "note": {
      "description": "For a contributor's submission: what changed and why, for the reviewer",
      "type": "string",
      "maxLength": 1000
    }
  },
  "required": [
    "title",
    "bodyMd"
  ]
}

article.acceptSource

Take the crawler's version

Discard the local edit and adopt the crawler's current text, returning the article to being crawler-owned so future crawls update it normally.

Full access keydestructive
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.acceptSource \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "articleId"
  ]
}

article.delete

Delete an article

Permanently remove an article and its chunks. A crawled article will reappear on the next crawl; to stop that, archive it or exclude its path from the source instead.

Full access keydestructive
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/article.delete \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "articleId"
  ]
}

Languages

language.list

The languages a help centre can be offered in

Every language AskBase can show a help centre and its chat in (code, name, and whether it reads right to left), with the help centre's own language and the others it currently offers.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/language.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

kb.setLanguages

Set a help centre's languages

The language its articles are written in, and the other languages it's offered in. Readers pick a language on the help centre (?lang=de); the chat follows the visitor's browser. autoPublishTranslations lets AI translations go live without review.

Not available to keys
Input schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "locales": {
      "maxItems": 30,
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[a-z]{2}$"
      }
    },
    "autoPublishTranslations": {
      "type": "boolean"
    }
  },
  "required": [
    "kbId",
    "locale",
    "locales"
  ]
}

translation.list

Where each article's translation stands

Every published article with its translation into one language: missing, draft (waiting for review), published, or outdated (the original changed since). hasDraft means an update is waiting beside a published one.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "kbId",
    "locale"
  ]
}

translation.get

Read an article's translation

The original article, its published translation in a language (if any), and the draft waiting for review (if any).

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "articleId",
    "locale"
  ]
}

translation.translate

Translate an article with AI

Drafts a translation of the article as it is now into one of the help centre's languages. It waits for review beside any published translation, unless the help centre publishes AI translations automatically.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.translate \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "articleId",
    "locale"
  ]
}

translation.translateAll

Translate every article that needs it

In the background, drafts translations into a language for every article with none yet, or whose translation is out of date and has no draft waiting. Returns how many it will do.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.translateAll \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "kbId",
    "locale"
  ]
}

translation.save

Edit a translation

Saves a translation's title and markdown as the draft waiting for review. The published translation doesn't change until it's published.

Propose changes key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.save \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…","locale":"…","title":"…","bodyMd":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "bodyMd": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "articleId",
    "locale",
    "title",
    "bodyMd"
  ]
}

translation.publish

Publish a translation

The waiting draft goes live for readers of that language, replacing the published translation.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.publish \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "articleId",
    "locale"
  ]
}

translation.publishAll

Publish every waiting translation in a language

Every draft translation in the language goes live at once. Returns how many.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.publishAll \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    }
  },
  "required": [
    "kbId",
    "locale"
  ]
}

translation.discard

Discard a translation

draft: throws away the waiting draft, keeping any published translation. all: removes the translation, so readers of that language see the original article.

Full access keydestructive
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/translation.discard \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"articleId":"…","locale":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "articleId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "locale": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "what": {
      "default": "draft",
      "type": "string",
      "enum": [
        "draft",
        "all"
      ]
    }
  },
  "required": [
    "articleId",
    "locale"
  ]
}

Facts

facts.list

The facts library

Every fact about the business AskBase has found in the help centre and website, or the team added: its topic, statement, sources (with the words that say it), and status. confirmed facts are relied on by drafts and answers; conflict means sources disagree (alternatives lists each version); suggested hasn't been looked at. mentions lists every article that states it; usedCount is how many answers and reply drafts relied on it.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/facts.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "kbId"
  ]
}

facts.add

Add a fact

A fact the team knows, in one sentence that includes the value ("Refunds are available for 14 days after purchase."). It's confirmed straight away.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/facts.add \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","statement":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "topic": {
      "default": "other",
      "type": "string",
      "enum": [
        "pricing",
        "plans",
        "limits",
        "billing",
        "accounts",
        "features",
        "integrations",
        "policies",
        "support",
        "other"
      ]
    },
    "subject": {
      "default": "",
      "type": "string",
      "maxLength": 80
    },
    "statement": {
      "type": "string",
      "minLength": 5,
      "maxLength": 300
    }
  },
  "required": [
    "kbId",
    "statement"
  ]
}

facts.update

Confirm, correct or dismiss a fact

confirm: it's right as found. edit: the team's wording replaces it, and it's confirmed (this settles a conflict). dismiss: not worth keeping. restore: back to suggested. Confirmed facts are what articles are checked against. After an edit, updates: check the articles that state it and draft updates for any still saying the old version (also any time, to recheck); noUpdates: leave them as they are.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/facts.update \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"factId":"…","action":"confirm"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "factId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "action": {
      "type": "string",
      "enum": [
        "confirm",
        "edit",
        "dismiss",
        "restore",
        "updates",
        "noUpdates"
      ]
    },
    "statement": {
      "type": "string",
      "minLength": 5,
      "maxLength": 300
    },
    "subject": {
      "type": "string",
      "maxLength": 80
    },
    "topic": {
      "type": "string",
      "enum": [
        "pricing",
        "plans",
        "limits",
        "billing",
        "accounts",
        "features",
        "integrations",
        "policies",
        "support",
        "other"
      ]
    }
  },
  "required": [
    "factId",
    "action"
  ]
}

facts.confirmAll

Confirm every suggested fact

Confirms all facts found but not yet looked at, optionally in one topic. Conflicts still need a decision each.

Full access key
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/facts.confirmAll \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "topic": {
      "type": "string",
      "enum": [
        "pricing",
        "plans",
        "limits",
        "billing",
        "accounts",
        "features",
        "integrations",
        "policies",
        "support",
        "other"
      ]
    }
  },
  "required": [
    "kbId"
  ]
}

facts.run

Find facts, or check articles against them

extract: reads every published article and the company's website and folds the facts into the library, flagging where sources disagree. check: compares articles with the confirmed facts and puts a fix for each contradiction in Suggested changes. Runs in the background; paid plans.

Propose changes keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/facts.run \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","kind":"extract"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "kind": {
      "type": "string",
      "enum": [
        "extract",
        "check"
      ]
    }
  },
  "required": [
    "kbId",
    "kind"
  ]
}

Answering

answer

Answer a question

Answer from the knowledge base, with citations. Returns a refusal rather than a guess when the documentation does not cover the question — a refusal is a correct outcome, and the refusalKind says which kind it was.

Read only keyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/answer \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","question":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "question": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000
    }
  },
  "required": [
    "kbId",
    "question"
  ]
}

retrieve

Inspect retrieval

Run retrieval without generating an answer, returning the full trace: what each arm found, the fused ranking, rerank scores, and what cleared the floor into context. Use this to work out why an answer was wrong — whether the content is missing, not retrieved, or retrieved and discarded.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/retrieve \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…","query":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "query": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "kbId",
    "query"
  ]
}

Insights

insights.overview

Usage overview

Headline numbers over a window: conversations, deflection rate, refusals, unresolved emails, ratings, median time to first token, and citations that pointed at nothing.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/insights.overview \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "days": {
      "default": 30,
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 365
    },
    "kbId": {
      "description": "One help centre; omit for the whole organisation",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  }
}

insights.gaps

Content gaps

Questions the documentation could not answer, grouped by meaning, most frequent first. This is the list to write articles from. Out-of-scope questions are excluded: they refuse for a different reason and are not gaps.

Read only keyread-onlyslow
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/insights.gaps \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "days": {
      "default": 30,
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 365
    },
    "maxClusters": {
      "default": 20,
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 50
    }
  },
  "required": [
    "kbId"
  ]
}

insights.triage

Why questions failed

Counts by failure stage, which separates four problems that each need a different fix: nothing indexed, indexed but not retrieved, retrieved but cut by the rerank floor, and in context but refused by the gate.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/insights.triage \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "days": {
      "default": 30,
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 365
    }
  },
  "required": [
    "kbId"
  ]
}

insights.contentHealth

Content health

Articles that reach the prompt but are never cited, and articles cited into answers people rated down. The first costs tokens for nothing; the second is probably wrong or out of date.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/insights.contentHealth \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kbId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "kbId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "days": {
      "default": 30,
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 365
    }
  },
  "required": [
    "kbId"
  ]
}

conversation.list

List conversations

Recent conversations across both routes. Filter by channel 'email' for the inbox, or by outcome 'refused' to see what went unanswered.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.list \
  -H "Authorization: Bearer $ASKBASE_API_KEY"
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "channel": {
      "type": "string",
      "enum": [
        "widget",
        "email",
        "playground"
      ]
    },
    "outcome": {
      "type": "string",
      "enum": [
        "open",
        "answered",
        "refused",
        "escalated",
        "abandoned",
        "errored"
      ]
    },
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 200
    },
    "kbId": {
      "description": "One help centre; omit for the whole organisation",
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  }
}

conversation.get

Read a conversation

One conversation with every turn and its full retrieval trace: per-arm ranks, rerank scores, what reached the prompt, the gate verdict, and what was cited.

Read only keyread-only
Input schema and example
curl -X POST https://askbase.com/api/v1/ops/conversation.get \
  -H "Authorization: Bearer $ASKBASE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"…"}'
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "conversationId": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "required": [
    "conversationId"
  ]
}