Docs · API · Brand Profiles

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#

POST/v1/brand-profiles
FieldTypeDescription
namestringrequiredDisplay name, 1–120 characters.
website_urlstring (url)optionalThe company site. With ingest_website (default true) it is crawled into the knowledge base immediately.
descriptionstringoptionalWhat the company does (≤2000 chars). Used as context during planning.
industrystringoptional≤200 chars.
audiencestringoptionalDefault audience for articles under this profile (≤500 chars).
default_languagestringdefault: "en"≤12 chars.
ingest_websitebooleandefault: trueWhen true and website_url is set, creates a website source and starts an ingest job in one call.
Request
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
  }'
Response · 201 Created
{
  "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#

GET/v1/brand-profiles
Response · 200 OK
{
  "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.

POST/v1/brand-profiles/{id}/sources
FieldTypeDescription
type"website" | "url" | "text" | "writing_sample"requiredwebsite 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.
urlstring (url)conditionalRequired for website and url types — otherwise 400 invalid_request.
contentstringconditionalRequired for text and writing_sample types (≤200,000 chars).
titlestringoptionalLabel shown in source listings (≤300 chars).
Request
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…"
  }'
Response · 202 Accepted
{
  "id": "72e5a1c9-8d40-4b3f-a6e7-05c1d9b82f34",
  "object": "kb_source",
  "status": "pending",
  "ingest_job_id": "5b8f0d21-6a3e-4c97-b1d0-84e7f2a9c655"
}

Ingestion status#

Sources move through:

FieldTypeDescription
pendinginitialAccepted, waiting for the ingest job.
crawlingrunningFetching pages (website/url types). page_count ticks up live.
processingrunningChunking, contextualizing, embedding, indexing.
readyterminalIndexed and searchable. chunk_count is final.
errorterminalIngestion failed; the error field says why. Re-add the source to retry.
GET/v1/brand-profiles/{id}/sources
Response · 200 OK
{
  "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_sample sources 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 extractingready. Articles referencing the profile use whatever is ready at generation time — you never have to wait for extraction to finish.