Weav

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 | null

Format: uuid.

statusstring | null

Defaults to draft

One of: draft, published.

translationsarray<object>required

Request

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": {}
}
  • 401 Unauthorized

Response fields

idstring

Format: uuid.

category_idstring | null

Format: uuid.

positioninteger | null
statusstring

One of: draft, published.

published_atstring | null

Format: date-time.

sourcestring

One of: manual, auto_generated, github, mcp.

translationsarray<object>
created_atstring | null

Format: date-time.

updated_atstring | null

Format: date-time.