Instagram Username Availability API. Send a handle or profile link.
Free or taken, with suggested alternatives. We handle the proxies, blocks and platform changes.
Instagram Username Availability API at a glance
Checks whether an Instagram username can be registered now, the way the sign-up form does, from a username or profile link. When it can't, you get why (taken or reserved, or against Instagram's username rules, in Instagram's words) and the free usernames the form suggests instead, in its order.
GET /v1/instagram/username
- 1 credit per request, $0.75–$1.97 per 1,000 requests
- 8 typed fields null when unknown
handleis all it needs, e.g.socialtap- 100 credits free when you sign up, no card, so you can build before you spend
Send one request. Get 8 fields back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtaphandle = socialtapconst params = new URLSearchParams({
handle: "socialtap",
});
const res = await fetch(`https://socialtap.dev/v1/instagram/username?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/instagram/username",
params={"handle": "socialtap"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/instagram/username")
uri.query = URI.encode_www_form('handle' => 'socialtap')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'handle' => 'socialtap',
]);
$ch = curl_init('https://socialtap.dev/v1/instagram/username?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("handle", "socialtap")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/instagram/username?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl 'https://socialtap.dev/v1/instagram/username?handle=socialtap' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": {
"id": "socialtap",
"is_available": false,
"message": "The username socialtap is not available.",
"platform": "instagram",
"platform_specific": {},
"reason": "taken",
"suggestions": [
"soci.altap",
"socia_ltap",
"soci_altap"
],
"url": "https://www.instagram.com/socialtap/",
"username": "socialtap"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "instagram",
"source": "api",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 608,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "profile",
"id": "socialtap",
"url": "https://www.instagram.com/socialtap/"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.instagram.username.get({ handle: "socialtap" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "handle=" + encode("socialtap");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/instagram/username?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"handle=" + Uri.EscapeDataString("socialtap"));
var res = await http.GetAsync("https://socialtap.dev/v1/instagram/username?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/instagram/username")
.query(&[("handle", "socialtap")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/instagram/usernameLong arrays and strings are shortened here. Real responses are complete.Docs What you send and what comes back.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Instagram doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
The Instagram username to check, with or without the @ (socialtap, @socialtap), or a profile link (instagram.com/socialtap).
What comes back
Whether a username is free to register on a platform, why not if it's taken, and the free alternatives its sign-up form suggests.
platformstring- Platform whose sign-up checked the username.
idstring- The username checked, as its identifier: the same value as username (a name, free or taken, has no other ID in a sign-up check).
usernamestring- The username checked, without @, in the platform's canonical form (lowercase where usernames are case-insensitive).
urlstring- The profile page at this username: the account's page when it is taken, the page it would have once registered (until then the platform answers it as not found); null when that address is one of the platform's own pages (instagram.com/explore/), not an account's.
is_availableboolean- True when the platform would let someone register the username now; false when it is taken, reserved or breaks the platform's username rules (reason and message say which); null when the platform did not say.
reasonstring- Why the username is not available: taken = registered to an account or reserved by the platform (platforms don't tell the two apart); invalid = breaks the platform's username rules (length, characters). Null when it is available or the platform gave no reason. New values may be added.
messagestring- The platform's own explanation when the username is not available, as its sign-up form shows it (English); null when it is available.
suggestionsstring[]- Free usernames the platform's sign-up form proposes for this one, in its order; [] when it proposes none (platforms suggest nothing for short, protected or brand names). Free when proposed: someone can take one at any time.
Live data from 33 platforms.
What teams build with the Instagram Username Availability API.
Find a free handle for a new brand
Check a name across platforms before launch
Suggest free usernames during sign-up
Watch for a wanted handle to free up
Good to know before you build.
- Suggestions are free when Instagram proposes them, but anyone can take one at any time, so check again before relying on it.
- Instagram suggests no alternatives for short, protected or brand names (nike, instagram), so suggestions is empty.
- taken covers both registered names and names Instagram reserves, without telling them apart.
1 credit per request. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful request | Per 1,000 requests |
|---|---|---|
Platform API api | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Instagram Username Availability API.
More in the API reference.
Does this tell me whether an account exists?
Does it register or hold the name?
How much does the Instagram Username Availability API cost?
Try it on an account you know.
Paste its handle or link in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints