How OpenSEO Calculates DataForSEO API Usage Costs: Technical Implementation Guide
OpenSEO meters every DataForSEO API call by applying a fixed 1.28x markup to raw USD costs, converting the result to internal credits at a rate of 1,000 credits per dollar, and finalizing charges through Stripe for hosted customers or credit pool deductions for self-hosted deployments.
Understanding exactly how OpenSEO DataForSEO API usage costs are calculated requires tracing the path from raw vendor pricing to final customer billing. In the every-app/open-seo repository, the platform implements a deterministic pipeline that captures live API responses, applies standardized markups, and normalizes everything into a unified credit system. This article breaks down the specific functions and file paths that handle cost estimation, real-time expenditure tracking, and credit conversion.
Defining Base Rates and Per-SERP Cost Estimation
OpenSEO stores the underlying DataForSEO pricing as constants to enable deterministic cost prediction before any API call is made.
Storing Raw DataForSEO Rates
The base-page and extra-page costs for DataForSEO's two access methods—instant "live" endpoints and cheaper "queued" task queues—are defined in src/shared/rank-tracking.ts at lines 12-22. These constants represent the raw vendor pricing that OpenSEO pays before any platform markup is applied.
Computing Costs with costPerSerpAtDepth
The function costPerSerpAtDepth(depth, method) calculates the exact cost for a single SERP request by multiplying the number of pages (calculated as depth / 10) by the appropriate per-page price for either the live or queued method. This implementation appears at lines 46-52 in src/shared/rank-tracking.ts, providing accurate per-request pricing based on how deep the rank check needs to scan into search results.
Scaling to Batch Jobs with Markup
When calculating costs for bulk operations, estimateRankCheckCredits (lines 68-71 in src/shared/rank-tracking.ts) performs three critical steps:
- Multiplies the per-SERP price by the total number of checks (
keywordCount × devicesCount) - Applies the platform markup using the constant
SEO_DATA_COST_MARKUP = 1.28(representing a 28% markup) - Rounds the result using
roundUsdForBillingto ensure billing precision
This function returns both the final USD amount and the equivalent credit cost, making it the central estimator for rank-check batch pricing.
Capturing Live API Costs and Billing Envelopes
While estimates predict costs, OpenSEO also captures actual expenditures from DataForSEO API responses to ensure billing accuracy.
Summing Raw Costs from SERP Responses
For queued tasks, the DataForSEO API returns a cost field per entry. The function googleOrganicTaskPost in src/server/lib/dataforseo/serp.ts (lines 48-67) sums these individual cost values into a consolidated costUsd total. This raw sum represents the exact amount DataForSEO charges OpenSEO before platform markup is applied.
Wrapping Costs in Billing Envelopes
Every DataForSEO response is wrapped by buildTaskBilling in src/server/lib/dataforseo/envelope.ts (lines 72-78). This function constructs a billing envelope containing the exact API request path and the precise costUsd charged by DataForSEO. This envelope attaches to every response, creating an immutable record of the raw expenditure for audit trails and customer transparency.
Applying Markup and Credit Conversion
Once raw costs are captured, OpenSEO converts them into the platform's internal currency system.
Implementing the Platform Markup
The function applyBillingMarkupUsd(rawUsd) in src/shared/billing.ts (lines 26-36) handles the markup calculation. Hosted customers see prices processed through this function, which multiplies the raw DataForSEO cost by 1.28 to cover platform operational expenses. Self-hosted deployments bypass this markup and pay DataForSEO directly at raw rates.
Converting USD to Internal Credits
OpenSEO operates on a credit system where AUTUMN_SEO_DATA_CREDITS_PER_USD = 1000. The helper autumnSeoDataCreditsToUsd converts credit balances back to USD for display purposes. When charging for actual usage, the platform calculates costCredits = Math.ceil(costUsd * AUTUMN_SEO_DATA_CREDITS_PER_USD) to determine the exact credit deduction from a customer's balance.
Billing Mode Differences
- Hosted Mode: Customers see the marked-up USD price (e.g., $0.0018 for a single SERP request) and are billed via Stripe. OpenSEO pays DataForSEO the raw rate and keeps the difference.
- Self-Hosted Mode: Customers pay DataForSEO directly at raw rates. OpenSEO displays the raw cost and deducts the equivalent credits from the internal usage pool without applying markup.
Practical Code Examples
Estimating Rank Check Batch Costs
Use estimateRankCheckCredits to calculate costs before submitting large batches:
import { estimateRankCheckCredits } from "@/shared/rank-tracking";
// 150 keywords, checking both desktop & mobile, depth = 30 (3 pages), queued method
const { costUsd, costCredits } = estimateRankCheckCredits(
150,
"both", // devices
30, // depth (10 results per page)
"queued", // live vs queued
);
console.log(`≈ $${costUsd} (≈ ${costCredits} credits)`);
// Example output: ≈ $0.45 (≈ 450 credits)
Inspecting Billing Data from API Responses
Access the billing envelope to verify actual charges from any SERP request:
import { fetchSerp } from "@/server/lib/dataforseo/serp";
const result = await fetchSerp({
tasks: [{ keyword: "open seo", device: "desktop", keywordId: "k1" }],
locationCode: 2840,
languageCode: "en",
depth: 10,
});
console.log(result.billing);
// { path: ["v3","serp","google","organic","task_post"], costUsd: 0.0018 }
Converting Credit Balances to USD
Convert internal credits back to dollar amounts for reporting:
import { autumnSeoDataCreditsToUsd } from "@/shared/billing";
const credits = 2500;
const usd = autumnSeoDataCreditsToUsd(credits);
console.log(`$${usd}`); // $2.5
Summary
- Raw cost constants for DataForSEO live and queued methods are stored in
src/shared/rank-tracking.tsand drive all price estimations. - Per-SERP pricing scales linearly with search depth and applies a 1.28x platform markup via
applyBillingMarkupUsdinsrc/shared/billing.ts. - Real-time cost capture occurs in
src/server/lib/dataforseo/serp.ts, wheregoogleOrganicTaskPostsums actual DataForSEO charges intocostUsd. - Billing envelopes created by
buildTaskBillinginsrc/server/lib/dataforseo/envelope.tsattach cost metadata to every API response. - Credit conversion uses a fixed rate of 1,000 credits per USD, with hosted customers paying marked-up prices and self-hosted users paying raw rates.
Frequently Asked Questions
How does OpenSEO handle pricing differences between live and queued DataForSEO methods?
OpenSEO maintains separate rate constants for each method in src/shared/rank-tracking.ts. The "live" method uses DataForSEO's instant endpoints at a higher per-page rate, while the "queued" method uses the task-queue system at a discounted rate. The costPerSerpAtDepth function automatically selects the correct rate constant based on the method parameter passed to it.
What is the exact formula for converting DataForSEO costs to OpenSEO credits?
The conversion follows the formula costCredits = Math.ceil(costUsd * 1000), where costUsd is the final marked-up dollar amount (not the raw DataForSEO cost for hosted customers). The estimateRankCheckCredits function in src/shared/rank-tracking.ts returns both values, applying the 1.28x markup and rounding before credit calculation.
Where can developers find the raw cost DataForSEO charged for a specific API call?
Every response from OpenSEO's DataForSEO wrapper includes a billing property containing the exact costUsd charged by DataForSEO and the API path accessed. This envelope is generated by buildTaskBilling in src/server/lib/dataforseo/envelope.ts and attached to the response object, allowing real-time cost verification without parsing vendor invoices.
How does the platform markup differ between hosted and self-hosted deployments?
Hosted deployments process all DataForSEO costs through applyBillingMarkupUsd in src/shared/billing.ts, which applies the 28% markup (SEO_DATA_COST_MARKUP = 1.28) to raw vendor costs before charging customers via Stripe. Self-hosted deployments do not apply this markup; they display the raw costUsd from DataForSEO and deduct credits at the flat conversion rate of 1,000 credits per dollar, as the customer pays DataForSEO directly.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →