---
title: "Create or return an RSS, YouTube, X profile, or email source"
method: POST
path: "/api/sources"
tags: ["Sources"]
---

# Create or return an RSS, YouTube, X profile, or email source

`POST /api/sources`

## Request

- Base URL: `https://keep.md`
- URL: `https://keep.md/api/sources`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `keep.session_token`

Create or return an RSS, YouTube, X profile, or email source.

## Headers

- `Keep-API-Version` string

## Request body

- SourceCreateRequest
  - `type` 'rss' | 'youtube_channel' | 'x_articles' | 'email_inbox' | 'web_monitor', required
  - `url` string, uri: Required for web_monitor. Public webpage or sitemap URL.
  - `kind` 'page' | 'sitemap': Required for web_monitor. Checks daily; first capture silently establishes a baseline. Maximum 10 monitors per account.
  - `name` string
  - `pollEveryMin` integer
  - `feedUrl` string, uri
  - `channel` string
  - `channelId` string
  - `handle` string
  - `input` string
  - `username` string
  - `contentMode` 'posts' | 'articles' | 'both'
  - `backfillMode` 'from_now' | 'days' | 'articles'
  - `backfillDays` integer
  - `backfillItems` integer
  - `initialImportCount` integer
  - `rollupEnabled` boolean
  - `expandFullContent` boolean
  - `autoSummarize` boolean
  - `defaultTags` string[]
  - `smartTagRules` SmartTagRule[]
    - `tag` string, required
    - `include` string[]
    - `exclude` string[]

## Response `200`

Created or existing source

- object
  - `source` Source, required: A compact content-source manifest. Config and tag rules are returned only with include=settings or include=sensitive. Cursor is returned only with include=sensitive.
    - `id` string, required
    - `type` 'rss' | 'youtube_channel' | 'x_articles' | 'email_inbox' | 'web_monitor', required
    - `name` string
    - `status` 'active' | 'paused' | 'error', required
    - `contentMode` 'posts' | 'articles' | 'both'
    - `pollEveryMin` integer
    - `nextPollAt` integer, nullable
    - `lastRunAt` integer, nullable
    - `lastSuccessAt` integer, nullable
    - `lastError` string, nullable
    - `inboxAddress` string, nullable
    - `config` object: Source configuration. Present with include=settings or include=sensitive. Secret fields and credential-like URL parameters are replaced with [redacted] unless include=sensitive was requested.
    - `cursor` object: Internal source cursor. Present only when include=sensitive was requested.
    - `createdAt` integer, required
    - `updatedAt` integer, required
  - `existing` boolean
  - `initialRun` object
  - `discovery` object

## Other responses

- `400`: Invalid request
- `401`: Authentication required
- `403`: The credential lacks access or the plan does not include the feature

---

[API](https://skmtc.dev/keep/apis/keep-api.md) · [All operations](https://skmtc.dev/keep/apis/keep-api/llms.txt) · [OpenAPI document](https://skmtc.dev/keep/apis/keep-api/revisions/a338a455bd0f?raw)
