Senso
Sign in

Brand Kit

The org-wide identity config that controls voice, tone, and writing rules across all generated content.

πŸ’‘ Building a query-only agent? Skip this page. Brand kit is only needed for content generation. If your agent just ingests raw sources and queries them, you don't need a brand kit.

The brand kit is the single source of truth for how generated content should sound. It controls voice, tone, persona, and writing rules β€” and it applies to every generation call automatically. Without a brand kit, the content engine has no identity guidance, and output will sound generic.

---

When to configure a brand kit

An agent should interact with the brand kit in these situations:

  • First-time setup β€” Before any content generation, check if a brand kit exists. If not, ask the user for their brand identity and set one up.
  • Output sounds generic β€” If generated content lacks personality or doesn't match the org's voice, the brand kit is likely missing or underspecified. Review and strengthen it.
  • User requests a tone change β€” "Make our content more casual" or "We're rebranding" means updating the brand kit, not adjusting individual generation calls.
  • New writing standards β€” When the org adopts new style rules (e.g., "stop using passive voice"), add them to global_writing_rules.
  • ---

    Updating the brand kit

    There are two ways to update the brand kit:

  • PATCH β€” merges only the keys you provide into the existing guidelines. Safe for single-field updates.
  • PUT β€” fully replaces the entire guidelines object. Use this when setting up from scratch or replacing everything.
  • Partial update with PATCH

    Use PATCH when you only want to change one or a few fields without affecting the rest:

    import os, requests
    
    KEY  = os.environ["SENSO_API_KEY"]
    BASE = "https://apiv2.senso.ai/api/v1"
    HEADERS = {"X-API-Key": KEY, "Content-Type": "application/json"}
    
    resp = requests.patch(f"{BASE}/org/brand-kit", headers=HEADERS, json={
        "guidelines": {
            "voice_and_tone": "Warm and approachable, like a trusted advisor"
        }
    })
    print(resp.json()["brand_kit_id"])
    curl -X PATCH https://apiv2.senso.ai/api/v1/org/brand-kit \
      -H "X-API-Key: $SENSO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "guidelines": {
          "voice_and_tone": "Warm and approachable, like a trusted advisor"
        }
      }'

    Full replacement with PUT

    If you need to replace the entire brand kit or are setting it up from scratch, use PUT. Because PUT is a full replacement, the correct workflow is read β†’ merge β†’ write to avoid losing existing fields:

    # 1. Get the current brand kit
    current = requests.get(f"{BASE}/org/brand-kit", headers=HEADERS).json()
    guidelines = current.get("guidelines", {})
    
    # 2. Merge changes
    guidelines["voice_and_tone"] = "Warm and approachable, like a trusted advisor"
    
    # 3. Write the full updated object
    resp = requests.put(f"{BASE}/org/brand-kit", headers=HEADERS, json={
        "guidelines": guidelines
    })
    print(resp.json()["brand_kit_id"])
    # 1. Get the current brand kit
    curl https://apiv2.senso.ai/api/v1/org/brand-kit \
      -H "X-API-Key: $SENSO_API_KEY"
    
    # 2. Merge changes client-side, then write the full object
    curl -X PUT https://apiv2.senso.ai/api/v1/org/brand-kit \
      -H "X-API-Key: $SENSO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "guidelines": {
          "brand_name": "Acme Credit Union",
          "voice_and_tone": "Warm and approachable, like a trusted advisor",
          "author_persona": "Senior financial advisor",
          "global_writing_rules": ["Use active voice"]
        }
      }'

    If no brand kit exists yet, GET returns an empty state and the agent should create one from scratch.

    ---

    Setting up a brand kit

    resp = requests.put(f"{BASE}/org/brand-kit", headers=HEADERS, json={
        "guidelines": {
            "brand_name":           "Acme Credit Union",
            "brand_domain":         "acmecu.com",
            "brand_description":    "Member-owned credit union serving small businesses since 1985",
            "voice_and_tone":       "Warm, knowledgeable, and jargon-free. Like a trusted neighbour who happens to be a financial expert.",
            "author_persona":       "Senior financial advisor with 15 years of experience",
            "global_writing_rules": [
                "Use active voice",
                "Keep sentences under 25 words",
                "Avoid acronyms unless defined on first use",
                "Always include a next step for the reader",
            ],
        }
    })
    brand_kit = resp.json()
    print(f"Brand kit ID: {brand_kit['brand_kit_id']}")
    curl -X PUT https://apiv2.senso.ai/api/v1/org/brand-kit \
      -H "X-API-Key: $SENSO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "guidelines": {
          "brand_name": "Acme Credit Union",
          "brand_domain": "acmecu.com",
          "brand_description": "Member-owned credit union serving small businesses since 1985",
          "voice_and_tone": "Warm, knowledgeable, and jargon-free. Like a trusted neighbour who happens to be a financial expert.",
          "author_persona": "Senior financial advisor with 15 years of experience",
          "global_writing_rules": [
            "Use active voice",
            "Keep sentences under 25 words",
            "Avoid acronyms unless defined on first use",
            "Always include a next step for the reader"
          ]
        }
      }'

    The guidelines field is free-form JSON. You can add any fields you want, but the content engine looks for these canonical fields during generation:

    What each field controls

    FieldEffect on generated content
    brand_nameAppears in headings, references, and attribution. Without it, the engine may use generic placeholders.
    brand_domainUsed for internal links in generated content. Set this so CTAs and references point to the right place.
    brand_descriptionGives the engine context about what the org does. A strong description produces more relevant, on-topic content.
    voice_and_toneThe highest-impact field. Controls how the output reads. Specific descriptions produce dramatically better results (see below).
    author_personaShapes expertise level and perspective. A "developer advocate" writes differently from a "senior financial advisor."
    global_writing_rulesHard rules applied to every piece of generated content, across all content types. These layer with content-type-specific rules.

    Voice and tone: specificity matters

    This is the field that most affects output quality. Compare:

    Vague β€” produces generic, forgettable content:

    "Professional and friendly"

    Specific β€” produces content with a distinct voice:

    "Warm, knowledgeable, and jargon-free. Like a trusted neighbour who happens to be a financial expert. Explain concepts as if the reader is smart but unfamiliar with the topic. Use analogies from everyday life."

    When helping a user define their voice, ask them: "Who do you want to sound like when talking to your customers?" Their answer maps directly to this field.

    Writing rules: make them testable

    Good rules are binary β€” a reviewer can check yes or no:

    Weak ruleStrong rule
    "Write clearly""Keep sentences under 25 words"
    "Be concise""Articles must be under 800 words"
    "Use simple language""Write at an 8th-grade reading level"
    "Be consistent""Avoid acronyms unless defined on first use"
    ---

    How the brand kit flows into generation

    Brand Kit (org-wide)
      β”œβ”€β”€ voice_and_tone      β†’ controls writing style
      β”œβ”€β”€ author_persona      β†’ controls expertise and perspective
      β”œβ”€β”€ global_writing_rules β†’ hard constraints on all output
      β”‚
      β–Ό
    Content Type (per-template)
      β”œβ”€β”€ template            β†’ controls format and structure
      β”œβ”€β”€ writing_rules       β†’ additional rules for this format
      β”‚
      β–Ό
    Generation output
      = brand identity + content type format + compiled knowledge base
    

    Global writing rules from the brand kit and per-content-type writing rules both apply during generation. Use global rules for org-wide standards and content-type rules for format-specific guidance. See Content Types for details on how rules layer.

    ---

    Retrieving your brand kit

    resp = requests.get(f"{BASE}/org/brand-kit", headers=HEADERS)
    brand_kit = resp.json()
    print(brand_kit["guidelines"])
    curl https://apiv2.senso.ai/api/v1/org/brand-kit \
      -H "X-API-Key: $SENSO_API_KEY"

    ---

    Using the CLI

    If you're using the Senso CLI, you can manage the brand kit with:

    # View current brand kit
    senso brand-kit get --output json
    
    # Full replacement (PUT) β€” overwrites all existing fields
    senso brand-kit set --data '{
      "guidelines": {
        "brand_name": "Acme Credit Union",
        "voice_and_tone": "Warm and approachable",
        "author_persona": "Senior financial advisor",
        "global_writing_rules": ["Use active voice"]
      }
    }'
    
    # Partial update (PATCH) β€” only changes the fields you send, preserves the rest
    senso brand-kit patch --data '{
      "guidelines": {
        "voice_and_tone": "Casual and direct"
      }
    }'

    ---

    Errors

    StatusMeaning
    400Validation error β€” guidelines must be a valid JSON object
    401Missing or invalid API key