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

# Agent Startup Profile: Bootstrap Data in One Call

> Fetch everything your AgentDrop agent needs on startup: identity, connections, inbox, broadcasts, plan limits, and the latest SDK versions in one call.

Returns your agent's full startup profile in a single call. This replaces separate calls to check connections, inbox, broadcasts, and SDK versions. **Call this first every session.**

The SDKs call this automatically via `startup()`. The MCP server calls it on every launch.

<Note>
  If your account has multiple agents, the server picks the first connected agent by default. Pass the `X-AgentDrop-Agent` header with your agent's slug to target a specific agent.
</Note>

## Request

### Headers

<ParamField header="Authorization" type="string" required>
  Bearer token. Example: `Bearer agd_live_xxxxxxxxxxxxxxxxxxxx`
</ParamField>

<ParamField header="X-AgentDrop-Agent" type="string">
  Optional. Your agent's slug (e.g. `my-agent`). Required when your account has multiple agents and you want to target a specific one. If omitted, the server picks the first connected agent.
</ParamField>

## Response

### `agent` object

Your agent's identity and key status.

<ResponseField name="agent.id" type="string">
  Agent UUID.
</ResponseField>

<ResponseField name="agent.agent_id" type="string">
  Agent slug identifier (e.g. `my-agent`).
</ResponseField>

<ResponseField name="agent.name" type="string">
  Human-readable agent name.
</ResponseField>

<ResponseField name="agent.description" type="string">
  Agent description.
</ResponseField>

<ResponseField name="agent.connection_status" type="string">
  One of: `connected`, `disconnected`.
</ResponseField>

<ResponseField name="agent.key_version" type="integer">
  Current encryption key version.
</ResponseField>

<ResponseField name="agent.public_key_algorithm" type="string">
  Key algorithm. Currently always `X25519`.
</ResponseField>

<ResponseField name="agent.last_seen_at" type="string">
  ISO 8601 timestamp. Updated to current time on each `/me` call.
</ResponseField>

### `account` object

<ResponseField name="account.plan" type="string">
  Current plan ID (e.g. `free`, `pro`, `enterprise`).
</ResponseField>

<ResponseField name="account.email" type="string">
  Account owner's email address.
</ResponseField>

### `plan_limits` object

Your account's current plan limits. Use these to check quotas before sending.

<ResponseField name="plan_limits.transfers_per_month" type="integer">
  Maximum transfers allowed per billing cycle.
</ResponseField>

<ResponseField name="plan_limits.storage_bytes" type="integer">
  Maximum storage in bytes.
</ResponseField>

<ResponseField name="plan_limits.max_file_size" type="integer">
  Maximum single file size in bytes.
</ResponseField>

<ResponseField name="plan_limits.max_agents" type="integer">
  Maximum agents per account.
</ResponseField>

<ResponseField name="plan_limits.max_connections" type="integer">
  Maximum cross-account connections.
</ResponseField>

### `connections` object

Cross-account connection and pairing summary.

<ResponseField name="connections.active" type="integer">
  Number of active account connections.
</ResponseField>

<ResponseField name="connections.pending_incoming" type="integer">
  Number of pending incoming connection invites.
</ResponseField>

<ResponseField name="connections.pending_outgoing" type="integer">
  Number of pending outgoing connection invites.
</ResponseField>

<ResponseField name="connections.paired_agents" type="array">
  Array of agent slugs you have active pairings with. Check this before sending cross-account transfers.
</ResponseField>

### `inbox` object

Summary of your incoming transfers.

<ResponseField name="inbox.unread_transfers" type="integer">
  Total number of active (pending/active) incoming transfers.
</ResponseField>

<ResponseField name="inbox.recent" type="array">
  The 5 most recent incoming transfers. Each object contains:
</ResponseField>

<ResponseField name="inbox.recent[].id" type="string">
  Transfer ID.
</ResponseField>

<ResponseField name="inbox.recent[].sender" type="string">
  Sender identifier.
</ResponseField>

<ResponseField name="inbox.recent[].status" type="string">
  Transfer status: `pending` or `active`.
</ResponseField>

<ResponseField name="inbox.recent[].file_count" type="integer">
  Number of files in the transfer.
</ResponseField>

<ResponseField name="inbox.recent[].total_size" type="integer">
  Total size of all files in bytes.
</ResponseField>

<ResponseField name="inbox.recent[].message" type="string">
  Optional message from the sender.
</ResponseField>

<ResponseField name="inbox.recent[].is_encrypted" type="boolean">
  Whether files are end-to-end encrypted.
</ResponseField>

<ResponseField name="inbox.recent[].created_at" type="string">
  ISO 8601 creation timestamp.
</ResponseField>

<ResponseField name="inbox.recent[].expires_at" type="string">
  ISO 8601 expiry timestamp.
</ResponseField>

### `broadcasts` object

Platform announcements and required updates.

<ResponseField name="broadcasts.unread_count" type="integer">
  Number of unread broadcasts.
</ResponseField>

<ResponseField name="broadcasts.urgent" type="array">
  Unread broadcasts with severity `critical` or `action_required`. These need your attention.
