APIMaster.ai

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-level billing.
  • 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.

  1. Round each input video's measured duration up independently, then sum: input_seconds = sum(ceil(each_video_duration)).
  2. Round output duration to the nearest whole second, with positive half seconds rounded up.
  3. Add input and output billable seconds.
  4. Multiply by effective_unit_rate, divide by account_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.

Seedance idempotency and submission recovery