Skip to main content

Overview

CreatorDB supports searching YouTube, Instagram, and TikTok content. Search for specific videos, shorts, streams, reels, and image posts across every creator in the CreatorDB database. Each result carries the content’s own metadata and engagement metrics, plus a short summary about the content creator. This is the inverse of creator search.
  • Creator search: Answers “which creators match my criteria?” and returns a list of creators.
  • Content search: Answers “which posts match my criteria?” and returns a list of posts.
Use content search when the thing you are looking for is a post: a video sponsored by a competitor’s brand, a reel using a hashtag you are tracking, or the top-performing shorts in a category this week. To find creators instead, see Configuring Custom Search Filters and Examples. To pull a known creator’s recent posts, use that platform’s content-detail endpoint.

Before you start

  • Get an API key. For details, see Authentication.
  • Read Credit cost. The price of each call depends on the time window you search, whether you search caption or description text, and whether you limit results to larger creators. You can work out the price before you send the request.
  • Decide which platform you are searching. Cross-platform content search is not supported. Each platform has its own endpoint and its own filter allowlist.

How content search works

Send a POST request to the content-search endpoint for the platform you want:
Every request requires a filters array, a pageSize, and an offset. By default, results are sorted by publishTime in descending order (newest first). Set sortBy to change the order. Content search covers the recent posts that CreatorDB stores for each creator, not every post a creator has ever published. A request with no time window searches content published in the last 30 days. For details, see Searching a time window.

Request parameters

These parameters are the same on YouTube, Instagram, and TikTok.
Request parameter limits
  • Filter count: At least 1 and at most 10 filter objects per request.
  • Array value limit: When using the in operator, the array must contain at least 1 and at most 100 string values.
  • Page size: The upper limit for pageSize is 100.
  • Fuzzy search: isFuzzySearch: true is only available on the free-text filters listed above.
  • Fuzzy in: With isFuzzySearch: true, the in operator takes at most 10 values.
  • publishTime: At most 36500 days.

Searching a time window

Every content search covers a publish-time window. The window decides which content can match, and its length is one of the inputs to the price. If you don’t set one, the search covers the last 30 days. You set it in two ways, and you can combine them.
  • timeRange takes absolute times: { "from": 1788220800000, "to": 1790812800000 }. Both values are Unix timestamps in milliseconds. from is inclusive and to is exclusive, so the range is [from, to). If you leave out to, the range ends at the time of the request.
  • The publishTime filter takes a number of days before the time of the request. { "filterName": "publishTime", "op": "<", "value": 30 } means the last 30 days.

The effective window

The window CreatorDB searches, and prices, is the overlap of timeRange and every publishTime filter in the request. This is the effective window. A request with only publishTime filters has an effective window too. If the effective window is empty, for example because timeRange and publishTime don’t overlap, the request returns 400 VALIDATION_ERROR. It isn’t billed. For details, see Common errors.

The applied window in the response

Every response returns the window that was searched in data.timeRange, with to filled in and any publishTime filter applied. Use it to confirm what you searched and paid for.
  • isDefault is true when the request set neither timeRange nor a publishTime filter, so the search used the 30-day default.
  • from is null when the window has no start, for example a request with only publishTime > 30.
To get the 7-day price for “the last 7 days”, use publishTime < 7, or send both from and to. If you compute from as “now minus 7 days” in your code and leave out to, the window is measured up to the moment the request arrives, which is slightly longer than 7 days, so it’s priced in the 30-day tier.

Two kinds of filters

Every content-search allowlist is split into two groups, and you can combine them freely in a single request.
  • Content-level filters apply to the post itself: how many views it got, when it was published, which hashtags it uses, whether it is sponsored.
  • Creator-level filters apply to the account that published it: follower count, country, niche, audience demographics.
Combining the two is what makes the endpoint useful. “Reels with over 5,000 likes” is a content-level query. Adding “posted by US creators with a majority-female audience aged 18-24” layers creator-level filters onto the same call.

Matching text

