Contact lens vertex calculator
A −8 D glasses prescription at 12 mm becomes about −7.30 D at the cornea, while +10 D at 13 mm needs about +11.49 D. Enter the spectacle power and vertex distance to get the contact-lens power. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Original power
- -8
- Vertex mm
- 12
- Result
- -7.299270073
- Vertex m
- 0.012
- Contact power
- -7.299270073
- Power change
- 0.700729927
A contact lens vertex calculator converts a spectacle-plane lens power into the equivalent dioptric power at the cornea after a vertex-distance change. When a lens is moved closer to the eye, plus prescriptions get stronger and minus prescriptions get weaker, so a high-power glasses Rx cannot be copied onto a contact lens without this correction. The closed formula is Fc equals F divided by one minus d times F, where F is the original power in diopters and d is the vertex distance in metres (millimetres divided by one thousand). This tool accepts the original lens power and a vertex distance in millimetres, rejects any non-finite input, and returns the corrected contact-lens power in diopters.
What vertex conversion means and why Fc equals F over one minus d F
Vertex distance is the gap between the back surface of a spectacle lens and the cornea. A contact lens sits on the tear film, so its optical plane is essentially at the cornea, typically twelve to fourteen millimetres closer than a trial frame or a finished pair of glasses. Optical power is not invariant under that translation.
If a thin lens of power F diopters is moved a distance d metres toward the eye, the equivalent power at the new plane is Fc equals F divided by one minus d times F. The millimetre reading used in clinic is converted to metres by dividing by one thousand before it enters the formula, so a twelve-millimetre vertex is d equals 0.012 m.
For plus lenses the denominator is smaller than one, so the contact lens must be stronger than the glasses: a ten-diopter hyperope at thirteen millimetres needs about 11.49 D. Those two directions are the whole clinical story behind vertex conversion and why copying a high-power spectacle Rx onto a contact lens is a mistake. The identity is the same first-order optics used in trial-frame refraction: effective power changes when the lens plane moves, even though the eye has not changed.
This calculator applies that identity only. It does not compensate for lens thickness, base curve, refractive index, or residual astigmatism, and it does not choose a brand or material. Treat the output as the equivalent spherical power at the new vertex, then apply your own rounding and cylinder rules in the fitting workflow that follows.
When vertex conversion matters
Optometry and dispensing classrooms use a vertex calculator so learners can check the spectacle-to-contact conversion without dropping a millimetre-to-metre factor or flipping the sign of a minus lens. Clinic worksheets and electronic fitting logs need a deterministic oracle that always applies Fc equals F over one minus d F, rather than a spreadsheet cell that silently turns a blank vertex into a copied Rx. Lens-ordering scripts and inventory tools convert a high-power glasses prescription into a starting spherical equivalent before quarter-diopter rounding and before cylinder is handled by the lab.
Prefer it when you already have a spectacle-plane power in diopters and a vertex in millimetres and only need the equivalent corneal-plane power. Convert centimetres to millimetres before calling if a textbook states vertex as 1.2 cm.
What you can do with it
Spectacle-to-contact fitting checks
Convert a high-power glasses Rx at a measured trial-frame vertex into the equivalent spherical contact-lens power before quarter-diopter rounding and ordering.
Lens-ordering and inventory scripts
Pipelines map a spectacle-plane power to a corneal-plane starting sphere with a deterministic parse step instead of an ad-hoc spreadsheet cell.
FAQ
Why is a minus contact lens weaker than the glasses Rx?
Moving a minus lens closer to the eye makes the denominator 1 − d F larger than one, so |Fc| is smaller than |F|. A typical −8.00 D spectacle at 12 mm is about −7.30 D at the cornea.
Why is a plus contact lens stronger than the glasses Rx?
Moving a plus lens closer to the eye shrinks the denominator, so Fc is larger than F. A +10.00 D spectacle at 13 mm is about +11.49 D at the cornea.
Which vertex distance should I enter?
The gap between the back surface of the spectacle lens and the cornea, in millimetres, typically 12 to 14 mm for glasses. A contact lens sits on the tear film, so its plane is essentially at the cornea.
Is the result rounded to quarter diopters?
No. You get the exact equivalent power, for example −7.30 D for a −8 D lens at 12 mm, which is usually ordered as −7.25 D. Apply your own rounding rules in the fitting step that follows.
Does it correct for astigmatism or lens thickness?
No. It gives the equivalent spherical power at the new vertex only. Lens thickness, base curve, refractive index and residual astigmatism are not included, and it does not choose a brand or material.
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/phys/contact-lens-vertex \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original_power":-8,"vertex_mm":12}'const res = await fetch("https://api.kit.forhosting.com/phys/contact-lens-vertex", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original_power": -8,
"vertex_mm": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/phys/contact-lens-vertex",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original_power": -8,
"vertex_mm": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/phys/contact-lens-vertex", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original_power":-8,"vertex_mm":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original_power":-8,"vertex_mm":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/phys/contact-lens-vertex", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"original_power": -8,
"vertex_mm": 12
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "phys.contact_lens_vertex",
"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
Failed validation is not billed; a successful call uses the published base price of $0.002.
What vertex conversion means and why Fc equals F over one minus d F
For minus lenses the denominator is larger than one, so the contact-lens power is weaker than the spectacle power: an eight-diopter myope at twelve millimetres needs about 7.30 D at the cornea, usually ordered as 7.25 D after quarter-diopter rounding.
Input contract, response shape, and error behaviour
A vertex of zero millimetres is valid and returns the original power unchanged, because the lens plane has not moved. A plano original power of zero is also valid and stays zero at any finite vertex. Send a JSON body with two required finite numbers: original_power in diopters (aliases power, lens_power, spectacle_power, and F) and vertex_mm in millimetres (aliases vertex_distance, vertex, vd, and d_mm). Each field may arrive as a JSON number or as a numeric string; missing fields, empty strings, non-numeric text, NaN, and infinities fail with invalid_input naming the field. The only extra hard failure is a vanishing denominator: when one minus d times F is exactly zero the equivalent power would be infinite, so the request is rejected instead of returning Infinity. On success the body echoes rounded original_power and vertex_mm, publishes vertex_m as the internal metre conversion, contact_power as the corrected diopters, result as an alias of contact_power, power_change as contact_power minus original_power, a formula string restating Fc equals F over one minus d F, and a units object that labels powers in D and vertex in mm. Example: original_power minus eight diopters at vertex_mm twelve yields contact_power about minus 7.299 D, because d is 0.012 m and the denominator is 1.096. Pricing is a flat $0.002 per successful request with unit item; failed validation does not consume prepaid balance.
Where a contact-lens vertex API earns its keep
Keep requests small, pin the rounded contact_power in tests, and you get reproducible diopters for homework, LMS plugins, and edge workers without standing up an optics library of your own.
Integration use cases
Optometry and dispensing homework
Let students submit original_power and vertex_mm and verify Fc = F / (1 − d F) against textbook vertex-conversion tables without a sign or unit error.
Technical questions
How do I convert spectacle power to contact-lens power with vertex distance?
Send original_power in diopters and vertex_mm in millimetres. The API returns Fc = F / (1 − d F) with d = vertex_mm / 1000 metres, as contact_power in diopters.
What happens if original_power or vertex_mm is not a finite number?
The task fails with invalid_input naming the field. Missing values, empty strings, NaN, and infinities are rejected and are not billed. A vanishing denominator (1 − d F = 0) is rejected the same way.
What does the contact lens vertex calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.