# Welcome to CreatorsJet

> Build supported creator and agency workflows with CreatorsJet Public API V1.
>
> Canonical URL: https://docs.creatorsjet.com/docs

CreatorsJet developer documentation helps engineering and operations teams build server-side creator workflows with the implemented Public API V1 contract.

> **Coming Soon — Production access is release gated:**
>
> Public API V1 is implemented, but production access must be enabled by CreatorsJet. CreatorsJet MCP is not publicly released. Use this documentation to review the current contract and release status.

## Who this documentation is for

This documentation is designed for:

* Developers building creator or agency integrations
* Agency teams importing and maintaining creator rosters
* Product and data teams reading creator identities and summary metrics
* Platform engineers implementing secure, server-side media-kit workflows

## Start here

### [Public API V1](/api)

Understand the supported creator and agency contract, scope model, and release status.

### [Getting started](/api/getting-started)

Prepare an API key and your first authenticated request after access is enabled.

### [Endpoint reference](/api/reference)

Review exact requests and responses generated from the OpenAPI 3.1 contract.

### [CreatorsJet MCP](/mcp)

Review the implemented preview tools, safety model, and current release status.

## Supported workflows

Public API V1 currently covers:

* Agency roster creation and cursor-paginated retrieval
* Validated creator CSV imports with row-level results
* Creator profile and summary-metric retrieval
* Default media-kit creation, listing, and retrieval
* Creator-owned link-in-bio creation and editing
* Agency-owned pitch-deck creation and editing
* Creator- and agency-owned campaign listing, retrieval, creation, and metadata editing
* Page-view analytics for owned CreatorsJet resources

## Machine-readable contracts

* Append `.md` to any documentation URL for its Markdown representation
* [OpenAPI 3.1 JSON](/openapi.json)
* [Documentation index](/llms.txt)
* [Complete Markdown corpus](/llms-full.txt)


---

# MCP overview

> Review the implemented CreatorsJet MCP preview, shared service architecture, and release boundary.
>
> Canonical URL: https://docs.creatorsjet.com/mcp

CreatorsJet MCP is implemented as a preview in the CreatorsJet backend, but it is not publicly released. There is no supported public server URL, client configuration, or production connection guide yet.

> **Warn — Do not configure production clients yet:**
>
> Tool names and behavior on these pages describe the implemented preview. CreatorsJet will publish the supported server URL, OAuth connection flow, and client-specific setup only when the transport is released.

## How it is designed

MCP tools and Public API controllers are separate adapters over the same tenant-aware application services. MCP uses OAuth actor identity and scopes; the Public API uses API-key actor identity and scopes.

The MCP adapter does not call Public API endpoints over HTTP. Both transports reuse ownership checks, plan policies, roster operations, media-kit operations, link-in-bio operations, decks, campaigns, analytics, and safe error mapping.

## Implemented preview workflows

* Validate and commit agency roster imports
* Add one creator to an agency roster
* Ensure a creator's default media kit exists
* Add or remove creator social accounts and keep the relevant default kit synchronized
* Retrieve, create, or update the authenticated creator's link in bio
* List, retrieve, create, or update agency pitch decks
* List, retrieve, create, or update creator- or agency-owned campaigns
* Answer page-view questions for owned media kits, link-in-bio pages, public rosters, decks, and campaign reports
* Find sponsorship matches for eligible Sponsorship Intelligence creator accounts

The current preview does not include a general creator-profile retrieval tool. Use the Public API creator endpoint for server-to-server profile retrieval.

## Authentication boundary

The preview transport uses OAuth authorization with account-role scopes. Public API keys and CreatorsJet browser session tokens are not MCP credentials.

OAuth authorization identifies the user and grants compatible scopes. It does not subscribe the account, start checkout, or bypass product-plan allowances. Plan-sensitive tools apply the relevant product rules when invoked.

## Next steps

* [Review the implemented preview tools](/mcp/tools)
* [Understand write safety, plans, and errors](/mcp/safety-and-plans)
* Use [Public API V1](/api) for server-to-server integration work after Public API access is enabled

Claude, ChatGPT, Codex, and other client connection guides remain intentionally unpublished until there is a supported public MCP endpoint and verified connection flow.


---

# MCP safety and plans

> Understand confirmation rules, tenant isolation, plan enforcement, upgrade actions, and preview error responses.
>
> Canonical URL: https://docs.creatorsjet.com/mcp/safety-and-plans

CreatorsJet MCP tools resolve an authenticated actor containing the OAuth principal, creator or agency subject, user, granted scopes, and request ID. Tools apply subject ownership and scope checks before calling shared application services.

## Write-safety rules

Agents using the preview should follow these rules:

1. Validate a roster import before commit, show the complete preview and capacity impact, and obtain approval before `roster_commit_import`.
2. Obtain explicit confirmation immediately before `social_remove`.
3. Use `link_in_bio_get` before choosing create or update.
4. Use `deck_list` or `deck_get` before `deck_update`.
5. Use `campaign_list` or `campaign_get` before `campaign_update`.
6. Never start checkout, subscribe the user, or modify billing on the user's behalf.

Tool annotations identify read-only, idempotent, and destructive behavior for clients that support MCP annotations. Clients should still present an understandable confirmation when a destructive or consequential action is about to run.

## Tenant isolation

Creator tools act on the creator resolved from OAuth. Agency tools act on the agency and, where required, creators already in its roster.

Cross-tenant IDs do not grant access. Owned-resource services include the subject predicate in database queries, and inaccessible resources are reported as not found.

## Plans and allowances

OAuth grants role-compatible scopes; it does not grant a paid entitlement. Plan-sensitive tools reuse the applicable CreatorsJet product rules when invoked, including creator and social capacity, media-kit rules, deck capacity, active-campaign capacity, analytics eligibility, and Sponsorship Intelligence access.

A plan or allowance failure returns a safe structured action. Example:

```json
{
  "ok": false,
  "error": {
    "code": "LIMIT_EXCEEDED",
    "message": "Your agency has reached its active campaign limit.",
    "retryable": false,
    "details": {
      "usage": {
        "current": 30,
        "limit": 30,
        "requested": 1,
        "remaining": 0
      },
      "upgrade_url": "https://www.creatorsjet.com/a/my-plan?tab=upgrade&source=mcp",
      "action_label": "View agency plans"
    }
  }
}
```

Usage appears only when the service can safely provide it. The text fallback also includes the upgrade URL for clients that do not display structured content.

| Context                   | Authenticated CreatorsJet destination                              |
| ------------------------- | ------------------------------------------------------------------ |
| Creator plan or allowance | `https://www.creatorsjet.com/my-plan?tab=subscription&source=mcp`  |
| Agency plan or allowance  | `https://www.creatorsjet.com/a/my-plan?tab=upgrade&source=mcp`     |
| Sponsorship Intelligence  | `https://www.creatorsjet.com/dashboard/sponsor/my-plan?source=mcp` |