isFuzzySearch: true is accepted only on the free-text filters: description, hashtag, creatorDisplayName, creatorBio, and on YouTube title. On any other filter, the request returns 400 VALIDATION_ERROR. To find content that mentions any of several phrases, use in with isFuzzySearch: true. For example, this filter matches captions that mention either brand:
A fuzzy in takes at most 10 values. These filters ignore letter case on every platform: title, hashtag, partneredBrands, creatorDisplayName, creatorBio, and creatorCategory. description ignores case and spaces.

Searching one creator’s content

To search within a single creator’s content, add the creator ID filter: The filter accepts = for one creator or in for several. Combine it with any other filter, for example to find every sponsored post by one creator over the past year. It doesn’t change the price.

Filter behavior to know before you start

Several filters behave differently from what their names suggest. Open any that apply before building a query.
The publishTime filter accepts a number of days ago, not a Unix timestamp. To find content from the last 30 days, use { "filterName": "publishTime", "op": "<", "value": 30 }. For absolute dates, use timeRange.The publishTime field in the response is a Unix timestamp in milliseconds. The filter and the response field use different units.
The description filter searches the post text, and the text it searches differs per platform.Matching ignores letter case and spaces, so "Promo Code" and "promocode" match the same text.
  • With isFuzzySearch: true, the value matches anywhere in the text. This is what you want for keyword searches.
  • Without isFuzzySearch, the value must match the whole text, so an exact description match rarely returns anything.
Despite its name, the audienceAvgAge filter takes the creator’s primary audience age range as a string, such as "18-24". It does not take an average age.The /{platform}/audience endpoint returns a field with the same name, audienceAvgAge, as an integer average age, such as 30. Don’t pass that integer to this filter.
The followers filter compares against a snapshot of each creator’s follower count that CreatorDB refreshes once a day. The follower count returned in each result (creator.totalSubscribers on YouTube, creator.totalFollowers on Instagram and TikTok) is read from the creator’s current record, so it can differ slightly from the value the filter used. A creator just above your followers threshold can show a count just below it, and the other way around.
performanceViews, performanceLikes, performanceDiggs, and performanceEngagement are ratios against that creator’s own average, not against the platform, the category, or any other creator.A value of 1.5 means the content performed 50% above the average for the account that posted it. Filtering on performanceEngagement > 1.2 finds posts that outperformed their own channel, which surfaces breakout content from small accounts as readily as from large ones.
Brand IDs are typically the brand’s primary domain. Filter for Acer with "value": "acer.com", not "Acer". The same IDs are returned in the partneredBrands response field.
The postType filter accepts different values on YouTube and Instagram, and TikTok has no postType filter at all because it returns only videos. Any other value returns 400 VALIDATION_ERROR.On Instagram, both single-image posts and multi-image carousels are returned as slideshow. The response doesn’t distinguish between them. Passing postType: video on Instagram only matches some videos, since many videos are stored as slideshow.On YouTube and Instagram, postType also affects the price.

Credit cost

Content search is priced per call. The price comes from your request alone, not from how many results come back, so you can work it out before you send the request. Every call costs at least 1 credit.

What sets the price

Prices by platform

Credits per call for POST /youtube/content-search.

Working out a price

Take this YouTube request:
  1. Time window: timeRange covers September 1 to October 1, 2026, which is exactly 30 days, so it’s in the 30 days or less tier.
  2. description filter: Present.
  3. Creator floor: followers > 100000, so 100K+.
  4. Content type: No postType, so Any type.
The price is 6 credits. The same search without the followers filter costs 17 credits. Limited to Shorts with postType: "shorts", it costs 2. Without timeRange, it searches the last 30 days, which is in the same tier, so the price stays 6.

How to lower the cost

  • Search a shorter window. Shorter windows cost less. A request with no window searches the last 30 days. A 7-day window costs less, and a window longer than 30 days, or one with no start, costs more.
  • Add a 100K+ creator floor. If you only care about larger creators, add { "filterName": "followers", "op": ">", "value": 100000 }. On windows longer than 30 days, this often cuts the price by half or more.
  • Pick one content type. On YouTube and Instagram, searching only Shorts, long videos, reels, or posts costs less than searching every type.
  • Search text only when you need it. A description filter usually costs several times more than the same request without it. On YouTube, if the word you’re looking for is likely in the video title, use the title filter instead. title doesn’t add to the price.

