Create article
Lazily creates the organization's knowledge base if this is its first write. Accepts one or more locale translations.
Lazily creates the organization's knowledge base if this is its first write. Accepts one or more locale translations.
POST https://api.weav.com/v1/kb-articles
Requires a token with the external-api:write ability.
Body
category_idstring | nullFormat: uuid.
statusstring | nullDefaults to draft
One of: draft, published.
translationsarray<object>requiredRequest
cURL
curl --request POST \
--url 'https://api.weav.com/v1/kb-articles' \
--header "Authorization: Bearer ${WEAV_API_TOKEN}" \
--header 'Content-Type: application/json' \
--data '{
"translations": [
{
"locale": "en",
"title": "string",
"content": "string"
}
]
}'
JavaScript
const body = {
"translations": [
{
"locale": "en",
"title": "string",
"content": "string"
}
]
};
const response = await fetch("https://api.weav.com/v1/kb-articles", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WEAV_API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
});
console.log(await response.json());
Python
import os
import requests
headers = {"Authorization": f"Bearer {os.environ['WEAV_API_TOKEN']}"}
body = {"translations": [{"locale": "en", "title": "string", "content": "string"}]}
response = requests.post("https://api.weav.com/v1/kb-articles", headers=headers, json=body)
print(response.json())
PHP
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST', 'https://api.weav.com/v1/kb-articles', [
'headers' => ['Authorization' => 'Bearer '.getenv('WEAV_API_TOKEN')],
'json' => array (
'translations' =>
array (
0 =>
(object) array(
'locale' => 'en',
'title' => 'string',
'content' => 'string',
),
),
),
]);
echo $response->getBody();
Response
201 Created
{
"id": "9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d",
"category_id": "9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d",
"position": 0,
"status": "draft",
"published_at": "2026-01-01T00:00:00Z",
"source": "manual",
"translations": [
{
"locale": "en",
"title": "string",
"slug": "string",
"content": "string",
"excerpt": "string",
"seo_title": "string",
"noindex": false,
"canonical_url": "https://example.com",
"og_image_url": "https://example.com",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
],
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}
422 Unprocessable Content
{
"error": "Error message",
"code": "ERROR_CODE",
"errors": {}
}
401Unauthorized
Response fields
idstringFormat: uuid.
category_idstring | nullFormat: uuid.
positioninteger | nullstatusstringOne of: draft, published.
published_atstring | nullFormat: date-time.
sourcestringOne of: manual, auto_generated, github, mcp.
translationsarray<object>created_atstring | nullFormat: date-time.
updated_atstring | nullFormat: date-time.
