# SearchAPI — Orthogonal API > Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance. > Base API: `https://api.orthogonal.com/v1/run` · [llms.txt](https://orthogonal.com/llms.txt) · [browse all APIs](https://orthogonal.com/discover) Real-time SERP scraping API - Search YouTube, Google, Amazon, TikTok, Instagram, and 100+ other platforms **Verified:** no ## Access **Run API:** `POST https://api.orthogonal.com/v1/run` **Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY` Get an API key at https://orthogonal.com/dashboard/settings/api-keys Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "", "data": { ... } }`. ## Endpoints ### YouTube Channel Get YouTube channel info `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `channel_id` | string | Yes | YouTube channel ID | | `gl` | string | No | Country code | | `hl` | string | No | Language code | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","channel_id":"","gl":"","hl":""}}' ``` ### Reddit Ad Library Search Reddit ads library `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `industry` | string | No | Industry filter | | `objective_type` | string | No | Campaign objective | | `budget_category` | string | No | Budget category | | `placements` | string | No | Ad placements | | `post_type` | string | No | Post type filter | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","industry":"","objective_type":"","budget_category":"","placements":"","post_type":""}}' ``` ### Meta Ad Library Search Meta/Facebook ads library Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | No | Search query | | `page_id` | string | No | Facebook page ID | | `location_id` | string | No | Location ID | | `country` | string | No | Country code | | `content_languages` | string | No | Content language filter | | `active_status` | string | No | Active status filter | | `ad_type` | string | No | Ad type filter | | `media_type` | string | No | Media type filter | | `platforms` | string | No | Platform filter (facebook, instagram) | | `sort_by` | string | No | Sort order | | `start_date` | string | No | Start date filter | | `end_date` | string | No | End date filter | | `next_page_token` | string | No | Pagination token For continuation billing, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","page_id":"","location_id":"","country":"","content_languages":"","active_status":"","ad_type":"","media_type":"","platforms":"","sort_by":"","start_date":"","end_date":"","next_page_token":""}}' ``` ### YouTube Transcripts Get video transcript/captions `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `video_id` | string | Yes | YouTube video ID | | `lang` | string | No | Transcript language code | | `transcript_type` | string | No | Type of transcript | | `transcript_name` | string | No | Name of specific transcript | | `only_available` | boolean | No | Only return available transcripts | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","video_id":"","lang":"","transcript_type":"","transcript_name":"","only_available":""}}' ``` ### YouTube Video Details Get detailed info about a YouTube video `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `video_id` | string | Yes | YouTube video ID | | `gl` | string | No | Country code | | `hl` | string | No | Language code | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","video_id":"","gl":"","hl":""}}' ``` ### YouTube Channel Videos Get videos from a YouTube channel `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `channel_id` | string | Yes | YouTube channel ID | | `gl` | string | No | Country code | | `hl` | string | No | Language code | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","channel_id":"","gl":"","hl":""}}' ``` ### Airbnb Search Search Airbnb listings `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Location query | | `airbnb_domain` | string | No | Airbnb domain | | `currency` | string | No | Currency code (e.g. USD, EUR) | | `check_in_date` | string | No | Check-in date (YYYY-MM-DD) | | `check_out_date` | string | No | Check-out date (YYYY-MM-DD) | | `time_period` | string | No | Flexible time period | | `adults` | integer | No | Number of adults | | `children` | integer | No | Number of children | | `infants` | integer | No | Number of infants | | `pets` | integer | No | Number of pets | | `price_min` | number | No | Minimum price | | `price_max` | number | No | Maximum price | | `bedrooms` | integer | No | Number of bedrooms | | `beds` | integer | No | Number of beds | | `bathrooms` | integer | No | Number of bathrooms | | `property_types` | string | No | Property type filter | | `type_of_place` | string | No | Entire place/private room/shared | | `amenities` | string | No | Amenities filter | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","airbnb_domain":"","currency":"","check_in_date":"","check_out_date":"","time_period":"","adults":"","children":"","infants":"","pets":"","price_min":"","price_max":"","bedrooms":"","beds":"","bathrooms":"","property_types":"","type_of_place":"","amenities":""}}' ``` ### TikTok Profile Get TikTok user profile info `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `username` | string | Yes | TikTok username | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","username":""}}' ``` ### Instagram Profile Get Instagram profile info `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `username` | string | Yes | Instagram username | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","username":""}}' ``` ### TikTok Ads Library Search TikTok ads library Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | No | Search query | | `advertiser_id` | string | No | Advertiser ID | | `country` | string | No | Country code | | `time_period` | string | No | Time period filter | | `sort_by` | string | No | Sort order | | `next_page_token` | string | No | Pagination token For continuation billing, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","advertiser_id":"","country":"","time_period":"","sort_by":"","next_page_token":""}}' ``` ### YouTube Search Search YouTube videos by query `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `sp` | string | No | Search filter parameter | | `gl` | string | No | Country code (e.g. us, uk, de) | | `hl` | string | No | Language code (e.g. en, de, fr) | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","sp":"","gl":"","hl":""}}' ``` ### TripAdvisor Search Search TripAdvisor listings Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `tripadvisor_domain` | string | No | TripAdvisor domain | | `category` | string | No | Category filter (all, hotels, restaurants, attractions) | | `location` | string | No | Location filter | | `lat` | number | No | Latitude for geo search | | `lon` | number | No | Longitude for geo search | | `page` | integer | No | Page number For later pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | | `num` | integer | No | Number of results | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","tripadvisor_domain":"","category":"","location":"","lat":"","lon":"","page":"","num":""}}' ``` ### YouTube Comments Get comments on a YouTube video Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `video_id` | string | Yes | YouTube video ID | | `gl` | string | No | Country code | | `hl` | string | No | Language code | | `next_page_token` | string | No | Pagination token For continuation billing, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","video_id":"","gl":"","hl":"","next_page_token":""}}' ``` ### Amazon Search Search Amazon products Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `amazon_domain` | string | No | Amazon domain (e.g. amazon.com, amazon.co.uk) | | `language` | string | No | Language code | | `delivery_country` | string | No | Delivery country code | | `page` | integer | No | Page number For later pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | | `sort_by` | string | No | Sort order | | `price_min` | number | No | Minimum price filter | | `price_max` | number | No | Maximum price filter | | `rh` | string | No | Refinement filters | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","amazon_domain":"","language":"","delivery_country":"","page":"","sort_by":"","price_min":"","price_max":"","rh":""}}' ``` ### eBay Search Search eBay listings Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `ebay_domain` | string | No | eBay domain (e.g. ebay.com) | | `country` | string | No | Country code | | `delivery_country` | string | No | Delivery country | | `page` | integer | No | Page number For later pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | | `num` | integer | No | Number of results | | `layout` | string | No | Results layout | | `sort_by` | string | No | Sort order | | `price_min` | number | No | Minimum price | | `price_max` | number | No | Maximum price | | `condition` | string | No | Item condition filter | | `buying_format` | string | No | Buying format filter | | `category_id` | string | No | Category ID | | `postal_code` | string | No | Postal code for local | | `distance_radius` | integer | No | Distance radius in miles | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","ebay_domain":"","country":"","delivery_country":"","page":"","num":"","layout":"","sort_by":"","price_min":"","price_max":"","condition":"","buying_format":"","category_id":"","postal_code":"","distance_radius":""}}' ``` ### Apple App Store Search Search Apple App Store apps Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `term` | string | Yes | Search term | | `country` | string | No | Country code (e.g. us, gb) | | `lang` | string | No | Language code | | `page` | integer | No | Page number For later pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | | `num` | integer | No | Number of results | | `device` | string | No | Device filter (iphone, ipad) | | `property` | string | No | Property filter | | `include_explicit` | boolean | No | Include explicit content | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","term":"","country":"","lang":"","page":"","num":"","device":"","property":"","include_explicit":""}}' ``` ### Walmart Search Search Walmart products Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | Yes | Search query | | `page` | integer | No | Page number For later pages of the same logical search, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | | `sort_by` | string | No | Sort order | | `price_min` | number | No | Minimum price | | `price_max` | number | No | Maximum price | | `category_id` | string | No | Category ID | | `store_id` | string | No | Store ID for local inventory | | `filters` | string | No | Additional filters | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","page":"","sort_by":"","price_min":"","price_max":"","category_id":"","store_id":"","filters":""}}' ``` ### LinkedIn Ad Library Search LinkedIn ads library Pagination billing: call the first page normally and save billing.requestId from the Orthogonal /v1/run response. For later page, offset, or cursor calls on the same logical search, pass parentRequestId with unchanged non-pagination parameters. Valid continuation calls still get their own request IDs and quoted price, but are charged 0. Changing filters starts a new billable request. `GET /api/v1/search` **Estimated cost:** $0.01 | Field | Type | Required | Description | |-------|------|----------|-------------| | `engine` | string | Yes | | | `q` | string | No | Search query | | `advertiser` | string | No | Advertiser name | | `country` | string | No | Country code | | `time_period` | string | No | Time period filter | | `next_page_token` | string | No | Pagination token For continuation billing, keep non-pagination parameters unchanged and pass top-level parentRequestId from the first Orthogonal /v1/run response. | ```bash curl -X POST 'https://api.orthogonal.com/v1/run' \ -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \ -H 'Content-Type: application/json' \ -d '{"api":"searchapi","path":"/api/v1/search","method":"GET","query":{"engine":"","q":"","advertiser":"","country":"","time_period":"","next_page_token":""}}' ``` --- Full details and an interactive quickstart: https://orthogonal.com/discover/searchapi