Threa Developers

    Quickstart.

    Four steps from a new API key to searching what Threa remembers, run from your own terminal.

    1. Create an API key

      In the app, open Workspace Settings → API Keys, create a personal access key, pick its scopes, and copy the threa_uk_… value. Threa shows it once and can't show it again.

      Give it memos:read for step 4. GET /me in step 3 takes no scope. Bot keys and the other scopes are in Authentication.

    2. Put it in your shell

      Export the key and your workspace ID. The workspace ID is in the app URL, after /w/.

      Shell
      export THREA_API_KEY=threa_uk_...
      export THREA_WORKSPACE_ID=ws_...
    3. Confirm who you are

      GET /me returns the identity behind the key. It's the quickest way to confirm a key is live and pointed at the right workspace.

      Who am I
      curl https://app.threa.io/api/v1/workspaces/$THREA_WORKSPACE_ID/me \
        -H "Authorization: Bearer $THREA_API_KEY"

      A working key comes back as a user or a bot principal, with its API version:

      200 response
      {
        "data": {
          "kind": "user",
          "workspaceId": "ws_...",
          "userId": "usr_...",
          "apiVersion": {
            "pinned": "2026-08-21",
            "resolved": "2026-08-21",
            "current": "2026-08-21",
            "supported": ["2026-08-21"]
          }
        }
      }
      user
      A personal access key. It acts as you, and messages it sends show as yours, flagged as sent via the API.
      bot
      A bot key. The bot acts as itself, in the streams it's been added to.
      401
      The key is missing or invalid.
    4. With memos:read, search memos the way Ariadne does. Search is semantic by default.

      Search memos
      curl -X POST https://app.threa.io/api/v1/workspaces/$THREA_WORKSPACE_ID/memos/search \
        -H "Authorization: Bearer $THREA_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{ "query": "auth", "limit": 5 }'

      Each result is a memo: a title, an abstract, its knowledge type (a decision, a procedure, and so on), tags, and the ids of the messages it came from. It's the same memo Ariadne answers from in Threa:

      Take a memo's id to GET /memos/{memoId} for the source stream and the exact messages, as in Find out what was decided, and why.

    Then pick a recipe