Norn APIGet started
PreviewQuickstart
From your credentials to your first ranked ideas: create a brand from a website, ask for ideas, turn one into a post and tell Norn what happened.
Five steps. Two of them wait on Norn: reading the website, once per brand, and thinking up each batch of ideas, which usually takes a few minutes.
Get an access token
#Join the waitlist. When your access is ready, you get a client ID and secret: the same pair signs you in to the Norn API and the Native API.
Your backend trades them for an access token that lasts up to an hour, with the Norn API as its
audience. Authentication shows the call. The examples read the token from an environment variable:Shell
export NATIVE_ACCESS_TOKEN="the access_token you got back"Create a brand
#A brand is who Norn suggests ideas for. Give it a website, and Norn reads the site to learn what the business does, who it is for and how it sounds.
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" }'Reading a website takes a few minutes, so the brand comes back with
"status": "reading". Ask for it again until the status isready:curl https://api.native.no/v1/brands/brand_7Hk2pQ \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN"Response
{ "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" }Check the
archetypeand itsrationale. If Norn read the brand wrong, correct it before you ask for ideas.Ask for ideas
#Send the brand’s id.
countis how many ideas you want back, andfocusis anything Norn should lean toward, in plain words.curl -X POST https://api.native.no/v1/ideas \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "brand": "brand_7Hk2pQ", "count": 2, "focus": "We want more emergency callouts this winter." }'Norn looks through the brand’s material and history before it answers, which takes a few minutes. So you get a batch back at once, with
"status": "thinking". Ask for the batch every 15 seconds or so:curl https://api.native.no/v1/ideas/batch_3Kp9sD \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN"When its status is
done, the ideas are indata, ranked best first:Response
{ "id": "batch_3Kp9sD", "object": "idea_batch", "status": "done", "model": "norn-preview", "brand": "brand_7Hk2pQ", "data": [ { "id": "idea_4Fd9xW", "object": "idea", "rank": 1, "title": "The Sunday frozen-pipe rescue", "hook": "Frozen pipes do not care that it is Sunday. We do.", "angle": "Deadpan humour about the worst-timed emergency, ending on proof that the team shows up the same day.", "why_now": "Winter is starting in Columbus, and burst pipes come with the first hard frosts.", "format": "video", "sources": [ { "type": "website", "title": "Emergency plumbing", "url": "https://pipedream.example/emergency", "quote": "Same-day callouts, seven days a week." }, { "type": "review", "title": "Review from a customer in Clintonville", "url": null, "quote": "They came on a Sunday and had the water back on in an hour." }, { "type": "focus", "title": "Your focus", "url": null, "quote": "We want more emergency callouts this winter." } ], "outline": { "opening": "Frozen pipes do not care that it is Sunday. We do.", "key_points": [ "A burst pipe from a real Sunday callout, before and after", "Running water again within the hour" ], "call_to_action": "Book a same-day visit at pipedream.example.", "visual": "A 15-second vertical video: the split pipe, a deadpan look to camera, then the repaired pipe with the water running." }, "prompt": "Write a 15-second vertical video script for Pipe Dream Plumbing, a family plumber in Columbus, Ohio. Voice: dry and joking, never at the customer’s expense. Open with: \"Frozen pipes do not care that it is Sunday. We do.\" Show a burst pipe from a real Sunday callout, then the repair and the water running again. Say that they come out the same day, seven days a week. End with: \"Book a same-day visit at pipedream.example.\"" }, { "id": "idea_9Qm3vT", "object": "idea", "rank": 2, "title": "Guess the leak", "hook": "One of these three drips is quietly running up your water bill. Which one?", "angle": "A quiz built from real callouts that teaches people to spot the costly leak, with the answer on the last slide.", "why_now": "Evergreen", "format": "carousel", "sources": [ { "type": "website", "title": "Leak detection", "url": "https://pipedream.example/leaks", "quote": "Most leaks we find have been dripping for months." } ], "outline": { "opening": "One of these three drips is quietly running up your water bill. Which one?", "key_points": [ "Three close-ups from real callouts: a tap, a toilet, a pipe joint", "The answer, and why it is the one that costs the most" ], "call_to_action": "Not sure about yours? Book a leak check.", "visual": "Four slides: three close-up photos of drips, then the answer." }, "prompt": "Write a four-slide Instagram carousel for Pipe Dream Plumbing, a family plumber in Columbus, Ohio. Voice: dry and joking, never at the customer’s expense. Slide 1 asks: \"One of these three drips is quietly running up your water bill. Which one?\" Slides 2 to 4 show a dripping tap, a running toilet and a weeping pipe joint from real callouts. The last slide reveals the answer and explains why it costs the most. End with: \"Not sure about yours? Book a leak check.\"" } ], "left_out": [ "A post about water heater rebates: nothing on the website or in your focus backs it." ], "error": null, "created_at": "2026-10-11T09:20:00Z", "done_at": "2026-10-11T09:24:12Z" }Turn an idea into a post
#Norn decides what the post should be. The writing is a job for a generative model. Every idea carries a
promptwritten for exactly that, so you can hand it to the model you already use:TypeScript
import Anthropic from '@anthropic-ai/sdk' const anthropic = new Anthropic() // reads ANTHROPIC_API_KEY const [best] = result.data // Any text model works. This example uses Claude. const message = await anthropic.messages.create({ model: 'claude-sonnet-5-5', max_tokens: 1024, messages: [{ role: 'user', content: best.prompt }], }) const script = message.content.find((block) => block.type === 'text')?.textPrefer to write it yourself, or to design it in your own tool? Use the
outlineinstead: an opening, the key points, a call to action and a note on the visuals.Tell Norn what happened
#When someone approves, rewrites or turns down an idea, say so. Here, the team posted the Sunday idea with a new last line:
curl -X POST https://api.native.no/v1/feedback \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "idea": "idea_4Fd9xW", "decision": "edited", "final_text": "Frozen pipes do not care that it is Sunday. Neither do we: same-day fix, no drama." }'Once the post has been out for a few days, send its numbers as well. Feedback covers outcomes, reasons and what Norn does with them.
Where to go next
#The Norn API is not open yet
Access opens from the waitlist. Join it and we will email you when your access is ready.