# Brands Source: https://docs.native.no/norn/brands > **Preview.** The Norn API is not live yet. This page describes the planned interface; names and fields can change before access opens. A brand is who Norn suggests ideas for. Create one from a website, check what Norn read, and correct anything it got wrong. Every idea is for a brand. A brand holds what Norn knows about one business or person: what it does, who it is for, how it sounds and what it must never say. Feedback is kept per brand too, so each brand builds up its own taste. If you serve many businesses, such as an agency with clients or a platform with customers, create one brand for each of them. ## What Norn reads from a website Give Norn a website and it reads the pages it can reach: what the business offers, its products, what customers say about it and how it talks. From that it writes a short description, lists the offerings and suggests an archetype. Ideas later cite these pages as their sources. Norn reads the site when you create the brand. Change `website` in an update to make it read again, for example after a relaunch. ## The archetype Norn describes a brand’s personality as one of twelve archetypes, drawn from Carl Jung and set out for brands by Margaret Mark and Carol Pearson. The archetype sets the brand’s voice, and the voice decides which angles an idea can take. A jester can joke about a burst pipe. A sage explains why pipes burst. | Archetype | Sounds | | --- | --- | | `innocent` | Simple, honest and hopeful. | | `everyman` | Down to earth. One of us. | | `hero` | Brave and determined. Proves itself. | | `outlaw` | Breaks the rules. Says what others will not. | | `explorer` | Curious and free. Looks for what is new. | | `creator` | Inventive. Cares about craft. | | `ruler` | In control. Sets the standard. | | `magician` | Transforms things. Makes the hard look easy. | | `lover` | Warm and close. About beauty and feeling. | | `caregiver` | Kind and protective. Looks after people. | | `jester` | Playful and funny. Never takes itself too seriously. | | `sage` | Wise. Explains, and is trusted for it. | If you know the archetype, set it. If you leave it out, Norn suggests one and explains its choice in `archetype.rationale`. Read the rationale once: a brand with the wrong voice gets the wrong ideas. ## Create a brand `POST /v1/brands` (preview) Body: - `website` (string, optional): The brand’s website, starting with `https://`. Leave it out only when you send `name` and `description` instead. - `name` (string, optional): The brand’s name. Norn takes it from the website when you leave it out. - `description` (string, optional): What the business does, in a sentence or two. Useful when there is no website. Up to 2,000 characters. - `language` (string, optional): The language ideas are written in, as an ISO 639-1 code such as `en` or `nb`. Norn takes it from the website when you leave it out. - `country` (string, optional): Where the brand is, as an ISO 3166-1 code such as `US` or `NO`. Norn uses it for the calendar. It knows the holidays of the US, the UK, Norway, Australia, Canada, New Zealand and Ireland, and goes by the season elsewhere. - `archetype` (string, optional; one of: `innocent`, `everyman`, `hero`, `outlaw`, `explorer`, `creator`, `ruler`, `magician`, `lover`, `caregiver`, `jester`, `sage`): The brand’s archetype. Norn suggests one when you leave it out. - `rules` (object, optional): Instructions every idea follows. Norn never overrides them with what it learns from feedback. - `always` (string[], optional): Things every idea should do, such as "Mention same-day callouts". Up to 20. - `never` (string[], optional): Things no idea may do, such as "Mention prices". Up to 20. cURL: ```bash curl -X POST https://api.native.no/v1/brands \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "website": "https://pipedream.example", "country": "US" }' ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/brands', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NATIVE_ACCESS_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ website: "https://pipedream.example", country: "US" }), }) if (!res.ok) throw new Error(`Norn answered ${res.status}: ${await res.text()}`) const result = await res.json() ``` Python: ```python import os import requests res = requests.post( "https://api.native.no/v1/brands", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, json={ "website": "https://pipedream.example", "country": "US" }, timeout=30, ) res.raise_for_status() result = res.json() ``` The brand comes back straight away, while Norn reads the website: Response: ```json { "id": "brand_7Hk2pQ", "object": "brand", "status": "reading", "name": null, "website": "https://pipedream.example", "language": null, "country": "US", "description": null, "offerings": [], "archetype": null, "rules": { "always": [], "never": [] }, "created_at": "2026-10-11T09:12:40Z" } ``` ## Get a brand `GET /v1/brands/{brand_id}` (preview) Returns the brand. While `status` is `reading`, ask again every ten seconds or so. When Norn could not read the website, for example because it blocks visitors, the status is `failed`: create the brand again with `name` and `description` instead. cURL: ```bash curl https://api.native.no/v1/brands/brand_7Hk2pQ \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/brands/brand_7Hk2pQ', { headers: { Authorization: `Bearer ${process.env.NATIVE_ACCESS_TOKEN}`, }, }) if (!res.ok) throw new Error(`Norn answered ${res.status}: ${await res.text()}`) const result = await res.json() ``` Python: ```python import os import requests res = requests.get( "https://api.native.no/v1/brands/brand_7Hk2pQ", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, timeout=30, ) res.raise_for_status() result = res.json() ``` Response: ```json { "id": "brand_7Hk2pQ", "object": "brand", "status": "ready", "name": "Pipe Dream Plumbing", "website": "https://pipedream.example", "language": "en", "country": "US", "description": "Family plumbers in Columbus, Ohio. Same-day callouts, seven days a week.", "offerings": [ "Emergency repairs", "Water heater installs", "Drain cleaning" ], "archetype": { "value": "jester", "rationale": "The website jokes about leaks and calls the team the drip squad. The humour always lands on a promise: they show up fast." }, "rules": { "always": [ "Mention same-day callouts" ], "never": [ "Joke at the customer’s expense" ] }, "created_at": "2026-10-11T09:12:40Z" } ``` ## Update a brand `PATCH /v1/brands/{brand_id}` (preview) Send only what you want to change. It takes the same fields as creating a brand. Lists, such as `rules.never`, are replaced rather than merged. A new `website` makes Norn read the site again. cURL: ```bash curl -X PATCH https://api.native.no/v1/brands/brand_7Hk2pQ \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "archetype": "jester", "rules": { "always": [ "Mention same-day callouts" ], "never": [ "Joke at the customer’s expense", "Mention prices" ] } }' ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/brands/brand_7Hk2pQ', { method: 'PATCH', headers: { Authorization: `Bearer ${process.env.NATIVE_ACCESS_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ archetype: "jester", rules: { always: [ "Mention same-day callouts" ], never: [ "Joke at the customer’s expense", "Mention prices" ] } }), }) if (!res.ok) throw new Error(`Norn answered ${res.status}: ${await res.text()}`) const result = await res.json() ``` Python: ```python import os import requests res = requests.patch( "https://api.native.no/v1/brands/brand_7Hk2pQ", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, json={ "archetype": "jester", "rules": { "always": [ "Mention same-day callouts" ], "never": [ "Joke at the customer’s expense", "Mention prices" ] } }, timeout=30, ) res.raise_for_status() result = res.json() ``` ## The brand object Fields: - `id` (string, required): Starts with `brand_`. - `object` (string, required): Always `brand`. - `status` (string, required; one of: `reading`, `ready`, `failed`): You can ask for ideas once it is `ready`. - `name` (string | null, required): `null` until Norn has read the website. - `website` (string | null, required): The website Norn read. - `language` (string | null, required): ISO 639-1 code. - `country` (string | null, required): ISO 3166-1 code. - `description` (string | null, required): What Norn understood the business to be. - `offerings` (string[], required): What the business sells or does, as Norn read it. - `archetype` (object | null, required): The brand’s archetype. - `value` (string, required; one of: `innocent`, `everyman`, `hero`, `outlaw`, `explorer`, `creator`, `ruler`, `magician`, `lover`, `caregiver`, `jester`, `sage`): The archetype. - `rationale` (string | null, required): Why Norn chose it. `null` when you set the archetype yourself. - `rules` (object, required): Instructions every idea follows. Norn never overrides them with what it learns from feedback. - `always` (string[], optional): Things every idea should do, such as "Mention same-day callouts". Up to 20. - `never` (string[], optional): Things no idea may do, such as "Mention prices". Up to 20. - `created_at` (string, required): When the brand was created, in ISO 8601.