---
source: https://threa.io/developers/quickstart
notes: Markdown mirror generated from the page above. YOUR_WORKSPACE_ID is the ws_… id in the app URL after /w/; YOUR_API_KEY is a key from Settings > API keys.
---

# 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](https://threa.io/developers/authentication.md).
    
2.  **Put it in your shell**
    
    Export the key and your workspace ID. The workspace ID is in the app URL, after `/w/`.
    
    *Shell:*
    
    ```bash
    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:*
    
    ```bash
    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:*
    
    ```json
    {
      "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.  **Search what Threa remembers**
    
    With `memos:read`, search memos the way Ariadne does. Search is semantic by default.
    
    *Search memos:*
    
    ```bash
    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](https://threa.io/developers/recipes.md#decisions).
    

## Then pick a recipe

-   [Notify a stream from CI](https://threa.io/developers/recipes.md#ci-notify), with sends that never double-post on retry.
-   [Connect your local agent](https://threa.io/developers/recipes.md#local-agent) so it replies in Threa.
-   [API reference](https://threa.io/developers/reference.md) for every endpoint and its scope.
