---
title: Look up a social profile
description: Get a LinkedIn, TikTok or Instagram profile through looot, with the right input field for each network.
---

Four jobs cover the common networks. Each takes a different input shape, so check the table before
you run one.

## What it costs

```json MCP
search {"filters": {"capability": "linkedin.person.profile"}, "prefer": "cheapest"}
```

On 2026-09-28 the cheapest listed prices were `linkedin.person.profile` around $0.0019 per call,
`linkedin.company.profile` around $0.0036 per call, `tiktok.user.profile` around $0.001 per call,
and `instagram.user.profile` around $0.0019 per call. Read the live number before a batch.

| Network | Job | Input |
| --- | --- | --- |
| LinkedIn person | `job:linkedin.person.profile` | `linkedin_url` |
| LinkedIn company | `job:linkedin.company.profile` | `linkedin_url` |
| TikTok | `job:tiktok.user.profile` | `handle` (no @) |
| Instagram | `job:instagram.user.profile` | `handle` (no @) |

1. **Run the lookup**

    <CodeGroup>

    ```json MCP
    run {"endpointId": "job:tiktok.user.profile", "input": {"handle": "example"}, "idempotencyKey": "social-tiktok-example", "fallback": true}
    ```

    ```bash REST
    curl -s "https://api.looot.ai/v1/runs?wait=20" \
      -H "Authorization: Bearer $LOOOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "endpointId": "job:tiktok.user.profile",
        "input": {"handle": "example"},
        "idempotencyKey": "social-tiktok-example",
        "fallback": true
      }'
    ```

    ```bash CLI
    looot run job:tiktok.user.profile --input '{"handle": "example"}' --wait
    ```

    </CodeGroup>

    :::note
    looot 1.1.0 does not accept `--fallback` on `looot run`. The CLI call above tries one provider.
    :::

    For LinkedIn, send `linkedin_url`, not `handle`:

    ```json MCP
    run {"endpointId": "job:linkedin.person.profile", "input": {"linkedin_url": "https://www.linkedin.com/in/example"}, "idempotencyKey": "social-linkedin-example", "fallback": true}
    ```

2. **Read the profile**

    These four jobs have no [`normalized`](/concepts/normalized-output) map yet: read the profile fields from `result` and check
    which provider answered ([`servedProviderId`](/concepts/served-provider)), since the field names can differ between providers on
    the same job.

3. **Another network**

    For a network not in the table (X, YouTube), search for it in plain words and read [`jobInputs`](/concepts/job-inputs) on
    the result before you run it:

    ```json MCP
    search {"query": "x user profile"}
    ```

## What the answer looks like

| Field | What it is |
| --- | --- |
| `status` | `completed`, `failed`, `queued`, `running` |
| [`outcome`](/concepts/outcomes) | `hit`, `weak`, `miss`, `error`, `rejected`, `skipped` or `pending` |
| `servedProviderId` | the provider that answered |
| `actualCost` | what this run charged |
| `route.summary` | fallback runs only |

## On a miss or error

- A handle or profile that does not exist, or a private account: `outcome` is `miss`. With
  [`fallback`](/concepts/fallback), the next provider of the same job gets a try inside the same hold.
- A LinkedIn URL that redirects to a sign-in wall reads the same way as a miss on some
  providers; if you get an empty profile back, try `fallback` before concluding the profile does
  not exist.
- [`insufficient_balance`](/errors/rest-errors#insufficient_balance): the run is blocked and not charged. Use [`top_up`](/mcp-tools/top-up), then retry with a new
  [`idempotencyKey`](/concepts/idempotency).

<Related />