The tool proposes the relevant page only. It never initiates checkout.

## Error handling

Tool results use an `ok` envelope. Errors contain a sanitized code, message, retryability flag, optional details, and optional `retry_after_seconds`.

Common codes include:

| Code                      | Meaning                                                       |
| ------------------------- | ------------------------------------------------------------- |
| `AUTHENTICATION_REQUIRED` | OAuth authentication is absent or expired                     |
| `SCOPE_REQUIRED`          | The grant lacks the tool's required scope                     |
| `ROLE_FORBIDDEN`          | The account role cannot use the tool                          |
| `PLAN_REQUIRED`           | The operation requires an eligible plan                       |
| `LIMIT_EXCEEDED`          | A current product allowance is exhausted                      |
| `VALIDATION_FAILED`       | Tool input or normalized request data is invalid              |
| `NOT_FOUND`               | The resource is absent or inaccessible to the subject         |
| `CONFLICT`                | The request conflicts with current state or another operation |
| `RATE_LIMITED`            | The tool's safety limit was reached                           |
| `RETRYABLE_INTERNAL`      | A temporary internal failure prevented completion             |

MCP tool safety limits are separate from product-plan allowances. When `retry_after_seconds` is present, clients should wait at least that long and avoid parallel retries.

## Audit and data handling

Preview audit events record tool name, outcome, client and user identifiers, request ID, duration, result code, and queue ID when applicable. Tool arguments, spreadsheet rows, OAuth tokens, emails, social handles, and creator payloads must not be written to audit events or application logs.


---

# MCP preview tools

> Exact tool names, account roles, scopes, and implemented behavior in the unreleased CreatorsJet MCP preview.
>
> Canonical URL: https://docs.creatorsjet.com/mcp/tools

These tools exist in the backend preview but are not yet a generally available public contract.

## Agency roster tools

| Tool                       | Scope          | Behavior                                                                                                                   |
| -------------------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `roster_validate_import`   | `roster:read`  | Validates 1–500 normalized creator rows and creates a 30-minute preview when every row is valid.                           |
| `roster_commit_import`     | `roster:write` | Consumes an approved preview and queues the existing creator-import workflow. Reusing the preview returns the same import. |
| `roster_get_import_status` | `roster:read`  | Returns queue status, progress, created creator and media-kit IDs, and row failures.                                       |
| `roster_add_creator`       | `roster:write` | Adds or links one creator by normalized social identity and ensures the agency media kit exists.                           |

The MCP client parses a spreadsheet into normalized JSON rows before calling `roster_validate_import`; the tool does not receive a raw spreadsheet file. An agent must show the valid preview and its capacity impact before calling `roster_commit_import`.

## Creator and social tools

| Tool               | Role    | Scope              | Behavior                                                                                                   |
| ------------------ | ------- | ------------------ | ---------------------------------------------------------------------------------------------------------- |
| `media_kit_ensure` | Creator | `media_kits:write` | Returns the latest personal media kit or creates one link-only default kit.                                |
| `social_add`       | Creator | `media_kits:write` | Adds a social identity to the authenticated creator and synchronizes the personal default kit.             |
| `social_add`       | Agency  | `roster:write`     | Adds a social identity to a selected creator in the agency roster and synchronizes the agency default kit. |
| `social_remove`    | Creator | `media_kits:write` | Removes a selected social identity from the creator and associated personal kits.                          |
| `social_remove`    | Agency  | `roster:write`     | Removes a selected social identity from an agency roster creator and associated agency kits.               |

Agency social calls require `creator_id`. Creator calls infer the creator from OAuth. Supported social platform values are `instagram`, `tiktok`, `youtube`, `facebook`, `linkedin`, `twitter`, `x`, `twitch`, `snapchat`, and `threads`.

`social_remove` is marked destructive. The agent must identify the matching social account and obtain explicit confirmation before calling it.

## Link-in-bio tools

| Tool                 | Role    | Scope               | Behavior                                                                    |
| -------------------- | ------- | ------------------- | --------------------------------------------------------------------------- |
| `link_in_bio_get`    | Creator | `link_in_bio:read`  | Returns the creator's page, social links, and supported blocks.             |
| `link_in_bio_create` | Creator | `link_in_bio:write` | Creates the creator's single page with a public slug and supported content. |
| `link_in_bio_update` | Creator | `link_in_bio:write` | Updates page copy, social links, or existing and new supported blocks.      |

The preview supports link, title, and text blocks. It does not delete blocks, upload image or video content, configure custom domains, or expose the complete visual designer. Agents should call `link_in_bio_get` before deciding whether to create or update.

## Pitch-deck tools

| Tool          | Role   | Scope         | Behavior                                                                              |
| ------------- | ------ | ------------- | ------------------------------------------------------------------------------------- |
| `deck_list`   | Agency | `decks:read`  | Lists agency-owned decks with opaque pagination.                                      |
| `deck_get`    | Agency | `decks:read`  | Returns one owned deck and its selected creator IDs.                                  |
| `deck_create` | Agency | `decks:write` | Creates a deck from creators already in the agency roster.                            |
| `deck_update` | Agency | `decks:write` | Updates selected creators, copy, supported branding fields, slug, or access settings. |

Password input is write-only. The preview does not upload deck images, delete decks, or add creators to the roster implicitly. Agents should list or retrieve the deck before updating it.

## Campaign tools

| Tool              | Role              | Scope             | Behavior                                                                         |
| ----------------- | ----------------- | ----------------- | -------------------------------------------------------------------------------- |
| `campaign_list`   | Creator or agency | `campaigns:read`  | Lists owned campaigns and optionally filters by status.                          |
| `campaign_get`    | Creator or agency | `campaigns:read`  | Returns one owned campaign and its supported settings.                           |
| `campaign_create` | Creator or agency | `campaigns:write` | Creates an owned campaign and applies the existing active-campaign allowance.    |
| `campaign_update` | Creator or agency | `campaigns:write` | Updates metadata, dates, tracking cadence or state, CPM values, or EMV override. |

New campaigns default to `on_request` tracking. Automatic tracking requires a future end date. The tools do not manage participants, content, public-report settings, refresh execution, lifecycle actions, or deletion.

## Analytics and sponsorship tools

| Tool                       | Role              | Scope               | Behavior                                                                                      |
| -------------------------- | ----------------- | ------------------- | --------------------------------------------------------------------------------------------- |
| `analytics_get_views`      | Creator or agency | `analytics:read`    | Returns page views and unique visitors for one owned resource or an owned-resource aggregate. |
| `sponsorship_find_matches` | Creator           | `sponsorships:read` | Returns evidence-backed matches for an eligible Sponsorship Intelligence account.             |

Analytics resource types are `media_kit`, `link_in_bio`, `roster`, `deck`, and `campaign`. Link-in-bio analytics are creator-only; roster and deck analytics are agency-only. Campaign analytics measure public campaign-report visits, not social content views.

