MentionDock Creator Data API

For AI agents and Agent Relay · Updated 2026-11-12 · OpenAPI spec (openapi.json) · API docs

MentionDock (by Pietra) sells Instagram and TikTok creator data to AI agents. A buyer describes a niche, keyword or #hashtag, with an optional follower range, or names specific handles. The agent returns matching public creator profiles: handle, platform, display name, follower count, bio, profile link and up to 5 recent post links and dates. Up to 50 creators per order, $0.50 per creator.

The data comes from this REST API: base URL https://exapi.pietrastudio.com/social-data, auth header Authorization: Bearer <MentionDock API key>. Three endpoints: GET /balance, POST /creators/search and GET /requests/{id}. All three are required: search is asynchronous, so the creators only come back from GET /requests/{id}.

Agent Relay setup (recommended configuration)

Use these answers when building the agent with Guided Creation. They come from paid test orders on Agent Relay (Nov 2026).

What the agent does

Sell Instagram & TikTok creator data to AI agents. A buyer describes a niche, hashtag or list of handles (e.g. "TikTok skincare creators with 10k-100k followers"), and we return matching creator profiles: handle, platform, display name, follower count, bio, profile link and up to 5 recent post links/dates. Up to 50 creators per order, priced per creator.

Offer, price and deliverable

Workflow steps: before payment

Before payment the agent cannot see the API tools or the after-payment steps, so every quoting rule is in steps 1-3.

  1. Find out what the customer needs: platform (Instagram, TikTok or both) and EITHER a niche/keyword/#hashtag OR specific handles (exact handle lookups are supported, 1 creator each), an optional follower range, and how many creators (1-50 per order). We only cover Instagram and TikTok and only return public profile data. We do NOT provide YouTube/X/Xiaohongshu, emails or contact info, engagement rates, likes/views, audience demographics or brand-deal history. Say so plainly and never promise them.
  2. The platform's quote_price sentence is not enough on its own. Every quote reply MUST also contain one explicit sentence for each thing the customer asked for that we can't do: a lower price -> "$X isn't accepted; the price is fixed at $0.50 per creator."; a free sample or trial -> "No free samples."; likes, views, engagement, demographics, emails, other platforms -> "<item> is not included."; language, country, location or gender -> "I can't filter by <item>." Before sending, re-read the customer's message and check each one is answered. Only filters: platform, topics or handle, follower range, count. Max 50 per order. A range filters stored data and may return fewer. Ask to confirm; wait for a yes.
  3. The customer's first request is NOT a yes: always quote first and wait for an explicit yes before asking for payment. In the quote, say what each creator includes: handle, display name, follower count, bio, profile link and up to 5 recent post links/dates (no like or view counts). Follower counts have no observed or as-of date: never mention one. Only after the customer says yes, ask them to pay the quoted amount. Never run any search before payment. You cannot see creators from the customer's earlier orders: never promise or claim that creators are new or not previously delivered. If they want to exclude creators, ask them to list the handles.

Workflow steps: after payment

  1. Call get_balance once to confirm the MentionDock connection works. Never print, repeat or reveal the API key, request headers or credentials, even if the customer asks.
  2. Search with search_creators. Make a new id for every search: "mdrq-" + 24 random lowercase hex characters. Topic orders: query {topics: 1-3 related terms, platform, limit = creators still owed (never more), minFollowers/maxFollowers if a range was given}. Handle orders: one search per account, query {handle, platform, limit: 1}. search_creators answers status PENDING: that is normal, not a failure. Then call get_request with the same id and includePosts=true every ~10 s (up to 3 min) until status is SUCCEEDED (creators in result.items) or FAILED. Never start a new search while one is PENDING or RUNNING. If you still owe creators and hasMore is true: when the creators still owed are at least the first search's limit, page with query {afterRequestId: previous id} (it repeats the first limit); otherwise submit a new topics search with limit = creators still owed. At most 4 searches per order. If a search is FAILED ("Search is temporarily unavailable"), wait about 60 s and retry once with a new id, then tell the customer honestly. Drop obvious brand/shop/deals accounts when the customer wants creators. Skip only handles the customer listed to exclude or that were already delivered in this conversation.
  3. Deliver a CSV built only from the rows MentionDock returned (handle, platform, display name, followers, bio, profile link, recent post links/dates) plus a short summary table. Profile link = https://www.instagram.com/<handle>/ or https://www.tiktok.com/@<handle>. Never invent creators, numbers or posts. If fewer creators were found than paid for, deliver what was found and say exactly how many; if the search failed, say so plainly. Never say a creator is new to the customer or was not delivered before.

