# Creator Partnership Profile Analyzer (`afkdigital/creator-partnership-profile-analyzer`) Actor

Analyze explicit Instagram/TikTok identifiers with permissioned JSON/HTML media kits or selected Wikidata records. Dated declared metrics, source evidence and partnership channels; no social scraping.

- **URL**: https://apify.com/afkdigital/creator-partnership-profile-analyzer.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 source-backed creator profiles

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Creator Partnership Profile Analyzer

Prepare an evidence trail for a shortlist of creators using **permissioned media kits and selected Wikidata records**. The Actor supports Instagram and TikTok **profile identifiers** and can combine them with dated creator-declared metrics and explicitly published partnership channels from your authorized sources.

**This version does not retrieve profiles or follower counts from Instagram or TikTok.** A social profile URL alone produces a normalized identifier with `accountExistenceVerified: false`. It does not establish who owns an account or whether the account is active.

### Supported inputs

| Input | What v1 actually does |
|---|---|
| Explicit Instagram/TikTok profile URLs | Normalizes the platform and username; removes tracking; deduplicates. No social-site request. |
| Creator-owned or authorized JSON media kit URL | Reads the documented `profiles` structure below when your permission record allows automated access and commercial reuse. |
| Authorized HTML media kit URL | Reads an explicit matching profile link and partnership links; exact dated metrics require the embedded JSON structure below. JavaScript is not executed. |
| Creator-provided inline JSON/HTML | Analyzes supplied document text and retains its declared source URL. Marks provenance as `user_supplied`, not a live retrieval. |
| Explicit Wikidata QIDs | Reads CC0 Instagram/TikTok handle claims, revision, statement ID, rank and reference count. No broad directory search. No Wikidata audience counts or website links are promoted into follower, media-kit or contact fields. |

PDF media kits, screenshots, generic prose follower-count extraction, hashtag discovery, post scraping and official platform API adapters are not supported in v1. Use JSON or supported HTML for a predictable field contract.

### Quick start: permitted live directory example

```json
{
  "wikidataIds": ["Q15994958", "Q550996", "Q57618112"],
  "maxProfiles": 6,
  "maxSourceRequests": 10,
  "includeBusinessContacts": false
}
```

These explicitly selected Wikidata records describe Marques Brownlee, Hank Green and MrBeast. At the recorded review, they contain six Instagram/TikTok username claims. Records are community-maintained and may change. Each result retains its observed revision and source. The example deliberately returns null follower counts, media kits and contacts: **directory assertions are not platform verification**. It does not visit those creators' social pages or websites.

### Analyze your authorized media kit

Use one entry per candidate and source. The Actor only attributes data that matches that entry's canonical `profileUrl`.

```json
{
  "mediaKits": [
    {
      "profileUrl": "https://www.instagram.com/your_creator/",
      "sourceUrl": "https://creator-owned.example/media-kit.json",
      "format": "json",
      "permission": {
        "basis": "written_permission",
        "automatedAccess": true,
        "commercialReuse": true,
        "note": "Creator permission reference for this evaluation and output use."
      }
    }
  ],
  "maxProfiles": 10
}
```

Replace the example URLs and permission reference with your own. The source must be public HTTPS and must separately permit automated retrieval. This input is an attestation by the person running the Actor; the Actor validates and records the declaration but cannot determine whether the person has the rights they claim.

Accepted permission bases are `creator_owned`, `written_permission`, and `open_license`. Both booleans must be `true`. Supply a meaningful `note` or HTTPS `evidenceUrl`; an open license requires its evidence URL. A public web page and an allowing robots file alone do not establish reuse permission. Do not use a declaration to override platform terms or another rights holder's restrictions.

#### JSON media-kit format

```json
{
  "profiles": [
    {
      "profileUrl": "https://www.instagram.com/your_creator/",
      "followerCount": 12500,
      "followersMeasuredAt": "2026-10-01T00:00:00Z",
      "partnershipContact": {
        "type": "form",
        "value": "https://creator-owned.example/partnerships",
        "label": "Brand partnerships"
      }
    }
  ]
}
```

