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

# External IDs

> Use your own user IDs to manage follows and webhooks without requiring wallet addresses

# External IDs

External IDs let you attach your app's internal user identifiers to Clicker profiles. This means you can set up follows and webhook subscriptions for your users before you know their wallet addresses.

# Why external IDs exist

Many apps identify users by an internal ID, not a wallet address. Your user might have an account in your system long before they connect a wallet. External IDs bridge this gap — you can start building a social graph for your users immediately, using identifiers you already have.

When a user later connects a wallet, you add their address to the profile and everything flows naturally: their follows are already in place, their webhook subscriptions start delivering on-chain activity, and their profile is ready to appear on leaderboards.

# How it works

Use the `ext:` prefix with any identifier in place of a wallet address or profile UUID. The `ext:` prefix tells Clicker to look up (or create) a profile using your app's internal ID, scoped to your API key.

```
ext:your-internal-user-id
```

For example, if your user's ID is `user_abc123`, you'd reference them as `ext:user_abc123` in API calls.

External IDs are scoped to your API key. Two different partners can use the same external ID string without conflict — each resolves to a separate profile.

# URL encoding

When using `ext:` identifiers in URL paths, the colon must be URL-encoded as `%3A`:

```
PUT /v1/addresses/ext%3Auser_abc123/follow
```

In request bodies (JSON), use the `ext:` prefix as-is:

```json theme={null}
{
  "walletAddresses": ["ext:user_abc123", "ext:user_xyz789"]
}
```

# Setting up follows

Create follow relationships using your internal user IDs. Clicker creates stub profiles automatically on first use.

```bash theme={null}
# user_abc123 follows a trader by their wallet address
curl -X PUT https://api.clicker.xyz/v1/addresses/ext%3Auser_abc123/follow \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"targets": ["0x1234..."]}'
```

You can also use `ext:` identifiers in bulk follow operations and as follow targets.

# Webhook subscriptions

Subscribe your users to webhook notifications using external IDs. When an `ext:` user is subscribed to a webhook and later gains wallet addresses, those addresses are automatically added as subscribers too.

```bash theme={null}
# Register a feed webhook with ext: subscribers
curl -X POST https://api.clicker.xyz/v1/webhooks/feed \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destinationUrl": "https://yourapp.com/webhooks/clicker",
    "walletAddresses": ["ext:user_abc123", "ext:user_xyz789"]
  }'
```

You can mix `ext:` identifiers with regular wallet addresses in the same request.

# Profile responses

When a profile has an external ID for your app, it appears in API responses as `externalId`:

```json theme={null}
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "trader.yourapp.xyz",
  "addresses": ["0x1234..."],
  "externalId": "user_abc123",
  "metadata": { ... }
}
```

The `externalId` field is only present when the profile has an external ID for your API key. Other partners see their own external IDs, or no field at all.

This field appears everywhere profiles are returned: profile lookups, follow responses, feed actors, leaderboard entries, and webhook payloads.

# Adding addresses later

When your user connects a wallet, add their address to the existing profile. This is the "de-anonymization" step — the stub profile becomes a full profile with on-chain activity.

After addresses are added:

* The profile starts appearing in feeds and leaderboards
* Webhook subscriptions automatically expand to cover the new addresses
* The user's existing follows remain intact
* The `externalId` field continues to appear in responses alongside the addresses

# Limitations

* External IDs are permanent — once assigned to a profile, they cannot be reassigned to a different profile.
* A profile can have one external ID per partner.
* Profiles with only external IDs (no addresses) cannot author feed items, appear on leaderboards, or have PnL. They can follow other profiles and receive webhook notifications.
* External IDs cannot be followed by other users — only profiles with addresses can be followed.