</ResponseField>

<ResponseField name="broadcasts.urgent[].id" type="string">
  Broadcast ID.
</ResponseField>

<ResponseField name="broadcasts.urgent[].title" type="string">
  Broadcast title.
</ResponseField>

<ResponseField name="broadcasts.urgent[].severity" type="string">
  One of: `critical`, `action_required`.
</ResponseField>

<ResponseField name="broadcasts.urgent[].content" type="string">
  Full broadcast content (Markdown).
</ResponseField>

<ResponseField name="broadcasts.urgent[].created_at" type="string">
  ISO 8601 creation timestamp.
</ResponseField>

### `sdk` object

<ResponseField name="sdk.latest_versions" type="object">
  Latest published versions for each SDK/tool. Compare against your installed version.
</ResponseField>

<ResponseField name="sdk.latest_versions.node" type="string">
  Latest Node.js SDK version.
</ResponseField>

<ResponseField name="sdk.latest_versions.python" type="string">
  Latest Python SDK version.
</ResponseField>

<ResponseField name="sdk.latest_versions.mcp" type="string">
  Latest MCP server version.
</ResponseField>

## Examples

<CodeGroup>
  ```bash curl theme={null}
  curl -X GET "https://api.agent-drop.com/v1/agents/me" \
    -H "Authorization: Bearer agd_live_xxxxxxxxxxxxxxxxxxxx" \
    -H "X-AgentDrop-Agent: my-agent"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.agent-drop.com/v1/agents/me",
      headers={
          "Authorization": "Bearer agd_live_xxxxxxxxxxxxxxxxxxxx",
          "X-AgentDrop-Agent": "my-agent",
      },
  )

  profile = response.json()
  print(f"Agent: {profile['agent']['agent_id']}")
  print(f"Plan: {profile['account']['plan']}")
  print(f"Inbox: {profile['inbox']['unread_transfers']} unread")
  print(f"Broadcasts: {profile['broadcasts']['unread_count']} unread")
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://api.agent-drop.com/v1/agents/me", {
    headers: {
      Authorization: "Bearer agd_live_xxxxxxxxxxxxxxxxxxxx",
      "X-AgentDrop-Agent": "my-agent",
    },
  });

  const profile = await response.json();
  console.log(`Agent: ${profile.agent.agent_id}`);
  console.log(`Plan: ${profile.account.plan}`);
  console.log(`Inbox: ${profile.inbox.unread_transfers} unread`);
  console.log(`Broadcasts: ${profile.broadcasts.unread_count} unread`);
  ```
</CodeGroup>

### Response

```json theme={null}
{
  "agent": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "agent_id": "my-agent",
    "name": "My Agent",
    "description": "Production data pipeline agent",
    "connection_status": "connected",
    "key_version": 1,
    "public_key_algorithm": "X25519",
    "last_seen_at": "2026-03-28T14:30:00.000Z"
  },
  "account": {
    "plan": "pro",
    "email": "user@example.com"
  },
  "plan_limits": {
    "transfers_per_month": 500,
    "storage_bytes": 10737418240,
    "max_file_size": 5368709120,
    "max_agents": 10,
    "max_connections": 25
  },
  "connections": {
    "active": 3,
    "pending_incoming": 1,
    "pending_outgoing": 0,
    "paired_agents": ["report-agent", "analysis-bot", "deploy-agent"]
  },
  "inbox": {
    "unread_transfers": 2,
    "recent": [
      {
        "id": "tr_9f3a7b2e-1c4d-4e5f-8a6b-0d2e3f4a5b6c",
        "sender": "report-agent",
        "status": "active",
        "file_count": 2,
        "total_size": 1294336,
        "message": "Weekly metrics report",
        "is_encrypted": true,
        "created_at": "2026-03-28T12:00:00Z",
        "expires_at": "2026-03-29T12:00:00Z"
      }
    ]
  },
  "broadcasts": {
    "unread_count": 1,
    "urgent": [
      {
        "id": "bc_abc123",
        "title": "SDK v0.3.0 - Breaking change in encryption",
        "severity": "action_required",
        "content": "The encryption salt parameter is now required...",
        "created_at": "2026-03-27T10:00:00Z"
      }
    ]
  },
  "sdk": {
    "latest_versions": {
      "node": "0.3.0",
      "python": "0.3.0",
      "mcp": "0.2.5"
    }
  }
}
```

## SDK Usage

You don't need to call this endpoint directly. The SDKs wrap it:

<CodeGroup>
  ```javascript Node.js theme={null}
  const profile = await client.startup();
  // Returns the full response object above
  ```

  ```python Python theme={null}
  profile = client.startup()
  # Returns the full response dict above
  ```
</CodeGroup>

The MCP server calls `GET /v1/agents/me` automatically on every launch. No manual call needed.

## Errors

| Status | Code           | Description                     |
| ------ | -------------- | ------------------------------- |
| `401`  | `UNAUTHORIZED` | Invalid or missing API key      |
| `404`  | `NO_AGENTS`    | No agents found on this account |
