Recraft prices the API in API units, and the whole rate card fits on one page: USD $1.00 buys 1,000 units, and every operation deducts a published number of them. Two billing bases sit inside that page, per image and per request, and one of them is easy to miscount.
What the pricing page publishes
The page states the exchange rate, the package terms and a table of service charges with both a USD figure and a unit figure per row. Packages “must be purchased in advance and all API Unit packages are non-cancellable and non-refundable,” any number can be bought, and they “do not expire.”
That is the entire pricing model. There are no reserved tiers, no committed-spend schedule and no published volume discount on this page, which makes the arithmetic unusually simple: count the images, count the requests, multiply.
The unit exchange rate
One rate covers everything: $1.00 = 1,000 API units, so a unit is a tenth of a cent. Every published charge is a whole number of units, which means a USD conversion is exact rather than rounded.
Units are drawn from a prepaid balance. All API tokens on an account share that one balance, so a second token does not create a second budget. The API walkthrough covers where the token comes from and how the balance gates token creation.
Per-image prices, model by model
| Model line | Raster (USD / units) | Vector (USD / units) |
|---|---|---|
| Recraft V4.1 Pro, V4.1 Utility Pro | 0.21 / 210 | 0.30 / 300 |
| Recraft V4.1, V4.1 Utility | 0.035 / 35 | 0.08 / 80 |
| Recraft V4 Pro | 0.25 / 250 | 0.30 / 300 |
| Recraft V4 | 0.04 / 40 | 0.08 / 80 |
| Recraft V4 Styles Pro | 0.10 / 100 | 0.12 / 120 |
| Recraft V4 Styles | 0.035 / 35 | 0.05 / 50 |
| Recraft V3 | 0.04 / 40 | 0.08 / 80 |
| Recraft V2 | 0.022 / 22 | 0.044 / 44 |
Two rows carry most of the decisions. V4.1 raster at $0.035 undercuts V4 at $0.04 and V3 at $0.04, so staying on the current line is cheaper per image as well as newer. Vector costs roughly double its raster sibling at almost every tier, which is the single largest lever in a batch budget. The V4.1 breakdown explains what the Pro and Utility suffixes buy.
Editing and style charges
Generation is priced per image. Almost everything else is priced per request, and the spread is wide: image vectorization and background removal at $0.01, prompt enhancement at $0.01, image style creation at $0.005, crisp upscale at $0.004, erase region at $0.002. Creative upscale is the outlier at $0.25, and variate image sits at $0.04.
The V3 editing endpoints are priced like V3 generation: image-to-image, inpainting, outpainting, replace background and generate background all cost $0.04 raster and $0.08 vector. The same operations run by hand are in the Studio walkthrough.
Style creation needs its own line in the estimate. Creating a style costs $0.005 per request once, and the response reports it.
# Requires curl and jq.
# Create one reusable style. The response credits field is the charge.
STYLE_ID=$(curl -s -X POST https://external.api.recraft.ai/v1/styles \
-H "Authorization: Bearer $RECRAFT_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model": "recraftv4_styles", "image_urls": ["https://example.com/reference-1.png"]}' \
| jq -r .id)
echo "$STYLE_ID" # the documented response carries "credits": 5
Estimating a batch before you run it

The one billing trap is documented rather than hidden. If you attach style references to a generation request instead of sending a style_id, the server creates a private style, so the style-creation charge is added once on top of the per-image cost, and the response credits field is the sum of the two. Reusing the returned style_id on later requests pays generation only.
A script for the whole rate card
# No dependencies. Rates transcribed from the Recraft pricing page;
# API units are the published $1.00 = 1,000 units.
PER_IMAGE_USD = {
"recraftv4_1": 0.035,
"recraftv4_1_utility": 0.035,
"recraftv4_1_pro": 0.21,
"recraftv4_1_utility_pro": 0.21,
"recraftv4_1_vector": 0.08,
"recraftv4_1_utility_vector": 0.08,
"recraftv4_1_pro_vector": 0.30,
"recraftv4_1_utility_pro_vector": 0.30,
"recraftv4_styles": 0.035,
"recraftv4_styles_pro": 0.10,
"recraftv4_styles_vector": 0.05,
"recraftv4_styles_pro_vector": 0.12,
"recraftv4": 0.04,
"recraftv4_pro": 0.25,
"recraftv4_vector": 0.08,
"recraftv4_pro_vector": 0.30,
"recraftv3": 0.04,
"recraftv3_vector": 0.08,
"recraftv2": 0.022,
"recraftv2_vector": 0.044,
}
STYLE_CREATION_USD = 0.005 # Per request, whatever the model.
def batch_usd(model, images, style_creations=0):
"""USD for a batch at the published per-image rate."""
return round(PER_IMAGE_USD[model] * images + STYLE_CREATION_USD * style_creations, 3)
def batch_units(model, images, style_creations=0):
"""The same batch in API units, at $1.00 = 1,000 units."""
return round(batch_usd(model, images, style_creations) * 1000)
print(batch_usd("recraftv4_styles", images=200, style_creations=1)) # 7.005
print(batch_units("recraftv4_styles_vector", images=50, style_creations=1)) # 2505
Change the model string and the answer moves by an order of magnitude, which is why the estimator keys on it. A 200-image raster set on V4 Styles Pro is $20.005; the same count on V4 Styles is $7.005.
Reading the charge off a response
The cheapest check is the response itself, because credits is the charge for that request and needs no arithmetic.
# Requires curl and jq. STYLE_ID comes from the create-style call above.
BODY=$(jq -n --arg sid "$STYLE_ID" '{
prompt: "a ceramic mug on a linen cloth, morning light",
model: "recraftv4_styles",
style_id: $sid,
n: 4,
response_format: "url"
}')
curl -s https://external.api.recraft.ai/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $RECRAFT_API_TOKEN" \
-d "$BODY" | jq '{credits, urls: [.data[].url]}'
The documented create-style response looks like this:
{
"id": "229b2a75-05e4-4580-85f9-b47ee521a00d",
"style": "any",
"creation_time": "2026-08-20T00:00:00Z",
"is_private": true,
"credits": 5
}
GET /v1/users/me returns the balance itself, alongside email, id and name, so a worker can check the balance before a batch instead of discovering it mid-run.
What the pricing page does not publish
Several numbers a budget owner will ask for are simply absent:
- Minimum purchase, and whether any volume discount exists above the published per-image rate.
- Whether a failed or rejected request is billed.
- Rate limits, concurrency ceilings and per-endpoint throughput.
- Latency, timeouts and any SLA.
- How the balance is reported in invoice or billing records beyond the
/v1/users/mefigure. - Enterprise terms of any kind.
The plan comparison covers the Studio side, which the credits page states outright is a separate system from API units. Third-party gateways and aggregator sites publish their own Recraft numbers; those are their prices, not Recraft’s, and we do not reproduce them here.
Frequently asked questions
How much is one API unit? A tenth of a cent, at the published rate of USD $1.00 per 1,000 units. Every published charge is a whole number of units.
Do unit packages expire or refund? No. The pricing page states they are non-cancellable and non-refundable, and that purchased packages do not expire.
Why did my style batch cost more than the per-image rate suggests? Because references attached to a generation request make the server create a style, and that $0.005 per-request charge is added once on top of the images.
How do I check the remaining balance? GET /v1/users/me on the API host returns it in the credits field.
Is the cheapest model always the right default? No. V2 raster is the cheapest row on the card, but V4.1 is the documented default and the current line; the gap is $0.013 per image.
Write the model id into configuration rather than into the code, and let the response credits field be the source of truth for what a request actually cost.