Frequent-flyer miles earned
Fly 2,500 miles at a 100 % accrual rate with a 25 % status bonus and you earn 3,125 miles. Enter the fare or distance, your program's earning rate and your bonus to see base, bonus and total miles. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Base amount
- 400
- Earning rate
- 5
- Status bonus percent
- 50
- Calculation mode
- spend
- Base unit
- currency
- Rate unit
- miles_per_currency_unit
- Base miles
- 2,000
- Bonus miles
- 1,000
Planning a trip around loyalty credit starts with one practical question: how many miles will this ticket actually post? This frequent-flyer miles earned calculator multiplies a transparent base—either the fare you paid or the distance you fly—by your program earning rate, then applies an optional elite or co-brand status bonus as a percentage of those base miles. Use spend mode when your airline posts revenue-based accrual (miles per dollar or euro), and distance mode when the chart still uses a percentage of flown miles. There is no live award-chart lookup and no hidden class matrix—only the numbers you already know from the fare rules or elite guide.
Where frequent-flyer miles earned calculators show up in real work
Leisure travelers compare two published fares on the same route and need a transparent estimate of how many miles each ticket will credit before they choose the cheaper non-status option or the slightly pricier fare that still qualifies for full revenue accrual. Bloggers and course creators publish status-bonus walkthroughs and need reproducible numbers for screenshots, quizzes, and auto-graded homework without inventing floating-point edge cases.
Booking bots that score cash-plus-miles itineraries can attach an earned-miles estimate to each candidate ticket once the program rate and traveler status percent are known, rejecting routes that fail a minimum miles-per-dollar floor. If you later need live award-chart scraping, partner transfer multipliers, dynamic award pricing, or hotel-point valuations, treat those as separate search intents and landings rather than overloading this frequent-flyer miles earned calculator page.
The SEO slug targets people searching for a frequent-flyer miles earned calculator who already know their fare or distance and program rate and only need the accrual math done correctly and quickly.
What you can do with it
Distance chart planning
Use distance mode with flown miles and an accrual ratio from the class chart to estimate credit when the program is still distance-based.
FAQ
What is the difference between spend mode and distance mode?
Mode only labels the units. The multiplication is identical.
Does this look up airline program charts?
No. You supply the earning rate and status bonus from your program guide. There is no network fetch of live charts or class matrices.
What does it cost?
The browser tool is free and runs locally.
How does the status bonus work?
It is a percentage added on top of your base miles: 50 means plus 50 %. With 2,000 base miles, a 50 % bonus adds 1,000 for a total of 3,000. Leave it empty and it counts as zero.
What earning rate do I enter in distance mode?
The accrual ratio as a decimal: 1 means 100 % of the distance flown, 0.5 means 50 % and 0.25 means 25 %. If your fare class earns a 150 % bonus, fold it into the rate as 1.5.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/travel/miles-earned \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"base_amount":400,"earning_rate":5}'const res = await fetch("https://api.kit.forhosting.com/travel/miles-earned", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"base_amount": 400,
"earning_rate": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/travel/miles-earned",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"base_amount": 400,
"earning_rate": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/travel/miles-earned", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"base_amount":400,"earning_rate":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"base_amount":400,"earning_rate":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/travel/miles-earned", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"base_amount": 400,
"earning_rate": 5
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "travel.miles_earned",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Pricing for successful API calls is the published base of $0.002 per item; failed validation is not charged.
How miles earned are calculated from fare, distance, rate, and status
Start from a published fare or a known segment distance and the earning language in your frequent-flyer program guide. In spend mode, base_amount is the eligible ticket fare in major currency units—often the base fare excluding taxes, or the amount the program states as revenue for accrual—and earning_rate is miles per currency unit, such as five miles per dollar on a co-brand card fare or one mile per euro on a basic revenue ticket. In distance mode, base_amount is the flown distance in statute miles or kilometers (use one unit consistently) and earning_rate is the accrual ratio as a decimal: one means one hundred percent of distance, zero point five means fifty percent, and one point five means a one-hundred-fifty percent class bonus already folded into the rate. The calculator multiplies base_amount by earning_rate to form base_miles. If you hold elite status or a co-brand bonus that advertises an extra percentage on top of base miles, put that figure in status_bonus_percent—for example fifty for plus fifty percent—so bonus_miles equals base_miles times the percent over one hundred and total_miles equals base_miles plus bonus_miles. Equivalently, total_miles equals base_amount times earning_rate times one plus status_bonus_percent over one hundred. Leaving status_bonus_percent out defaults it to zero so non-elite estimates stay honest. Negative amounts, missing required fields, non-finite numbers, and unknown mode strings fail with invalid_input so clients never see NaN or silent clamps. Identical inputs always produce identical JSON: no network chart fetch, no random jitter, and no clock dependence.
What you send and what you get back
Classic checks include a four-hundred currency fare at five miles per unit with a fifty percent status bonus, which yields two thousand base miles and three thousand total miles, or a two-thousand-five-hundred unit distance at one hundred percent accrual with a twenty-five percent status bonus, which yields two thousand five hundred base miles and three thousand one hundred twenty-five total. Wire the free browser form for one-off trip planning, then call the identical contract from scripts when you batch dozens of candidate fares against the same program rate table. Send base_amount and earning_rate as required finite numbers greater than or equal to zero. Optionally send status_bonus_percent as a non-negative finite number, and mode as the string spend or distance (aliases fare or revenue for spend, miles or km for distance). JSON strings that parse as numbers are accepted the same way as numeric literals. Missing base_amount or earning_rate, empty strings, NaN, Infinity, negative values, and invalid mode values all fail with invalid_input and are not charged. On success the response echoes the cleaned base_amount, earning_rate, status_bonus_percent, and mode; reports base_unit as currency or distance and rate_unit as miles_per_currency_unit or accrual_ratio; and returns base_miles, bonus_miles, total_miles, effective_multiplier equal to one plus the bonus percent over one hundred, and a human-readable formula string. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance. Downstream tools can threshold on total_miles alone, store the full object for audit, or combine results with a separate cents-per-point valuation cap when deciding whether to burn or earn on a given itinerary.
Where frequent-flyer miles earned calculators show up in real work
Loyalty onboarding teams use the same JSON in demos and API sandboxes so offline worksheets stay aligned with production. Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Fare versus status trade-off
Enter two candidate fares with the same earning rate and your status bonus percent, then compare total_miles before you buy the cheaper non-qualifying ticket.
Bulk trip scoring
Pipe candidate fares and rates into the API and rank itineraries by total_miles with one deterministic formula shared by the browser and scripts.
Technical questions
How are total miles calculated?
total_miles = base_amount × earning_rate × (1 + status_bonus_percent / 100). Base miles are base_amount times earning_rate; the status bonus is an extra percentage of those base miles.
Is status_bonus_percent required?
No. When omitted it defaults to 0, so you get a pure base-miles estimate without inventing elite credit.