{
  "openapi": "3.0.1",
  "info": {
    "title": "Instagram Influencer Finder — AI-vetted creators & emails",
    "description": "First 25 creators free. Find Instagram & TikTok influencers by hashtag, niche or lookalike — engagement rate, audience quality, contact e-mail and an AI opener per creator. No login, no cookies.",
    "version": "0.2",
    "x-build-id": "gm0nzUQH7WTxf89Ns"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~instagram-creator-qualifier/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-instagram-creator-qualifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/rich_minds~instagram-creator-qualifier/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-instagram-creator-qualifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/rich_minds~instagram-creator-qualifier/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-instagram-creator-qualifier",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "sourceMode"
        ],
        "properties": {
          "sourceMode": {
            "title": "Where do the creators come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "Starts as a free demo on 18 sample records (nothing charged). For a real search choose Instagram / TikTok search and fill hashtags, a niche preset or lookalike seeds plus your Brand brief. 'Existing dataset' re-qualifies Instagram / TikTok Scraper results you already have.",
            "default": "actor"
          },
          "platform": {
            "title": "Platform",
            "enum": [
              "instagram",
              "tiktok"
            ],
            "type": "string",
            "description": "Which platform the search runs on. The same hashtags, profiles and lookalike seeds are mapped onto the matching Store scraper on your account; the creator row is identical.",
            "default": "instagram"
          },
          "nichePreset": {
            "title": "Niche preset (optional)",
            "enum": [
              "none",
              "beauty",
              "fitness",
              "food",
              "travel",
              "fashion",
              "parenting",
              "gaming",
              "tech",
              "home",
              "pets"
            ],
            "type": "string",
            "description": "Adds six proven hashtags for the niche to your own (e.g. Beauty → #skincareroutine, #cleanbeauty, …), so a first search never starts from a guess.",
            "default": "none"
          },
          "hashtags": {
            "title": "Hashtags",
            "type": "array",
            "description": "Hashtags to search, without # (e.g. skincareroutine). Each one samples `postsPerSource` posts; the creators behind them are qualified, not the posts.",
            "items": {
              "type": "string"
            }
          },
          "lookalikeOf": {
            "title": "Find creators like… (lookalike seeds)",
            "type": "array",
            "description": "Usernames or profile URLs of creators you already like. Their profiles are looked up first; their most used hashtags and the accounts they mention become the search, their follower band (0.3×–3× the median) becomes the filter when you set none. The seeds themselves are not output.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "Brand brief — what are you looking for?",
            "type": "string",
            "description": "Describe the ideal creator in plain words: niche, audience, tone, what the collaboration is. The AI scores every creator against this, explains why and writes the opener from it."
          },
          "maxQualified": {
            "title": "Max qualified creators to output",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on qualified creators delivered (and so on what this Actor can charge). Best first.",
            "default": 100
          },
          "minFollowers": {
            "title": "Min followers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop creators below this follower count (free filter, needs profile details)."
          },
          "maxFollowers": {
            "title": "Max followers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop creators above this follower count (free filter)."
          },
          "minEngagementRate": {
            "title": "Min engagement rate (%)",
            "minimum": 0,
            "type": "number",
            "description": "Average (likes + comments) per sampled post as a percentage of followers. 1–3 % is typical; 3 %+ is strong. Free filter, needs profile details."
          },
          "activeWithinDays": {
            "title": "Active within (days)",
            "minimum": 1,
            "type": "integer",
            "description": "Drop creators whose latest sampled post is older than this. Leave empty to keep everyone.",
            "default": 60
          },
          "requireContact": {
            "title": "Require a contact",
            "enum": [
              "none",
              "any",
              "email"
            ],
            "type": "string",
            "description": "<b>none</b> — deliver everyone. <b>any</b> — a bio link or a contact invitation in the bio is required. <b>email</b> — an e-mail address must have been found (bio, caption or bio-link page).",
            "default": "none"
          },
          "verifyEmails": {
            "title": "Verify contact e-mails",
            "type": "boolean",
            "description": "Checks each delivered creator's e-mail: syntax, MX record of the domain and shared role inboxes (info@, support@ …). Adds emailVerified and emailCheck to the row. No SMTP probing, nothing extra charged.",
            "default": false
          },
          "minScore": {
            "title": "Minimum score (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Creators scoring below this are discarded and <b>not charged</b>. The default 45 delivers hot (≥ 70) and warm (45–69) creators.",
            "default": 45
          },
          "mustMentionKeywords": {
            "title": "Must mention (any of)",
            "type": "array",
            "description": "Keep only creators whose bio, captions or hashtags contain at least one of these words (case-insensitive). Matching creators get the <code>keyword_match</code> flag.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop creators whose bio, captions, hashtags or sample comments contain any of these words.",
            "items": {
              "type": "string"
            }
          },
          "brandSafetyTopics": {
            "title": "Extra brand-safety topics",
            "type": "array",
            "description": "Words that, in addition to the built-in list (adult, gambling, weapons, hard drugs, hate), flag a creator as <code>brand_safety_keyword</code> and lower its score. The AI treats them as at least medium risk.",
            "items": {
              "type": "string"
            }
          },
          "maxSponsoredShare": {
            "title": "Max sponsored share (0–1)",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Drop creators whose sampled posts are more than this fraction ads / sponsored / gifted (e.g. <code>0.5</code>). Empty = no limit."
          },
          "verifiedOnly": {
            "title": "Verified accounts only",
            "type": "boolean",
            "description": "Keep only accounts with the verified badge (needs profile details).",
            "default": false
          },
          "businessAccountsOnly": {
            "title": "Business / creator accounts only",
            "type": "boolean",
            "description": "Keep only Instagram business accounts (or TikTok Shop sellers).",
            "default": false
          },
          "minSampledPosts": {
            "title": "Min sampled posts",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "A creator must appear with at least this many posts before it is considered (metrics from one post are noise).",
            "default": 2
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver creators that have at least one of these flags, and rank those with more of them higher. Leave empty to keep everything. Flags are listed in the README (e.g. <code>high_engagement</code>, <code>email_found</code>, <code>tier_micro</code>).",
            "items": {
              "type": "string"
            }
          },
          "suppressionList": {
            "title": "Exclude list",
            "type": "array",
            "description": "Usernames (with or without <code>@</code>), profile URLs or ids never to output — creators you already work with. Skipped before any processing, never charged.",
            "items": {
              "type": "string"
            }
          },
          "enableAi": {
            "title": "AI assessment",
            "type": "boolean",
            "description": "Score each creator against your goal, explain why, summarise it and generate text. Off = rule-based flags and scores only (cheaper).",
            "default": true
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "Apify model access needs no key: tokens go on your Apify bill at OpenRouter rates, on Apify plans that can run public Store Actors (the free plan cannot — there, pick 'My own API key'). If the AI is refused the run says 'AI unavailable' and charges the basic price.",
            "default": "apify"
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>."
          },
          "outreachChannel": {
            "title": "Opener channel",
            "enum": [
              "dm",
              "email"
            ],
            "type": "string",
            "description": "Whether the AI writes the opener as a DM or as the opening lines of an e-mail.",
            "default": "dm"
          },
          "outreachTone": {
            "title": "Opener tone",
            "type": "string",
            "description": "Tone for the generated opener, e.g. <code>friendly and concise</code>, <code>professional</code>, <code>playful</code>.",
            "default": "friendly and concise"
          },
          "enrichBioLinks": {
            "title": "Check bio links for e-mails",
            "type": "boolean",
            "description": "Fetch each shortlisted creator's bio link once (8 s timeout) and pull an e-mail address / other social profiles from the page. Never charged; failures are ignored.",
            "default": true
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (× max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many of the best rule-scored candidates get the AI pass, as a multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "aiTimeBudgetSecs": {
            "title": "AI time budget (seconds)",
            "minimum": 30,
            "maximum": 86400,
            "type": "integer",
            "description": "The AI pass stops after this long (and always before the run timeout); creators not assessed by then keep their rule score and the basic price.",
            "default": 600
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Stops the source scraper once it has cost this much on your account (shared by every source call). The form starts at $0.50; an API / MCP call without it is capped at $2.",
            "default": 2
          },
          "maxToProcess": {
            "title": "Max candidates to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many creators are scored in one run (controls run time). Default = 3 × max qualified."
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same creator twice",
            "type": "boolean",
            "description": "Remembers every creator you were charged for (in a named key-value store on your account) and skips it in future runs.",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Use different names for different campaigns.",
            "default": "instagram-creator-qualifier-seen"
          },
          "digestWebhookUrl": {
            "title": "Weekly digest webhook (Slack / Teams / Discord)",
            "type": "string",
            "description": "Posts one message per run with new creators — \"7 new creators, 2 hot\" plus the top 3 with links — to a Slack incoming webhook (or any URL). Sent only when something is new."
          },
          "notifyEmail": {
            "title": "E-mail me the digest",
            "type": "string",
            "description": "Sends the same digest by e-mail through Apify's send-mail Actor on your account, only when the run delivered at least one new creator."
          },
          "exportPreset": {
            "title": "Export for your outreach tool",
            "enum": [
              "none",
              "instantly",
              "lemlist",
              "hubspot",
              "sheets"
            ],
            "type": "string",
            "description": "Also writes the qualified creators as <b>EXPORT.csv</b> (key-value store, Storage tab) with the columns your tool imports as is — no column mapping. Instantly and Lemlist get only creators with an e-mail address; the opener goes into the personalisation / icebreaker column.",
            "default": "none"
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified creators are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1 = one POST per creator the moment it is ready. Higher = one POST per N creators.",
            "default": 1
          },
          "profiles": {
            "title": "Profiles to qualify",
            "type": "array",
            "description": "Usernames or profile URLs you already have. They go straight to a profile-details look-up (bio, followers, 12 latest posts).",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode. Pick the dataset so the Actor is granted read access to it."
          },
          "itemsList": {
            "title": "Records to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of Instagram Scraper post / reel / profile items or TikTok Scraper video items (see the README for the fields used)."
          },
          "places": {
            "title": "Places",
            "type": "array",
            "description": "Instagram location ids or <code>instagram.com/explore/locations/…</code> URLs — creators who tag these places.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Free-text search on Instagram (a separate source call, because the source cannot mix URLs and search). Combine with <b>Search type</b>.",
            "items": {
              "type": "string"
            }
          },
          "searchType": {
            "title": "Search type",
            "enum": [
              "user",
              "hashtag",
              "place"
            ],
            "type": "string",
            "description": "What the search queries look for: users (creators), hashtags or places.",
            "default": "user"
          },
          "searchLimit": {
            "title": "Search results limit",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many users / hashtags / places a search query may return.",
            "default": 20
          },
          "contentType": {
            "title": "Sample posts or reels",
            "enum": [
              "posts",
              "reels"
            ],
            "type": "string",
            "description": "What the discovery call collects per hashtag / place: regular posts or reels.",
            "default": "posts"
          },
          "postsPerSource": {
            "title": "Posts per hashtag / place",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Results limit per hashtag, place or query in the discovery call. Each result costs you $0.0027 on the source Actor.",
            "default": 50
          },
          "postsNewerThan": {
            "title": "Only posts newer than",
            "type": "string",
            "description": "Date (<code>YYYY-MM-DD</code>) or relative period (<code>90 days</code>, <code>2 months</code>) passed to the source Actor. Older posts are never fetched or paid for.",
            "default": "90 days"
          },
          "profilePostsLimit": {
            "title": "Posts per known profile",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "For <b>Profiles to qualify</b>: the profile look-up already returns the 12 latest posts; a higher number adds one extra posts call.",
            "default": 12
          },
          "fetchProfileDetails": {
            "title": "Fetch profile details",
            "type": "boolean",
            "description": "After the free filters, look up bio, follower count, verified / business status and the 12 latest posts for every remaining candidate (one source result per creator on your account). Off = follower-based metrics are missing and the creator carries <code>no_profile_details</code>.",
            "default": true
          },
          "hashtagsFromBrief": {
            "title": "Search the hashtags of my brief when I type none",
            "type": "boolean",
            "description": "Only when no hashtag, profile, preset or seed is given: the Brand brief becomes the search (one short AI call → 6–8 niche hashtags; words from the brief when AI is off). Logged and listed in OUTPUT.searchFromBrief.",
            "default": true
          },
          "discoveryTimeoutSecs": {
            "title": "Source call timeout (seconds)",
            "minimum": 60,
            "maximum": 86400,
            "type": "integer",
            "description": "Maximum run time of each source call (discovery, search, profile details) in <b>actor</b> mode. A call that times out is reported in the run summary and the run continues with what was loaded.",
            "default": 3600
          },
          "discoveryActorId": {
            "title": "Source Actor (advanced)",
            "type": "string",
            "description": "Actor used in <b>actor</b> mode. Default <code>apify/instagram-scraper</code> (the hashtag / place / profile inputs are mapped for it). Any other Actor, e.g. <code>clockworks/tiktok-scraper</code>, is called once with <b>Source Actor input</b> as-is.",
            "default": "apify/instagram-scraper"
          },
          "discoveryInput": {
            "title": "Source Actor input (advanced)",
            "type": "object",
            "description": "Raw input merged into every source call as an override (see the source Actor's input schema). With the default Instagram Scraper you normally leave this empty and use the fields above."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify Proxy for the optional bio-link check (the source Actor uses its own proxies)."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}