# GET /v1/bloggers/{id}

Returns one **account** (blogger record) from your organization by its internal UUID, with the same aggregated statistics as [`GET /v1/bloggers`](./list).

To start tracking a new account, use [`POST /v1/bloggers/track`](./track) first and poll [`GET /v1/bloggers/jobs/{job_id}`](./jobs) until `succeeded`.

## 📋 Overview

| Property | Value |
|----------|-------|
| **Method** | `GET` |
| **Endpoint** | `https://api.influtics.com/v1/bloggers/`<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 account's internal UUID — the `id` returned by [`GET /v1/bloggers`](./list). Must be a canonical UUID. |

This endpoint takes **no query parameters**. Every filter lives on the list endpoint.

### Example Request

```bash
curl -X GET "https://api.influtics.com/v1/bloggers/1b7c4e90-3a55-4d21-9f08-6c2ad5b19e34" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```bash
# A trailing slash is accepted
curl -X GET "https://api.influtics.com/v1/bloggers/1b7c4e90-3a55-4d21-9f08-6c2ad5b19e34/" \
  -H "Authorization: Bearer YOUR_API_KEY"
```

## 📤 Response

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

```json
{
  "success": true,
  "data": {
    "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"
  },
  "meta": {
    "request_id": "9f7e8d4c-1a2b-4c3d-8e5f-6a7b8c9d0e1f"
  }
}
```

### `account` fields

Identical to the list endpoint — see [`account` fields on GET /v1/bloggers](./list#account-fields) for the full table with types and nullability.

| Field | Type | Description |
|-------|------|-------------|
| `id` | `string` \| `null` | Internal account UUID. |
| `channel_name` | `string` \| `null` | Creator's display name. |
| `channel_username` | `string` \| `null` | Username without `@`; `null` when unknown. |
| `channel_thumbnail` | `string` \| `null` | Avatar URL. |
| `url` | `string` \| `null` | Canonical profile URL. |
| `platform` | `string` \| `null` | Platform identifier. |
| `is_tracked` | `boolean` | **Actively** tracking — a paused account reads `false`. |
| `tracking_id` | `string` \| `null` | UUID of the tracking row. |
| `tracked_at` | `string` \| `null` | When tracking started (ISO 8601). |
| `last_scraped_at` | `string` \| `null` | When platform stats were last refreshed — not when this request was made. |
| `campaign` | `string` \| `null` | Exact campaign name, or `null` when the account is not in a campaign — which is the case for about 97% of accounts. See the campaign notes on the [list endpoint](./list). |
| `budget_per_video` | `number` \| `null` | Per-video budget configured for the account. |
| `daily_videos_count` | `number` \| `null` | Videos per day expected by the tracking schedule. |
| `video_count` | `number` \| `null` | Number of videos with statistics in the org. |
| `number_of_subscribers` | `number` \| `null` | Subscriber / follower count at last refresh. |
| `total_views` | `number` \| `null` | Sum of views across the account's videos. |
| `median_views` | `number` \| `null` | Median views across the account's videos. |
| `avg_views` | `number` \| `null` | **Mean** views per video. Published as `avg_views`. |
| `created_at` | `string` \| `null` | When the account row was created (ISO 8601). |
| `updated_at` | `string` \| `null` | When the account row was last written (ISO 8601). |

### 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 account 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/bloggers/alice`) | — |
| `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

An account that exists but belongs to another organization is indistinguishable from one that does not exist: both return `404 NOT_FOUND` with the message `Account 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/bloggers/alice` 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/bloggers/alice`. Same status and code, different message — so if you need to tell "malformed id" from "unknown id", match on `message`.

### `is_tracked` means *actively* tracking

`is_tracked` is `true` only while tracking is running. A paused account reads `false`, identical to an account you never tracked. See the full explanation on the [list endpoint](./list#is_tracked-means-actively-tracking-not-known-to-you).

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

The statistics view behind this endpoint aggregates views only, so there is no engagement average to compute. The three fields are omitted rather than emitted as `0`. For computed engagement averages use [`GET /v1/bloggers/by-username/{username}`](./by-username), which returns them — there `0` means "no video data to average".

### Duplicated accounts resolve to the most recently tracked copy

A blogger with two tracking rows has two rows in the underlying view. This endpoint returns one of them: the copy with the newest `tracked_at`. Fields that come from the tracking row (`tracking_id`, `tracked_at`, `campaign`, `budget_per_video`, `daily_videos_count`, `is_tracked`) therefore reflect that copy. Account-level fields (`channel_name`, `platform`, `number_of_subscribers`) and all view aggregates are identical across copies.

- 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 (`last_scraped_at`), not the moment of this request.

---

**Related**: [List Accounts →](./list) | [Creator Lookup by Username →](./by-username) | [Get Creator →](../creators/by-id)
