---
name: tapline
description: Integrate Tapline's YouTube, Airbnb, X (Twitter), Pinterest, Instagram, TikTok, GMGN, GeckoTerminal, GoPlus, Pons, Pump.fun, Birdeye, Zillow, LinkedIn, imovelweb, Expedia, Brave Search, Indeed, Facebook, Facebook Ad Library, Facebook Marketplace, and Google Maps APIs. Choose use-it-now or add-to-a-project, get an API key, run one real request, and verify it.
---

# Tapline

Tapline returns structured JSON from YouTube, Airbnb, X (Twitter), Pinterest, Instagram, TikTok, GMGN, GeckoTerminal, GoPlus, Pons, Pump.fun, Birdeye, Zillow, LinkedIn, imovelweb, Expedia, Brave Search, Indeed, Facebook, Facebook Ad Library, Facebook Marketplace, and Google Maps. Base URL: https://api.tapline.sh.

Typed clients are available as the `tapline` package for Python and `@tapline/client` for TypeScript, and `@tapline/cli` installs a `tapline` command. All three cover every API. Use plain HTTP for another language or a project that already has an HTTP client. There is no MCP server. Follow the project's conventions for configuration and error handling.

## How you might arrive

- A pasted prompt from a landing page: the product is already chosen. Skip the "which API" question and ask only what the user wants to do.
- The copy link in a product docs intro: the API is already known. Ask only what the user wants to fetch. Ask which API on the combined reference.
- You found this file or https://tapline.sh/llms.txt on your own: ask which API and what the user wants to do.
- A 401 from https://api.tapline.sh in the middle of a task: go straight to "Get an API key".

## Choose a path

Path A, use it now: you are the client. Pick the endpoint for the ask, build one request with curl or a typed client, run it with the user's key, and show the result. For more pages, follow the response cursor with the same query; never invent a cursor.

Path B, add it to a project: inspect the repo first for its language, HTTP client, configuration loading, error handling, and test setup. In Python, add `tapline`. In TypeScript or JavaScript, add `@tapline/client`. For another language, use the project's HTTP client with the key from the environment, a bounded timeout, and handling for non-2xx responses. Put the call where the project keeps its API calls, and add one focused test if the repo has tests.

Both paths end at Verify.

## Get an API key

1. Sign up at https://tapline.sh/sign-up. A free account includes 100 credits and needs no card.
2. Create and copy a key at https://tapline.sh/dashboard?tab=api-keys.

The user does both steps in a browser. Ask for the key, then wait; do not try to sign up for them. Take the key in one of two ways.

In a local shell, a hidden prompt:

```bash
read -r -s -p 'Tapline API key: ' TAPLINE_API_KEY && export TAPLINE_API_KEY && echo
```

In a project, the .env file or secret manager it already uses. Confirm .env is gitignored.

## Authenticate

Send the key in the X-API-Key header on every request. Read it from the TAPLINE_API_KEY environment variable. Never write it into source code, URLs, logs, chat messages, or committed files, and check that the variable is set without printing it.

## Python and TypeScript clients

Python requires 3.10 or newer. Both clients read TAPLINE_API_KEY, retry temporary failures, honor Retry-After, and expose typed response models.

```bash
pip install tapline
npm install @tapline/client
```

Python:

```python
from tapline import SyncTaplineClient

with SyncTaplineClient() as tapline:
    subtitles = tapline.youtube.subtitles("dQw4w9WgXcQ", subtitle_format="txt")
    print(subtitles.transcript)
```

TypeScript:

```ts
import { TaplineClient } from '@tapline/client'

const tapline = new TaplineClient()
const results = await tapline.gmgn.search({ chain: 'sol', q: 'bonk' })

console.log(results.data.coins[0])
```

Both clients expose the Zillow service alongside the other maintained APIs. Use the dedicated API reference for method inputs and response fields. The Python package has sync and async clients; the TypeScript package works in Node.js and server runtimes.

Errors are typed: `MissingAPIKeyError`, `AuthenticationError` (401), `InsufficientCreditsError` (402), `PermissionDeniedError` (403), `NotFoundError` (404), `UnprocessableEntityError` (422), `RateLimitError` (429), and `InvalidCursorError`. All extend `TaplineError`; the HTTP ones carry `status_code`, `code`, `message`, and `request_id`.

## Endpoints

