> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sendora.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Identifiers

> Which id to send, where to find it, and why it is safe to share.

Every object in Sendora has one id that you use everywhere: in the app address bar, in API responses, and in API requests. You never need to convert, decode or look up a second id.

## The one rule

* An `id` the API returns can be sent straight back to any endpoint that takes that kind of object.
* An id you copy from the app address bar is the same value the API uses.

For example, open a campaign in the app. The last part of the address is the campaign's id:

```text theme={"dark"}
https://app.sendora.ai/campaigns/2DFhs9pmIx0t9g4f4XfLTA
                                 └── campaign id
```

Send that same value as `campaign_id`:

```bash theme={"dark"}
curl "https://api.sendora.ai/api/v1/public/campaigns/2DFhs9pmIx0t9g4f4XfLTA" \
  -H "X-API-Key: $SENDORA_API_KEY"
```

## Where each id comes from

| You need | Get it from |
| - | - |
| `campaign_id` | `id` in List campaigns, or the campaign's page address |
| `folder_id` | `id` in List campaign folders |
| `lead_id`, `lead_ids` | `id` in List all leads, or the lead's page address |
| `list_id`, `lead_list_id`, `target_list_id` | `id` in List lead lists |
| `agent_id`, `reply_agent_id`, `inbound_agent_id` | `id` in List voice agents, or the agent's page address |
| `kb_id` | `id` in List knowledge bases |
| `source_id` | `id` in List KB sources |
| `tool_id` | `id` in List workspace tools, or List agent tools for an agent's own tools |
| `widget_id` | `id` in List widgets |
| `number_id`, `from_number_id` | `id` in List connected phone numbers |
| `account_id` (channel assignments) | `id` in List connected channel accounts |
| `endpoint_id` | `id` in List webhook endpoints |
| `entry_id` | `id` in List DNC entries |
| `call_id` | `id` in List voice calls, or `call_id` from Initiate voice call |
| `voice_id` | `id` in List available voices |
| `client_id`, `plan_id` (agency) | `id` in the matching agency list |

## Ids that exist only for one job

A few ids are not objects in your workspace. The API creates them for a single piece of work and returns them in the response that started it. They are not shown in the app, and the only place to get one is that response.

| Id | Returned by | Used for |
| - | - | - |
| `preview_id` | A preview request, for example Preview prospect search results | Reading that result set again, or importing rows from it |
| `source_run_id` | Prepare a one-time prospect search | Starting that search |
| `job_id` | Any request that starts background work | Checking progress with Get job status |
| `thread_id` | The first `thread` event of Stream a Copilot reply | Continuing or reading that session |
| `run_id`, `action_id` | Get a Copilot session | Approving or rejecting a pending action |

## Why these ids are safe to share

A Sendora id is a random value. It is not derived from anything inside Sendora, so nothing can be worked out from it. Every lookup is limited to the workspace that owns your API key: an id from another workspace returns `404 Not Found`, the same as an id that does not exist.

## If an id is rejected

* `404`: the id does not exist in this workspace. Check that the API key belongs to the workspace that owns the object, and that the id is for the right kind of object (a lead id is not a campaign id).
* `422`: the id is in the wrong place or the wrong shape, or an account id in Save channel assignments is not connected in this workspace. Read the message for the reason.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.