Export · CSV
Export your X bookmarks to Notion
Sift hands you a nine-column CSV; Notion turns that file into a full-page database in one import, and the only real work is converting four of the columns to the property types Notion cannot guess on its own.
The file, and what Notion can do with it
The download is a single CSV, UTF-8, RFC 4180, every field quoted, ordered by when you saved each post — newest first. Notion’s importer parses quoted fields properly, which matters more here than it sounds: post text routinely contains commas, straight quotes and hard line breaks, and all three survive the trip intact. A row looks like this.
"1795432198765432198","https://x.com/rauchg/status/1795432198765432198", "@rauchg","2026-08-14T09:12:44.000Z","2026-08-14T21:03:01.812Z", "the only two hard problems in caching","Engineering", "caching infra performance","A one-line note on cache invalidation."
Six of those columns are X’s: the post ID, the canonical x.com permalink, the author handle, when it was posted, when you saved it, and the post text exactly as published. The last three are ours, and they carry an ai_ prefix so that a database you later share with someone still shows at a glance which text a person wrote and which a model did.
Importing it
Reorder the columns before you import — this one is irreversible
Notion makes the leftmost column the database’s Title property, and Title cannot be reassigned to a different property afterwards. Left as-is you get a database whose every page is named after a 19-digit number. Moveai_summary(orpost_text) to column A first — in a spreadsheet, or with the in-browser export converter, which reorders and rewrites columns without the file leaving your tab.Turn ai_tags into a comma-separated list
Our tags are space-separated. Notion splits text into Multi-select options on commas, socaching infra performancearrives as one three-word option rather than three tags. Find-and-replace spaces with commas in that column only, before import.Import: sidebar → Import → CSV
Pick the file. Notion creates a new full-page database as a subpage of wherever you were. There is no “import into this existing database” option on this path — that is the merge step below.Fix the property types
Notion imports almost everything as Text and guesses at the rest. Click each property header → Edit property → Type, and set the four in the table below. Converting Text to Date parses the ISO 8601 timestamps we emit without any reformatting.Build the views you actually wanted
Group a board view byai_categoryto get the twelve-lane version of your saved posts, or filter a table byai_tagscontains. This is the point of the exercise; the import is just the plumbing.Adding a later export
Open the database →···→ Merge with CSV. It appends rows and matches columns by header name; it does not match onpost_id, so a second file will duplicate anything both exports contain. Sort by the post ID column and delete the pairs, or keep one database per export.
Column to property mapping
| CSV column | Notion property type | Why |
|---|---|---|
post_id | Text — never Number | See the warning below. |
post_url | URL | Makes the permalink clickable from a table row and from the peek view. |
author_handle | Text, or Select | Select if you want to filter by who you save from; the option list gets long fast. |
posted_at | Date | Include time — ISO 8601 with a Z offset parses cleanly. |
saved_at | Date | Sort descending on this to reproduce the order the file arrived in. |
post_text | Text | Verbatim. Do not edit it — see the note on alteration below. |
ai_category | Select | One of a fixed set, so Notion’s option list stays short and groupable. |
ai_tags | Multi-select | Only after the comma substitution in step 2. |
ai_summary | Text | Good candidate for the Title column. |
Where the post text ends up
Notion turns each CSV row into a page, but the values land in properties, not in the page body. So every post opens to a blank canvas with the text sitting in a property field above it. That is fine — Notion’s search indexes property text, so the bookmarks are findable — but it surprises people who expected a page per post with the post as its content. If you want that shape, generate one Markdown file per bookmark instead and import those; the notes on the Markdown flavour of the same export cover how to escape post text so a stray # or * does not become a heading or an italic.
Why there is no Notion integration
Notion has a perfectly good API, and writing rows into a database you nominated would be a couple of days of work. We have not built it, and the reason is not effort.
X’s developer policy restricts handing X content to third parties: what may be redistributed freely is post IDs, and the exception that lets us give you the text at all is written for “non-automated means” — a spreadsheet you download. A scheduled push into a Notion workspace is neither non-automated nor obviously covered. The compliant version of a Notion sync would carry post IDs plus our own categories and summaries and no post text, and a Notion database full of bare nineteen-digit numbers is not a product anyone wants.
- So: export is a button you press, the file lands in your downloads folder, and what happens next is yours. Nothing about Notion is connected to your Sift account.
- Deleted posts never make it into the file. A free nightly deletion check tombstones anything removed on X, and tombstoned rows are excluded from the export — so a Notion database built from it will not resurrect a post its author took down.
Curious where the data comes from in the first place? It is one endpoint, GET /2/users/:id/bookmarks, read with your own read-only token — and X’s policy on redistribution is the same document that sets the limit below.
Two things that are true of every export
Sort them first, then export
An export is only worth having if the categories are. Connect X read-only, let Sift import and sort your newest bookmarks, and the file you download inherits that structure — category, tags and a one-line summary already attached to every row.
Connect X