| Product | Operation | Method and path | Credits |
| --- | --- | --- | --- |
| YouTube API | Transcript | `GET /v1/youtube/videos/{video_id}/subtitles` | 2 |
| YouTube API | Video Search | `GET /v1/youtube/search` | 3 |
| YouTube API | Playlist | `GET /v1/youtube/playlist/{playlist_id}` | 2 |
| YouTube API | Comments | `GET /v1/youtube/videos/{video_id}/comments` | 3 |
| YouTube API | Comment Replies | `GET /v1/youtube/videos/{video_id}/comments/{comment_id}/replies` | 2 |
| YouTube API | Video Metadata | `GET /v1/youtube/videos/{video_id}/metadata` | 3 |
| YouTube API | Channel Info | `GET /v1/youtube/channels/{channel_id}` | 3 |
| YouTube API | Subtitle Tracks | `GET /v1/youtube/videos/{video_id}/subtitles/tracks` | 2 |
| YouTube API | Channel Videos | `GET /v1/youtube/channels/{channel_id}/videos` | 3 |
| YouTube API | Video Formats | `GET /v1/youtube/videos/{video_id}/formats` | 2 |
| YouTube API | Engagement Heatmap | `GET /v1/youtube/videos/{video_id}/heatmap` | 2 |
| Airbnb API | Listing Details | `POST /v1/airbnb/details` | 5 |
| Airbnb API | Live Price | `POST /v1/airbnb/price` | 2 |
| Airbnb API | Availability | `POST /v1/airbnb/calendar` | 1 |
| Airbnb API | Listing Reviews | `POST /v1/airbnb/reviews` | 2 |
| Airbnb API | Listing Search | `POST /v1/airbnb/search` | 5 |
| Airbnb API | Location Autocomplete | `GET /v1/airbnb/locations` | 1 |
| GMGN API | Token Security | `GET /v1/gmgn/{chain}/token/{token_address}/security` | 2 |
| GMGN API | Token Stats | `GET /v1/gmgn/{chain}/token/{token_address}/stats` | 2 |
| GMGN API | Token Holders | `GET /v1/gmgn/{chain}/token/{token_address}/holders` | 2 |
| GMGN API | Top Traders | `GET /v1/gmgn/{chain}/token/{token_address}/traders` | 2 |
| GMGN API | Token Trades | `GET /v1/gmgn/{chain}/token/{token_address}/trades` | 2 |
| GMGN API | Token Candles | `GET /v1/gmgn/{chain}/token/{token_address}/candles` | 2 |
| GMGN API | Token Socials | `GET /v1/gmgn/{chain}/token/{token_address}/socials` | 2 |
| GMGN API | Wallet Rankings | `GET /v1/gmgn/{chain}/wallet-rankings` | 2 |
| GMGN API | Wallet P&L | `GET /v1/gmgn/{chain}/wallet-pnl/{wallet_address}` | 2 |
| GMGN API | Token & Wallet Search | `GET /v1/gmgn/{chain}/search` | 2 |
| GeckoTerminal API | Search | `GET /v1/gecko-terminal/search` | 2 |
| GeckoTerminal API | Latest Pools | `GET /v1/gecko-terminal/pools/latest` | 2 |
| GeckoTerminal API | Pool Details | `GET /v1/gecko-terminal/networks/{network}/pools/{address}` | 2 |
| GeckoTerminal API | Pool Swaps | `GET /v1/gecko-terminal/networks/{network}/pools/{address}/swaps` | 2 |
| GeckoTerminal API | Candlesticks | `GET /v1/gecko-terminal/candlesticks/{pool_id}/{pair_id}` | 2 |
| GeckoTerminal API | Token Top Holders | `GET /v1/gecko-terminal/networks/{network}/tokens/{token_address}/top-holders` | 2 |
| GeckoTerminal API | Historical Holders | `GET /v1/gecko-terminal/networks/{network}/tokens/{token_address}/historical-holders` | 2 |
| GeckoTerminal API | Token Top Traders | `GET /v1/gecko-terminal/tokens/{token_id}/top-traders` | 2 |
| GeckoTerminal API | Wallet Token Position | `GET /v1/gecko-terminal/tokens/{token_id}/wallets/{wallet_address}` | 2 |
| GeckoTerminal API | Developer Past Tokens | `GET /v1/gecko-terminal/token-developers/{developer_detail_id}/past-tokens` | 2 |
| X (Twitter) API | Profile | `GET /v1/twitter/profile` | 1 |
| X (Twitter) API | User Posts | `GET /v1/twitter/user-tweets` | 1 |
| X (Twitter) API | Post | `GET /v1/twitter/tweet` | 1 |
| X (Twitter) API | Community | `GET /v1/twitter/community` | 1 |
| X (Twitter) API | Community Posts | `GET /v1/twitter/community/tweets` | 1 |
| Pinterest API | Pin Search | `GET /v2/pinterest/search` | 1 |
| Pinterest API | Pin Details | `GET /v2/pinterest/pin` | 1 |
| Pinterest API | Board Pins | `GET /v2/pinterest/board` | 1 |
| Pinterest API | User Boards | `GET /v2/pinterest/user/boards` | 1 |
| Instagram API | Profile | `GET /v1/instagram/profile` | 3 |
| Instagram API | User Posts | `GET /v1/instagram/user/posts` | 3 |
| Instagram API | User Reels | `GET /v1/instagram/user/reels` | 2 |
| Instagram API | Post | `GET /v1/instagram/post` | 1 |
| Instagram API | Post Comments | `GET /v1/instagram/post/comments` | 1 |
| Instagram API | Popular Search | `GET /v1/instagram/search/popular` | 3 |
| Instagram API | Audio Reels | `GET /v1/instagram/audio/reels` | 1 |
| Instagram API | Highlights | `GET /v1/instagram/user/highlights` | 1 |
| Instagram API | Highlight Detail | `GET /v1/instagram/user/highlight/detail` | 1 |
| Instagram API | Basic Profile | `GET /v1/instagram/basic-profile` | 1 |
| Instagram API | Post Count | `GET /v1/instagram/profile/post-count` | 1 |
| Instagram API | Profile Embed | `GET /v1/instagram/user/embed` | 1 |
| TikTok API | Profile | `GET /v1/tiktok/profile` | 1 |
| TikTok API | Profile Videos | `GET /v1/tiktok/profile/videos` | 1 |
| TikTok API | Video | `GET /v1/tiktok/video` | 1 |
| TikTok API | Transcript | `GET /v1/tiktok/video/transcript` | 1 |
| TikTok API | Comments | `GET /v1/tiktok/video/comments` | 1 |
| TikTok API | Comment Replies | `GET /v1/tiktok/video/comment/replies` | 1 |
| TikTok API | Hashtag Search | `GET /v1/tiktok/search/hashtag` | 1 |
| TikTok API | User Search | `GET /v1/tiktok/search/users` | 1 |
| TikTok API | Trending Feed | `GET /v1/tiktok/get-trending-feed` | 1 |
| TikTok API | Search Suggestions | `GET /v1/tiktok/search/suggestions` | 1 |
| TikTok API | Followers | `GET /v1/tiktok/user/followers` | 1 |
| TikTok API | Following | `GET /v1/tiktok/user/following` | 1 |
| TikTok API | Sound | `GET /v1/tiktok/song` | 1 |
| TikTok API | Sound Videos | `GET /v1/tiktok/song/videos` | 1 |
| TikTok API | Collection Videos | `GET /v1/tiktok/collection/videos` | 1 |
| GoPlus API | EVM Token Security | `GET /v1/goplus/evm/{chain_id}/tokens/{address}/security` | 3 |
| GoPlus API | Solana Token Security | `GET /v1/goplus/solana/tokens/{mint}/security` | 3 |
| GoPlus API | Tron Token Security | `GET /v1/goplus/tron/tokens/{address}/security` | 3 |
| Pons API | Launches | `GET /v1/ponsfamily/launches` | 2 |
| Pons API | Search Launches | `GET /v1/ponsfamily/launches/search` | 2 |
| Pons API | Protocol Analytics | `GET /v1/ponsfamily/analytics` | 2 |
| Pons API | Token | `GET /v1/ponsfamily/tokens/{token}` | 2 |
| Pons API | Market | `GET /v1/ponsfamily/markets/{token}` | 2 |
| Pons API | Trades | `GET /v1/ponsfamily/markets/{token}/trades` | 2 |
| Pons API | Holders | `GET /v1/ponsfamily/markets/{token}/holders` | 2 |
| Pons API | Price Chart | `GET /v1/ponsfamily/markets/{token}/chart` | 2 |
| Pons API | Wallet Positions | `GET /v1/ponsfamily/wallets/{address}/positions` | 2 |
| Pons API | Forum Posts | `GET /v1/ponsfamily/forum/posts` | 2 |
| Pump.fun API | Trending Coins | `GET /v1/pumpfun/coins/trending` | 1 |
| Pump.fun API | Search Coins | `GET /v1/pumpfun/search/coins` | 1 |
| Pump.fun API | Coin | `GET /v1/pumpfun/coins/{mint}` | 1 |
| Pump.fun API | Trades | `GET /v1/pumpfun/chains/{chain}/coins/{address}/trades` | 1 |
| Pump.fun API | Top Holders | `GET /v1/pumpfun/chains/{chain}/coins/{address}/top-holders` | 1 |
| Pump.fun API | Candles | `GET /v1/pumpfun/chains/{chain}/coins/{address}/candles` | 1 |
| Pump.fun API | PnL Leaderboard | `GET /v1/pumpfun/leaderboards/pnl` | 2 |
| Pump.fun API | Coin Boards | `GET /v1/pumpfun/coins/boards/{board}` | 1 per 75 results |
| Pump.fun API | User Profile | `GET /v1/pumpfun/users/{address}` | 1 |
| Pump.fun API | SOL Price | `GET /v1/pumpfun/sol-price` | 1 |
| Birdeye API | Trending Tokens | `GET /v1/birdeye/chains/{chain}/trending` | 1 |
| Birdeye API | New Listings | `GET /v1/birdeye/chains/{chain}/new-listings` | 1 |
| Birdeye API | Token Overview | `GET /v1/birdeye/chains/{chain}/tokens/{address}/overview` | 1 |
| Birdeye API | Token Security | `GET /v1/birdeye/chains/{chain}/tokens/{address}/security` | 1 |
| Birdeye API | Token Markets | `GET /v1/birdeye/chains/{chain}/tokens/{address}/markets` | 1 |
| Birdeye API | Token OHLCV | `GET /v1/birdeye/chains/{chain}/tokens/{address}/ohlcv` | 1 |
| Birdeye API | Token Trades | `GET /v1/birdeye/chains/{chain}/tokens/{address}/trades` | 1 |
| Birdeye API | Top Traders | `GET /v1/birdeye/chains/{chain}/tokens/{address}/top-traders` | 2 |
| Birdeye API | Solana Token Holders | `GET /v1/birdeye/solana/tokens/{address}/holders` | 2 |
| Birdeye API | Wallet PnL Summary | `GET /v1/birdeye/chains/{chain}/wallets/{wallet}/pnl-summary` | 2 |
| Zillow API | Search Homes | `GET /v1/zillow/search` | 3 |
| Zillow API | Property Details | `GET /v1/zillow/properties/{zpid}` | 2 |
| Zillow API | Property History | `GET /v1/zillow/properties/{zpid}/history` | 1 |
| Zillow API | Property Records | `GET /v1/zillow/properties/{zpid}/records` | 1 |
| Zillow API | Comparable Homes | `GET /v1/zillow/properties/{zpid}/comparables` | 1 |
| Zillow API | Location Suggestions | `GET /v1/zillow/locations` | 1 |
| LinkedIn API | Profile | `GET /v1/linkedin/profile` | 2 |
| LinkedIn API | Company Page | `GET /v1/linkedin/company` | 1 |
| LinkedIn API | Company Posts | `GET /v1/linkedin/company/posts` | 1 |
| LinkedIn API | Post or Article | `GET /v1/linkedin/post` | 1 |
| LinkedIn API | Video Transcript | `GET /v1/linkedin/post/transcript` | 1 |
| LinkedIn API | Jobs Search | `GET /v1/linkedin/jobs/search` | 1 |
| LinkedIn API | Job Posting | `GET /v1/linkedin/job` | 1 |
| imovelweb API | Search Listings | `GET /v1/imovelweb/listings` | 2 |
| imovelweb API | Map Markers | `GET /v1/imovelweb/listings/map` | 1 |
| imovelweb API | Listing Details | `GET /v1/imovelweb/listings/{posting_id}` | 2 |
| imovelweb API | Similar Listings | `GET /v1/imovelweb/listings/{posting_id}/similar` | 1 |
| imovelweb API | Duplicate Publishers | `GET /v1/imovelweb/listings/{posting_id}/publishers` | 1 |
| imovelweb API | Broker Profile | `GET /v1/imovelweb/publishers/{publisher_id}` | 2 |
| imovelweb API | Location IDs | `GET /v1/imovelweb/locations` | 1 |
| Expedia API | Search Hotels | `GET /v1/expedia/hotels` | 4 |
| Expedia API | Hotel Details | `GET /v1/expedia/hotels/{hotel_id}` | 2 |
| Expedia API | Rooms and Rates | `GET /v1/expedia/hotels/{hotel_id}/rooms` | 3 |
| Expedia API | Price Calendar | `GET /v1/expedia/hotels/{hotel_id}/calendar` | 2 |
| Expedia API | Guest Reviews | `GET /v1/expedia/hotels/{hotel_id}/reviews` | 2 |
| Expedia API | Things to Do | `GET /v1/expedia/activities` | 2 |
| Expedia API | Things to Do Nearby | `GET /v1/expedia/hotels/{hotel_id}/activities` | 2 |
| Expedia API | Activity Details | `GET /v1/expedia/activities/{activity_id}` | 2 |
| Expedia API | Location Suggestions | `GET /v1/expedia/locations` | 1 |
| Expedia API | Search Flights | `GET /v1/expedia/flights` | 10 |
| Expedia API | Next Leg | `GET /v1/expedia/flights/next-leg` | 10 |
| Expedia API | Fare Calendar | `GET /v1/expedia/flights/fare-calendar` | 2 |
| Expedia API | Airport Codes | `GET /v1/expedia/flights/airports` | 1 |
| Brave Search API | Web Search | `GET /v1/brave-search/search` | 5 |
| Brave Search API | News Search | `GET /v1/brave-search/news` | 5 |
| Brave Search API | Video Search | `GET /v1/brave-search/videos` | 5 |
| Brave Search API | Image Search | `GET /v1/brave-search/images` | 5 |
| Brave Search API | Similar Images | `GET /v1/brave-search/images/similar` | 5 |
| Brave Search API | Suggestions | `GET /v1/brave-search/suggestions` | 1 |
| Brave Search API | AI Answer | `GET /v1/brave-search/ai-answer` | 5 |
| Brave Search API | Place Search | `GET /v1/brave-search/places` | 8 |
| Brave Search API | Place Suggestions | `GET /v1/brave-search/places/suggestions` | 1 |
| Brave Search API | Place Details | `GET /v1/brave-search/places/{place_id}` | 5 |
| Brave Search API | Place Description | `GET /v1/brave-search/places/{place_id}/description` | 1 |
| Brave Search API | Directions | `GET /v1/brave-search/directions` | 1 |
| Brave Search API | Transit Directions | `GET /v1/brave-search/directions/transit` | 1 |
| Brave Search API | League Standings | `GET /v1/brave-search/sports/standings` | 1 |
| Brave Search API | League Games | `GET /v1/brave-search/sports/games` | 1 |
| Brave Search API | Team Games | `GET /v1/brave-search/sports/teams/{team_id}/games` | 1 |
| Brave Search API | Game Details | `GET /v1/brave-search/sports/fixtures/{fixture_id}` | 1 |
| Brave Search API | Popular Goggles | `GET /v1/brave-search/goggles` | 1 |
| Brave Search API | Goggle Search | `GET /v1/brave-search/goggles/search` | 1 |
| Brave Search API | Goggle Details | `GET /v1/brave-search/goggles/profile` | 1 |
| Indeed API | Job Search | `GET /v1/indeed/jobs/search` | 10 |
| Indeed API | Job Details | `GET /v1/indeed/jobs/{job_key}` | 2 |
| Indeed API | Company Search | `GET /v1/indeed/companies/search` | 2 |
| Indeed API | Company Directory | `GET /v1/indeed/companies/directory` | 2 |
| Indeed API | Company Profile | `GET /v1/indeed/companies/{company_key}` | 2 |
| Indeed API | Company Jobs | `GET /v1/indeed/companies/{company_key}/jobs` | 10 |
| Indeed API | Salaries | `GET /v1/indeed/salaries` | 2 |
| Indeed API | Job Title Suggestions | `GET /v1/indeed/suggestions/job-titles` | 2 |
| Indeed API | Location Suggestions | `GET /v1/indeed/suggestions/locations` | 2 |
| Indeed API | Popular Searches | `GET /v1/indeed/popular-searches` | 2 |
| Facebook API | Resolve URL | `GET /v1/facebook/resolve` | 3 |
| Facebook API | Page Lookup | `GET /v1/facebook/pages/lookup` | 3 |
| Facebook API | Page | `GET /v1/facebook/pages/{profile_id}` | 3 |
| Facebook API | Page Intro | `GET /v1/facebook/pages/{profile_id}/intro` | 3 |
| Facebook API | Page About | `GET /v1/facebook/pages/{profile_id}/about` | 5 |
| Facebook API | Page Posts | `GET /v1/facebook/pages/{profile_id}/posts` | 6 |
| Facebook API | Page Photos | `GET /v1/facebook/pages/{profile_id}/photos` | 3 |
| Facebook API | Page Videos | `GET /v1/facebook/pages/{page_id}/videos` | 3 |
| Facebook API | Page Events | `GET /v1/facebook/pages/{profile_id}/events` | 3 |
| Facebook API | Page Followers | `GET /v1/facebook/pages/{profile_id}/followers` | 3 |
| Facebook API | Page Following | `GET /v1/facebook/pages/{profile_id}/following` | 3 |
| Facebook API | Post | `GET /v1/facebook/posts/{story_id}` | 4 |
| Facebook API | Photo | `GET /v1/facebook/photos/{photo_id}` | 4 |
| Facebook API | Video | `GET /v1/facebook/videos/{video_id}` | 4 |
| Facebook API | Reel | `GET /v1/facebook/reels/{reel_id}` | 3 |
| Facebook API | Comments | `GET /v1/facebook/comments` | 3 |
| Facebook API | Comment Replies | `GET /v1/facebook/comments/{comment_id}/replies` | 3 |
| Facebook API | Video Search | `GET /v1/facebook/videos/search` | 6 |
| Facebook API | Live Videos | `GET /v1/facebook/videos/live` | 3 |
| Facebook API | Hashtag Posts | `GET /v1/facebook/hashtags/{hashtag}/posts` | 3 |
| Facebook API | Event Search | `GET /v1/facebook/events/search` | 3 |
| Facebook API | City Events | `GET /v1/facebook/events/cities/{city_id}` | 3 |
| Facebook API | Event | `GET /v1/facebook/events/{event_id}` | 3 |
| Facebook API | Event About | `GET /v1/facebook/events/{event_id}/about` | 3 |
| Facebook API | Group | `GET /v1/facebook/groups/{group_id}` | 3 |
| Facebook API | Group About | `GET /v1/facebook/groups/{group_id}/about` | 3 |
| Facebook API | Group Posts | `GET /v1/facebook/groups/{group_id}/posts` | 5 |
| Facebook API | Group Events | `GET /v1/facebook/groups/{group_id}/events` | 3 |
| Facebook API | Group Photos | `GET /v1/facebook/groups/{group_id}/photos` | 3 |
| Facebook Ad Library API | Ad Search | `GET /v1/facebook/ad-library/ads` | 3 |
| Facebook Ad Library API | Ad Details | `GET /v1/facebook/ad-library/ads/{ad_id}` | 3 |
| Facebook Ad Library API | Ad Transparency | `GET /v1/facebook/ad-library/ads/{ad_id}/transparency` | 3 |
| Facebook Ad Library API | Ad Versions | `GET /v1/facebook/ad-library/collations/{collation_id}` | 3 |
| Facebook Ad Library API | Advertiser Search | `GET /v1/facebook/ad-library/advertisers/search` | 3 |
| Facebook Ad Library API | Advertiser Profile | `GET /v1/facebook/ad-library/advertisers/{page_id}` | 3 |
| Facebook Ad Library API | Advertiser Audience | `GET /v1/facebook/ad-library/advertisers/{page_id}/audience` | 3 |
| Facebook Ad Library API | Ad Library Report | `GET /v1/facebook/ad-library/report` | 3 |
| Facebook Ad Library API | Report Advertisers | `GET /v1/facebook/ad-library/report/advertisers` | 3 |
| Facebook Marketplace API | Marketplace Search | `GET /v1/facebook/marketplace/listings` | 3 |
| Facebook Marketplace API | Marketplace Categories | `GET /v1/facebook/marketplace/categories` | 3 |
| Facebook Marketplace API | Category Listings | `GET /v1/facebook/marketplace/categories/{category}/listings` | 3 |
| Facebook Marketplace API | Listing Details | `GET /v1/facebook/marketplace/listings/{listing_id}` | 4 |
| Facebook Marketplace API | Listing Photos | `GET /v1/facebook/marketplace/listings/{listing_id}/photos` | 3 |
| Facebook Marketplace API | Marketplace Locations | `GET /v1/facebook/marketplace/locations` | 3 |
| Facebook Marketplace API | Marketplace Feed | `GET /v1/facebook/marketplace/feed` | 3 |
| Facebook Marketplace API | Rentals Map | `GET /v1/facebook/marketplace/rentals` | 3 |
| Google Maps API | Place Search | `GET /v1/google-maps/search` | 2 per 20 results |
| Google Maps API | Place Details | `GET /v1/google-maps/places/{feature_id}` | 2 |
| Google Maps API | Place by CID | `GET /v1/google-maps/places/cid/{cid}` | 2 |
| Google Maps API | Place ID Lookup | `GET /v1/google-maps/place-ids/{place_id}` | 2 |
| Google Maps API | Reviews | `GET /v1/google-maps/places/{feature_id}/reviews` | 2 |
| Google Maps API | Photos | `GET /v1/google-maps/places/{feature_id}/photos` | 1 |
| Google Maps API | Photo | `GET /v1/google-maps/photos/{photo_id}` | 1 |
| Google Maps API | Owner Posts | `GET /v1/google-maps/places/{feature_id}/posts` | 1 |
| Google Maps API | Directions | `GET /v1/google-maps/directions` | 2 |
| Google Maps API | Suggestions | `GET /v1/google-maps/suggestions` | 1 |
| Google Maps API | Contributor | `GET /v1/google-maps/contributors/{contributor_id}` | 4 |
| Google Maps API | Reverse Geocode | `GET /v1/google-maps/reverse-geocode` | 1 |
| Google Maps API | Popular Times | `GET /v1/google-maps/popular-times` | 7 |
| Google Maps API | Shared List | `GET /v1/google-maps/lists/{list_id}` | 1 |
| Google Maps API | Share Link | `GET /v1/google-maps/share-links/{code}` | 1 |
| Google Maps API | Street View Panorama | `GET /v1/google-maps/street-view/panoramas/{pano_id}` | 1 |
| Google Maps API | Nearby Panoramas | `GET /v1/google-maps/street-view/panoramas` | 1 |
| Google Maps API | Traffic | `GET /v1/google-maps/traffic` | 1 |
| Google Maps API | Weather | `GET /v1/google-maps/weather` | 1 |

Each request costs the listed credits. A price such as `2 per 20 results` is billed on the results the call returns, rounded up to a whole credit and never below the first number, and your balance has to cover the full page or batch you ask for. Free accounts allow 1 request per second; buying a credit pack raises that to 5 requests per second, the same as the Starter plan. Purchased credits never expire. Credits are charged when Tapline reaches the target and receives a valid response about the requested resource. This includes responses showing that the resource is private, restricted, unavailable, or does not exist. Requests that fail because Tapline is blocked by the target, times out, or encounters an internal error cost 0 credits.

## Request rules

- Before looping over more than a handful of items, multiply the endpoint's credit cost by the item count and tell the user the total before starting.
- YouTube path parameters take the 11-character video id, the UC... channel id or @handle, or the playlist id. Extract ids from URLs before calling.
- Transcript: `GET /v1/youtube/videos/{video_id}/subtitles?subtitle_format=txt`. The text is in the `transcript` field. Formats: txt, srt, vtt, json3, ttml (default srt). `language` defaults to en; call `/subtitles/tracks` first to see which languages exist.
- Pagination: video search, comments, comment replies, and channel videos return fixed-size pages with `pagination.next_cursor`. Pass it back as `cursor` with the same query and filters, and stop when it is null. They do not accept `limit`; only the playlist endpoint does (1 to 100). Never invent a cursor.
- Airbnb endpoints are POST with a JSON body, except location autocomplete. `room_id` is the number in the listing URL (airbnb.com/rooms/20669368).
- Live price needs `check_in` and `check_out` as YYYY-MM-DD, both in the future, with check-out after check-in. Compute the dates at run time. A stay that is not bookable returns 200 with `available: false`; try other dates rather than retrying the same ones.
- Availability needs `month` (1 to 12) and `year`.
- X profile takes `handle` or the numeric `user_id`, not both; user-tweets takes `handle`; post, community, and community/tweets take the x.com URL as `url`. They return a fixed window with no cursor: user-tweets is the pinned post plus about 5 newest posts.
- Pinterest endpoints live under `/v2/pinterest/`. Search, board, and user boards return `cursor`. Pass it back as `cursor` and stop when it is null. Pin and board take the Pinterest URL as `url`.
- GMGN endpoints use the chain slug in the path. Token endpoints take an on-chain contract address; wallet endpoints take a wallet address. Preserve opaque cursors exactly when paging holders, traders, or trades.
- Instagram profile, user posts, post count, and embed take `handle`; user reels and highlights take `handle` or `user_id`; post and comments take the post or reel URL as `url`. Send `pagination.next_cursor` back as `next_max_id` on user posts, `max_id` on user reels, and `cursor` on comments, popular search, and audio reels, while `pagination.has_more` is true.
- TikTok profile, profile videos, and followers take `handle` or `user_id`, not both; video, transcript, and comments take the video URL as `url`. Profile videos page with `max_cursor`, followers and following with `min_time`, and comments, hashtag search, and sound videos with `cursor`.
- Pump.fun coin routes take the coin address (mint) in the path and an optional `chain`; multichain candles, trades, fee events, and top holders live under `/v1/pumpfun/chains/{chain}/coins/{address}/`. User and wallet routes take the wallet address.
- Birdeye endpoints take the chain in the path (`/v1/birdeye/chains/{chain}/...`) plus a token or wallet address; holders, first buyers, portfolio, and net worth are Solana-only under `/v1/birdeye/solana/`. Page lists with `pagination.next_cursor`.
- Zillow search takes a free-text `location`, or an exact `region_id` with `region_type` from the locations endpoint. Search pages with `pagination.next_cursor`. Property, history, records, and comparables take an integer zpid in the path.
- LinkedIn endpoints take a LinkedIn URL in `url`: a `/in/` profile, a company, school, or showcase page, a post or Pulse article, a video post for transcripts, or a `/jobs/view/` job. Company posts page with `page` 1 to 7; jobs search takes filters and pages with `pagination.next_cursor`.
- imovelweb search and map take `location_id` values from `/v1/imovelweb/locations`; look the place up first. Search pages 30 listings with `pagination.next_cursor` up to page 1,000. Search listings carry `publisher.type` (`owner` is an owner selling directly) and `publisher.id`. Full agency phone numbers come from `/v1/imovelweb/publishers/{publisher_id}` (`phone_numbers`, as +55 numbers); owners have no publisher profile and answer 404, so their listing's `whatsapp` is the contact. Codes come decoded (`property_type`, amenities, `ad_tier`), and each record keeps fields the API does not decode under `raw`.
- Expedia hotel search takes a `region_id` from `/v1/expedia/locations`; look the place up first. Search and rooms need `check_in` and `check_out` as YYYY-MM-DD, today or later, up to 500 days ahead, for a stay of at most 28 nights. Compute the dates at run time. `adults` is 1 to 14 (default 2); repeat `children_ages` once per child, ages 0 to 17, up to 6 children. Hotel details, reviews, and rooms take the numeric hotel id in the path: `id` on a search result, or the number after `.h` in an Expedia hotel URL. Search pages 25 hotels and reviews 10 with `pagination.next_cursor`; send it back with the same parameters. Search cards carry coordinates but no star rating; `/v1/expedia/hotels/{hotel_id}` has it, plus the `region_id` that `/rooms` takes for `price_insight`. The calendar takes only the hotel id. Things to do (`/v1/expedia/activities` with `region_id`, `/v1/expedia/hotels/{hotel_id}/activities`) need `start_date` and `end_date` and page 20 with `pagination.next_cursor`; `/v1/expedia/activities/{activity_id}` takes the number after `.a` in an activity URL. An unknown hotel id answers a charged 404 on every hotel endpoint.
- Expedia flight search takes IATA airport or city codes from `/v1/expedia/flights/airports` as `origin` and `destination`, `departure_date` up to 330 days ahead, and `return_date` for a round trip. It returns up to 25 flights for the first leg; send a fare's `next_leg_token` to `/v1/expedia/flights/next-leg` soon after the search for the next leg; an expired token answers 400 `invalid_cursor`, not charged. `adults` is 1 to 9 (default 1); repeat `children_ages` once per child, ages 2 to 17; under-2s go in `infants_in_lap`, at most one per adult; 9 travelers at most. Repeat `airlines` once per two-letter code. `/v1/expedia/flights/multi-city` takes `legs` repeated as `ORIGIN-DESTINATION-YYYY-MM-DD`, 2 to 5 legs. Prices are USD; `price` is the rounded per-traveler trip price and a fare's `total_price` the exact total.
- Brave Search queries take `site:`, quotes, `-term`, and `OR`; `intitle:`, `inurl:`, `intext:`, `inanchor:`, their `allin` forms, and `site:linkedin.com/in` answer 422, so use `site:www.linkedin.com/in` for profiles. Brave Search web, news, and video search take `query` with optional `country`, `safe_search`, `freshness`, and `search_language`, and page with `pagination.next_cursor` (6 pages on web search, 2 on news and videos); send the cursor back with the same filters. A web search's `ai_answer.conversation_id` goes to `/v1/brave-search/ai-answer`, and an image result's `similar_images_token` to `/v1/brave-search/images/similar`; the conversation id lasts at least 90 minutes and the token at least 2 hours. Place search and place suggestions take `query`, `latitude`, and `longitude`; `places[].id` opens `/v1/brave-search/places/{place_id}`. Directions take `origin` and `destination` as `latitude,longitude`; repeat `via` once per stop. Sports routes take `sport`, `league_id` (`39` Premier League, `12` NBA, `1` MLB, `57` NHL, `nfl` NFL), and `season` as the start year (`2026-2027` for basketball). Pass a Goggle's `url` from `/v1/brave-search/goggles` as `goggle_url` to re-rank web search.
- Indeed endpoints take `country` as an Indeed site's ISO code (`us` by default, `gb` for the UK); `language` must be one that site offers, or it answers 422. Job search takes `query` with optional `location` (`Houston, TX`), `radius`, and filters, returns up to 25 jobs (`limit` 1 to 25), and pages with `pagination.next_cursor`; send the cursor with the same search and `limit`, since a changed `limit` answers 400 `invalid_cursor`. Repeat `job_type`, `work_setting`, or `experience_level` for jobs matching any value, and `attribute` or `occupation` (five-character codes from a job's `attributes` and `occupations`) for jobs carrying every code; `exclude_job_type`, `exclude_attribute`, and `exclude_company` leave jobs out, and a value both kept and excluded answers 422. `posted_within_days` is 1, 3, 7, or 14. A result's `job.key` opens `/v1/indeed/jobs/{job_key}`; pass the `country` you searched, because Indeed sends a job's pay only on its own site. `job.company.key` or `/v1/indeed/companies/search` supplies the `company_key` that `/v1/indeed/companies/{company_key}` and its `/jobs` take. `/v1/indeed/salaries` takes `location` as Indeed's path (`US`, `US/TX`, `US/TX/Houston`); `/v1/indeed/suggestions/locations` returns it as `salary_location` for US cities. An unknown job key, or an unknown company key on the profile, answers a charged 404.
- Facebook endpoints take numeric ids or base64 tokens, not URLs. Send a facebook.com URL to `/v1/facebook/resolve` first: its `ids` give the `profile_id` for `/v1/facebook/pages/{profile_id}`, the `story_id` for `/v1/facebook/posts/{story_id}`, the `group_id`, `event_id`, `video_id`, `reel_id`, or `photo_id`, the `listing_id` for Facebook Marketplace, and the `collection_id` of a page tab URL such as `facebook.com/NASA/following`. Page videos take the page's `page_id` from `/v1/facebook/pages/{profile_id}`, not its `profile_id`. Page About and following need a `collection_id` from `tabs[].collections` of the page. Comments take the `feedback_id` of a post, photo, video, or reel; replies take a comment's `id` in the path and its `replies_cursor` as `cursor`. Event search takes `date` or `start_date` with `end_date`, not both, and a mix answers 422; city events take a `city_id` from `/v1/facebook/marketplace/locations`. Lists page with `pagination.next_cursor`; send it back as `cursor` with the same inputs, because a cursor from other inputs answers 400 `invalid_cursor`. The clients call this API `facebook`, and the CLI `tapline facebook`.
- Facebook Ad Library ad search (`/v1/facebook/ad-library/ads`) takes `query` or an advertiser's `page_id`, not both; both or neither answers 422. `/v1/facebook/ad-library/advertisers/search` supplies the `page_id` that the advertiser, audience, and transparency routes take. An ad's `ad_archive_id` is the `ad_id` for `/v1/facebook/ad-library/ads/{ad_id}`, and its `collation.id` opens `/v1/facebook/ad-library/collations/{collation_id}`. `country` is an upper-case ISO 3166-1 alpha-2 code, or `ALL` on every route except the report, which needs one country. The report takes a `date` two days ago or earlier, and the newest published day without one; it can answer 503 with `Retry-After` while Facebook builds it, so retry after that many seconds. Lists page with `pagination.next_cursor`; send it back as `cursor` with the same inputs. The clients call this API `facebook_ad_library` in Python and `facebookAdLibrary` in TypeScript, and the CLI `tapline facebook-ad-library`.
- Facebook Marketplace search, category listings, the feed, and rentals take `latitude` and `longitude`: look the place up with `/v1/facebook/marketplace/locations` first. Category listings take a category `slug` from `/v1/facebook/marketplace/categories`. A listing's `id` opens `/v1/facebook/marketplace/listings/{listing_id}` and its `/photos`. Lists page with `pagination.next_cursor`; send it back as `cursor` with the same inputs. The clients call this API `facebook_marketplace` in Python and `facebookMarketplace` in TypeScript, and the CLI `tapline facebook-marketplace`.
- Google Maps place details, reviews, photos, and owner posts take a `feature_id` (`0x…:0x…`) from search results or suggestions. `/v1/google-maps/places/cid/{cid}` takes the decimal `?cid=` number from a Maps link, and `/v1/google-maps/place-ids/{place_id}` turns a `ChIJ…` place id into the `feature_id` and `cid`; address and coordinate ids (`Ei…`, `GhIJ…`) answer 404. Popular times takes a place's `kgmid` (`/m/…` or `/g/…`) as a query parameter. Search takes `query` with optional `latitude` and `longitude`, sent together, `zoom` (3 to 21, only with a point), `open_now`, `min_rating` (2.0 to 4.5 in steps of 0.5), and `limit` up to 100; Google reranks between calls, so later pages leave out places earlier pages returned. Reviews take `sort` (`most_relevant`, `newest`, `highest_rating`, `lowest_rating`) and `limit` up to 60; photos take `category` and return up to 10 per page. Search, reviews, and photos page with `pagination.next_cursor`; send it back as `cursor` with the same inputs, because a cursor from another search, place, sort, or photo tab answers 400 `invalid_cursor`. Directions take `origin` and `destination` as a place name, an address, or `lat,lng`. Traffic takes a box (`south`, `west`, `north`, `east`) at most 1 degree a side; `west` above `east` crosses 180°. Every endpoint except place id lookups and share links takes `hl` (language, `en` by default) and `gl` (region, `us` by default). An unknown id answers a charged 404; reviews and owner posts answer an unknown place with an empty page, also charged. The clients call this API `google_maps` in Python and `googleMaps` in TypeScript, and the CLI `tapline google-maps`.
- GoPlus token security takes the chain in the path: `/v1/goplus/evm/{chain_id}/tokens/{address}/security` with a numeric EVM chain id, `/v1/goplus/solana/tokens/{mint}/security`, or `/v1/goplus/tron/tokens/{address}/security`. The GoPlus envelope comes back unchanged: `code` 1 is complete data, 2 partial, and `result` is keyed by the token address.
- Pons endpoints take a token or wallet contract address in the path. v2 launches (bonding curve) live under `/v1/ponsfamily/v2-markets/`, v1 tokens under `/v1/ponsfamily/markets/`.
- GeckoTerminal endpoints distinguish network slugs, on-chain addresses, and numeric GeckoTerminal ids. Read the parameter name before choosing an identifier. Search is the easiest first request when an id is not known.

## Verify

Run one real, authenticated request from the user's shell or project.

YouTube transcript:

```bash
curl -sS -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v1/youtube/videos/dQw4w9WgXcQ/subtitles?subtitle_format=txt"
```

Python client:

```bash
python -c 'from tapline import SyncTaplineClient; print(SyncTaplineClient().youtube.subtitles("dQw4w9WgXcQ", subtitle_format="txt").transcript[:200])'
```

Airbnb listing details:

```bash
curl -sS -X POST "https://api.tapline.sh/v1/airbnb/details" \
  -H "X-API-Key: $TAPLINE_API_KEY" -H "Content-Type: application/json" \
  -d '{"room_id":"20669368"}'
```

X profile:

```bash
curl -sS -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v1/twitter/profile?handle=shivanipod"
```

Instagram profile:

```bash
curl -sS -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v1/instagram/profile?handle=nike"
```

Pinterest search:

```bash
curl -sS -G -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v2/pinterest/search" --data-urlencode "query=Italian Pot Roast"
```

GMGN token security:

```bash
curl -sS -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v1/gmgn/sol/token/DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263/security"
```

GeckoTerminal search:

```bash
curl -sS -H "X-API-Key: $TAPLINE_API_KEY" \
  "https://api.tapline.sh/v1/gecko-terminal/search?query=bonk"
```

