Weav

Update article

Updating an existing locale's title, content, excerpt, or slug records a revision of its prior content. SEO-only changes do not create a revision. Adding a new locale requires both title and content.

Updating an existing locale's title, content, excerpt, or slug records a revision of its prior content. SEO-only changes do not create a revision. Adding a new locale requires both title and content.

PUT https://api.weav.com/v1/kb-articles/{id}

Requires a token with the external-api:write ability.

Path parameters

idstringrequired

Format: uuid.

Body

category_idstring | null

Format: uuid.

statusstring | null

One of: draft, published.

translationsarray<object>

Request

cURL
curl --request PUT \
  --url 'https://api.weav.com/v1/kb-articles/{id}' \
  --header "Authorization: Bearer ${WEAV_API_TOKEN}" \
  --header 'Content-Type: application/json' \
  --data '{
  "category_id": "9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d",
  "status": "draft",
  "translations": [
    {
      "locale": "en"
    }
  ]
}'
JavaScript
const body = {
  "category_id": "9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d",
  "status": "draft",
  "translations": [
    {
      "locale": "en"
    }
  ]
};
const response = await fetch("https://api.weav.com/v1/kb-articles/{id}", {
  method: "PUT",
  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 = {"category_id": "9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d", "status": "draft", "translations": [{"locale": "en"}]}
response = requests.put("https://api.weav.com/v1/kb-articles/{id}", headers=headers, json=body)
print(response.json())
PHP
use GuzzleHttp\Client;

$client = new Client();
$response = $client->request('PUT', 'https://api.weav.com/v1/kb-articles/{id}', [
    'headers' => ['Authorization' => 'Bearer '.getenv('WEAV_API_TOKEN')],
    'json' => array (
  'category_id' => '9b2f6c1e-3d4a-4f5b-8c7d-1e2f3a4b5c6d',
  'status' => 'draft',
  'translations' => 
  array (
    0 => 
    (object) array(
       'locale' => 'en',
    ),
  ),
),
]);
echo $response->getBody();

Response

200 OK
{
    "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": {}
}
  • 404 Not Found
  • 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.