Sponsorship discovery exists only in the MCP preview. There is no sponsorship endpoint in Public API V1.


---

# Changelog

> Notable updates to CreatorsJet documentation and published integration contracts.
>
> Canonical URL: https://docs.creatorsjet.com/docs/reference/changelog

## 2026-08-14

* Created the initial CreatorsJet documentation foundation.
* Documented the implemented CreatorsJet Public API V1 contract for agency and creator accounts.
* Documented API-key authentication, account eligibility, scopes, idempotency, rate limits, errors, CSV imports, pagination, and tenant-safe `404` behavior.
* Added the 21-operation generated endpoint reference and bundled `/openapi.json` contract.
* Added creator-owned link-in-bio retrieval, creation, and editing for page copy, social profile links, and safe link, title, or text blocks.
* Added agency-owned pitch-deck listing, retrieval, creation, and editing with roster ownership and plan-capacity enforcement.
* Added creator- and agency-owned campaign listing, retrieval, creation, and base metadata editing through the existing campaign service and plan allowance.
* Added tenant-safe page-view analytics for media kits, link-in-bio pages, public rosters, decks, and campaign reports.
* Documented the implemented MCP preview tool catalog, role scopes, write-safety rules, plan actions, and release boundary.
* Kept MCP transport and connection configuration marked as not publicly released.
* Added official Fumadocs LLM outputs, per-page Markdown alternates, and semantic custom-component exports.

Future entries will record meaningful documentation changes and released integration contract updates. This changelog is not a product release log unless an entry explicitly says so.


---

# Page-view analytics

> Retrieve page views and unique visitors for CreatorsJet resources owned by the API subject.
>
> Canonical URL: https://docs.creatorsjet.com/api/analytics

`GET /analytics/views` returns page views, unique visitors, and a time series for one owned CreatorsJet resource or an aggregate of owned resources. It requires `analytics:read`.

> **Info — Page views are not social-platform views:**
>
> This endpoint measures visits to CreatorsJet pages. It does not return views, reach, impressions, or engagement for Instagram, TikTok, YouTube, or other social content.

## Available resources

| `resource_type` | Creator key | Agency key | Measured page                   |
| --------------- | ----------: | ---------: | ------------------------------- |
| `media_kit`     |         Yes |        Yes | Owned media-kit pages           |
| `link_in_bio`   |         Yes |         No | The creator's link-in-bio page  |
| `roster`        |          No |        Yes | The agency's public roster page |
| `deck`          |          No |        Yes | Agency-owned pitch-deck pages   |
| `campaign`      |         Yes |        Yes | Owned public campaign reports   |

## Query one resource

Supply the resource's opaque ID through `resource_id`:

```bash
curl "https://api.creatorsjet.com/public/v1/analytics/views?resource_type=campaign&resource_id=$CAMPAIGN_ID&timeframe=last7d&timezone=Europe/Paris" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

The timezone must be an IANA timezone. It controls calendar boundaries and time-series buckets.

## Query an aggregate

Omit `resource_id` to aggregate every owned resource of that type:

```bash
curl "https://api.creatorsjet.com/public/v1/analytics/views?resource_type=media_kit&timeframe=mtd&timezone=UTC" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

The response reports whether the request covered one resource or an aggregate:

```json
{
  "data": {
    "resource_type": "campaign",
    "resource_scope": "resource",
    "resource_count": 1,
    "resource_ids": ["66b0f51d46071dc43b2db103"],
    "metric": "page_views",
    "totals": {
      "page_views": 482,
      "unique_visitors": 361
    },
    "timeframe": "last7d",
    "timezone": "Europe/Paris",
    "period": {
      "start": "2026-08-07T00:00:00.000Z",
      "end": "2026-08-14T10:00:00.000Z"
    },
    "granularity": "day",
    "series": []
  },
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1"
}
```

Supported `timeframe` values are `last24h`, `today`, `yesterday`, `last7d`, `wtd`, `mtd`, `ytd`, and `all`.

## Empty and inaccessible resources

An aggregate with no owned resources returns zero totals. A specific resource that is absent or belongs to another subject returns `404 NOT_FOUND`.

Do not sum overlapping aggregate and resource responses. Use one aggregation strategy in your application and retain the response timezone with any stored series.

See the [analytics endpoint reference](/api/reference/analytics/getViewAnalytics) for the complete schema.


---

# Authentication

> Authenticate Public API V1 requests with scoped CreatorsJet API keys.
>
> Canonical URL: https://docs.creatorsjet.com/api/authentication

The Public API uses scoped Bearer API keys. Session JWTs, browser sessions, and MCP OAuth tokens are not accepted under `/public/v1`.

## Authorization header

Send the complete key on every request:

```http
Authorization: Bearer cj_live_<public-id>.<secret>
```

The secret is a 32-byte base64url value. Treat the entire key as sensitive even though the public ID and display prefix remain visible in settings.

## Key ownership and eligibility

| Subject | Who manages keys                          | Plan requirement                 |
| ------- | ----------------------------------------- | -------------------------------- |
| Creator | The signed-in user linked to that creator | Active Pro                       |
| Agency  | Any current agency owner                  | Active Pro, Scale, or Enterprise |

Entitlement and subject ownership are checked on every API request. A plan downgrade disables requests without deleting the key. Current agency owners can manage keys owned by their agency.

## Scopes

| Scope               | Creator keys | Agency keys | Grants                                                                    |
| ------------------- | -----------: | ----------: | ------------------------------------------------------------------------- |
| `profile:read`      |          Yes |          No | Read the creator subject's own profile summary                            |
| `roster:read`       |           No |         Yes | List and retrieve creators in the agency roster and inspect import status |
| `roster:write`      |           No |         Yes | Add creators and start CSV imports                                        |
| `media_kits:read`   |          Yes |         Yes | List and retrieve visible owned media kits                                |
| `media_kits:write`  |          Yes |         Yes | Ensure the subject's default media kit exists                             |
| `link_in_bio:read`  |          Yes |          No | Retrieve the creator subject's link-in-bio page                           |
| `link_in_bio:write` |          Yes |          No | Create or edit the creator subject's link-in-bio page                     |
| `decks:read`        |           No |         Yes | List and retrieve pitch decks owned by the agency subject                 |
| `decks:write`       |           No |         Yes | Create or edit pitch decks owned by the agency subject                    |
| `campaigns:read`    |          Yes |         Yes | List and retrieve campaigns owned by the subject                          |
| `campaigns:write`   |          Yes |         Yes | Create or edit campaigns owned by the subject                             |
| `analytics:read`    |          Yes |         Yes | Read page views and unique visitors for resources owned by the subject    |

`sponsorships:read` is reserved for future compatibility and cannot be selected for a V1 API key.

Create separate keys for integrations with different responsibilities. Do not give a read-only integration write scopes.

## Lifecycle

