Knowledge Base API
Search manufacturer technical documentation programmatically. Use these endpoints to build LLM-powered integrations that reference Biamp, Crestron, and other manufacturer knowledge bases.
GET /api/v1/knowledge-base/manufacturers
List all available manufacturer knowledge bases with article counts. Use this to discover which manufacturers have documentation before searching.
Response (200 - Success)
{
"success": true,
"data": [
{
"slug": "biamp",
"displayName": "Biamp",
"description": "Tesira, Devio, Parle, Vocia product families",
"articleCount": 1298,
"lastImportedAt": "2026-04-19T15:30:00Z",
"isActive": true
},
{
"slug": "crestron",
"displayName": "Crestron",
"description": "Control systems, SIMPL programming, hardware",
"articleCount": 3533,
"lastImportedAt": "2026-04-19T15:30:00Z",
"isActive": true
}
],
"timestamp": "2026-04-20T12:00:00Z"
}
GET /api/v1/knowledge-base/manufacturers/{slug}
Get details for a single manufacturer knowledge base.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
slug |
string | Manufacturer slug (e.g. biamp, crestron) |
Response (200 - Success)
{
"success": true,
"data": {
"slug": "biamp",
"displayName": "Biamp",
"description": "Tesira, Devio, Parle, Vocia product families",
"articleCount": 1298,
"lastImportedAt": "2026-04-19T15:30:00Z",
"isActive": true
},
"timestamp": "2026-04-20T12:00:00Z"
}
POST /api/v1/knowledge-base/search
Search one manufacturer's documentation for a question. The response holds the passages of that documentation that match the question, best match first. Each passage names the article it belongs to, with the article's id, title and source URL. This is the endpoint to give an LLM as a tool when it needs wiring rules, port specifications, configuration steps or troubleshooting guidance.
Each article's text is divided into passages of at most 400 words, and the search ranks each passage on its own. A short article is a single passage, so the search returns its whole text.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
query |
string | Yes | The question, in plain language |
manufacturer |
string | Yes | Manufacturer slug from GET /api/v1/knowledge-base/manufacturers (e.g. biamp). Upper and lower case are treated alike, and spaces around the slug are ignored |
limit |
integer | No | Maximum number of passages, 1 to 10 (default 5). A value outside that range is moved to the nearest end of it |
The passages of one response hold at most 3,000 words in total, so a response can hold fewer passages than limit.
Changed on 9 October 2026
Before this date the endpoint returned one row per article. It now returns one row per passage, and the request, the rows in results and the error body changed with it. An integration written for the article search needs these changes:
| Before | Now |
|---|---|
Request: manufacturer was optional |
manufacturer is required |
Request: limit defaulted to 10 |
limit defaults to 5 and is held to 1 to 10 |
Request: category, threshold |
Not read. A request that still sends them is accepted and searched without them |
Row: id |
articleId |
Row: contentSnippet, the first 500 characters of the article |
text, the passage that matches |
Row: similarity, rerankScore |
score, the reranker's relevance score |
Row: matchType (Semantic, Keyword, Hybrid) |
match (semantic, keyword, hybrid) |
Row: summary, category |
Removed, with no replacement |
Row: title, sourceUrl, productLine, manufacturerSlug, manufacturerName |
Unchanged |
Response: no manufacturer, no creditsCharged |
Both are returned beside query and totalResults |
Error: "error": "Query is required", a string |
"error": { "code", "message", "details" }, an object. See Error Responses below |
A removed field is absent from the response, so code that still reads id or contentSnippet gets no value and no error.
Example Request
POST /api/v1/knowledge-base/search
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
{
"query": "Dante port wiring requirements for TesiraFORTE",
"manufacturer": "biamp",
"limit": 5
}
Response (200 - Success)
{
"success": true,
"query": "Dante port wiring requirements for TesiraFORTE",
"manufacturer": "biamp",
"results": [
{
"articleId": 42,
"title": "TesiraFORTE Network Configuration",
"manufacturerName": "Biamp",
"manufacturerSlug": "biamp",
"productLine": "tesira",
"sourceUrl": "https://support.biamp.com/...",
"text": "The TesiraFORTE connects via Dante...",
"score": 0.912,
"match": "hybrid"
}
],
"totalResults": 1,
"creditsCharged": 1,
"timestamp": "2026-10-09T12:00:00Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
success |
boolean | true for a search that ran, with or without passages. false in an error response |
query |
string | The question as it was searched, with the spaces around it removed |
manufacturer |
string | The slug as it was searched, in lower case with the spaces around it removed |
results |
array | The passages, best match first |
totalResults |
integer | Number of passages in results |
creditsCharged |
number | Credits charged for this search: the price of one search when passages are returned, 0 when none are |
timestamp |
string | When the response was written, in UTC |
Passage Fields
Every passage in results carries the same nine fields. A field with no value is null.
| Field | Type | Description |
|---|---|---|
articleId |
integer | Id of the article the passage belongs to. Two passages of the same article carry the same id |
title |
string | Title of that article |
manufacturerName |
string | Display name of the manufacturer |
manufacturerSlug |
string | Slug of the manufacturer |
productLine |
string or null |
Product line of the article, when the article has one |
sourceUrl |
string or null |
Address of the article on the manufacturer's site, when the article has one |
text |
string | The text of the passage |
score |
number or null |
The reranker's relevance score for the passage, rounded to three decimal places. A higher score is a closer match. null when the reranker did not score the passage |
match |
string | How the search found the passage: semantic (by meaning), keyword (by matching words) or hybrid (both) |
A search that finds no passage also answers 200, with an empty results array, "totalResults": 0 and "creditsCharged": 0.
Credits
A search costs 1 credit. A search is charged whenever passages come back, and it has no relevance cut-off, so a search of a manufacturer that has documentation returns passages and is charged nearly every time. A search that returns no passage, names an unknown manufacturer or fails is not charged.
The credit balance is checked before the search runs. An organization without the credit gets INSUFFICIENT_CREDITS and no search is made. A key or user with read-only access gets READ_ONLY_ACCESS, and nothing is searched or charged.
Error Responses
| Status | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR |
query is missing or blank ("Query is required"), or manufacturer is missing or blank ("Manufacturer is required"). Nothing is searched or charged |
| 400 | INSUFFICIENT_CREDITS |
The organization does not have the credit for one search ("Insufficient credits for knowledge base search"). Nothing is charged |
| 403 | READ_ONLY_ACCESS |
The key or user making the request has read-only access ("You don't have permission. Contact your administrator."). Nothing is searched or charged |
| 404 | MANUFACTURER_NOT_FOUND |
No active manufacturer has the slug ("Unknown manufacturer 'nosuch'"). Nothing is charged |
| 503 | SEARCH_FAILED |
The search could not be completed ("Knowledge base search failed. Nothing was charged.") |
Two answers come before this endpoint runs and are not in the table: 401 for a request without a valid token or API key, and 403 SUBSCRIPTION_REQUIRED for an organization without a subscription that is active, trialing or past due. See Error Handling.
An error carries its code, its message and, for some errors, a hint in details:
{
"success": false,
"error": {
"code": "MANUFACTURER_NOT_FOUND",
"message": "Unknown manufacturer 'nosuch'",
"details": "GET /api/v1/knowledge-base/manufacturers lists the slugs."
},
"timestamp": "2026-10-09T12:00:00Z"
}
LLM Integration Pattern
To use these endpoints as tools for an external LLM agent:
- Discover available manufacturers and their slugs with
GET /manufacturers - Search one manufacturer's documentation with
POST /search, using the manufacturer's slug and a natural language question. The passages in the response are the documentation text to hand to the LLM
The search matches passages by meaning and by matching words, and a reranker then puts the matches in order. A query written as a full question works best. For example, "How do I wire IR ports on an HD-CTL-101" with the manufacturer crestron searches the Crestron documentation for the passages about IR port wiring.
