How a spin is priced

Five tiers, one number per tier, and a public endpoint you can query without an account. Including what the provider is paid out of it.

All posts

Our price list is a table in a database with one public, unauthenticated endpoint in front of it. You can read it right now, without an account, without talking to sales:

curl https://api.aggregator.gg/v1/pricing

This post explains what comes back.

The tiers

Price per spin falls as monthly volume rises. The band is the number of live spins in a calendar month.

TierMonthly spinsPer spin
Starter100K to 1M$0.0022
Growth1M to 10M$0.0019
Scale10M to 100M$0.0017
Pro100M to 500M$0.0015
Enterprise500M+on request

Section 2.1 of the Operator Service Offer puts it plainly: no setup fee, no monthly minimum commitment, and no revenue share. A package is bought upfront, is valid for six months, and is tied to one brand.

The six months is a real constraint rather than a formality. Section 8.3 forfeits calls still unused when the package expires, so the tier worth buying is the one you will actually consume, not the one with the best headline rate.

Two things the table does not do, on purpose.

It does not care about bet size. A $0.10 spin and a $500 spin cost the same, because they cost us the same to serve: one session call, one callback, one row. If you run high-stakes traffic, this is the single largest difference between us and a revenue-share contract.

It does not care about your margin. The price is a function of volume and nothing else. There is no clause that reads your GGR, and no month where the bill moves because your players ran cold.

What the provider gets

The same endpoint returns a second number, and this is the part most price lists leave out:

"floor_per_spin": 0.0015,
"provider_default_rate_per_spin": 0.0012

provider_default_rate_per_spin is what the game provider is paid. Section 8.2 of the Provider Service Offer states it in writing: USD $0.0012 per metered successful API call, and the rate is universal across all providers. There is no separate tier for whoever negotiated hardest.

Set that against the operator column and the important part is which number moves. The operator’s price falls as volume rises. The provider’s rate does not move at all. Volume is supposed to make distribution cheaper for the operator, not make the provider’s work worth less.

We publish both numbers on the same open endpoint because the alternative is worse for everyone in the chain. A provider whose rate is a private number has no way to tell whether it is the same number the last provider got. An operator who cannot see what the provider is paid has no way to tell a distribution fee from a toll.

Why the price lives in the database

It used to live in three places on this website: a pricing component, a facts file, and translated marketing copy in nine languages. By the time anyone checked, they disagreed. One said the floor was $0.0015, another said prices started at $0.0025, and both were shipped.

Nobody had done anything careless. Three copies of a number is simply a number that will be wrong, and the only question is when someone notices.

The public endpoint exposes the package table. This static site uses an approved snapshot in src/lib/pricingV522.ts: its pricing cards and savings calculator derive their values from that shared model at build time. It does not fetch live prices in the browser. A price change requires reconciling the snapshot and rebuilding the site; changing the backend table alone does not update it.

That is also why this post can tell you to go and check. If the numbers in the table above ever disagree with what the endpoint returns, the endpoint is right and this post is stale.

Back to all posts