Get Brand

Retrieve a brand's full context including identity, competitors, brand pages, technical audit, and voice profile.

GEThttps://api.boringmarketing.com/brands/{brand_id}

Returns the full brand context. The response includes every field the pipeline has populated so far — brand identity (from enrichment), crawled pages, competitors, technical audit results, and voice profile.

Path parameters

brand_idstringrequired

The brand UUID returned from POST /brands.

Response

{
  "id": "ea502f67-338b-47e4-a245-5c4eea8bd8d2",
  "domain": "yourdomain.com",
  "name": "Your Brand",
  "created_at": "2026-04-01T12:00:00Z",
  "updated_at": "2026-04-07T10:28:00Z",

  "competitors": [
    {
      "domain": "competitor1.com",
      "type": "business",
      "tier": "direct",
      "confidence": 0.82,
      "reason_codes": ["same_jtbd", "shared_icp"],
      "source_tags": ["tavily_research"],
      "evidence": ["https://example.com/article"]
    }
  ],

  "description": "What your company does, extracted from crawl.",
  "positioning": "Where you sit in the category.",
  "icp": "Target customer profile.",
  "services": ["service 1", "service 2"],
  "capabilities": ["capability 1", "capability 2"],
  "differentiators": ["why you are different"],
  "terminology": ["priority_term", "house_term"],
  "product_category": "marketing-intelligence",
  "business_model": "saas",

  "voice_profile": {
    "tone": ["direct", "anti-hype"],
    "banned_phrases": [],
    "preferred_patterns": []
  },

  "brand_identity": { "additional_identity_fields": "..." },

  "brand_context": null,
  "technical_context": null,
  "llm_context": null,

  "brand_pages": [
    { "url": "https://yourdomain.com/", "title": "Home", "word_count": 842 }
  ]
}

competitors — array of Competitor objects

Each element is a full Competitor object, not a bare domain string:

FieldTypeNotes
domainstringNormalized (lowercased, protocol and www. stripped, trailing slashes removed).
type"business" | "serp" | "content"Unknown values normalize to "business".
tier"direct" | "adjacent" | "content"Unknown values normalize to "adjacent".
confidencefloat0.0–1.0.
reason_codesstring[]Why this competitor was added (e.g. same_jtbd, shared_icp).
source_tagsstring[]Which system surfaced it (e.g. tavily_research, manual).
evidencestring[]URLs / quotes supporting the classification.

PATCH /brands/{id} accepts either full Competitor objects or bare strings — bare strings are auto-upgraded with default type="business", tier="adjacent", confidence=0.

Context fields are nullable

brand_context, technical_context, and llm_context are typed as object | null with no guaranteed schema. They are null until the corresponding enrichment runs:

FieldPopulated by
brand_contextPOST /brands/{id}/enrich/brand (may contain trust signals, certifications, testimonials — exact keys depend on what the crawl surfaced)
technical_contextPOST /brands/{id}/enrich/technical (typically health_score, pages_crawled, issues_count, crawl_date)
llm_contextPOST /brands/{id}/enrich/llm (typically per-platform citation counts)

Treat the inner shape as advisory. The pipeline may add, rename, or reshape keys without a breaking change to the brand response — your consumer should tolerate unknown keys and null.

terminology

list[str], not a dict. Each entry is a canonical term the brand prefers to use in drafts.

Field notes

FieldPopulated by
description, positioning, icp, services, capabilities, differentiators, terminology, product_category, business_model, voice_profile, brand_identity, brand_context, brand_pagesPOST /brands/{id}/enrich/brand
technical_contextPOST /brands/{id}/enrich/technical
llm_contextPOST /brands/{id}/enrich/llm
competitorsPOST /brands/{id}/discover-competitors or PATCH /brands/{id}

Freshly created brands have most fields empty or null until the enrichment endpoints run.

Errors

StatusMeaning
404Brand not found, or not owned by the caller.
422brand_id is not a valid UUID.

Example

curl -H "X-API-Key: $BM_API_KEY" \
  https://api.boringmarketing.com/brands/$BRAND_ID