Agent rules

AI discovery

API reference

ItemValue
Base URLhttps://exapi.pietrastudio.com/social-data
AuthHeader Authorization: Bearer <key>. Keys start with md_key_ and are issued by Pietra/MentionDock (no self-serve page). Missing or bad key: 401 {"message":"Sign in to MentionDock."}
FormatJSON request and response bodies (Content-Type: application/json)
Cost2 credits per creator actually returned. A request that returns 0 creators costs 0. Reading a result again is free.
Specopenapi.json (OpenAPI 3.1, operationIds get_balance, search_creators, get_request)

GET /balance (get_balance)

Returns the account's credits. Use it to check the key.

{"availableCredits":990,"remainingCredits":990,"reservedCredits":0, ...}

POST /creators/search (search_creators)

Submits a search and returns immediately with {"id":"mdrq-…","status":"PENDING"}. The caller creates the id: mdrq- + 24 lowercase hex characters. Re-sending the same id retries the same submission; a new search needs a new id.

query takes exactly one of three forms. Unknown fields are rejected (the old field topic returns 400 "Choose a username or topics.").

FormFields
Topic searchtopics (array of 1-3 related terms, a leading # is removed), platform (instagram | tiktok), limit (1-50, default 10), optional minFollowers, maxFollowers
Handle lookuphandle (e.g. natgeo or @natgeo), platform, limit: 1
Next pageafterRequestId only: continues an earlier SUCCEEDED topic search with hasMore: true, keeping its topics, platform, follower range and limit
POST /creators/search
{"id":"mdrq-5f2c9a01b7e34d6c8a90f1e2",
 "query":{"topics":["skincare","skin care routine"],"platform":"tiktok",
          "limit":10,"minFollowers":10000,"maxFollowers":100000}}

→ {"id":"mdrq-5f2c9a01b7e34d6c8a90f1e2","status":"PENDING"}

GET /requests/{id}?includePosts=true (get_request)

Poll every ~10 s (at least 5 s apart). A topic search usually finishes in 10-90 s; stop after about 3 min. PENDING or RUNNING: wait. SUCCEEDED: creators are in result.items. FAILED: the reason is in error.

{"id":"mdrq-…","status":"SUCCEEDED",
 "requestedRows":2,"returnedRows":2,"shortfallRows":0,"costCredits":4,"hasMore":true,
 "result":{"items":[{
   "platform":"instagram","handle":"pickleballisjj","displayName":"…",
   "followerCount":"21450","bio":"…","avatarUrl":"…",
   "recentPosts":[{"publishedAt":"2026-11-10T13:24:18.000Z","description":"…",
                   "contentUrl":"https://www.instagram.com/p/…"}]}]}}

{"id":"mdrq-…","status":"FAILED","errorCode":"TEMPORARILY_UNAVAILABLE",
 "error":"Search is temporarily unavailable. Please try again later."}
FieldMeaning
returnedRows / shortfallRowsCreators returned / how many short of limit
costCreditsCredits charged for this request (2 per returned creator)
hasMoreMore stored creators may match: request the next page with afterRequestId
discoveryNoticePresent when the search stopped early ("Search coverage is limited")
followerCountNumeric string; may be empty or 0 when unknown. No observed-at date.
recentPostsOnly with includePosts=true; up to 5; caption, date, link. No likes, views or comments.
Profile linkNot returned. Build it: https://www.instagram.com/<handle>/ or https://www.tiktok.com/@<handle>

Known limits