* A subject can have at most 10 active keys.
* A key can have no expiration or expire after 30, 90, or 365 days.
* The complete secret appears only when the key is created.
* Revocation is immediate and permanent.
* Rotation is create a replacement, deploy it, verify it, then revoke the previous key.
* `last_used_at` is updated at most once every 15 minutes, so it is an activity indicator rather than a request log.

## Secret handling

* Keep API keys in a server-side secret manager or protected environment variable.
* Never expose a key through browser JavaScript, mobile binaries, screenshots, support messages, analytics, or source control.
* Redact `Authorization` before logging requests.
* Revoke and replace a key immediately if it may have been exposed.

Malformed, expired, revoked, or incorrect keys return `401 INVALID_API_KEY`. A missing credential returns `401 AUTHENTICATION_REQUIRED`.


---

# Campaigns

> Create, list, retrieve, and edit creator- or agency-owned campaigns through Public API V1.
>
> Canonical URL: https://docs.creatorsjet.com/api/campaigns

Creator and agency keys can manage campaigns owned directly by their authenticated subject.

| Operation                  | Scope             |
| -------------------------- | ----------------- |
| List or retrieve campaigns | `campaigns:read`  |
| Create or update campaigns | `campaigns:write` |

## Create a campaign

`POST /campaigns` requires an `Idempotency-Key`. Only `name` is required. If `refresh_cadence` is omitted, the campaign uses `on_request` tracking.

```bash
curl https://api.creatorsjet.com/public/v1/campaigns \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data '{
    "name": "Summer launch",
    "description": "Track creator content for the summer launch.",
    "refresh_cadence": "on_request",
    "cpm": {
      "instagram": 14,
      "tiktok": 11
    }
  }'
```

Automatic tracking supports `daily` and `every_2_days`. Both require `ends_at` to be a future ISO 8601 timestamp. Use `on_request` when the integration should create the campaign without scheduling automatic collection.

Campaign creation uses the account's existing active-campaign allowance. When the allowance is exhausted, the API returns `403 LIMIT_EXCEEDED`.

## List and retrieve campaigns

List campaigns with opaque cursor pagination. The optional `status` filter accepts `active`, `completed`, or `archived`.

```bash
curl "https://api.creatorsjet.com/public/v1/campaigns?status=active&limit=25" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

The list response includes summary values when they are available. Retrieve one campaign by its returned `id`:

```bash
curl "https://api.creatorsjet.com/public/v1/campaigns/$CAMPAIGN_ID" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

## Update supported settings

`PATCH /campaigns/{campaign_id}` updates only supplied fields and requires an idempotency key.

```bash
curl "https://api.creatorsjet.com/public/v1/campaigns/$CAMPAIGN_ID" \
  --request PATCH \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data '{
    "description": "Updated launch reporting scope.",
    "cpm": {
      "instagram": 16
    },
    "emv_override": 2500
  }'
```

Supported fields are:

* `name`
* `description`
* `starts_at`
* `ends_at`
* `refresh_cadence`
* `refresh_state`, limited to `active` or `paused`
* `cpm` values for Instagram, TikTok, YouTube, or Twitter
* `emv_override`

Partial `cpm` updates preserve platform values that are not supplied. Set `emv_override` to `null` to remove the override.

An `on_request` campaign remains paused even if an update asks for an active refresh state. Automatic cadence is required for an active schedule.

## Public-report state

Campaign responses include public-report state and an editor URL. `public_report.share_url` is `null` while the report is disabled.

Public API V1 does not enable reports or change their slug, password, visible metrics, sections, or branding. Configure those settings in CreatorsJet.

## Not included

Public API V1 does not manage campaign participants, tracked content, short links, metric overrides, refresh execution, completion, reopening, archiving, report publication, passwords, or deletion.

Use the [endpoint reference](/api/reference/campaigns/listCampaigns) for exact request and response schemas.


---

# Media kits, link in bio, and decks

> Work with the supported CreatorsJet publishing resources through Public API V1.
>
> Canonical URL: https://docs.creatorsjet.com/api/content-pages

Public API V1 exposes a deliberately small publishing surface: ensure and retrieve default media kits, manage one creator link-in-bio page, and manage agency pitch decks.

## Media kits

Creator and agency keys can ensure, list, and retrieve visible media kits.

For a creator key, omit `creator_id`; the creator is inferred from the key:

```bash
curl https://api.creatorsjet.com/public/v1/media-kits \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data '{}'
```

For an agency key, supply a creator already in the agency roster:

```json
{
  "creator_id": "66b0f51d46071dc43b2db103"
}
```

The endpoint returns `201` when it creates the default kit and `200` when it returns the existing kit. Repeated calls do not create customizable or duplicate kits.

Public API V1 does not edit kit blocks, themes, analytics configuration, publication settings, or platform synchronization.

## Link in bio

Link-in-bio management is creator-only. Call `GET /link-in-bio` before choosing whether to create or update the page.

Create the creator's single page with a public slug:

```bash
curl https://api.creatorsjet.com/public/v1/link-in-bio \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data '{
    "slug": "maria-links",
    "username": "Maria",
    "bio": "Fashion creator and stylist",
    "social_links": [
      { "platform": "instagram", "handle_or_url": "@maria" }
    ],
    "blocks": [
      {
        "client_id": "portfolio",
        "type": "link",
        "title": "My portfolio",
        "url": "https://maria.example.com",
        "visible": true,
        "order": 0
      }
    ]
  }'
```

New blocks require a stable `client_id`. Keep that value in your system and reuse it when retrying the same operation. Existing blocks are selected by their returned `id`.

`PATCH /link-in-bio` changes only supplied page fields and blocks. Omitting a field leaves it unchanged. V1 supports `link`, `title`, and `text` blocks; it does not delete blocks, upload media, configure custom domains, or expose the complete designer.

Social links on a link-in-bio page are presentation links. They do not attach or remove the creator's underlying CreatorsJet social accounts.

## Pitch decks

Pitch decks are agency-only. Every `creator_id` selected for a deck must belong to the authenticated agency's roster.

Create a deck with `POST /decks`:

```bash
curl https://api.creatorsjet.com/public/v1/decks \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --data '{
    "slug": "summer-creators",
    "title": "Summer creator shortlist",
    "bio": "Creators selected for the summer launch.",
    "contact_email": "partnerships@agency.example",
    "creator_ids": ["66b0f51d46071dc43b2db103"],
    "tags": ["summer", "fashion"],
    "visibility": "link"
  }'
```

`PATCH /decks/{deck_id}` changes only supplied fields, except `creator_ids`, which replaces the deck's complete creator selection when provided.

For private visibility, provide a password in the same write. Passwords are write-only and never returned. The response reports only `has_password`.

Deck creation applies the agency's current deck allowance. V1 does not upload pictures or covers, ingest remote images, delete decks, or implicitly add creators to the roster.

## Use returned URLs

Media-kit, link-in-bio, and deck responses include editor and public share URLs where applicable. Use those returned URLs instead of constructing frontend routes in your integration.

