Import file format
Import lives in Settings → Data → Import data. It takes two kinds of input, and works out which one you gave it on its own — you never pick a format.
- A JSON file in the format below. This is exactly what Export data produces, so an export always imports back cleanly. It is also the format to ask an AI agent for.
- A plain text or markdown list, pasted or dropped in as a file.
Nothing is written to your account until you have seen the preview and confirmed it.
The JSON format
The file is one JSON object with three parts:
schemaVersion— must be1. A file without it, or with any other version, is rejected.lists— the lists to create. Each list references the things in it by their ids, throughthingIds.things— the items themselves. A thing that no list mentions is imported without a list.
Fields
| Field | Where | Required | Notes |
|---|---|---|---|
id | both | yes | Any number, unique within the file. Used to link the two. |
name | both | yes | An item or list without a name is skipped. |
description | lists | no | Free text. |
isPublic | lists | no | true makes the list publicly visible. Defaults to false. |
defaultViewMode | lists | no | "list" or "grid". |
thingIds | lists | no | The ids of the things in this list. |
url | things | no | Must be an http(s) link. Stored exactly as written. |
note | things | no | Free text. |
price + currency | things | no | A number plus a currency, or one string like "120 USD". |
identifier | things | no | Your own reference, e.g. a model number. |
isOwned | things | no | true marks the item as already owned. |
createdAt | both | no | ISO date. Kept as written, so history survives a round trip. |
A price always needs a currency. "price": 120 on its own is skipped; "price": 120, "currency": "USD" is fine.
Images are never imported, and neither are followers, settings or API keys.
A complete example
{
"schemaVersion": 1,
"lists": [
{
"id": 1,
"name": "Birthday",
"description": "Things I would love",
"isPublic": true,
"defaultViewMode": "grid",
"thingIds": [1, 2]
},
{
"id": 2,
"name": "Kitchen",
"isPublic": false,
"thingIds": [3]
}
],
"things": [
{
"id": 1,
"name": "Sony WH-1000XM5",
"url": "https://www.amazon.de/dp/B09XS7JWHH",
"note": "Black, not silver",
"price": 379,
"currency": "EUR"
},
{
"id": 2,
"name": "Wool blanket",
"isOwned": true
},
{
"id": 3,
"name": "Kettle",
"url": "https://shop.com/p/9912",
"price": "49.90 USD",
"identifier": "KT-9912"
}
]
}
Ask an AI agent to build the file
You do not have to write the JSON yourself. Any chat assistant — ChatGPT, Claude, Gemini — can turn a wishlist you already have into an import file.
- Copy the prompt below.
- Paste it into the assistant, followed by your wishlist: a screenshot, a page of notes, an export from another service, a bunch of links.
- Save the reply as a file ending in
.json. - Drop that file on the import page.
Agents get things wrong, so read the preview before you confirm — it lists every item that will be created, and nothing is written to your account until you say so.
Turn my wishlist into a Things To Have import file. Follow the format documented at https://thingstohave.app/help/import-format exactly: one JSON object with "schemaVersion": 1, a "lists" array and a "things" array, where each list references its items by their ids in "thingIds". Reply with the JSON only.
Pasting a list instead
Anything that is not JSON is read line by line. Blank lines are ignored, and -, * and 1. prefixes are stripped.
## Birthday
- [Sony WH-1000XM5](https://www.amazon.de/dp/B09XS7JWHH)
- Wool blanket — https://shop.com/wool-blanket
- [x] Kettle
- A long walk with a friend
## Kitchen
- https://shop.com/p/9912
That import creates two lists:
- A
##heading starts a new list named after the heading. Items above the first heading go into the list you chose on the import page. [Name](link)uses the name and the link.- Text before a link becomes the name; trailing dashes, colons and pipes are trimmed off.
- A bare link is named after the readable part of its address —
https://shop.com/wool-blanketbecomes "Wool blanket", andhttps://shop.com/p/9912falls back to "shop.com". - A line with no link becomes an item with just a name.
- [x]imports the item as already owned.
Limits
- Up to 2 MB and 1,000 items per import.
- Import never deduplicates. A link you already have is imported again, and the same link twice in one file becomes two items.
- Rows that cannot be imported — no name, a price that cannot be read, an invalid link, a field that is too long — are listed on the result screen and can be downloaded, corrected and imported again.