This is an illustrative schema, not a real creator measurement. A follower value must be a nonnegative safe integer with a valid full ISO-8601 measurement timestamp including timezone. Strings such as `12.5K`, unsupported numbers, missing dates and future dates leave **both** count and measurement time null. The Actor checks that the source contains the declared value and its date; it does not independently audit the underlying platform measurement. The output explicitly labels it `creator_reported`, or `user_supplied_creator_report` for an inline document.

For an inline document, add `content` as the complete JSON/HTML string alongside the required `sourceUrl` and `format`. The source URL is retained for provenance; it is **not fetched** in this mode. Inline content must be at most 1 MiB and total input at most 2 MiB. Never paste platform tokens, credentials, private conversations or unnecessary personal data into input.

#### Supported HTML

An exact profile link on the page establishes the source's assertion about that candidate. Partnership forms are recognized from explicit link labels such as “Brand partnerships”, “Sponsorships”, or “Work with me”, and must remain on the source origin. On pages with multiple social profiles, an HTML contact must share a container that contains only the exact candidate profile. Ambiguous page-wide contacts are omitted; explicit per-profile JSON contacts are the most precise method.

Exact dated metrics use this embedded JSON, with the same format as above:

```html
<script type="application/json" id="creator-partnership-data">
{"profiles":[{"profileUrl":"https://www.instagram.com/your_creator/","followerCount":12500,"followersMeasuredAt":"2026-10-01T00:00:00Z"}]}
</script>
```

Generic HTML numbers are ignored. Scripts are parsed as data and never executed. Unsupported HTML can still yield a source-backed profile/kit link while leaving metrics empty.

### Partnership channels and privacy

A contact is retained only when its label explicitly indicates partnership, collaboration or sponsorship use. Supported channels are a same-origin form URL or a general business role mailbox such as `partnerships@creator-domain.example`. Personal-name mailboxes, common personal email providers, unlabelled email strings and biography email harvesting are excluded. HTML email addresses must be explicit `mailto:` links; JSON contacts must be explicit structured fields. The filtering is conservative and does not establish mailbox ownership, consent for a particular message, or deliverability.

Each contact includes its source and `deliverabilityVerified: false`. The Actor sends no email, checks no mailbox and produces no separate contact list. Set `includeBusinessContacts: false` to omit all contact values and their field evidence.

### Output

The default Dataset contains one result per canonical profile. Export using Apify's normal JSON, CSV, Excel or other Dataset tools.

| Field | Meaning |
|---|---|
| `profileUrl`, `platform`, `username` | Canonical Instagram/TikTok identifier. |
| `followerCount`, `followersMeasuredAt` | Paired, dated source-declared measurement or null. |
| `followerVerification` | `not_available`, `creator_reported`, `user_supplied_creator_report`, or `conflicting_sources`. Never means official platform verification. |
| `mediaKitUrl` | The matching authorized media-kit document or an explicitly declared same-origin kit link. |
| `partnershipContact` | Eligible published partnership channel with verification limits, or null. |
| `sources` | Source URL, acquisition method, hash/revision and permission provenance. Wikidata also retains statement/rank/reference count. |
| `fieldEvidence` | The exact source and JSON pointer or HTML selector associated with each populated field. |
| `warnings` | Missing/invalid measurements, unreferenced directory assertions or conflicting values. |
| `status` | `source_backed` or `identifier_only`. Source-backed does not mean independently verified. |
| `analyzedAt` | When this analysis was performed; distinct from a follower measurement date. |

Duplicate sources merge into one profile. The latest dated follower value is retained. Conflicting values at the same latest measurement time leave the metric pair null. The first eligible contact/kit is retained if sources disagree, with a multiple-source warning.

The run's key-value store contains `SUMMARY` (counts, requests, bytes and charge events), `PERMISSION_LOG` (approved, supplied and failed source records), and `DIAGNOSTICS` (invalid, unmatched or blocked inputs). Raw source bodies are not exported or cached in persistent storage. Supplied input remains in the run's standard Apify INPUT record under your account's storage controls.

### Pricing

Pay per event: **$0.005 per unique source-backed profile** ($5 per 1,000), plus **$0.00005 per run start** at the supported memory settings. Platform usage is included for standard runs. The pricing shown on the Actor's Pricing tab is authoritative.

