TikTok scraper API. Live data from any public TikTok link.
Get public posts, profiles, comments and more by link, handle or search, with posts in the same fields as on 20 other platforms. We handle the proxies, blocks and platform changes.
GET socialtap.dev/v1/tiktok/post
Live data from 33 platforms.
What TikTok data can you get?
Public TikTok profiles with exact follower counts, videos and photo posts with their views and likes, comments and transcripts. You also get engagement rates, playlists, effects, LIVE rooms, watermark-free downloads and what's trending by country. Search videos, hashtags and sounds by keyword, get the search box's suggestions for a partial query, and find accounts by keyword, niche or place in a search engine's web results. See also the TikTok Ad Library API.
- Posts 10
- Profiles 3
- Search 6
- Comments 3
- Transcript 1
- Hashtags 2
- Playlists 1
- Engagement 1
- Live 1
- Sound 1
- Download 1
- Effect 1
Posts
-
Post
TikTok Post API
Video or photo post with views, likes and media
1 creditGET /v1/tiktok/post -
Post
TikTok Posts API
Account videos and photo posts, newest first
1 credit / pageGET /v1/tiktok/posts -
Post
TikTok Effect Posts API
Videos and photo posts made with an effect
1 credit / pageGET /v1/tiktok/effect_posts -
Post
TikTok Hashtag Posts API
Top videos and photo posts under a hashtag
1 credit / pageGET /v1/tiktok/hashtag_posts -
Post
TikTok Liked Posts API
What an account liked, most recent like first
1 credit / pageGET /v1/tiktok/liked_posts -
Post
TikTok Place Posts API
Videos and photo posts tagged at a place
1 credit / pageGET /v1/tiktok/place_posts -
Post
TikTok Playlist Posts API
Videos in a playlist or collection, in its order
1 credit / pageGET /v1/tiktok/playlist_posts -
Post
TikTok Sound Posts API
Videos and photo posts that use a sound
1 credit / pageGET /v1/tiktok/sound_posts -
Post
TikTok Top Videos API
Ranked by country, period and metric
1 credit / pageGET /v1/tiktok/top_posts -
Post
TikTok Trending Videos API
What the explore page shows now, by topic
1 credit / pageGET /v1/tiktok/trending_posts
Profiles
-
Profile
TikTok Profile API
Exact follower and like counts, bio and country
1 creditGET /v1/tiktok/profile -
Profile
TikTok Followers API
Followers of an account with exact counts, newest first
1 credit / pageGET /v1/tiktok/followers -
Profile
TikTok Following API
Accounts an account follows, with exact counts
1 credit / pageGET /v1/tiktok/following
Search
-
Web result
TikTok Hashtag Search API
Hashtags for a keyword, topic or niche
From 1 credit / pageGET /v1/tiktok/search_hashtags -
Post
TikTok Search API
Videos for a keyword, by country
1 credit / pageGET /v1/tiktok/search_posts -
Web result
TikTok User Search API
Accounts by keyword, niche or place
From 1 credit / pageGET /v1/tiktok/search_profiles -
Web result
TikTok Sound Search API
Sounds and songs by title, artist or keyword
From 1 credit / pageGET /v1/tiktok/search_sounds -
Suggestion
TikTok Search Suggestions API
Search box autocomplete for a partial query
1 credit / pageGET /v1/tiktok/search_suggestions -
Web result
TikTok Top Search API
Accounts, videos, hashtags and sounds in one search
From 1 credit / pageGET /v1/tiktok/search_top
Comments
-
Comment
TikTok Comment API
Comment or reply with its likes and author
1 creditGET /v1/tiktok/comment -
Comment
TikTok Comments API
Top-level comments with exact like and reply counts
1 credit / pageGET /v1/tiktok/comments -
Comment
TikTok Comment Replies API
Thread under a comment, with likes and authors
1 credit / pageGET /v1/tiktok/replies
Hashtags
Sound
Why not the official TikTok API?
TikTok's Research API is limited to vetted academic and non-profit researchers, and its Display API only reads the accounts of people who log in and authorize your app.
No approval to wait for
One API key works on every endpoint. There's no app to get reviewed and no account to connect.
Anything public
Read what anyone can see without logging in, not only the accounts you manage or that authorized your app.
No daily quota
You pay per request. Plans have no rate limit, only a ceiling that stops a runaway loop.
Call the TikTok API from your code.
Copy the request for your language, or hand it to your agent.
const params = new URLSearchParams({
url: "https://www.tiktok.com/@scout2015/video/6718335390845095173",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/post?${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/tiktok/post",
params={"url": "https://www.tiktok.com/@scout2015/video/6718335390845095173"},
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/tiktok/post")
uri.query = URI.encode_www_form('url' => 'https://www.tiktok.com/@scout2015/video/6718335390845095173')
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([
'url' => 'https://www.tiktok.com/@scout2015/video/6718335390845095173',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/post?' . $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("url", "https://www.tiktok.com/@scout2015/video/6718335390845095173")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/post?"+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 -G 'https://socialtap.dev/v1/tiktok/post' \
--data-urlencode 'url=https://www.tiktok.com/@scout2015/video/6718335390845095173' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/postDocs const params = new URLSearchParams({
handle: "nasa",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/profile?${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/tiktok/profile",
params={"handle": "nasa"},
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/tiktok/profile")
uri.query = URI.encode_www_form('handle' => 'nasa')
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' => 'nasa',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/profile?' . $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", "nasa")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/profile?"+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/tiktok/profile?handle=nasa' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/profileDocs const params = new URLSearchParams({
comment_id: "7047599416228234031",
url: "https://www.tiktok.com/@hankgreen1/video/7047596209028074758",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/comment?${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/tiktok/comment",
params={"comment_id": "7047599416228234031", "url": "https://www.tiktok.com/@hankgreen1/video/7047596209028074758"},
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/tiktok/comment")
uri.query = URI.encode_www_form('comment_id' => '7047599416228234031', 'url' => 'https://www.tiktok.com/@hankgreen1/video/7047596209028074758')
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([
'comment_id' => '7047599416228234031',
'url' => 'https://www.tiktok.com/@hankgreen1/video/7047596209028074758',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/comment?' . $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("comment_id", "7047599416228234031")
q.Set("url", "https://www.tiktok.com/@hankgreen1/video/7047596209028074758")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/comment?"+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 -G 'https://socialtap.dev/v1/tiktok/comment' \
--data-urlencode 'comment_id=7047599416228234031' \
--data-urlencode 'url=https://www.tiktok.com/@hankgreen1/video/7047596209028074758' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/commentDocs const params = new URLSearchParams({
url: "7673108027645414678",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/transcript?${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/tiktok/transcript",
params={"url": "7673108027645414678"},
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/tiktok/transcript")
uri.query = URI.encode_www_form('url' => '7673108027645414678')
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([
'url' => '7673108027645414678',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/transcript?' . $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("url", "7673108027645414678")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/transcript?"+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/tiktok/transcript?url=7673108027645414678' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/transcriptDocs const params = new URLSearchParams({
url: "https://www.tiktok.com/tag/cooking",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/hashtag?${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/tiktok/hashtag",
params={"url": "https://www.tiktok.com/tag/cooking"},
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/tiktok/hashtag")
uri.query = URI.encode_www_form('url' => 'https://www.tiktok.com/tag/cooking')
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([
'url' => 'https://www.tiktok.com/tag/cooking',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/hashtag?' . $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("url", "https://www.tiktok.com/tag/cooking")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/hashtag?"+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 -G 'https://socialtap.dev/v1/tiktok/hashtag' \
--data-urlencode 'url=https://www.tiktok.com/tag/cooking' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/hashtagDocs const params = new URLSearchParams({
query: "cooking",
});
const res = await fetch(`https://socialtap.dev/v1/tiktok/search_hashtags?${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, page, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/tiktok/search_hashtags",
params={"query": "cooking"},
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, page, meta = body["data"], body["page"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/tiktok/search_hashtags")
uri.query = URI.encode_www_form('query' => 'cooking')
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([
'query' => 'cooking',
]);
$ch = curl_init('https://socialtap.dev/v1/tiktok/search_hashtags?' . $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("query", "cooking")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/tiktok/search_hashtags?"+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"`
Page json.RawMessage `json:"page"`
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/tiktok/search_hashtags?query=cooking' \
-H "x-api-key: $SOCIALTAP_API_KEY"GET https://socialtap.dev/v1/tiktok/search_hashtagsDocs Other platforms, same key.
Posts and profiles come back in the same fields wherever they're from.
- 28 endpoints
Instagram
Posts, profiles, comments and more
- 14 endpoints
Facebook
Posts, profiles, comments and more
- 6 endpoints
YouTube
Posts, profiles, comments and more
- 13 endpoints
Reddit
Posts, profiles, comments and more
- 6 endpoints
Threads
Posts, profiles and comments
- 12 endpoints
Spotify
Tracks, artists, playlists and more
- 10 endpoints
Amazon
Products, posts, profiles and more
- 10 endpoints
Apple Music
Tracks, artists, playlists and more
- 10 endpoints
Pinterest
Pins, profiles, boards and more
- 7 endpoints
Rumble
Posts, profiles, comments and more
- 7 endpoints
X
Posts, profiles and communities
- 5 endpoints
Bluesky
Posts, profiles and comments
- 5 endpoints
Twitch
Videos, profiles, transcripts and more
- 4 endpoints
LinkedIn
Posts and profiles
- 4 endpoints
Telegram
Posts and channels
- 4 endpoints
TikTok Shop
Products and reviews
- 3 endpoints
Kwai
Posts and profiles
- 3 endpoints
Snapchat
Spotlights, profiles and comments
- 3 endpoints
SoundCloud
Tracks and artists
- 3 endpoints
Truth Social
Posts and profiles
- 2 endpoints
Kick
Posts and transcripts
- 1 endpoint
Komi
Pages
- 1 endpoint
Lnk.Bio
Profiles
- 1 endpoint
Linkme
Profiles
- 1 endpoint
Linktree
Profiles
- 1 endpoint
Pillar
Pages
- 3 endpoints
TikTok Ad Library
Ads
- 5 endpoints
Facebook Ad Library
Ads, advertisers and transcripts
- 4 endpoints
Facebook Events
Events
- 3 endpoints
Facebook Marketplace
Listings and places
- 6 endpoints
Google Ads Transparency Center
Ads and advertisers
- 2 endpoints
LinkedIn Ad Library
Ads
Can I download the video?
Are the follower counts exact?
Does the TikTok Comments API return replies?
Can I get the transcript in another language?
What do I send?
Is the data live?
What does null mean in a response?
Are the fields the same on every platform?
What happens when a platform changes its pages?
Do you read private or logged-in content?
Can my AI agent use it?
Try it on a TikTok link you have.
Get a key and send your first request in a minute. The same key works on every platform.
- No credit card
- Failed requests are free
- Works on all 218 endpoints