For exact field constraints, themes, CTA values, visibility behavior, and response schemas, use the [generated endpoint reference](/api/reference).


---

# Errors

> Handle CreatorsJet Public API V1 problem responses and stable error codes.
>
> Canonical URL: https://docs.creatorsjet.com/api/errors

Errors use `application/problem+json`.

```json
{
  "type": "https://api.creatorsjet.com/problems/validation-failed",
  "title": "Invalid request",
  "status": 400,
  "code": "VALIDATION_FAILED",
  "detail": "One or more fields are invalid",
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1",
  "errors": [
    {
      "field": "socials",
      "message": "Array must contain at least 1 element(s)"
    }
  ]
}
```

| Field        | Meaning                                   |
| ------------ | ----------------------------------------- |
| `type`       | Stable problem-type URL                   |
| `title`      | Short category suitable for display       |
| `status`     | HTTP status code                          |
| `code`       | Stable machine-readable error code        |
| `detail`     | Safe explanation of this failure          |
| `request_id` | Identifier to retain for logs and support |
| `errors`     | Optional field or row-level details       |

## Common error codes

| HTTP | Code                       | Meaning                                                         | Action                                                       |
| ---: | -------------------------- | --------------------------------------------------------------- | ------------------------------------------------------------ |
|  400 | `VALIDATION_FAILED`        | A body, query, or field is invalid                              | Correct the fields listed in `errors`                        |
|  400 | `CSV_FILE_REQUIRED`        | The multipart `file` field is missing                           | Attach one CSV file                                          |
|  400 | `IDEMPOTENCY_KEY_REQUIRED` | A protected write has no valid key                              | Add a non-empty key of at most 128 characters                |
|  401 | `AUTHENTICATION_REQUIRED`  | The Bearer credential is missing                                | Send a Public API key                                        |
|  401 | `INVALID_API_KEY`          | The key is malformed, incorrect, expired, or revoked            | Replace or recreate the key                                  |
|  403 | `PUBLIC_API_PLAN_REQUIRED` | The subject no longer has an eligible plan                      | Restore an eligible plan                                     |
|  403 | `SCOPE_REQUIRED`           | The key lacks the operation's scope                             | Use or create a least-privilege key with that scope          |
|  403 | `SUBJECT_FORBIDDEN`        | The account type cannot use this endpoint                       | Use an agency or creator endpoint appropriate to the subject |
|  403 | `LIMIT_EXCEEDED`           | A current product-plan allowance has been reached               | Review usage or change the plan before retrying              |
|  404 | `NOT_FOUND`                | The resource is absent or belongs to another tenant             | Verify the opaque ID and authenticated subject               |
|  409 | `CONFLICT`                 | The request conflicts with identity, capacity, or current state | Inspect the detail and do not retry unchanged                |
|  409 | `IDEMPOTENCY_KEY_REUSED`   | The same key was used with a different payload                  | Use a new idempotency key                                    |
|  409 | `IDEMPOTENCY_IN_PROGRESS`  | An identical request is still running                           | Wait, then retry with the same key                           |
|  413 | `REQUEST_TOO_LARGE`        | A JSON body or CSV exceeds its size limit                       | Reduce the payload                                           |
|  415 | `UNSUPPORTED_MEDIA_TYPE`   | An import is not a CSV file                                     | Submit `text/csv` multipart data                             |
|  429 | `RATE_LIMITED`             | The active quota was exceeded                                   | Wait for `Retry-After`                                       |
|  503 | `PUBLIC_API_DISABLED`      | Public API routing is not enabled in the environment            | Do not retry continuously                                    |
|  503 | `RATE_LIMIT_UNAVAILABLE`   | Limits cannot be safely enforced                                | Retry later with backoff                                     |
|  500 | `INTERNAL_ERROR`           | An unexpected server error occurred                             | Retry safe reads; contact support if persistent              |

## Tenant-safe not found responses

CreatorsJet returns `404` for resources that are absent or not owned by the authenticated subject, including creators, imports, media kits, decks, and campaigns. Do not use response differences to probe for resources owned by another account.

## Retry guidance

* Retry `429` after `Retry-After`.
* Retry temporary `503` and `500` responses with bounded exponential backoff.
* Preserve the same idempotency key when retrying the same protected write.
* Do not retry validation, authentication, scope, not-found, or conflict errors without changing the request or account state.
* Log the error `code`, HTTP status, and `request_id`; never log the API key, CSV rows, or sensitive creator payloads.


---

# Getting started

> Prepare a CreatorsJet API key and first authenticated Public API V1 request after access is enabled.
>
> Canonical URL: https://docs.creatorsjet.com/api/getting-started

> **Warn — Access must be enabled first:**
>
> Public API V1 is release gated. The key-management controls and production endpoints are available only after CreatorsJet enables access for the target account and environment.

## 1. Confirm account eligibility

When Public API access is enabled, creators need an active Pro plan. Agencies need an active Pro, Scale, or Enterprise plan, and the signed-in user must be a current agency owner.

## 2. Create an API key

Creators manage keys from **Profile → Public API**. Agency owners manage agency keys from **Agency settings → Public API**.

When you create a key:

1. Give it a recognizable name.
2. Select only the scopes the integration needs.
3. Optionally choose a 30, 90, or 365-day expiration.
4. Copy the complete key from the one-time dialog.
5. Store it in a secret manager or protected server environment variable.

The complete key is shown once. CreatorsJet stores only a digest and cannot display the secret again.

## 3. Make your first request

Use the key as a Bearer credential. `GET /me` verifies the key, subject, scopes, and current API entitlement.

```bash
curl https://api.creatorsjet.com/public/v1/me \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

Agency response:

```json
{
  "data": {
    "subject_type": "agency",
    "subject_id": "66b0f51d46071dc43b2db101",
    "user_id": "66b0f51d46071dc43b2db102",
    "scopes": ["roster:read", "roster:write"],
    "entitlement": "active"
  },
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1"
}
```

## 4. Add a creator

Agency keys with `roster:write` can add one creator. An idempotency key is required for this write.

```bash
curl https://api.creatorsjet.com/public/v1/creators \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Idempotency-Key: creator-add-2026-08-14-001" \
  --data '{
    "display_name": "Maria Lopez",
    "email": "maria@example.com",
    "country": "France",
    "languages": ["en", "fr"],
    "tags": ["fashion", "lifestyle"],
    "socials": [
      { "platform": "instagram", "handle_or_url": "@maria" }
    ]
  }'
```

`display_name` and at least one social identity are required. Supported social values are `instagram`, `tiktok`, `youtube`, `facebook`, `linkedin`, `twitter`, and `x`. V1 does not accept a remote `avatar_url`.

For a creator key, a useful first read is the creator's own profile. Use the `subject_id` returned by `GET /me`:

```bash
curl "https://api.creatorsjet.com/public/v1/creators/$CREATOR_SUBJECT_ID" \
  --header "Authorization: Bearer $CREATORSJET_API_KEY"
