# Feedback Source: https://docs.native.no/norn/feedback > **Preview.** The Norn API is not live yet. This page describes the planned interface; names and fields can change before access opens. Tell Norn what happened to an idea: approved, edited or turned down, and how the post performed. It is how Norn learns a brand’s taste. Norn learns a brand’s taste the way a good marketer does: by watching which ideas the people who know the brand keep, change or throw away, and what happens once posts go out. Feedback is how you show it. Every business on Native feeds this loop today. The API is built to feed it the same way, so the brands you create learn from your users’ decisions too. ## Decisions Send a decision when a person acts on an idea: | Decision | When | Send with it | | --- | --- | --- | | `approved` | The idea was used as it was. | Nothing else. | | `edited` | The idea was used, but changed. | `final_text`: what was actually posted. | | `rejected` | The idea was turned down. | `reasons`, and a `comment` if the person wrote one. | A reason in a person’s own words teaches Norn the most. From decisions, Norn writes lessons about what a brand’s posts should be about, such as "Posts about prices get turned down", and the ideas after that follow them. In Native, lessons start once a brand has eight explained decisions in 90 days (approvals, and turn-downs that came with a reason), and each lesson rests on at least three of them. In Native, a comment in the person’s own words about the idea or its wording also becomes a do or a don’t in the brand’s writing style, and one only about the picture becomes a picture rule. A reason picked from the list, with no comment, adds neither. ## Reasons | Reason | Means | | --- | --- | | `off_brand` | It does not sound like the brand. | | `not_relevant` | The subject does not matter to this brand or its audience. | | `wrong_language` | It came back in the wrong language. | | `needs_work` | The idea is fine, but the hook or the angle is weak. | | `other` | Anything else. Say what in `comment`. | Do not invent a reason when the person gave none. A rejection without a reason is still useful; a made-up reason teaches Norn the wrong lesson. ## Outcomes Once a post has been out for a few days, send its numbers as an `outcome`. Norn compares each post with the brand’s own usual results, never with other brands, so a corner bakery and a national chain are each judged on their own scale. Engagement is counted the way Native counts it: likes, comments, shares and clicks, divided by views. Send the numbers your channel reports and Norn does the rest. ## Send feedback `POST /v1/feedback` (preview) Body: - `idea` (string, required): The id of the idea. - `decision` (string, optional; one of: `approved`, `edited`, `rejected`): What a person did with the idea. Each request needs a `decision`, an `outcome` or both. - `final_text` (string, optional): With `edited`: the text that was published. Up to 10,000 characters. - `reasons` (string[], optional; one of: `off_brand`, `not_relevant`, `wrong_language`, `needs_work`, `other`): With `rejected`: why. - `comment` (string, optional): With `rejected`: the reason in the person’s own words. Up to 1,000 characters. - `outcome` (object, optional): How the post performed. Send it again whenever the numbers change; the latest one counts. - `channel` (string, required; one of: `instagram`, `facebook`, `linkedin`, `tiktok`, `x`, `threads`, `bluesky`, `pinterest`, `youtube`, `other`): Where the post went out. - `published_at` (string, required): When it went out, in ISO 8601. - `views` (integer, required): Views or impressions. - `likes` (integer, optional): Likes and reactions. - `comments` (integer, optional): Comments. - `shares` (integer, optional): Shares, reposts and sends. - `clicks` (integer, optional): Link clicks. cURL: ```bash 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." }' ``` TypeScript: ```ts const res = await fetch('https://api.native.no/v1/feedback', { method: 'POST', headers: { Authorization: `Bearer ${process.env.NATIVE_ACCESS_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ idea: "idea_4Fd9xW", decision: "edited", final_text: "Frozen pipes do not care that it is Sunday. Neither do we: same-day fix, no drama." }), }) 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/feedback", headers={"Authorization": f"Bearer {os.environ['NATIVE_ACCESS_TOKEN']}"}, json={ "idea": "idea_4Fd9xW", "decision": "edited", "final_text": "Frozen pipes do not care that it is Sunday. Neither do we: same-day fix, no drama." }, timeout=30, ) res.raise_for_status() result = res.json() ``` A rejection with a reason: Body: ```json { "idea": "idea_9Qm3vT", "decision": "rejected", "reasons": [ "not_relevant" ], "comment": "We stopped doing leak checks in the winter months." } ``` An outcome, a few days after the post went out: Body: ```json { "idea": "idea_4Fd9xW", "outcome": { "channel": "instagram", "published_at": "2026-11-02T18:00:00-05:00", "views": 4210, "likes": 186, "comments": 23, "shares": 17, "clicks": 9 } } ``` Norn answers `202 Accepted` with a receipt: Response: ```json { "object": "feedback", "id": "fb_2Lr8sN", "idea": "idea_4Fd9xW", "created_at": "2026-11-03T08:00:00Z" } ``` ## What feedback changes - The ideas Norn suggests next for that brand: the subjects, formats and angles it leans toward, and the lessons it follows. - Not the brand’s rules. Only you set `rules`, and Norn never overrides them with what it learns. - Not the order of ideas already sent. Feedback shapes the next request, not the last one.