# Ideas Source: https://docs.native.no/norn/ideas > **Preview.** The Norn API is not live yet. This page describes the planned interface; names and fields can change before access opens. Ask Norn for ideas and get them back ranked, each with a hook, an angle, why it fits now, its sources and a prompt for a generative model. An idea is the decision before the writing. It says what a post should be about, how to come at it, which format suits it and why now. It is not the finished post: Norn leaves the writing to whichever model does it best. ## What an idea holds | Field | What it is | | --- | --- | | `rank` | Norn’s order. `1` is the idea it would post first. | | `title` | A short name for the idea, for lists and dashboards. | | `hook` | The opening line: the words that make someone stop scrolling. | | `angle` | The take on the subject, and why it suits this audience. | | `why_now` | Why the idea fits this moment: a season, a date, something new at the business. `Evergreen` when it works any time. | | `format` | The format the idea is meant for. | | `sources` | Where the idea comes from, with the words it relies on quoted. | | `outline` | An opening, the key points, a call to action and a note on the visuals. | | `prompt` | The whole idea, written as instructions for a generative model. | ## Every idea shows its sources Ideas are built from what the brand’s own material says. When an idea makes a claim about the business, it cites the page, review or product the claim comes from, and quotes the words. A claim you cannot trace is a claim you cannot post, so this is what lets a person, or your code, check an idea before it goes out. When Norn cannot back an idea, it leaves the idea out and says so in `left_out`. That list is worth reading: it often names a page the website is missing. ## Formats | Format | Meant for | | --- | --- | | `image` | One picture with a caption. | | `carousel` | Two to ten slides that tell a story or teach something step by step. | | `video` | A short vertical video, such as a reel. | | `text` | Words only, such as a LinkedIn or Threads post. | Ideas are not tied to a channel. The same idea can become a reel on Instagram and a text post on LinkedIn: write one post per channel from it. ## Create ideas `POST /v1/ideas` (preview) Body: - `brand` (string, required): The id of a brand whose `status` is `ready`. - `count` (integer, optional; default: `3`): How many ideas to return, from 1 to 10. - `formats` (string[], optional; one of: `image`, `carousel`, `video`, `text`): Only suggest ideas in these formats. All formats when you leave it out. - `focus` (string, optional): Anything Norn should lean toward, in plain words: a campaign, a launch, a goal for the month. Up to 2,000 characters. Ideas built on it cite it as a source. - `date` (string, optional; default: `today`): Plan for another day, as `YYYY-MM-DD`, up to 45 days ahead. `why_now` is written for that day. Norn looks through the brand’s material and history before it answers. In Native that usually takes two to six minutes, far longer than an HTTP request should stay open. So the request answers at once with a batch that is still thinking, and the ideas arrive in the same batch when Norn is done. cURL: ```bash 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." }' ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/ideas', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NATIVE_ACCESS_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ brand: "brand_7Hk2pQ", count: 2, focus: "We want more emergency callouts this winter." }), }) 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/ideas", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, json={ "brand": "brand_7Hk2pQ", "count": 2, "focus": "We want more emergency callouts this winter." }, timeout=30, ) res.raise_for_status() result = res.json() ``` Norn answers `202 Accepted` with the batch: Response: ```json { "id": "batch_3Kp9sD", "object": "idea_batch", "status": "thinking", "model": "norn-preview", "brand": "brand_7Hk2pQ", "data": [], "left_out": [], "error": null, "created_at": "2026-10-11T09:20:00Z", "done_at": null } ``` ## Get a batch `GET /v1/ideas/{batch_id}` (preview) Returns the batch. While `status` is `thinking`, ask again every 15 seconds or so. When it is `done`, the ideas are in `data`, best first. When it is `failed`, `error` says why. cURL: ```bash curl https://api.native.no/v1/ideas/batch_3Kp9sD \ -H "Authorization: Bearer $NATIVE_ACCESS_TOKEN" ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/ideas/batch_3Kp9sD', { 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/ideas/batch_3Kp9sD", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, timeout=30, ) res.raise_for_status() result = res.json() ``` Response: ```json { "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" } ``` ## The batch object Fields: - `id` (string, required): Starts with `batch_`. - `object` (string, required): Always `idea_batch`. - `status` (string, required; one of: `thinking`, `done`, `failed`): Where the batch is. Only a `done` batch has ideas. - `model` (string, required): The model that answered, such as `norn-preview`. - `brand` (string, required): The brand the ideas are for. - `data` (idea[], required): The ideas, best first. Empty until the batch is `done`. - `left_out` (string[], required): Ideas Norn considered and left out because nothing backed them. Often empty. - `error` (string | null, required): Why the batch failed. `null` otherwise. - `created_at` (string, required): When you asked, in ISO 8601. - `done_at` (string | null, required): When Norn finished, in ISO 8601. `null` while it is thinking. ## The idea object Fields: - `id` (string, required): Starts with `idea_`. Send it back with [feedback](https://docs.native.no/norn/feedback). - `object` (string, required): Always `idea`. - `rank` (integer, required): Norn’s order, from `1`. - `title` (string, required): A short name for the idea. - `hook` (string, required): The opening line. - `angle` (string, required): The take on the subject. - `why_now` (string, required): Why it fits the moment, or `Evergreen`. - `format` (string, required; one of: `image`, `carousel`, `video`, `text`): The format it is meant for. - `sources` (object[], required): Where the idea comes from. Up to four. - `type` (string, required; one of: `website`, `review`, `product`, `focus`): `focus` means the idea is built on what you sent in `focus`. - `title` (string, required): A name for the source, such as a page title. - `url` (string | null, required): Where to see it, when it is a page. - `quote` (string | null, required): The words the idea relies on, quoted exactly. - `outline` (object, required): The idea laid out for a writer or a designer. - `opening` (string, required): The first line. - `key_points` (string[], required): What the post has to get across, one to five points. - `call_to_action` (string, required): What the reader is asked to do. - `visual` (string, required): A note on the picture, the slides or the video. - `prompt` (string, required): The idea written as instructions for a generative model, in the brand’s voice and language. ## Languages Ideas are written in the brand’s `language`, whichever it is. Norn does not check that an idea came back in that language yet. If one did not, turn it down with the reason `wrong_language`, so Norn learns from it.