API Reference

ano API Reference

ano is a feed personalization engine. Send posts and a user ID — get back a ranked feed with full explainability. No ML setup, no training data.

Authentication

Every request to a tenant route needs two headers:

x-ano-api-key: ano_live_xxxxxxxxxxxxxxxx
x-ano-user-id: <your platform's user ID>
HeaderValueDescription
x-ano-api-key ano_live_xxxx Your tenant API key. Get one from API Keys.
x-ano-user-id user_abc123 The end user's ID in your system. Can be a Clerk UID, Firebase UID, or any stable unique string.

POST /feed

The core endpoint. Call every time a user opens their feed. Returns your posts ranked by relevance to this specific user.

POST
/feed

Request body

{
  "posts": [
    {
      "id": "post_abc",
      "title": "Army conducts anti-terror operation in border region",
      "body": "Military forces launched a combat operation near the border...",
      "timestamp": "2026-03-13T10:00:00Z",
      "platform": "news"
    }
  ]
}
FieldRequiredDescription
idrequiredYour post ID
titlerequiredPost headline — weighted 2× vs body in scoring
bodyoptionalPost body or description
timestampoptionalISO 8601. Used for recency boost (24h half-life)
platformoptionalPassed through unchanged in response

Response

{
  "tenantId": "acme-news",
  "userId": "user_abc",
  "count": 3,
  "feed": [
    {
      "id": "post_abc",
      "title": "Army conducts anti-terror operation...",
      "_score": {
        "final": 0.8583,
        "raw": 0.9980,
        "recencyBoost": 0.86,
        "primaryTopic": "military",
        "isBlocked": false,
        "breakdown": [
          { "topic": "military", "postWeight": 1.0, "userScore": 1.0, "contribution": 1.0 }
        ]
      }
    }
  ]
}

Use _score.breakdown to build a "why am I seeing this?" transparency feature for your users.

POST /event

Record a user's engagement with a post. Call this from your frontend on every interaction. ano uses these signals to improve the user's feed over time.

POST
/event
{
  "eventType": "like",
  "post": { "id": "post_abc", "title": "...", "body": "..." }
}

POST /profile/:userId/onboard

Solves cold-start. Call once when a user signs up. Show them 5–8 topics to pick from — the feed is useful immediately.

POST
/profile/:userId/onboard
{
  "like":    ["aviation", "military", "technology"],
  "dislike": ["food", "entertainment"]
}

GET /profile/:userId

Fetch an end user's profile. Use to build a "your interests" settings page.

GET
/profile/:userId

POST /profile/:userId

Update explicit topic preferences. Use when a user changes their interests in your settings UI.

POST
/profile/:userId
{
  "explicitTopics": {
    "sports": true,
    "food": false,
    "politics": null
  }
}
ValueMeaning
trueUser explicitly wants this topic
falseHard block — never show posts on this topic
nullClear explicit preference, fall back to implicit learning

DELETE /profile/:userId

Delete a user's profile entirely. Use for GDPR / right-to-erasure requests.

DELETE
/profile/:userId

Built-in topics

ano recognises these 12 content domains out of the box:

military
aviation
politics
economy
technology
health
sports
food
science
entertainment
crime
business

Event weights

eventTypeWeightWhen to fire
share+0.15User shares the post
like+0.10User likes or upvotes
click+0.06User clicks to read full post
view+0.03Post visible in viewport 3+ seconds
skip-0.08User scrolled past without stopping
hide-0.15User explicitly hides or reports

Errors

StatusMeaning
400Bad request — missing or invalid fields
401Missing or invalid API key
404Profile or resource not found
500Server error