Skip to content

Stripe API errorStripe: “Invalid integer: 10.99”

Creating a PaymentIntent, Checkout Session or Price fails with parameter_invalid_integer and a message such as Invalid integer: 10.99. Stripe amounts are whole numbers in the currency’s smallest unit, so a price in dollars, a float from a calculation, or a string with a decimal point is rejected before anything is charged.

Short answer

Convert the amount to the smallest currency unit and round it to a whole number before you send it: Math.round(10.99 * 100) gives 1099 cents. For zero-decimal currencies such as JPY, send the amount as is. The error’s param field names the parameter that failed, such as amount or unit_amount. The same error hits other integer fields, such as quantity or trial_period_days, when they are sent with decimals.

Where the decimal comes from, and the fix

  1. 01

    The amount is in dollars, not cents

    “For example, enter 1099 to charge 10.99 USD (or any other two-decimal currency).” Stripe, Supported currencies

    amount and unit_amount are in the smallest currency unit. Multiply two-decimal currencies by 100 and round, so floating-point results such as 1098.9999 become 1099. Float edge cases still exist (1.005 * 100 is 100.49999…), so it is better to keep money as integer cents, or use a decimal library, from the start.

    const amount = Math.round(Number(price) * 100); // 10.99 -> 1099
    await stripe.paymentIntents.create({ amount, currency: 'usd' });
  2. 02

    A calculated total with a fraction of a cent

    “One or more of the parameters requires an integer, but the values provided were a different type.” Stripe, Error codes (parameter_invalid_integer)

    Discounts, tax or quantity math can leave a fraction of a cent even when every input was in cents. Round once, at the end, with the rounding rule your business uses, and store money as integer cents in your database.

  3. 03

    Zero-decimal currencies multiplied by 100

    “For the following zero-decimal currencies, the charge and the amount are the same, without requiring multiplication.” Stripe, Supported currencies (Zero-decimal currencies)

    For JPY, KRW and other zero-decimal currencies, the amount is already the smallest unit, so multiplying by 100 overcharges by 100 times. Look the currency up in Stripe’s list before you scale.

  4. 04

    Prices that really need fractions of a cent

    “A positive integer in the smallest currency unit” Stripe, Create a price (unit_amount)

    For prices below one cent per unit, unit_amount can’t hold the fraction. Create the Price with unit_amount_decimal, a decimal string in the smallest unit (up to 12 decimal places). Stripe rounds each invoice line to a whole cent after multiplying by the quantity. For per-call usage billing, use Stripe’s usage-based billing instead of a licensed price.

    await stripe.prices.create({
      currency: 'usd',
      unit_amount_decimal: '0.5', // half a cent per unit; each invoice line is rounded to whole cents
      recurring: { interval: 'month' },
      product: productId,
    });

Checked against the vendor’s docs on : Stripe docs: Supported currencies; Stripe docs: Error codes; Stripe docs: Create a price.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

Related: Stripe “No such price” · Stripe “Received unknown parameter” · Stripe PaymentIntent already succeeded · Stripe Invalid API Key provided

Questions

More on this error

Why does Stripe use cents instead of dollars?

Whole numbers avoid floating-point rounding errors. Every amount in the API is in the currency’s smallest unit, so 1099 means 10.99 USD and 500 means 500 JPY.

Is there a minimum amount?

Yes. Below the minimum, Stripe returns amount_too_small instead. Stripe’s currencies page lists the minimum charge per currency.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.