← Help

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 be 1. 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, through thingIds.
  • things — the items themselves. A thing that no list mentions is imported without a list.

Fields

FieldWhereRequiredNotes
idbothyesAny number, unique within the file. Used to link the two.
namebothyesAn item or list without a name is skipped.
descriptionlistsnoFree text.
isPubliclistsnotrue makes the list publicly visible. Defaults to false.
defaultViewModelistsno"list" or "grid".
thingIdslistsnoThe ids of the things in this list.
urlthingsnoMust be an http(s) link. Stored exactly as written.
notethingsnoFree text.
price + currencythingsnoA number plus a currency, or one string like "120 USD".
identifierthingsnoYour own reference, e.g. a model number.
isOwnedthingsnotrue marks the item as already owned.
createdAtbothnoISO 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.

  1. Copy the prompt below.
  2. Paste it into the assistant, followed by your wishlist: a screenshot, a page of notes, an export from another service, a bunch of links.
  3. Save the reply as a file ending in .json.
  4. 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-blanket becomes "Wool blanket", and https://shop.com/p/9912 falls 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.