# GET /v1/creators/{id}

Returns one **creator** from your organization by its internal UUID, together with its accounts and their `overall_stats` aggregate.

This is the same object [`GET /v1/creators`](../creators/list) returns per row, without the surrounding array or `pagination` block.

## 📋 Overview

| Property | Value |
|----------|-------|
| **Method** | `GET` |
| **Endpoint** | `https://api.influtics.com/v1/creators/`<code>&#123;id&#125;</code> |
| **Auth Required** | ✅ Yes |
| **Plan Required** | 💳 Paid — free-tier keys get `402 PAID_PLAN_REQUIRED` |
| **Credits Cost** | 0 credits |

## 🔐 Headers

```
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
```

## 📝 Path Parameters

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `id` | string (uuid) | ✅ **Required** | The creator's internal UUID — the `id` returned by [`GET /v1/creators`](../creators/list). Must be a canonical UUID. |

This endpoint takes **no query parameters**. `name`, `limit` and `offset` live on the list endpoint.

### Example Request

```bash
curl -X GET "https://api.influtics.com/v1/creators/1f0c9a5e-6b2d-4a17-9c3e-7d8b2f4a1c90" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```bash
# A trailing slash is accepted
curl -X GET "https://api.influtics.com/v1/creators/1f0c9a5e-6b2d-4a17-9c3e-7d8b2f4a1c90/" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

## 📤 Response

`data` **is the creator object itself** — there is no `creator` wrapper, and there is no `pagination` block on this endpoint.

```json
{
  "success": true,
  "data": {
    "id": "1f0c9a5e-6b2d-4a17-9c3e-7d8b2f4a1c90",
    "display_name": "Kate Comfortt",
    "created_at": "2026-02-14T10:02:00Z",
    "updated_at": "2026-10-19T22:03:12Z",
    "overall_stats": {
      "video_count": 57,
      "number_of_subscribers": 243700,
      "total_views": 25180000,
      "average_views": 441930,
      "median_views": 312000
    },
    "accounts": [
      {
        "id": "1b7c4e90-3a55-4d21-9f08-6c2ad5b19e34",
        "channel_name": "Kate Comfortt",
        "channel_username": "katecomfortt",
        "channel_thumbnail": "https://xhrjtpcqcdqwcdiqrhfw.supabase.co/storage/v1/object/public/avatars/katecomfortt.jpg",
        "url": "https://www.instagram.com/katecomfortt",
        "platform": "instagram",
        "is_tracked": true,
        "tracking_id": "8c3f2b71-0d64-4a92-b1f7-2e5c9a4d6b13",
        "tracked_at": "2026-02-14T09:31:00Z",
        "last_scraped_at": "2026-10-19T22:00:00Z",
        "campaign": "Авито Недвиж",
        "budget_per_video": 12000,
        "daily_videos_count": 3,
        "video_count": 42,
        "number_of_subscribers": 128400,
        "total_views": 18732000,
        "median_views": 312000,
        "avg_views": 446000,
        "created_at": "2026-01-08T11:02:41Z",
        "updated_at": "2026-10-19T22:03:12Z"
      },
      {
        "id": "3d90b2c8-77a1-4e5f-8c26-0b4e9a7d1f55",
        "channel_name": null,
        "channel_username": null,
        "channel_thumbnail": null,
        "url": null,
        "platform": null,
        "is_tracked": false,
        "tracking_id": null,
        "tracked_at": null,
        "last_scraped_at": null,
        "campaign": null,
        "budget_per_video": null,
        "daily_videos_count": 0,
        "video_count": 0,
        "number_of_subscribers": 0,
        "total_views": 0,
        "median_views": 0,
        "avg_views": 0,
        "created_at": null,
        "updated_at": null
      }
    ]
  },
  "meta": {
    "request_id": "6a1d4f52-8c39-4e07-b6a8-2f5d9c1e7b40"
  }
}
```

### `creator` fields

| Field | Type | Description |
|-------|------|-------------|
| `id` | `string` | Internal creator UUID. Also the value to pass as `creator_id` to [`GET /v1/bloggers`](../bloggers/list). |
| `display_name` | `string` \| `null` | The creator's name. `null` when it has not been set. |
| `created_at` | `string` \| `null` | When the creator was created (ISO 8601). |
| `updated_at` | `string` \| `null` | When the creator row was last written (ISO 8601). |
| `overall_stats` | `object` | Aggregate across `accounts[]` — see below. |
| `accounts` | `object[]` | Accounts linked to this creator. Empty array when none are linked. |