Empty results and pagination

  • A search that matches nothing is still billed. The price is for running the search, not for the results, so an empty contentList costs the same as a full one.
  • Every page is billed. Each call with a new offset is a new search and bills the full price again. Paging through 10 pages of a 6-credit search costs 60 credits.
  • Failed requests aren’t billed. A request rejected with 400 VALIDATION_ERROR, including an empty effective window, uses no credits.
For pricing across all endpoints, see API Credit Usage.

What you get back

All three platforms return the same envelope: a contentList array, plus pagination fields.
totalResults is an estimate. It can count content that can no longer be loaded, for example because the post was removed. Each page returns pageSize items when that many matches remain, and nextOffset can be more than offset plus pageSize because it skips over content that couldn’t be loaded. Always page with the returned nextOffset instead of calculating the next offset yourself.
CreatorDB excludes content published in the last 4 days from aggregated performance metrics, but that exclusion does not apply to content search. Recently published content does appear in your results. Each item in contentList includes a creator object. This is a lightweight summary that includes the handle or channel ID, display name, avatar, and follower count. For full creator details, call the /{platform}/profile endpoint with the ID returned here.

Filter names and response field names

Some filters use a different name from the response field that holds the same data.

Content search by platform

Method: POST
Endpoint: https://apiv3.creatordb.app/youtube/content-search

Content-level filters

Creator-level filters

YouTube engagement rate is calculated as (likes + comments) / views, and the response rounds engagementRate to four decimal places.
Find high-performing sponsored long videos from the last 30 days, posted by channels with over 100,000 subscribers. Long videos, 30 days or less, no description, 100K+: 1 credit.
Find every video that mentions “promo code” in its description during September 2026, from channels with over 100,000 subscribers. Any type, 30 days or less, with description, 100K+: 6 credits.
Find every video sponsored by a specific brand in the last 90 days. Any type, 90 days or less, no description, all creators: 5 credits.
Find trending shorts carrying a hashtag this week, from creators reaching a specific audience. Shorts, 7 days or less, no description, all creators: 1 credit.

Paginating results

Send offset: 0 on your first call. If the response has hasNextPage: true, send the returned nextOffset as the offset of your next request, keeping every other parameter the same. For example, the second request for a query that returns 100 results per page:
Every page is a new search and bills the full price again. On YouTube, paging through 10 pages of this 3-credit query costs 30 credits. Use the largest pageSize you can (up to 100) so that you make as few calls as possible. Check totalResults on your first call to see how deep the result set goes before you commit to paging through it, but keep in mind that totalResults can count items that contentList doesn’t return.If you page with timeRange, keep sending the same from and to. Leaving out to lets the window grow with each call, which can move a request into the next price tier.

Common errors

Invalid requests return 400 VALIDATION_ERROR and aren’t billed. The details array names each field that failed and why.
For all error codes and the response envelope, see Error Codes.

Platform differences at a glance

Troubleshooting

For error codes and the response envelope, see Error Codes. Besides the common errors above, the most common content-search mistakes are:
  • Paying more than expected. Check the four price inputs in Credit cost. A window longer than 30 days, or one with no start such as publishTime > 30 on its own, is priced in a higher tier.
  • Missing older content. A request with no timeRange and no publishTime filter only searches the last 30 days. Check data.timeRange.isDefault, and set timeRange to search further back.
  • Getting no results from a description search. Set isFuzzySearch to true. Without it, the value must match the whole caption or description. To match any of several phrases, use in with isFuzzySearch: true.
  • Passing an average age to audienceAvgAge. The filter takes an age-range string, such as 18-24.
  • Sorting on a field that is not sortable. Check the Sortable column in the tables above.
  • Using a brand name in partneredBrands. Use the brand ID, typically a domain such as acer.com.
  • Sending an empty filters array or an empty in array. Include at least one filter, and at least one value in every in array.
  • Sending more than 10 filters or an in array longer than 100 values. For the limits, see Request parameters.
  • Filtering on isSponsored for TikTok. TikTok sponsored-content detection is not built.
Last modified on November 2, 2026