Documentation
Learn how Header works and explore the API for building integrations.
What is Header
In the era of AI, the expectations on knowledge workers are expanding across domains, but the time to learn hasn't kept up. Current tools help you consume more content — none help you actually improve how you or your agents work.
Header is a continuous learning system that turns information into behavior change. You define what you want to learn, connect the sources you trust, and Header synthesizes relevant insights from hundreds of sources into focused briefings you can act on.
The Learning Loop
- Goal — Define what you want to learn
- Synthesize — Header surfaces relevant insights from your sources
- Experiment — Act on insights, observe results
- Persist — What works becomes behavior change, reshaping your goals, your habits, and your agents
Topics
What are Topics?
A Topic is the top-level container in Header. It groups together the source groups you want to follow and the goals that define how you want to analyze that content.
- Name — a short label (e.g., "AI Research", "Startup News")
- Source groups — the content feeds attached to this topic
- Goals — one or more goals, each with its own lens on the same sources
- Public / Curated — topics can be shared publicly for others to subscribe to or fork
When you create a topic, a default goal is created automatically with it. You can add more goals later to analyze the same sources from different angles. For example, an "AI Research" topic could have one goal tracking inference performance and another tracking safety research — same sources, different perspectives.
Public topics appear in the catalog for other users to discover. They can subscribe to receive the default goal's briefings, or fork the topic to create their own copy with a custom goal.
Goals
What are Goals?
A Goal lives inside a topic and describes what you want to learn from its sources, written in plain language. Each goal has a description, optional keywords for fine-tuning relevance, and relevance questions that guide the AI when filtering content.
- Description — natural language explanation of your objective (e.g., "Advances in local LLM inference on consumer hardware")
- Keywords — terms that signal relevance (e.g.,
llama.cpp,quantization,GGUF) - Relevance questions — questions the AI uses to decide if content matters (e.g., "Does this discuss running models locally?")
- Scheduling — set a frequency (daily, weekly, etc.) to receive briefings by email automatically
Goals are the unit that owns briefings. When a briefing is generated, Header pulls content from the goal's source groups, filters it through your relevance criteria, and synthesizes a focused digest. A single topic can have multiple goals, each producing its own briefings from a different perspective on the same content.
Sources
Content Streams
Sources are the content feeds that Header ingests. Each source has a type that determines how content is fetched and processed:
- RSS — any valid RSS or Atom feed URL. Header polls the feed and processes new entries.
- YouTube — a YouTube channel URL. Header fetches video metadata and transcripts for analysis.
- Newsletter — a dedicated email address. Forward newsletters to it and Header parses them into content.
- Reddit — a subreddit URL. Header ingests posts and comments from the community.
Sources are shared resources — any user can add a source, and all users benefit from the cached content. You organize sources into source groups to control which content flows into which goals.
Source Groups
Organizing Sources
Source groups let you organize sources into logical collections. They support nesting (groups within groups) for hierarchical organization, and can be cloned by other users to share curated collections.
- Flat groups — a simple list of sources (e.g., "AI Research Blogs")
- Nested groups — groups containing other groups (e.g., "Tech" containing "AI Blogs" and "Dev Tools")
- Cloning — copy a public group into your own account to customize it
OPML Import
OPML (Outline Processor Markup Language) is a standard XML format used by RSS readers to export and import feed subscriptions. If you use an RSS reader like Feedly, Inoreader, or NetNewsWire, you can export your feeds as an OPML file and import them directly into Header.
During import, each feed in the OPML file becomes a source, and the folder structure is preserved as source groups. Upload the file through the web interface or use the Imports API.
FreshRSS Import
If you run a self-hosted FreshRSS instance, Header can connect to it directly via the Google Reader-compatible API. Provide your FreshRSS instance URL, username, and API password, and Header will import your feeds and categories.
You can import into a single group or create one group per FreshRSS category. Validate your credentials first with the validate endpoint before running the full import.
Briefings
Cross-Source Synthesis
Briefings are where Header's value compounds. Unlike feed-level summaries or one-off research tools, Header synthesizes across all of your sources to surface patterns and insights you wouldn't find reading any single feed. For each goal, the system:
- Collects recent content from all connected source groups
- Filters entries through your relevance criteria and keywords
- Uses LLMs to analyze, rank, and synthesize the most relevant content
- Produces a structured digest with key developments, takeaways, and source links
Briefings can be generated on-demand via the API or web interface, or scheduled to run automatically (daily, weekly, etc.) with results delivered by email. You can also make briefings public and share them with a link, or subscribe to other users' public topics to receive their briefings.
API Overview
Base URL
https://joinheader.com/api/v2
Authentication
All API requests require a Bearer token issued by Clerk.
Include it in the Authorization header:
Authorization: Bearer <your-clerk-session-token>
OpenAPI Schema
The full machine-readable API specification is available at
/api/v2/openapi.json.
Use it with any OpenAPI-compatible client or code generator.
For AI agents: Fetch /api/v2/openapi.json to get the
complete request/response schemas, parameter types, and error codes. The tables below
provide a human-friendly overview.
Integration pattern: Agents can plug into Header's
learning loop programmatically.
Use GET /topics/dashboard to discover a user's topics and goals,
POST /goals/{goal_id}/briefings to trigger briefing generation,
and GET /briefings/{id} to retrieve synthesized insights.
Agents can act on briefing content — extracting key developments,
feeding them into downstream workflows, or updating goals based on
what the user has learned. This closes the loop.
Sources
| Method | Path | Description |
|---|---|---|
| GET | /sources | List all sources |
| GET | /sources/{source_id} | Get a single source |
| POST | /sources | Create a new source |
| PUT | /sources/{source_id} | Update a source (owner only) |
| DELETE | /sources/{source_id} | Delete a source (owner only) |
| GET | /sources/{source_id}/entries | Get cached content entries (paginated) |
| POST | /sources/{source_id}/refresh | Trigger content re-ingestion (async) |
| POST | /sources/{source_id}/validate | Validate source URL is reachable |
Create Source
// POST /api/v2/sources
{
"name": "Hacker News",
"url": "https://news.ycombinator.com/rss",
"type": "rss"
}
Source Groups
| Method | Path | Description |
|---|---|---|
| GET | /source-groups | List public and user's own groups |
| GET | /source-groups/{group_id} | Get a single group with members |
| POST | /source-groups | Create a new source group |
| PUT | /source-groups/{group_id} | Update a source group (owner only) |
| DELETE | /source-groups/{group_id} | Delete a source group (owner only) |
| POST | /source-groups/{group_id}/clone | Clone a public group into your account |
| GET | /source-groups/{group_id}/members | List group members |
| POST | /source-groups/{group_id}/members | Add a member (source or nested group) |
| DELETE | /source-groups/{group_id}/members/{member_id} | Remove a member from group |
| GET | /source-groups/{group_id}/entries | Get content entries for all sources in group (paginated) |
Topics
| Method | Path | Description |
|---|---|---|
| GET | /topics/dashboard | Get your dashboard (custom + subscribed topics) |
| GET | /topics/catalog | Browse public topics |
| POST | /topics | Create a topic with a default goal and source groups |
| GET | /topics/{topic_id} | Get a single topic |
| POST | /topics/{topic_id}/fork | Fork a public topic with your own goal |
| POST | /topics/{topic_id}/subscribe | Subscribe to a public topic |
| DELETE | /topics/{topic_id}/subscribe | Unsubscribe from a topic |
Create Topic
// POST /api/v2/topics
// Creates a topic with a default goal and triggers the first briefing.
{
"name": "AI Research",
"source_group_ids": ["sg_abc123"],
"goal_description": "Advances in local LLM inference on consumer hardware",
"keywords": ["llama.cpp", "quantization"]
}
// Response:
{
"topic": { /* TopicResponse */ },
"first_briefing_id": "br_xyz789"
}
Fork Topic
// POST /api/v2/topics/{topic_id}/fork
// Creates your own copy of a public topic with a custom goal.
{
"goal_name": "Safety Research Focus",
"goal_description": "Track AI safety papers and alignment research",
"keywords": ["alignment", "RLHF", "interpretability"]
}
Goals
| Method | Path | Description |
|---|---|---|
| GET | /goals | List your goals |
| GET | /goals/{goal_id} | Get a single goal |
| POST | /goals | Create a goal with optional source groups |
| PUT | /goals/{goal_id} | Update a goal (owner only) |
| DELETE | /goals/{goal_id} | Delete a goal (owner only) |
| POST | /goals/{goal_id}/source-groups | Link a source group to goal |
| DELETE | /goals/{goal_id}/source-groups/{sg_id} | Unlink a source group from goal |
| GET | /goals/{goal_id}/feed | Get preprocessed feed entries (paginated) |
Create Goal
// POST /api/v2/goals
{
"name": "Local LLM Inference",
"description": "Advances in running language models on consumer hardware",
"keywords": ["llama.cpp", "quantization", "GGUF"],
"relevance_questions": [
"Does this discuss running models locally?",
"Are there benchmarks for consumer GPUs?"
],
"source_group_ids": ["sg_abc123"]
}
Briefings
| Method | Path | Description |
|---|---|---|
| GET | /goals/{goal_id}/briefings | List briefings for a goal |
| POST | /goals/{goal_id}/briefings | Generate a new briefing (async) |
| GET | /briefings/{briefing_id} | Get a single briefing |
| DELETE | /briefings/{briefing_id} | Delete a briefing (owner only) |
| PUT | /briefings/{briefing_id}/sharing | Toggle briefing public/private |
Generate Briefing
// POST /api/v2/goals/{goal_id}/briefings
// Returns 201 with briefing in IN_PROGRESS status.
// Poll GET /briefings/{id} until status is COMPLETED.
// Response:
{
"id": "br_xyz789",
"goal_id": "goal_abc123",
"status": "IN_PROGRESS",
"created_at": "2026-02-26T12:00:00Z"
}
Imports
| Method | Path | Description |
|---|---|---|
| POST | /imports/opml | Import sources from OPML file (multipart upload, max 10 MB) |
| POST | /imports/freshrss/validate | Validate FreshRSS connection credentials |
| POST | /imports/freshrss | Import sources from a FreshRSS instance |
Subscriptions
Subscribe to public topics or individual goals to receive their briefings. Topic-level subscriptions are available under Topics. Goal-level subscriptions below allow more granular control.
| Method | Path | Description |
|---|---|---|
| POST | /goals/{goal_id}/subscribe | Subscribe to a public goal |
| DELETE | /goals/{goal_id}/subscribe | Unsubscribe from a goal |
| GET | /goals/{goal_id}/subscription | Get subscription status and subscriber count |
| GET | /subscriptions | List all goals you are subscribed to |
Preferences
| Method | Path | Description |
|---|---|---|
| GET | /preferences | Get your preferences (returns defaults if not set) |
| PUT | /preferences | Update your preferences |
Billing
| Method | Path | Description |
|---|---|---|
| POST | /billing/create-checkout | Create a Polar checkout session |
| POST | /billing/portal | Create customer portal session |
| GET | /billing/subscription | Get current subscription status |
API Keys
Self-managed API keys allow programmatic access without Clerk session tokens.
Only available for paid/poweruser tier subscribers. Keys have a scope that controls
which HTTP methods are allowed: read (GET only) or full (all methods).
| Method | Path | Description |
|---|---|---|
| POST | /api-keys | Create a new API key (402 if free tier, 409 if at limit) |
| GET | /api-keys | List your API keys (secrets are never returned) |
| DELETE | /api-keys/{key_id} | Revoke an API key |
Authentication with API keys: Use the Authorization header
with your key: Authorization: Bearer hdr_sk_...