You have a spreadsheet of 500 Instagram handles from a discovery run, and every one of them is a dead end until you can reach a human. The bio says "collabs 👉 link in bio", the link is a Linktree, the Linktree points to a Notion page, and somewhere three clicks deep there is a press@ address. Doing that by hand for 500 creators is a week of tab-juggling. Doing it wrong — blasting a generic DM — is how you get muted.

The fix is to make contact discovery a single API call. Give it an Instagram handle, get back classified email candidates — each with source provenance and a deliverability verification snapshot — plus the creator's other social accounts, and pipe the result straight into your CRM or outreach sequence. This guide covers the two endpoints that do it — /v1/intelligence/contact for pure email hunting and /v1/intelligence/profile when you also want the AI profile bundle — plus how to run them in bulk without melting your budget, and how to send the email without landing in spam or breaking the law.

Two endpoints, one job

Both endpoints take a single Instagram q — a username, an @handle, or an instagram.com/username URL — and both run an LLM under the hood, so responses take seconds to minutes rather than milliseconds. There is no live demo widget for either one; the latency makes an inline runner pointless. You call them, you wait, you get structured JSON back in the standard { data, meta } envelope.

EndpointWhat it returnsCostWhen to use
/v1/intelligence/contactemails[] + cross-platform social_accounts[]$0.10You only need contact info
/v1/intelligence/profileFull AI bundle — niche, audience, brand fit — including emails[] and social_accounts[]$0.05You already want the profile intel

Read the field you already paid for

If your pipeline already calls /v1/intelligence/profile to classify a creator's niche and brand fit, the emails[] and social_accounts[] fields come in the same payload at no extra charge. Don't call contact on a profile you just enriched — you'd be paying $0.10 for data already sitting in the $0.05 response.

Discover a single creator's email

Start with the specialist endpoint. The turns parameter (1-5, default 3) controls how hard the agent searches — more turns means deeper crawling of linked sites and more thorough cross-referencing, at the cost of latency. source=live forces a fresh crawl instead of cached data and doubles the price to $0.20.

shell
curl "https://api.virev.ai/v1/intelligence/contact?q=natgeo&turns=3" \
  -H "Authorization: Bearer $VIREV_API_KEY"
contact.js
const res = await fetch(
  "https://api.virev.ai/v1/intelligence/contact?q=natgeo&turns=3",
  { headers: { Authorization: "Bearer kb_live_..." } }
);

const { data, meta } = await res.json();
console.log(data.emails);
// [{ email: "press@natgeo.com", category: "press",
//    contact_relevance: "possible", source_url: "https://...",
//    verification: { status: "deliverable", provider: "zerobounce", ... } }, ...]
console.log(data.social_accounts);  // [{ platform: "tiktok", handle: "..." }, ...]
console.log(meta.cost);             // "$0.1000"

The response puts everything under data. emails[] is a list of classified candidate objects rather than a single guess — each entry names the exact page it was found on (source_url), how relevant it is to outreach (contact_relevance), and, when deliverability verification ran, a verification snapshot (deliverable / risky / undeliverable / unverified). Treat deliverable as the mail server's answer at check time, not a guarantee — and note that discovery is the priced operation, so an unverified entry still bills the same. social_accounts[] gives you the same creator's handles on TikTok, YouTube, and elsewhere, which is often more valuable than the email itself: now you can look them up on the TikTok analytics API or the YouTube channel API and enrich the whole row.

Pull contact info as part of the full profile

If you're already classifying creators, reach for /v1/intelligence/profile instead. It returns the AI bundle — account_role, content_tags, niche_authority, commercial_intent, brand_fit_summary — and carries emails[] and social_accounts[] in the same object. One call, $0.05, and you get both the reason to reach out and the way to do it.

profile.py
import requests

res = requests.get(
    "https://api.virev.ai/v1/intelligence/profile",
    params={"q": "natgeo"},  # add model="gpt-5.4" for the $0.10 tier
    headers={"Authorization": "Bearer kb_live_..."},
)

profile = res.json()["data"]
print(profile["tagline"])            # one-line positioning
print(profile["brand_fit_summary"])  # is this creator a fit?
print(profile["emails"])             # contact candidates, free with the bundle
print(profile["social_accounts"])    # cross-platform handles

Model and refresh knobs

/v1/intelligence/profile defaults to gpt-5.4-mini at $0.05; pass model=gpt-5.4 for the sharper $0.10 tier. On either endpoint, force_refresh re-runs the analysis from scratch and doubles the cost — only reach for it when a creator has visibly rebranded since your last pull.

Enrich a list without blowing your budget

Real outreach starts from a list, not one handle. The loop is straightforward: iterate your handles, call contact, and collect the results. Two things to build in from the start — respect the 100 req/min default rate limit (a 429 carries a Retry-After header), and remember you are never charged for a non-200, so a failed lookup costs nothing and can be retried freely.

bulk_contacts.py
import requests, time

HANDLES = ["natgeo", "nasa", "bbcearth"]  # from your discovery run
HEADERS = {"Authorization": "Bearer kb_live_..."}
rows = []

for handle in HANDLES:
    res = requests.get(
        "https://api.virev.ai/v1/intelligence/contact",
        params={"q": handle, "turns": 3},
        headers=HEADERS,
    )
    if res.status_code == 429:
        time.sleep(int(res.headers.get("Retry-After", 5)))
        continue  # non-200 was free — safe to retry
    if res.status_code != 200:
        continue  # log and move on; you were not billed
    data = res.json()["data"]
    rows.append({
        "handle": handle,
        "emails": data.get("emails", []),
        "socials": data.get("social_accounts", []),
    })

print(f"Enriched {len(rows)} creators")

A few cost anchors for planning a run: at $0.10 each, 1,000 creators is $100 of contact discovery. If you're enriching profiles anyway, doing it through /v1/intelligence/profile at $0.05 gets you the emails plus full classification for half that. And the starter offer — pay $1, get a $5 balance — covers your first ~50 contact lookups or ~100 profile enrichments before you commit to anything.

Send the email without getting burned

Finding the address is the easy part. Not getting reported is the discipline. These emails are business contact points creators published so brands could reach them — but publishing an address is not consent to receive bulk mail, and the law treats it that way.

  • CAN-SPAM (US): use accurate From/Subject headers, include a real physical mailing address, and provide a working unsubscribe that you honor within 10 business days.
  • GDPR (EU recipients): you can lean on legitimate interest for B2B outreach, but you must offer a clear opt-out and stop on request. Keep a record of why you contacted them.
  • Relevance over volume: use the brand_fit_summary and content_tags you already pulled to send something specific. A creator who gets a personalized, on-niche pitch replies; one who gets a mail-merge blast blocks you.
  • Verify before a big send: the API returns candidates — run them through your ESP's validation step to catch bounces before they hurt your sender reputation.
Discovery gives you the address. Etiquette gives you the reply. Treat every send as if the creator will screenshot it.

Turn handles into inboxes

Pay $1, get a $5 balance — enough for ~50 contact lookups or ~100 full profile enrichments. No subscription, no minimum.

Get your API key →