Report the HTTP status and one useful field from the response, such as the first line of `transcript`, the listing `title`, the X `handle`, the first Pinterest pin `title`, the Instagram `profile.handle`, a GMGN security flag, or a GeckoTerminal search result.

Only an authenticated 200 counts as done. Copied code, the docs "Test request" panel, demo routes, and the dashboard are not proof.

## Errors

Error bodies contain `code`, `message`, and `request_id`. Keep the request_id when writing to hello@tapline.sh.

- 401 unauthenticated: TAPLINE_API_KEY is missing, wrong, or revoked. Go back to "Get an API key".
- 402: not enough credits. The user tops up at https://tapline.sh/dashboard?tab=billing with a one-time credit pack, no subscription needed, or moves to a plan at https://tapline.sh/pricing. Say which one fits what they were doing.
- 403: access denied. If the response includes upgrade_url, offer that link to buy credits; otherwise check resource permissions.
- 404: the requested video, listing, token, pool, wallet, or other resource was not found. Check the identifier and run Verify again.
- 422: validation failed. Read `details`. Usual causes: a malformed id, past or reversed dates, or an unknown enum value. Fix the input and run Verify again.
- 429: per-minute rate limit. Back off and honor Retry-After, never in a tight loop.
- 502 or 503: the upstream site is unavailable or blocking. Retry after a delay and keep the request_id.