### `overall_stats` fields

| Field | Type | Description |
|-------|------|-------------|
| `video_count` | `number` | **Sum** of `video_count` across the creator's accounts. |
| `number_of_subscribers` | `number` | **Sum** of `number_of_subscribers` across accounts — not the largest one, so a creator on two platforms double-counts reach. |
| `total_views` | `number` | Sum of `total_views` across the creator's accounts. |
| `average_views` | `number` | Video-count-weighted mean of the per-account averages. **Named `average_views` here, `avg_views` on each account** — same metric, two names. |
| `median_views` | `number` | Upper median over the same reconstructed distribution. For an even number of values it biases toward the higher one. |

An account whose `avg_views` is `0` contributes nothing to `average_views` or `median_views` and drops out of both denominators. A creator with no linked accounts, or only zeroed ones, reports all zeros.

### `account` fields inside `accounts[]`

Each entry has the identical shape to an account on [`GET /v1/bloggers`](../bloggers/list#account-fields) — including `avg_views`, `is_tracked`, `campaign`, `tracked_at` and the absence of `avg_likes` / `avg_comments` / `avg_reposts`. An account linked to this creator but with no statistics row of its own is still returned, zeroed, with its own UUID in `id`.

### Envelope fields

| Field | Type | Description |
|-------|------|-------------|
| `meta.request_id` | `string` | Unique request identifier. |

## ⚠️ Error Responses

All errors share the standard envelope `{ success: false, error: { code, message, request_id, ... } }`. The table below lists every documented `code` and the conditions that trigger it.

| Status | `code` | Trigger | Additional `error` fields |
|--------|--------|---------|---------------------------|
| `401` | `INVALID_API_KEY` | The `Authorization: Bearer` header is missing, empty, or malformed | — |
| `402` | `PAID_PLAN_REQUIRED` | Free-tier API key attempted the call | `upgrade_url` |
| `403` | `INVALID_OR_INACTIVE_API_KEY` | The API key is well-formed but unknown, revoked, or deactivated | — |
| `404` | `NOT_FOUND` | No creator with that `id` in your organization — including an id that belongs to another organization | — |
| `404` | `NOT_FOUND` | The path segment is not a canonical UUID (e.g. `GET /v1/creators/kate`) | — |
| `503` | `RETRY` | Subscription status could not be verified; retry shortly | — |
| `500` | `INTERNAL_ERROR` | Unexpected database or service failure | — |

A `403` means the key was recognised and can no longer be used — a revoked or deactivated credential — which is a different client-side fix from a `401`, where the `Authorization: Bearer` header never arrived or was malformed. The two are deliberately distinct: a credential that never arrived versus one that arrived and is unusable.

## 📌 Notes

### A cross-organization id returns the same 404 as a missing one

A creator that exists but belongs to another organization is indistinguishable from one that does not exist: both return `404 NOT_FOUND` with the message `Creator not found`. This is deliberate — it is what stops the endpoint from leaking which UUIDs are real.

### A non-UUID path segment is a routing 404, not a validation error

`/v1/creators/kate` does not reach this handler. The path is checked against a UUID pattern first, and a non-UUID falls through to the generic not-found route with the message `Not found: GET /v1/creators/kate`. Same status and code, different message — so if you need to tell "malformed id" from "unknown id", match on `message`.

### A creator with no accounts is a valid `200`

An existing creator with no linked accounts returns `accounts: []` and an all-zero `overall_stats`. That is not an error and not the same as a missing creator — only `404` means the creator does not exist.

### `is_tracked` means *actively* tracking

Inside `accounts[]`, `is_tracked` is `true` only while tracking is running, so a paused account reads `false`, exactly like an account you never tracked. See the [full explanation](../bloggers/list#is_tracked-means-actively-tracking-not-known-to-you).

### `avg_likes`, `avg_comments` and `avg_reposts` are **not** returned

Neither on the creator nor on any account inside `accounts[]`. The statistics view behind them aggregates views only, so there is no engagement average to compute — the fields are omitted rather than emitted as `0`. For computed engagement averages use [`GET /v1/bloggers/by-username/{username}`](../bloggers/by-username), where `0` means "no video data to average".

- The response is scoped to the calling organization.
- This endpoint only reads tables the organization already pays for and calls no platform API, so it costs `0` credits.
- Statistics are as of the last platform refresh (`accounts[].last_scraped_at`), not the moment of this request.

---

**Related**: [List Creators →](./list) | [List Accounts →](../bloggers/list) | [Account by ID →](../bloggers/by-id)