```

This request requires `profile:read`. Creator keys cannot retrieve a different creator ID.

## Response conventions

Successful responses use:

```json
{
  "data": {},
  "meta": {},
  "request_id": "..."
}
```

`meta` appears when the endpoint has pagination or other response metadata. Errors use `application/problem+json`; preserve `request_id` when reporting an issue.

Lists use opaque cursor pagination. The default `limit` is 25 and the maximum is 100. Pass the returned `meta.next_cursor` unchanged as the next request's `cursor`.

## Production integration checklist

* Set explicit connection and read timeouts.
* Treat API keys, creator emails, and imported CSV rows as sensitive.
* Persist `request_id` with your operation logs, but never log the `Authorization` header.
* Use a unique idempotency key for every supported write operation.
* Follow `Retry-After` for `429` responses and use bounded backoff for temporary failures.
* Store opaque IDs and cursors as strings without deriving meaning from their format.


---

# Idempotency

> Retry Public API V1 writes without duplicating supported creator, content, deck, or campaign operations.
>
> Canonical URL: https://docs.creatorsjet.com/api/idempotency

The following endpoints require an `Idempotency-Key` header:

* `POST /creators`
* `POST /creator-imports`
* `POST /media-kits`
* `POST /link-in-bio`
* `PATCH /link-in-bio`
* `POST /decks`
* `PATCH /decks/{deck_id}`
* `POST /campaigns`
* `PATCH /campaigns/{campaign_id}`

## Create a key

Use a unique, non-empty string of at most 128 characters. UUIDs work well.

```http
Idempotency-Key: 6bf0ef96-a2fd-4bdb-86e8-6c62ad62d6e8
```

The key is isolated by subject, HTTP method, and route. Records are retained for 24 hours.

## Retry behavior

If the original request completed, an identical retry returns the stored status and response body and includes:

```http
Idempotent-Replayed: true
```

The request fingerprint includes the canonical JSON body and, for imports, the uploaded file bytes.

| Situation                                         | Result                        |
| ------------------------------------------------- | ----------------------------- |
| Same key and same payload after completion        | Original response is replayed |
| Same key with a different payload                 | `409 IDEMPOTENCY_KEY_REUSED`  |
| Same key while the original request is unfinished | `409 IDEMPOTENCY_IN_PROGRESS` |
| Same key after the 24-hour record expires         | Treated as a new request      |

## Recommended pattern

1. Create the idempotency key before sending the request.
2. Store it with the local operation until the request is resolved.
3. Reuse it only for retries of that exact operation and payload.
4. If the payload changes intentionally, create a new key.
5. Do not generate a new key automatically after a network timeout; doing so can create a second operation.


---

# Creator CSV imports

> Format, submit, and monitor agency creator-roster imports through Public API V1.
>
> Canonical URL: https://docs.creatorsjet.com/api/imports

Agency keys with `roster:write` can queue a CSV roster import. The endpoint accepts one multipart field named `file`.

## Limits

* CSV only
* Maximum file size: 2 MB
* Maximum creator rows: 500
* One queued or processing Public API import per agency
* An `Idempotency-Key` header is required
* Agency roster-capacity rules apply before the job is queued

## CSV columns

| Column             |    Required | Notes                                                                |
| ------------------ | ----------: | -------------------------------------------------------------------- |
| `username`         |         Yes | 3–50 letters, numbers, or hyphens; a leading `@` is removed          |
| `first_name`       |         Yes | Creator's first name                                                 |
| `last_name`        |         Yes | Creator's last name                                                  |
| `contact_email`    |         Yes | Valid email address                                                  |
| `bio`              |          No | Creator biography                                                    |
| `location`         |          No | City or free-form location                                           |
| `country`          |          No | Country                                                              |
| `tags`             |          No | Separate values with semicolons or commas                            |
| `languages`        |          No | Separate values with semicolons or commas                            |
| `avatar_url`       |          No | Must be blank for Public API V1; remote avatar ingestion is disabled |
| `instagram_handle` | Conditional | Handle, `@handle`, or supported profile URL                          |
| `tiktok_handle`    | Conditional | Handle, `@handle`, or supported profile URL                          |
| `youtube_handle`   | Conditional | Handle, `@handle`, or supported profile URL                          |
| `facebook_url`     | Conditional | Facebook profile URL or accepted identity                            |
| `linkedin_url`     | Conditional | LinkedIn profile URL or accepted identity                            |
| `x_handle`         | Conditional | X/Twitter handle, `@handle`, or profile URL                          |

Every row needs at least one social identity.

```csv
username,first_name,last_name,contact_email,bio,location,country,tags,languages,avatar_url,instagram_handle,tiktok_handle,youtube_handle,facebook_url,linkedin_url,x_handle
maria2,Maria,Lopez,maria@example.com,Lifestyle creator based in Paris,Paris,France,fashion; lifestyle,en; fr,,maria,,,,,
```

## Start an import

```bash
curl https://api.creatorsjet.com/public/v1/creator-imports \
  --request POST \
  --header "Authorization: Bearer $CREATORSJET_API_KEY" \
  --header "Idempotency-Key: roster-import-2026-08-14-001" \
  --form "file=@creators.csv;type=text/csv"
