Rates
The current rates are on the pricing page, and in the price list, which needs no key:platform (the scraper type), price_per_1000 and
price_per_item, in USD as decimal strings, plus minimum_charge_enabled and minimum_charge_usd
(minimum charge).
instagram_posts and instagram_profile bill at the instagram rate; facebook_posts and facebook_profile at the
facebook rate.
A crawl limited to posts from the last 29 days is billed at its own rate. The dashboard shows that rate before you
start the job, and every job keeps the rate it was billed at. The price list shows the rate for a full crawl, and
POST /api/v1/pricing/calculate_cost/ estimates at that rate:
price_per_1000_at_creation, and is_initial_crawl says whether it was billed as a full crawl
(true) or a recent one (false).
What a job costs
A job costs its results times its scraper’s rate, locked when the job is created. A result is one row of output: a post, comment, video, profile, page or search query, depending on the scraper. A new rate applies to new jobs only.- You pay per billed result row delivered. A job that delivers zero billed rows costs $0.
- Some scrapers also return rows that are not posts or videos. Instagram and Facebook start each profile with a
summary row, which is billed. Status rows on YouTube and Instagram cost nothing and stay in the results: a channel
with nothing in your date range, a link that is not a channel, a private, missing, restricted or blocked profile,
a profile that couldn’t be resolved (
profile_error), a post that couldn’t be read. Each scraper guide lists its rows and whether they are billed./results/totalincludes these $0 rows and can exceeditems_scraped, which counts billed rows. - Some scrapers charge a minimum per job. In the price list,
minimum_charge_enabledsays whether a scraper has one andminimum_charge_usdgives the amount, ornullwhen there is none. A job’sminimum_charge_at_creationsays whether its scraper had one when it was created. A job with no billed results costs $0 even then. - The charge is settled when a job completes, or, for a job its own spending cap stops, when the stopped run reports the rows it delivered. A job you cancel yourself is not charged.
- No charge is ever above the job’s
maxTotalChargeUsd.
The final cost
Every job reports what it was charged, in three places that always agree:actual_coston the job (GET /api/v1/jobs/{id}/), in USD;usageTotalUsdin its webhook, and in the SDK’s run;- the job’s line in your billing history and in
GET /api/v1/usage/.
estimated_cost on the job is the estimate its credit check used.
Credit check: 402
If your balance can’t cover a new job’s estimate, the API refuses it with402 Payment Required. It also counts
the quoted estimated_cost of your organization’s pending and running jobs: those quotes plus the new job’s own
must not exceed 10 times your balance. A job stopped by its spending cap still reserves that cap until its final
charge is settled. A 402 creates no job, so retrying the request after backing off is safe. See
Errors for the response and how to handle it.
The estimate is the scraper’s rate times the results the job can return, counting every target: a job for 50
profiles with limit: 100 is quoted as 5,000 results. It is in the job’s estimated_cost. Without a limit, a target
is counted as:
- 50 posts on Instagram and Facebook;
- 1,000 videos on TikTok, or 100 with a date filter within the last 29 days;
- 100 videos on YouTube;
- one row on
instagram_profileandfacebook_profile.
maxTotalChargeUsd is what caps
that.
Comment scrapers count maxComments, TikTok search maxItems, TikTok profile its handles and posts, and Google
search its queries.
Cap a job with maxTotalChargeUsd
Add maxTotalChargeUsd to a job’s input (config): a number of USD, at least 0.01.
maxTotalChargeUsd is a ceiling on spending. It can lower a job’s volume. For tiktok_search without maxItems,
the budget sets the volume, up to 100,000 items; other types never run above their volume without a budget.
- Split per target. On
instagram,tiktokandfacebookthe cap is split across the profiles or pages and written as a per-target limit (maxPosts,maxVideosPerProfile,resultsLimit), never above the limit you set or the default. A job with no limit gets one from the cap. - A result cap. On
instagram_commentsandtiktok_comments(maxComments),tiktok_searchandtiktok_profile(maxItems), a cap you leave out is set to what the budget buys.tiktok_searchis capped at 100,000 items. An explicitmaxItemswhose cost exceeds the budget is refused with400; a smaller cap is kept. - When it can’t fit. A job is refused with
400only when the limit you set for one target already costs more than the whole budget, or the budget buys less than one result per profile. Oninstagram_profile,facebook_profileandgoogle_serp, the whole job must fit the budget. The message says how many results the budget buys. - YouTube gets no cap written: the job is accepted with a warning in its log, and the budget is enforced while it runs.
- While it runs: a job whose results pass 110% of the budget is stopped. Its status becomes
cancelled, and itserror_messagesays so. Itsactual_coststaysnulluntil the stopped run reports the rows it delivered. It is then billed for them, at most the budget, and its onejob.cancelledwebhook carries that charge. A run that hasn’t reported 30 minutes after the stop is closed with no charge. A job its budget stopped can’t be retried (400), billed or not: create a new job instead.
Add credits
Write to support@go-fetch.io and we’ll add them to your organization. Your balance iscredit_balance in GET /api/v1/organizations/.
Low balance
When your balance falls below its warning threshold, or to zero, the organization’s owners and admins get an email, and webhooks subscribed toaccount.low_balance are called. Set the threshold in the dashboard’s
organization settings.
Usage
GET /api/v1/usage/ lists one usage record per completed job: job, platform, posts_scraped (results billed),
unit_price and total_cost, newest first. GET /api/v1/organizations/{id}/usage/ sums the current month.