# Personalize for a prospect's brand

> Use observed brand context to write to a company that you do not work with yet: from a work email to a first line in its terms, with code and limits.

Observed context is context read from a company's public website. If all you have is a work email, an observed endpoint is the right tool. It reads the public website of the company and needs nothing from the company. Use it to understand the prospect, not to imitate the prospect. The Brandfetch Brand Context API takes the email directly. It returns what the company sells, who it sells to, and how it talks about itself.

## The flow

1. Take the domain from the work email. The Brandfetch Brand Context API accepts the email as it is. The Context.dev Brand endpoint also has a lookup by email.
2. Ask for the profile and keep `positioning` and `identity`. Voice is less important, because you write as yourself to them.
3. Write one line that shows that you know what they do. Use `value_proposition` or a product name.
4. Before you use a number, make sure that it is correct.

```ts
export async function openingLine(email: string, draft: (prompt: string) => Promise<string>) {
  const res = await fetch(`https://api.brandfetch.io/v2/context/${encodeURIComponent(email)}`, {
    headers: { Authorization: `Bearer ${process.env.BRANDFETCH_API_KEY}`, Accept: "application/json" },
  });
  if (!res.ok) return null; // 404 or 422: write without it
  const c = await res.json();
  return draft(
    [
      `Write one sentence opening a sales email to someone at ${c.meta.canonical_name}.`,
      `What they do: ${c.positioning.value_proposition}`,
      `Their products: ${c.positioning.products_and_services.map((p: { name: string }) => p.name).join(", ")}`,
      "Mention one product by name. Don't quote prices or customer numbers.",
    ].join("\n")
  );
}
```

```python
import os
from urllib.parse import quote
import httpx

def opening_line(email: str, draft) -> str | None:
    res = httpx.get(
        f"https://api.brandfetch.io/v2/context/{quote(email)}",
        headers={"Authorization": f"Bearer {os.environ['BRANDFETCH_API_KEY']}", "Accept": "application/json"},
        timeout=30,
    )
    if res.status_code != 200:
        return None  # 404 or 422: write without it
    c = res.json()
    products = ", ".join(p["name"] for p in c["positioning"]["products_and_services"])
    return draft(
        f"Write one sentence opening a sales email to someone at {c['meta']['canonical_name']}.\n"
        f"What they do: {c['positioning']['value_proposition']}\n"
        f"Their products: {products}\n"
        "Mention one product by name. Don't quote prices or customer numbers."
    )
```

Brandfetch resolves the email to its domain. The Brandfetch documentation says that Brandfetch does not store the address.

## What to watch

- First lookups are slow. For a domain that Brandfetch has not seen, the build takes about 10 to 12 seconds. Do the lookup when the lead arrives, not when you send the email.
- Profiles can be weeks old. Brandfetch read the Linear profile 26 days before we asked. A new product can be missing, and a price can be out of date.
- The Brandfetch developer terms restrict the use of its content in AI models without consent. Before you build this, read the terms for your use. The [Brand Context API page](https://brandcontextapi.com/responses/brandfetch-brand-context-api#before-you-pass-it-to-a-model) gives the details.
- Do not borrow their voice. An email to a prospect in the prospect's own brand voice reads as odd. Their voice is useful for a demo built for them, not for your email.

## When the prospect is worth more than an email

Sometimes you make real work in the prospect's brand before they sign, for example a personalized demo, mock-ups or a pilot. A description of their website gives a model too little to design from. Add their brand to Rainbrand from their website, and request a Brief for the piece of work. The Brief gives you guidance, rules and files for that work. If the prospect becomes a customer, their brand is already in place for every job after that. See [Customer brands in your product's jobs](https://brandcontextapi.com/recipes/customer-brands-in-your-product).

---

Source: https://brandcontextapi.com/recipes/personalize-for-a-prospect
Last updated: 2026-11-11
Published by The Brand Object. The Brand Object is run by Rainbrand, which makes two of the endpoints described here. Their pages follow the same rules as the others.