```

The API validates the file, queues accepted work, and returns `202`. Poll the returned import ID with `GET /creator-imports/{import_id}` using a key that has `roster:read`.

## Status and row results

Import status is one of:

* `queued`
* `running`
* `completed`
* `completed_with_errors`
* `failed`

Progress includes total, processed, created, attached-social, and failed counts. Each row may include a `creator_id`, automatically created agency `media_kit_id`, social IDs, and error messages.

Public imports do not silently attach a globally existing creator identity to another agency. An ambiguous external identity produces a row-level creator identity conflict. Fix the identity or resolve ownership in CreatorsJet before retrying that row.

## Sensitive data

CSV files contain creator contact information. Keep them out of logs and public support tickets, upload them only to the official API host, and retain them only as long as your workflow requires.


---

# Public API overview

> Review the implemented server-to-server creator, roster, media-kit, link-in-bio, pitch-deck, campaign, and page-view analytics contract for CreatorsJet Public API V1.
>
> Canonical URL: https://docs.creatorsjet.com/api

The CreatorsJet Public API V1 contract defines a server-to-server REST API for agency and creator accounts. The backend implementation is release gated and is not currently a generally available public endpoint.

> **Warn — Production access is not generally available:**
>
> Use this documentation to review the implemented V1 contract. Requests will work only after CreatorsJet enables Public API access for the target account and environment.

> **Info — Server-side use only:**
>
> Public API keys are secrets. Never place one in browser code, a mobile application, a public repository, or client-visible logs.

## Base URL

```text
https://api.creatorsjet.com/public/v1
```

All request and response fields use `snake_case`. IDs are opaque strings and timestamps use ISO 8601.

Use the task guides for workflow decisions and the [generated endpoint reference](/api/reference) for exact schemas and response statuses. The checked-in OpenAPI contract is the source of truth for the REST interface.

## Account eligibility

| Account | Eligible plan                    | V1 capability after access is enabled                                                                                                                       |
| ------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Creator | Active Pro                       | Read the creator's own profile and media kits; create, retrieve, or edit their link-in-bio and campaigns; and read link-in-bio or campaign-report analytics |
| Agency  | Active Pro, Scale, or Enterprise | Manage roster creators and imports, retrieve media kits, create or edit pitch decks and campaigns, and read roster, deck, or campaign-report analytics      |

Agency API keys belong to the agency and can be managed by current agency owners. Creator keys belong to the creator represented by the signed-in user. If an account becomes ineligible, existing keys are retained but requests return `403 PUBLIC_API_PLAN_REQUIRED`.

## V1 capabilities

| Domain                | Implemented V1 behavior                                                                                                                              |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| Creator profiles      | Retrieve identity, public social accounts, summary metrics, data status, and freshness timestamps. Creator keys can retrieve only their own profile. |
| Agency rosters        | Add one creator or list an agency roster with opaque cursor pagination.                                                                              |
| CSV imports           | Queue an import of up to 500 creator rows and retrieve row-level progress and results.                                                               |
| Media kits            | Ensure, list, and retrieve the default media kit visible to a creator or agency subject.                                                             |
| Link in bio           | Creator keys can create, retrieve, or edit their single page, social profile links, and safe link, title, or text blocks.                            |
| Pitch decks           | Agency keys can list, retrieve, create, or edit agency-owned decks using creators already in the agency roster.                                      |
| Campaigns             | Creator and agency keys can list, retrieve, create, or edit owned campaign metadata, schedules, tracking state, CPM values, and EMV override.        |
| Page-view analytics   | Retrieve page views, unique visitors, and a time series for owned media kits, link-in-bio pages, public rosters, decks, or campaign reports.         |
| Sponsorship discovery | Not included in V1. No sponsorship endpoint is published.                                                                                            |

V1 intentionally excludes creator-profile mutation, social OAuth and synchronization controls, full media-kit editing, link-in-bio block deletion, campaign participants and content, campaign report configuration and lifecycle actions, deck, link-in-bio, or campaign deletion, media uploads, custom domains, the full link-in-bio designer, creator invitations, webhooks, SDKs, GraphQL, XLSX, Google Sheets imports, and remote avatar ingestion.

## Endpoint summary

| Method  | Endpoint                       | Account                | Required scope                  |
| ------- | ------------------------------ | ---------------------- | ------------------------------- |
| `GET`   | `/me`                          | Creator or agency      | Any valid key                   |
| `POST`  | `/creators`                    | Agency                 | `roster:write`                  |
| `GET`   | `/creators`                    | Agency                 | `roster:read`                   |
| `GET`   | `/creators/{creator_id}`       | Agency or creator self | `roster:read` or `profile:read` |
| `POST`  | `/creator-imports`             | Agency                 | `roster:write`                  |
| `GET`   | `/creator-imports/{import_id}` | Agency                 | `roster:read`                   |
| `POST`  | `/media-kits`                  | Creator or agency      | `media_kits:write`              |
| `GET`   | `/media-kits`                  | Creator or agency      | `media_kits:read`               |
| `GET`   | `/media-kits/{media_kit_id}`   | Creator or agency      | `media_kits:read`               |
| `GET`   | `/link-in-bio`                 | Creator                | `link_in_bio:read`              |
| `POST`  | `/link-in-bio`                 | Creator                | `link_in_bio:write`             |
| `PATCH` | `/link-in-bio`                 | Creator                | `link_in_bio:write`             |
| `GET`   | `/decks`                       | Agency                 | `decks:read`                    |
| `POST`  | `/decks`                       | Agency                 | `decks:write`                   |
| `GET`   | `/decks/{deck_id}`             | Agency                 | `decks:read`                    |
| `PATCH` | `/decks/{deck_id}`             | Agency                 | `decks:write`                   |
| `GET`   | `/campaigns`                   | Creator or agency      | `campaigns:read`                |
| `POST`  | `/campaigns`                   | Creator or agency      | `campaigns:write`               |
| `GET`   | `/campaigns/{campaign_id}`     | Creator or agency      | `campaigns:read`                |
| `PATCH` | `/campaigns/{campaign_id}`     | Creator or agency      | `campaigns:write`               |
| `GET`   | `/analytics/views`             | Creator or agency      | `analytics:read`                |

Cross-account resources return `404` rather than revealing that another tenant owns the requested ID.

## Next steps

* [Make your first request](/api/getting-started)
* [Create and protect API keys](/api/authentication)
* [Understand resource ownership](/api/ownership)
* [Import creators from CSV](/api/imports)
* [Work with media kits, link in bio, and decks](/api/content-pages)
* [Create and update campaigns](/api/campaigns)
* [Read page-view analytics](/api/analytics)
* [Use idempotency safely](/api/idempotency)
* [Understand rate limits](/api/rate-limits)
* [Handle API errors](/api/errors)
* [Browse the generated endpoint reference](/api/reference)


---

# Subjects and resource ownership

> Understand creator and agency API subjects, ownership boundaries, and tenant-safe resource access.
>
> Canonical URL: https://docs.creatorsjet.com/api/ownership

Every Public API key acts as one subject: a creator or an agency. The subject is fixed when the key is created and is returned by `GET /me`.

```json
{
  "data": {
    "subject_type": "creator",
    "subject_id": "66b0f51d46071dc43b2db101",
    "user_id": "66b0f51d46071dc43b2db102",
    "scopes": ["profile:read", "campaigns:read"],
    "entitlement": "active"
  },
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1"
}
```

Do not treat `user_id` and `subject_id` as interchangeable. Creator resources are owned by the creator record identified by `subject_id`; agency resources are owned by the agency identified by `subject_id`.

## Ownership matrix

| Resource        | Creator key                                         | Agency key                                                   |
| --------------- | --------------------------------------------------- | ------------------------------------------------------------ |
| Creator profile | The creator subject only                            | Creators currently in the agency roster                      |
| Creator import  | Not available                                       | Imports started by the agency                                |
| Media kit       | Personal kits without an agency owner               | Kits owned by the agency for its roster creators             |
| Link in bio     | The creator subject's single page                   | Not available                                                |
| Pitch deck      | Not available                                       | Decks owned by the agency                                    |
| Campaign        | Campaigns owned by the creator                      | Campaigns owned by the agency                                |
| Analytics       | Owned media kits, link in bio, and campaign reports | Owned media kits, public roster, decks, and campaign reports |

For agency media-kit operations, `creator_id` selects a creator already in the agency roster. It does not transfer ownership of another agency's kit or create a cross-agency relationship.

For creator media-kit operations, omit `creator_id`. The API infers the creator from the key and rejects attempts to select a different creator.

## Tenant-safe lookups

Ownership is part of the database query for resource reads and writes. A resource that does not exist and a resource owned by another subject both return `404 NOT_FOUND`.

This behavior applies to opaque resource IDs. It prevents callers from using response differences to discover whether another account owns a creator, import, media kit, deck, or campaign.

## Integration guidance

* Persist the `subject_id` alongside the API-key configuration in your system.
* Do not accept arbitrary resource IDs from an untrusted client and pass them to the API without authorization in your own application.
* Store IDs as opaque strings; do not derive ownership or resource type from their format.
* Use separate keys when one integration needs agency access and another needs creator access.
* Re-run `GET /me` after rotating credentials or changing the connected CreatorsJet account.

> **Info — A scope does not change ownership:**
>
> A write scope permits an operation only within the key's subject. It never grants access to another creator or agency.


---

# Rate limits

> Understand Public API V1 quotas, headers, and safe retry behavior.
>
> Canonical URL: https://docs.creatorsjet.com/api/rate-limits

Rate limits protect CreatorsJet and apply after a request is authenticated.

| Request category |                    Limit | Window   |
| ---------------- | -----------------------: | -------- |
| Reads            | 120 requests per API key | 1 minute |
| Ordinary writes  |  30 requests per API key | 1 minute |
| Import starts    |   5 requests per API key | 1 hour   |

Only one Public API creator import may be queued or processing for an agency at a time.

## Response headers

Authenticated requests include:

| Header                | Meaning                                                  |
| --------------------- | -------------------------------------------------------- |
| `RateLimit-Limit`     | Maximum requests in the current window                   |
| `RateLimit-Remaining` | Requests left in the current window                      |
| `RateLimit-Reset`     | Unix timestamp when the current window resets            |
| `Retry-After`         | Seconds to wait; included when a request is rate limited |

## Rate-limit responses

A request above its limit returns HTTP `429` and code `RATE_LIMITED`.

```json
{
  "type": "https://api.creatorsjet.com/problems/rate-limited",
  "title": "Rate limit exceeded",
  "status": 429,
  "code": "RATE_LIMITED",
  "detail": "Too many requests",
  "request_id": "50c20a47-bf9a-4dfa-98ae-54fd89a172e1"
}
```

Wait for `Retry-After` before retrying. Add bounded exponential backoff and jitter if multiple workers share a key.

## Rate-limit availability

CreatorsJet fails closed when Redis cannot safely enforce a limit. The API returns `503 RATE_LIMIT_UNAVAILABLE`; do not bypass this response with aggressive retries. Retry after a delay and keep the same idempotency key for a protected write.


---

# Endpoint reference

> Exact Public API V1 operations generated from the CreatorsJet OpenAPI 3.1 contract.
>
> Canonical URL: https://docs.creatorsjet.com/api/reference

This reference is generated from the checked-in CreatorsJet Public API V1 OpenAPI contract. Use it for exact parameters, request bodies, response schemas, status codes, and security declarations.

## Identity

* [`GET /me`](/api/reference/identity/getCurrentSubject) — retrieve the authenticated creator or agency subject, granted scopes, and entitlement state.

## Creators

* [`POST /creators`](/api/reference/creators/createCreator) — add one creator to an agency roster.
* [`GET /creators`](/api/reference/creators/listCreators) — list an agency roster with cursor pagination.
* [`GET /creators/{creator_id}`](/api/reference/creators/getCreator) — retrieve one roster creator or the authenticated creator's own profile.

## Creator imports

* [`POST /creator-imports`](/api/reference/imports/createCreatorImport) — validate and queue an agency CSV import.
* [`GET /creator-imports/{import_id}`](/api/reference/imports/getCreatorImport) — retrieve progress and row-level results.

## Media kits

* [`POST /media-kits`](/api/reference/media-kits/ensureMediaKit) — find or create the visible default media kit.
* [`GET /media-kits`](/api/reference/media-kits/listMediaKits) — list visible owned media kits.
* [`GET /media-kits/{media_kit_id}`](/api/reference/media-kits/getMediaKit) — retrieve one strictly owned media kit.

## Link in bio

* [`GET /link-in-bio`](/api/reference/link-in-bio/getLinkInBio) — retrieve the creator subject's page.
* [`POST /link-in-bio`](/api/reference/link-in-bio/createLinkInBio) — create the creator subject's page.
* [`PATCH /link-in-bio`](/api/reference/link-in-bio/updateLinkInBio) — edit supported page fields and blocks.

## Pitch decks

* [`GET /decks`](/api/reference/decks/listDecks) — list agency-owned decks.
* [`POST /decks`](/api/reference/decks/createDeck) — create a deck from agency-roster creators.
* [`GET /decks/{deck_id}`](/api/reference/decks/getDeck) — retrieve one agency-owned deck.
* [`PATCH /decks/{deck_id}`](/api/reference/decks/updateDeck) — edit supported deck fields.

## Campaigns

* [`GET /campaigns`](/api/reference/campaigns/listCampaigns) — list creator- or agency-owned campaigns.
* [`POST /campaigns`](/api/reference/campaigns/createCampaign) — create an owned campaign.
* [`GET /campaigns/{campaign_id}`](/api/reference/campaigns/getCampaign) — retrieve one owned campaign.
* [`PATCH /campaigns/{campaign_id}`](/api/reference/campaigns/updateCampaign) — edit supported campaign metadata and tracking settings.

## Analytics

* [`GET /analytics/views`](/api/reference/analytics/getViewAnalytics) — retrieve page views for an owned resource.

The bundled machine-readable schema is also available at [`/openapi.json`](/openapi.json).


---

# Retrieve page-view analytics

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/analytics/getViewAnalytics

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Create a campaign

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/campaigns/createCampaign

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve one owned campaign

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/campaigns/getCampaign

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# List owned campaigns

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/campaigns/listCampaigns

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Update an owned campaign

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/campaigns/updateCampaign

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Add one creator to an agency roster

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/creators/createCreator

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve creator profile and summary metrics

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/creators/getCreator

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# List an agency roster

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/creators/listCreators

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Create an agency pitch deck

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/decks/createDeck

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve one agency pitch deck

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/decks/getDeck

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# List agency pitch decks

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/decks/listDecks

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Update an agency pitch deck

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/decks/updateDeck

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve the authenticated API subject

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/identity/getCurrentSubject

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Queue a creator roster CSV import

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/imports/createCreatorImport

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve an import and its row results

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/imports/getCreatorImport

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Ensure a default media kit exists

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/media-kits/ensureMediaKit

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve one owned media kit

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/media-kits/getMediaKit

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# List visible media kits

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/media-kits/listMediaKits

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Create the creator's link-in-bio page

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/link-in-bio/createLinkInBio

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Retrieve the creator's link-in-bio page

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/link-in-bio/getLinkInBio

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}


---

# Update the creator's link-in-bio page

> undefined
>
> Canonical URL: https://docs.creatorsjet.com/api/reference/link-in-bio/updateLinkInBio

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
