Brand profiles.
A brand profile is the difference between generic AI content and articles that know your products, cite your case studies, and sound like your founder wrote them. It bundles a knowledge base, a compiled fact sheet, and an extracted voice profile.
Create a brand profile#
/v1/brand-profiles| Field | Type | Description | |
|---|---|---|---|
| name | string | required | Display name, 1–120 characters. |
| website_url | string (url) | optional | The company site. With ingest_website (default true) it is crawled into the knowledge base immediately. |
| description | string | optional | What the company does (≤2000 chars). Used as context during planning. |
| industry | string | optional | ≤200 chars. |
| audience | string | optional | Default audience for articles under this profile (≤500 chars). |
| default_language | string | default: "en" | ≤12 chars. |
| ingest_website | boolean | default: true | When true and website_url is set, creates a website source and starts an ingest job in one call. |
curl -X POST https://scribe.whizztech.ai/v1/brand-profiles \
-H "Authorization: Bearer $SCRIBE_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Analytics",
"website_url": "https://www.acme-analytics.com",
"description": "Self-serve product analytics for B2B SaaS teams",
"industry": "B2B SaaS / analytics",
"audience": "Product managers and growth engineers",
"default_language": "en",
"ingest_website": true
}'{
"id": "bfa6d2a7-4c1e-4f7a-9a2b-91d3f0a6c8e2",
"object": "brand_profile",
"name": "Acme Analytics",
"website_url": "https://www.acme-analytics.com",
"voice_status": "none",
"ingest_job_id": "0c9be9a4-2b77-4e19-8a5d-f21e6b40c7d3"
}ingest_job_id is the crawl job — poll it at /v1/jobs/{id} or just watch the source status flip to ready. It is null when no website ingestion was started.
List brand profiles#
/v1/brand-profiles{
"object": "list",
"data": [
{
"id": "bfa6d2a7-4c1e-4f7a-9a2b-91d3f0a6c8e2",
"name": "Acme Analytics",
"website_url": "https://www.acme-analytics.com",
"voice_status": "ready",
"default_language": "en",
"created_at": "2026-07-01T08:12:44.000Z"
}
]
}Knowledge-base sources#
Sources feed the knowledge base. Ingestion crawls or chunks the content, generates situating context per chunk (contextual retrieval), embeds everything for hybrid search, then refreshes the profile's fact sheet and voice profile.
/v1/brand-profiles/{id}/sources| Field | Type | Description | |
|---|---|---|---|
| type | "website" | "url" | "text" | "writing_sample" | required | website crawls the whole site from the given URL; url ingests a single page; text ingests raw text; writing_sample ingests text and drives the voice profile. |
| url | string (url) | conditional | Required for website and url types — otherwise 400 invalid_request. |
| content | string | conditional | Required for text and writing_sample types (≤200,000 chars). |
| title | string | optional | Label shown in source listings (≤300 chars). |
curl -X POST https://scribe.whizztech.ai/v1/brand-profiles/bfa6d2a7-4c1e-4f7a-9a2b-91d3f0a6c8e2/sources \
-H "Authorization: Bearer $SCRIBE_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "writing_sample",
"title": "Founder blog — pricing teardown",
"content": "Full text of a post that sounds exactly like the brand…"
}'{
"id": "72e5a1c9-8d40-4b3f-a6e7-05c1d9b82f34",
"object": "kb_source",
"status": "pending",
"ingest_job_id": "5b8f0d21-6a3e-4c97-b1d0-84e7f2a9c655"
}Ingestion status#
Sources move through:
| Field | Type | Description |
|---|---|---|
| pending | initial | Accepted, waiting for the ingest job. |
| crawling | running | Fetching pages (website/url types). page_count ticks up live. |
| processing | running | Chunking, contextualizing, embedding, indexing. |
| ready | terminal | Indexed and searchable. chunk_count is final. |
| error | terminal | Ingestion failed; the error field says why. Re-add the source to retry. |
/v1/brand-profiles/{id}/sources{
"object": "list",
"data": [
{
"id": "31c7e8f2-9b04-4d6a-8e51-c2a7f6d90b13",
"type": "website",
"url": "https://www.acme-analytics.com",
"title": "Acme Analytics",
"status": "ready",
"page_count": 42,
"chunk_count": 318,
"error": null
},
{
"id": "72e5a1c9-8d40-4b3f-a6e7-05c1d9b82f34",
"type": "writing_sample",
"url": null,
"title": "Founder blog — pricing teardown",
"status": "processing",
"page_count": 1,
"chunk_count": 0,
"error": null
}
]
}The voice profile#
After each successful ingestion the engine recompiles two artifacts from the corpus:
- Fact sheet — a distilled company brief (products, differentiators, named clients, numbers) that grounds article claims about your business.
- Voice profile — a portable style guide: tone adjectives, sentence mechanics, always/never vocabulary, structural habits, and imperative rules for a writer. When
writing_samplesources exist they take priority over crawled pages, so two or three strong samples noticeably outperform a whole crawled site for voice.
voice_status on the profile tracks this: none → extracting → ready. Articles referencing the profile use whatever is ready at generation time — you never have to wait for extraction to finish.