---
title: "Instagram Profile Search API"
method: GET
path: "/v1/instagram/profile-search"
tags: ["Instagram"]
---

# Instagram Profile Search API

`GET /v1/instagram/profile-search`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/instagram/profile-search`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Resolve a brand or @handle to one public Instagram profile — stable id, bio, links, and stats (not niche discovery).

Pass an account name, @handle, or profile URL (e.g. nike, @nasa, instagram.com/natgeo) and this endpoint resolves it to the matching public Instagram account — a name→username resolver, not a Google-style niche discovery search (queries like "fitness coach" will not return a creator list). A leading underscore on q is stripped (_glowprotocol → glowprotocol); underscores in the middle of a handle stay. Response: mode=resolve (the only mode; Instagram keyword search is login-gated), users[0] with platform, id (numeric), username, displayName, url (canonical https://www.instagram.com/{user}/), bio, bioLinks[], externalUrl, fbid, businessAddress{cityName, streetAddress, latitude, longitude, zipCode} when Instagram exposes them, followers/following/postCount, verified, isPrivate, isBusinessAccount/isProfessionalAccount, avatar, and imageExpiresAt when the CDN oe= param is present. Sparse keys (bio, bioLinks, externalUrl, businessAddress, categoryName, relatedProfiles, likeAndViewCountsDisabled) are omitted, not nulled, when the account has no value. relatedProfiles only appears when Instagram's logged-out graph sends edge_related_profiles — many public accounts including nike omit it, so it is not a creator-search substitute. No nextCursor — resolve returns at most one user. A handle Instagram confirms does not exist is 200 with users=[] and handleStatus not_found at 0 credits. When the lookup itself fails (Instagram rate limit or timeout) the answer is 503 UPSTREAM_UNAVAILABLE with retryable=true at 0 credits — an empty users[] always means the account was checked and is not there. A q that cannot be an Instagram username (no letters, digits, periods or underscores) is 400 BAD_REQUEST. Flat 1 credit on a hit. Cache is on by default (24h shared cache, 0 credits on hit) because a resolve answer barely changes — pass cache=false to force a fresh upstream lookup. The uncached path resolves the profile live; set client timeouts ≥15s, not 10s.

Docs: https://captapi.com/apis/instagram-profile-search

## Query parameters

- `q` string, required
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `query` string: The search query you sent.
    - `totalReturned` integer: Number of items returned in this response.
    - `users` object[]
      - `id` string: Id of this users item.
      - `username` string: Account username / handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `url` string: Canonical profile URL: https://www.instagram.com/{username}/ (www + trailing slash) — join-safe with channel-details / basic-profile.
      - `bio` string: Profile bio. Canonical across profile endpoints (prefer over description on YouTube).
      - `followers` integer: Follower count.
      - `following` integer: Number of accounts followed.
      - `postCount` integer: Total posts/statuses/videos for the account. Canonical across profile endpoints (prefer over posts / videoCount / tweetCount).
      - `verified` boolean: Whether the account is verified on this platform.
      - `isPrivate` boolean: Whether the account is private. Canonical privacy flag (no separate private alias).
      - `isBusinessAccount` boolean: Whether the account is a business account.
      - `isProfessionalAccount` boolean: Whether the account is a professional (creator/business) account.
      - `externalUrl` string: Website / link-in-bio URL when present.
      - `bioLinks` object[]: External links from the profile bio ({title, url, linkType} on Instagram; {url, verified, linkId} on Threads).
        - `url` string: Canonical profile URL: https://www.instagram.com/{username}/ (www + trailing slash) — join-safe with channel-details / basic-profile.
        - `linkType` string
      - `profileImage` string: Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
      - `profileImageHd` string: HD profile picture URL.
      - `platform` string: Always "instagram" on each users[] row.
      - `imageExpiresAt` string: ISO-8601 expiry parsed from the CDN oe= hex timestamp when present. Re-host the image for long-term storage — do not treat the CDN URL as permanent.
    - `mode` string: Always "resolve". Instagram keyword / multi-result search is login-gated — there is no "search" mode and no nextCursor on this endpoint.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
