Seedance quotes and billing receipts
Estimate Seedance generation costs and verify the final debit using authenticated, persistent billing receipts.
Seedance quotes and billing receipts
Applies to seedance-2.0, seedance-2.5, seedance-2.0-fast, and seedance-2.0-mini, across all generation channels. Base URL: https://apimaster.ai/v1 (https://apimaster.ai/v1). Authenticate all requests with Authorization: Bearer YOUR_API_KEY.
INTL models: actual video Tokens
The four seedance-*-intl models use actual video Token billing for new requests. Their quotes and receipts use schema_version: "2" and unit: "million_tokens". estimated_video_tokens is a reservation estimate; actual_video_tokens is the provider-reported final usage. Final charges use the frozen USD-per-million-Token rate, channel pricing and account multiplier, rounded once to the account unit. Resolution and reference-video mode select the Token rate; duration is not multiplied into the charge a second time.
Base prices follow BytePlus ModelArk online pricing. Actual channel discounts and selling multipliers are shown separately in the live model card. A task without confirmed final Token usage continues polling; estimated Tokens are not represented as final usage. Tasks already accepted under the earlier per-second contract retain their frozen prices.
Legacy -nsfw model IDs are retired. New requests must use their corresponding -intl IDs; historical tasks and material bindings are retained.
The per-second examples below apply to the standard model IDs listed above.
Obtain an estimate
POST https://apimaster.ai/v1/videos/quote accepts the same JSON parameters as a standard video-generation request, including model, prompt, duration, resolution, video_urls, and other supported generation settings. Draft generation, draft upgrades, and remix quotes are not currently supported.
curl "https://apimaster.ai/v1/videos/quote" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"seedance-2.0","prompt":"A paper boat on a pond","duration":4,"resolution":"480p","generate_audio":false}'
The response contains object: "video.quote", quote_id, expires_at (Unix seconds), binding: false, funds_reserved: false, and a billing object described below. The quote has a five-minute advisory validity period. It does not debit funds, create a task, or start provider generation. billing.reserved_amount is therefore "0.000000". The quote ID is informational; it is not an authorization or price-lock token and does not need to be submitted with generation.
Pricing is recalculated at actual submission and frozen for that task. An estimate is not a maximum-charge guarantee. The completed task may cost more or less than the estimate. Automatic-duration requests use a 30-second output estimate; requested_output_seconds is -1.
Generation remains subject to provider validation. For Seedance 2.5 video-extension requests, explicitly set aspect_ratio: "adaptive"; a provider rejection is handled through the normal refund lifecycle.
Retrieve the task receipt
curl "https://apimaster.ai/v1/videos/task_xxx/billing" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /v1/videos/{task_id}/billing returns object: "video.billing_receipt" and billing. Only API keys belonging to the task owner's account can retrieve it. Unknown, foreign, and historical tasks without a receipt return HTTP 404. Receipts are created for new tasks after this feature was enabled; older tasks are not retrospectively reconstructed.
The same billing object is included in both task-query responses:
GET /v1/videos/{task_id}: top-levelbilling.GET /v1/video/generations/{task_id}:data.billing.
settlement_status is pending, settled, or refunded; quote responses use estimate. Task completion and financial settlement are separate: treat amounts as final only when the receipt is settled or refunded. Repeated receipt requests do not run generation, settlement, or refunds. Finalized receipts keep the same receipt ID and contents, including after a refund.
Complete request and response examples
Both examples use Seedance 2.0 at 480P, a requested 4-second output, one reference measured at 4.042 seconds, channel multiplier 1 and account multiplier 1.05. Completion durations and amounts come from a live test; the quote is an illustrative example assembled for matching inputs. IDs and media URLs are placeholders. Actual rates come from your API response.
1. Obtain a quote
POST https://apimaster.ai/v1/videos/quote, request JSON:
{
"model": "seedance-2.0",
"prompt": "A paper boat moves gently on a pond.",
"duration": 4,
"resolution": "480p",
"video_urls": [
"https://example.com/reference.mp4"
]
}
| Field | Type | Meaning |
|---|---|---|
model |
string | Model ID, seedance-2.0 here. |
prompt |
string | Generation prompt. |
duration |
integer | Requested output seconds, not reference-video duration. |
resolution |
string | Output resolution, 480p here. |
video_urls |
array |
Reference-video URLs. Replace the placeholder with accessible media; the server measures each file. |
Quote response:
{
"object": "video.quote",
"quote_id": "quote_example",
"expires_at": 1790949324,
"binding": false,
"funds_reserved": false,
"billing": {
"schema_version": "1",
"settlement_status": "estimate",
"model": "seedance-2.0",
"resolution": "480P",
"tariff_variant": "480P-input",
"tariff_revision": "sd-v1-b79a35d3a29af9af",
"currency": "USD",
"unit": "second",
"base_unit_rate": "0.04319",
"channel_multiplier": 1,
"account_multiplier": 1.05,
"effective_unit_rate": "0.0453495",
"requested_output_seconds": 4,
"estimated_output_seconds": 4,
"estimated_billable_seconds": 9,
"input_videos": [
{
"index": 0,
"media_id": "media_example_hash",
"measured_seconds": 4.042,
"billable_seconds": 5,
"duration_source": "apimaster_probe"
}
],
"billable_input_video_seconds": 5,
"output": null,
"billable_seconds": null,
"rounding": {
"amount_formula": "round(total_billable_seconds * effective_unit_rate / account_unit_usd) * account_unit_usd",
"effective_unit_rate": "nearest_decimal_12_places_half_up",
"input_video": "ceil_each_file_then_sum",
"money": "nearest_account_unit_half_up",
"output_video": "nearest_integer_half_up"
},
"estimated_amount": "0.408146",
"reserved_amount": "0.000000",
"additional_debit_amount": "0.000000",
"final_debit_amount": null,
"refunded_amount": "0.000000",
"net_amount": null,
"initial_quota_units": 0,
"final_quota_units": null,
"account_unit_usd": "0.000002",
"media_charges": {
"audio": "0.000000",
"image": "0.000000",
"input_video_unrounded": "0.2267475",
"other_reference": "0.000000",
"output_video_unrounded": "0.181398"
},
"final_debit_may_exceed_estimate": true,
"created_at": 1790949024,
"settled_at": null
}
}
The 4.042-second input rounds up to 5 seconds. With 4 estimated output seconds, the estimate covers 9 seconds and costs 0.408146 USD. Quoting does not debit funds; final amounts remain null.
2. Submit generation and query completion
After submitting to POST https://apimaster.ai/v1/videos/generations, the initial response contains the task ID:
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_example"
}
]
}
Then query GET https://apimaster.ai/v1/videos/task_example using an API key from the same account. After generation and settlement finish:
{
"actual_time": 189,
"billing": {
"schema_version": "1",
"receipt_id": "bill_task_example",
"task_id": "task_example",
"settlement_status": "settled",
"model": "seedance-2.0",
"resolution": "480P",
"tariff_variant": "480P-input",
"tariff_revision": "sd-v1-b79a35d3a29af9af",
"currency": "USD",
"unit": "second",
"base_unit_rate": "0.04319",
"channel_multiplier": 1,
"account_multiplier": 1.05,
"effective_unit_rate": "0.0453495",
"requested_output_seconds": 4,
"estimated_output_seconds": 4,
"estimated_billable_seconds": 9,
"input_videos": [
{
"index": 0,
"media_id": "media_example_hash",
"measured_seconds": 4.042,
"billable_seconds": 5,
"duration_source": "apimaster_probe"
}
],
"billable_input_video_seconds": 5,
"output": {
"actual_seconds": 4,
"billable_seconds": 4,
"duration_source": "provider_reported"
},
"billable_seconds": 9,
"rounding": {
"amount_formula": "round(total_billable_seconds * effective_unit_rate / account_unit_usd) * account_unit_usd",
"effective_unit_rate": "nearest_decimal_12_places_half_up",
"input_video": "ceil_each_file_then_sum",
"money": "nearest_account_unit_half_up",
"output_video": "nearest_integer_half_up"
},
"estimated_amount": "0.408146",
"reserved_amount": "0.408146",
"additional_debit_amount": "0.000000",
"final_debit_amount": "0.408146",
"refunded_amount": "0.000000",
"net_amount": "0.408146",
"initial_quota_units": 204073,
"final_quota_units": 204073,
"account_unit_usd": "0.000002",
"media_charges": {
"audio": "0.000000",
"image": "0.000000",
"input_video_unrounded": "0.2267475",
"other_reference": "0.000000",
"output_video_unrounded": "0.181398"
},
"final_debit_may_exceed_estimate": true,
"created_at": 1790949024,
"settled_at": 1790949213
},
"completed_at": 1790949213,
"created_at": 1790949024,
"id": "task_example",
"metadata": {
"url": "https://apimaster.ai/v1/videos/task_example/content"
},
"model": "seedance-2.0",
"object": "video",
"progress": 100,
"status": "completed",
"task_id": "task_example",
"usage": {
"completion_tokens": 80770
}
}
The initial debit equals the final cost here, with no additional debit or refund. billing.output.actual_seconds is output duration; actual_time is processing time. usage.completion_tokens does not determine the charge. Optional fields may vary by channel.
GET https://apimaster.ai/v1/videos/task_example/billing returns { "object": "video.billing_receipt", "billing": ... } with the same billing object. The compatibility query GET https://apimaster.ai/v1/video/generations/task_example places it under data.billing.
Outer response fields
| Field | Type | Meaning |
|---|---|---|
object |
string | Response type: video.quote, video, or video.billing_receipt. |
quote_id |
string | Informational quote identifier; not a price lock or generation authorization. |
expires_at |
integer | Advisory quote expiry in Unix seconds, normally creation plus 300 seconds. |
binding |
boolean | Currently false; the quote does not guarantee a final amount. |
funds_reserved |
boolean | Currently false; quoting does not debit or reserve funds. |
billing |
object | Billing details documented individually below. |
code |
integer | Submission response code; 200 means submitted, not completed. |
data |
array | Submitted task list; the compatibility query instead uses an object for data. |
data[].status |
string | Submission status, submitted in this example. |
data[].task_id |
string | Public task identifier used for subsequent queries. |
id |
string | Public task ID in the completion query. |
task_id |
string | Task identifier, equal to id in this example. |
model |
string | Public generation model name. |
status |
string | Task status; completed means generation finished. Check billing.settlement_status for final settlement. |
progress |
number | Progress percentage; 100 on completion in this example. |
actual_time |
number | Task processing seconds, not output video duration. |
created_at |
integer | Task creation timestamp in Unix seconds. |
completed_at |
integer | Task completion timestamp in Unix seconds. |
metadata |
object | Generation result metadata. |
metadata.url |
string | Video content download URL. |
usage |
object | Provider usage information; may be absent depending on the channel. |
usage.completion_tokens |
integer | Provider token count; not used for per-second billing of these four models. |
Billing schema
All monetary amounts and unit rates are decimal strings. Time durations are seconds. Nullable fields are JSON null until available.
| Field | Type | Meaning |
|---|---|---|
schema_version |
string | Billing schema version, "1" in this example. |
receipt_id |
string | Stable receipt identifier; absent from quotes. |
task_id |
string | Public task ID linked to the receipt; absent from quotes. |
settlement_status |
string | estimate, pending, settled, refunded |
model |
string | Applied public model ID. |
resolution |
string | Normalized resolution used for billing. |
tariff_variant |
string | Tariff tier; -input indicates video references, with this rate applying to input and output. |
tariff_revision |
string | Fingerprint of the model, tariff tier, configured base rate and billing-rule version |
currency |
string | Charge currency, currently USD. |
unit |
string | Unit of the rate; second means per second. |
base_unit_rate |
decimal string | Configured base price per second for this model and tier. |
channel_multiplier |
number | Applied aggregate channel pricing multiplier. |
account_multiplier |
number | Applied account/group multiplier, 1.05 in this example. |
effective_unit_rate |
decimal string | Applied per-second rate, frozen at submission and rounded to 12 decimal places. |
requested_output_seconds |
integer | Requested output duration; -1 for automatic duration |
estimated_output_seconds |
integer | Estimated output seconds; automatic duration is estimated at 30 seconds. |
estimated_billable_seconds |
integer | Initial estimated total billable seconds, including reference videos and estimated output. |
input_videos |
array | Per-reference server measurements, in request order |
input_videos[].index |
integer | Reference-video position in the request, starting at zero. |
input_videos[].media_id |
string | Account-scoped media hash or owned asset ID; no reference-video URL is echoed. |
input_videos[].measured_seconds |
number or null | Server-measured duration before rounding; can be null for older cached assets |
input_videos[].billable_seconds |
integer | This reference's rounded billable duration |
input_videos[].duration_source |
string | apimaster_probe or apimaster_asset_cache |
billable_input_video_seconds |
integer | Sum of per-reference billable seconds |
output |
object or null | Final output duration information, available after successful settlement |
output.actual_seconds |
number or null | Actual reported/probed output duration; null if unavailable |
output.billable_seconds |
integer | Output seconds actually used in settlement |
output.duration_source |
string | provider_reported, apimaster_probe, provider_billable_seconds, requested_duration_fallback, or reservation_fallback |
billable_seconds |
integer or null | Final combined billable input/output seconds |
rounding |
object | Input, output and money rounding rules and amount formula |
estimated_amount |
decimal string | Initial estimated cost, not a final amount or maximum-charge guarantee. |
reserved_amount |
decimal string | Initial account debit at submission, zero for quotes; not a bank authorization hold. |
additional_debit_amount |
decimal string | Additional debit when final cost exceeds the initial debit. |
final_debit_amount |
decimal string or null | Final net task cost after adjustments; zero after full refund |
net_amount |
decimal string or null | Final net task cost after adjustments; zero after full refund |
refunded_amount |
decimal string | Amount returned from the initial debit; equals the initial debit on a full refund. |
initial_quota_units |
integer | Exact account units debited initially; zero for quotes. |
final_quota_units |
integer or null | Exact account units of the final net cost; null while pending, zero after a full refund. |
account_unit_usd |
decimal string | "0.000002" per account unit |
media_charges |
object | image, audio, other_reference are zero under the current tariff; input_video_unrounded and output_video_unrounded separate the video components before final monetary rounding |
final_debit_may_exceed_estimate |
boolean | true; the estimate is not a hard spending cap |
created_at |
integer | Billing-detail creation timestamp in Unix seconds. |
settled_at |
integer or null | Final settlement or refund timestamp in Unix seconds; null until finalized. |
| Field | Type | Meaning |
|---|---|---|
rounding.input_video |
string | ceil_each_file_then_sum: round each input file up, then sum. |
rounding.output_video |
string | nearest_integer_half_up: nearest output second, half seconds rounded up. |
rounding.effective_unit_rate |
string | nearest_decimal_12_places_half_up: round the effective rate to 12 decimal places. |
rounding.money |
string | nearest_account_unit_half_up: round the combined amount to account units. |
rounding.amount_formula |
string | Final combined amount formula; input and output amounts are not rounded separately. |
media_charges.input_video_unrounded |
decimal string | Input-video component before monetary rounding. |
media_charges.output_video_unrounded |
decimal string | Output-video component before monetary rounding. |
media_charges.image |
decimal string | Separate image surcharge, currently zero. |
media_charges.audio |
decimal string | Separate audio surcharge, currently zero. |
media_charges.other_reference |
decimal string | Other reference surcharge, currently zero. |
Recalculate the final cost
With reference video, the video-input tier applies to both the output and reference-video seconds. Images and audio have no separate surcharge under the current Seedance tariff. Token counts and provider cost are not billing inputs.
- Round each input video's measured duration up independently, then sum:
input_seconds = sum(ceil(each_video_duration)). - Round output duration to the nearest whole second, with positive half seconds rounded up.
- Add input and output billable seconds.
- Multiply by
effective_unit_rate, divide byaccount_unit_usd, then round the total once to the nearest integer account unit, with positive half units rounded up.
final_quota_units = round_half_up(billable_seconds × effective_unit_rate / 0.000002)
net_amount = final_quota_units × 0.000002
net_amount = reserved_amount + additional_debit_amount - refunded_amount
Use decimal arithmetic. Do not round the input and output monetary components separately. For example, a 4-second Seedance 2.0 task at 480P, without reference video, with base rate 0.07031, channel multiplier 1, and account multiplier 1.05, has an effective rate of 0.0738255 and a net cost of 0.295302 USD (147651 account units).
APIMaster measures reference-video duration, rather than trusting client fields such as input_seconds or reference_seconds. Requested duration/seconds controls output duration. For outputs, settlement prefers provider-reported duration and probes the output when needed; unavailable measurements may fall back to provider billable seconds or the requested/reserved duration. The receipt explicitly labels the source. A fallback is never labeled as an independently measured actual duration. Existing cached assets or inherited older drafts can lack complete per-file measurement details.
actual_time in the video response is task processing time, not output video duration. usage.completion_tokens, when present, is informational.
Failures and refunds
Provider task failures and the configured 24-hour unfinished-task timeout trigger an automatic full refund. Their receipts remain retrievable and show refunded with zero net amount once the refund succeeds. Temporary polling/network errors do not immediately refund or cancel a task; processing is retried.
A submission failure confirmed as uncharged is refunded. An ambiguous submission outcome is held for automatic reconciliation (first async reconciliation after approximately 20 minutes; still-unknown outcomes after 24 hours are refunded during reconciliation). If submission did not create a public task, there is no task-linked receipt for that attempt. A quote is not a reservation and needs no release.
There is no public Seedance cancellation endpoint. Disconnecting or stopping polling does not cancel a task. Task-state checks prevent repeated polling from applying the same completion settlement/refund again, while the receipt endpoint itself is read-only. These are not a blanket exactly-once guarantee for every infrastructure failure; pending financial operations must not be treated as finalized.