The profile event is `profile-analyzed`. Identifier-only results, duplicates, invalid/unmatched sources and blocked sources do not incur this profile event. A run start can still be charged even when no source-backed profiles are returned. There is no additional automatic Dataset-row fee. Six source-backed profiles cost $0.03005 at the stated prices. This is processing price, not a promise of verified platform metrics or available business contacts.

The Actor respects the run spending cap and the smaller of that cap's remaining profile capacity and `maxProfiles`. Choose the smallest useful shortlist. The maximum is 100 output profiles, 25 QIDs and 50 media-kit entries. `maxSourceRequests` counts robots checks and redirects as well as source requests. A 120-second analysis budget stops new sources; partial results and diagnostics remain available.

### Access behavior

The Actor sends an identifying user agent, observes robots rules and pacing, uses no proxy or login, and stops access to denied/rate-limited origins. Requests use HTTPS, bounded bodies and DNS-pinned public addresses. Private network destinations, credentials, platform source hosts and cross-origin redirects are rejected. A 404 robots file is treated as absent; inaccessible or ambiguous robots responses are refused. This protects predictable operation and does not replace the required source rights.

### Validation and source review

The release package contains `SOURCE_PERMISSIONS.md`, a structured source-review record, automated tests and separately labelled live/fixture evidence. The live reference checks cover the selected Wikidata facts; owned synthetic fixtures cover dated metrics, business-contact filtering and HTML behavior. No real creator's media-kit or contact-collection permission is implied by the synthetic tests.

Instagram and TikTok official API scopes and applicable use restrictions were reviewed on 2026-10-10. Direct adapters are disabled in this release; platform approval and use-specific permission would be required before adding them. The Actor is independent and is not endorsed by Meta, TikTok, Wikidata or the creators in the directory example.

### Development

```bash
npm ci --ignore-scripts
npm test
npm start
```

Node.js 22 or later. Source and operational evidence for this independent project are maintained in `/opt/APIFY/API13`. Report reproducible issues using the Actor's Apify Issues tab, including the run ID and a redacted input sample. Do not include private documents or access tokens in public issues.

# Actor input Schema

## `profileUrls` (type: `array`):

Up to 100 exact HTTPS profile links. No post URLs, hashtag searches or username discovery. URL-only records are not charged a profile event.

## `wikidataIds` (type: `array`):

Up to 25 QIDs. Reads only Instagram/TikTok username claims from these records, with revision and reference counts. These are directory assertions, not independently verified social accounts. Follower counts are not imported.

## `mediaKits` (type: `array`):

Objects with profileUrl, sourceUrl, optional format (json/html), optional inline content, and permission {basis: creator_owned/written_permission/open_license, automatedAccess: true, commercialReuse: true, evidenceUrl or note}. Read the README for exact source JSON and HTML markup. This permission is your attestation, not an independently verified license. Source websites must separately permit automated access; robots restrictions are respected.

## `maxProfiles` (type: `integer`):

1–100. Applies after canonical deduplication. A lower spending limit may reduce the number processed.

## `maxSourceRequests` (type: `integer`):

1–50. Includes robots and redirects. No retries or proxy bypass. Lower this to bound work on unavailable sources.

## `includeBusinessContacts` (type: `boolean`):

Includes eligible same-origin partnership forms or general business role email addresses with explicit partnership labels. Personal addresses and free-mail addresses are omitted. Email ownership and deliverability are not verified.

## Actor input object example

```json
{
  "profileUrls": [],
  "wikidataIds": [
    "Q15994958",
    "Q550996",
    "Q57618112"
  ],
  "mediaKits": [],
  "maxProfiles": 10,
  "maxSourceRequests": 20,
  "includeBusinessContacts": true
}
```

# Actor output Schema

## `profiles` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `permissions` (type: `string`):

No description

## `diagnostics` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "wikidataIds": [
        "Q15994958",
        "Q550996",
        "Q57618112"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/creator-partnership-profile-analyzer").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "wikidataIds": [
        "Q15994958",
        "Q550996",
        "Q57618112",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("afkdigital/creator-partnership-profile-analyzer").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "wikidataIds": [
    "Q15994958",
    "Q550996",
    "Q57618112"
  ]
}' |
apify call afkdigital/creator-partnership-profile-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/creator-partnership-profile-analyzer"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/p0NagPZfYN3QyIbd5/builds/jdb9DM4NLcglAx26Y/openapi.json