## References

- YouTube API reference: https://tapline.sh/docs/youtube
- Airbnb API reference: https://tapline.sh/docs/airbnb
- GMGN API reference: https://tapline.sh/docs/gmgn
- GeckoTerminal API reference: https://tapline.sh/docs/geckoterminal
- X (Twitter) API reference: https://tapline.sh/docs/twitter
- Pinterest API reference: https://tapline.sh/docs/pinterest
- Instagram API reference: https://tapline.sh/docs/instagram
- TikTok API reference: https://tapline.sh/docs/tiktok
- Pump.fun API reference: https://tapline.sh/docs/pumpfun
- Birdeye API reference: https://tapline.sh/docs/birdeye
- Zillow API reference: https://tapline.sh/docs/zillow
- LinkedIn API reference: https://tapline.sh/docs/linkedin
- imovelweb API reference: https://tapline.sh/docs/imovelweb
- Expedia API reference: https://tapline.sh/docs/expedia
- Brave Search API reference: https://tapline.sh/docs/brave-search
- Indeed API reference: https://tapline.sh/docs/indeed
- Facebook API reference: https://tapline.sh/docs/facebook
- Facebook Ad Library API reference: https://tapline.sh/docs/facebook-ad-library
- Facebook Marketplace API reference: https://tapline.sh/docs/facebook-marketplace
- Google Maps API reference: https://tapline.sh/docs/google-maps
- GoPlus API reference: https://tapline.sh/docs/goplus
- Pons API reference: https://tapline.sh/docs/ponsfamily
- OpenAPI: https://tapline.sh/openapi.youtube.json, https://tapline.sh/openapi.airbnb.json, https://tapline.sh/openapi.twitter.json, https://tapline.sh/openapi.pinterest-v2.json, https://tapline.sh/openapi.instagram.json, https://tapline.sh/openapi.tiktok.json, https://tapline.sh/openapi.gmgn.json, https://tapline.sh/openapi.geckoterminal.json, https://tapline.sh/openapi.goplus.json, https://tapline.sh/openapi.ponsfamily.json, https://tapline.sh/openapi.pumpfun.json, https://tapline.sh/openapi.birdeye.json, https://tapline.sh/openapi.zillow.json, https://tapline.sh/openapi.linkedin.json, https://tapline.sh/openapi.imovelweb.json, https://tapline.sh/openapi.expedia.json, https://tapline.sh/openapi.brave_search.json, https://tapline.sh/openapi.indeed.json, https://tapline.sh/openapi.facebook.json, https://tapline.sh/openapi.facebook_ad_library.json, https://tapline.sh/openapi.facebook_marketplace.json, and https://tapline.sh/openapi.google_maps.json
- Python client: https://github.com/TaplineData/tapline-python and https://pypi.org/project/tapline/
- TypeScript client: https://github.com/TaplineData/tapline-typescript and https://www.npmjs.com/package/@tapline/client
- Site index for agents: https://tapline.sh/llms.txt
