---
title: Indoor Lighting Calculator
description: Estimate indoor fixture quantity, required lumens or maintained average illuminance. Compare outputs with explicit utilization and maintenance assumptions.
canonical: https://ledyi.com/tools/indoor-lighting-calculator
updatedAt: 2026-10-24T16:13:15Z
---

# Indoor Lighting Calculator

Estimate indoor fixture quantity, required lumens or maintained average illuminance. Compare outputs with explicit utilization and maintenance assumptions.

## For AI agents: instructions and calculation APIs

Read the tool instructions in Markdown and the request/response schemas in OpenAPI. These public calculation APIs run the same models as the web and offline calculators. No account, API key or Turnstile is required.

- [Indoor Lighting Calculator — Full tool instructions (Markdown)](https://ledyi.com/tools/indoor-lighting-calculator.md)
- [OpenAPI contract](https://ledyi.com/openapi.json)
- [Agent site index](https://ledyi.com/llms.txt)

Your agent needs an HTTP tool permitted to send POST requests. Reading this page or importing OpenAPI does not automatically grant execution access.

### Indoor Lighting Calculator

```
POST /api/tools/v1/indoor-lighting
Content-Type: application/json
```

Early sizing with the lumen method, using complete-luminaire output. The result is an average on the calculation plane, not a point-by-point photometric design. Natural light, uniformity, glare, fixture positions and compliance are excluded.

### Estimate fixture quantity

Supply areaM2, targetLux, lumensPerFixture, utilization and maintenance. All are required SI numbers. The example needs 12,500 lm and 13 fixtures, giving 312 lx maintained average. The supplied factors are engineering inputs, not verified room properties.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| areaM2 (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1000000} | Calculation area in square metres. API shares keep area-only geometry; no length or width is inferred. |
| targetLux (Required) | {"type":"number","exclusiveMinimum":0,"maximum":100000} | Target maintained average illuminance in lux. Task recommendations apply to their working plane, not automatically to an entire room. |
| utilization (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Fraction of complete-luminaire output reaching the calculation plane, above 0 and at most 1. Supply a suitable utilance value; lamp-based CU may use a different reference flux. |
| maintenance (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Maintained output relative to initial output, above 0 and at most 1; allows for aging and dirt. No automatic default. |
| lumensPerFixture (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1000000} | Lumens from one complete fixture after any lens or diffuser. Required for fixtures/check; forbidden for lumens. |
| operation (Required) | {"type":"string","const":"fixtures"} |  |

```
{
  "operation": "fixtures",
  "areaM2": 20,
  "targetLux": 300,
  "lumensPerFixture": 1000,
  "utilization": 0.6,
  "maintenance": 0.8
}
```

### Estimate total light output

Use operation=lumens when fixture output is unknown. Omit lumensPerFixture and count. requiredLumens is the complete-luminaire output needed before utilization and maintenance losses; all fixture-specific results are null.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| areaM2 (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1000000} | Calculation area in square metres. API shares keep area-only geometry; no length or width is inferred. |
| targetLux (Required) | {"type":"number","exclusiveMinimum":0,"maximum":100000} | Target maintained average illuminance in lux. Task recommendations apply to their working plane, not automatically to an entire room. |
| utilization (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Fraction of complete-luminaire output reaching the calculation plane, above 0 and at most 1. Supply a suitable utilance value; lamp-based CU may use a different reference flux. |
| maintenance (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Maintained output relative to initial output, above 0 and at most 1; allows for aging and dirt. No automatic default. |
| operation (Required) | {"type":"string","const":"lumens"} |  |

```
{
  "operation": "lumens",
  "areaM2": 20,
  "targetLux": 300,
  "utilization": 0.6,
  "maintenance": 0.8
}
```

### Check existing lighting

Use operation=check with a whole count, including zero. maintainedLux describes that installed count. requiredCount is the minimum quantity for the target and shortfallCount is the additional quantity, never negative. Twelve 1,000 lm fixtures in the example give 288 lx and need one more fixture.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| areaM2 (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1000000} | Calculation area in square metres. API shares keep area-only geometry; no length or width is inferred. |
| targetLux (Required) | {"type":"number","exclusiveMinimum":0,"maximum":100000} | Target maintained average illuminance in lux. Task recommendations apply to their working plane, not automatically to an entire room. |
| utilization (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Fraction of complete-luminaire output reaching the calculation plane, above 0 and at most 1. Supply a suitable utilance value; lamp-based CU may use a different reference flux. |
| maintenance (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1} | Maintained output relative to initial output, above 0 and at most 1; allows for aging and dirt. No automatic default. |
| lumensPerFixture (Required) | {"type":"number","exclusiveMinimum":0,"maximum":1000000} | Lumens from one complete fixture after any lens or diffuser. Required for fixtures/check; forbidden for lumens. |
| operation (Required) | {"type":"string","const":"check"} |  |
| count (Required) | {"type":"integer","minimum":0,"maximum":1000000} | Existing whole fixture count, including zero. Required only for check; forbidden for the other operations. |

```
{
  "operation": "check",
  "areaM2": 20,
  "targetLux": 300,
  "lumensPerFixture": 1000,
  "utilization": 0.6,
  "maintenance": 0.8,
  "count": 12
}
```

### Reading the result

Required lumens = targetLux × areaM2 / (utilization × maintenance). Required count = ceil(required lumens / lumensPerFixture). Installed lumens = count × lumensPerFixture. Initial average = installed lumens × utilization / areaM2; maintained average = initial average × maintenance. All decisions and conversions use exact decimal/rational arithmetic; JSON numbers are display projections.

result.ok=true means the calculation succeeded, not that the design meets regulations. meetsTarget compares the unrounded maintained average with the entered target. ratio can round to 1 while meetsTarget=false; preserve the boolean. fixtures uses the rounded-up count, check uses your installed count, lumens leaves fixture-specific values null. theoreticalCount is the unrounded count; requiredCount is the whole-fixture minimum.

Missing inputs, numeric strings, unknown fields, nonpositive quantities/factors, factors above 1, fractional/negative counts and inactive parameters return 422. Domain maxima are in the schemas. Finite inputs whose exact result cannot be represented safely also return 422. Never silently insert the browser example or round a decision down.

Open links.share to restore SI inputs as area-only geometry. The browser deliberately does not invent a room shape. Browser shares can also preserve supplied room dimensions and display units. Save CSV, print/PDF or download an offline HTML calculator. Use complete-fixture lumens after lenses/diffusers and utilization on that same basis; do not subtract optical losses twice. Request suitable photometric data and verify mounting, task plane, uniformity and glare separately. The offline endpoint is a browser download, not a calculation API.

### Request limits and errors

Every success carries apiVersion, a server-generated requestId, operation, normalized inputs, result, warnings and links (tool, markdown, openapi, share). requestId also appears in X-Request-Id. The domain result is deterministic; the request ID changes. Preserve warnings and special statuses when explaining results.

Send uncompressed application/json with strict types and no query parameters. Indoor lighting bodies are limited to 16 KiB; driver-match bodies to 16 KiB; battery bodies to 16 KiB; voltage bodies to 16 KiB; resistor bodies to 16 KiB; DMX bodies to 1024 KiB and 1000 fixtures; pixel bodies to 64 KiB, 64 run rows, 128 outputs and 2000000 channels. DALI bodies are limited to 64 KiB, 24 rows and 512 devices. Illuminance bodies are limited to 16 KiB and 400 planned points. Photometry bodies are limited to 1024 KiB with up to 4 files and 16 by 721 query directions per file. Lighting-cost bodies are limited to 64 KiB with up to 20 groups in each scenario. Body reading expires after 5 seconds. Complete success JSON is bounded to 4 MiB. GET/HEAD return 405; OPTIONS returns 204. Source responses are no-store. Anonymous browser CORS permits POST/OPTIONS and Content-Type with credentials omitted.

Tool POST requests and ordinary page requests share 120 requests per 60 seconds per IP/Cloudflare location; mitigation lasts 60 seconds. Heavy tool use can temporarily block pages from the same source. This is not an independent or globally exact API quota. Inquiry/search use their existing separate rule. Tool POST requests do not inherit the company-page or verified-bot exemption.

Source errors use application/problem+json with status, stable code, requestId and at most one invalidParams JSON pointer. 400: malformed JSON/query; 405: method; 408: body timeout; 413: body limit; 415: media/encoding; 422: parameter/domain error; 500/503: service failure. Fix invalid inputs rather than retrying or changing engineering facts. For 429 or transient failures, use at most two retries with backoff and jitter, honoring Retry-After when present.

Cloudflare can return 403/429/5xx before the application, sometimes as HTML without CORS or Retry-After. Check HTTP status and Content-Type before parsing JSON. A browser may see only a network error. Do not present an error or an older result as a successful new calculation.

Calculations do not create inquiries, send emails, call a language model or store project results. Operational logs exclude fixture labels, groups and request bodies. Existing network/access logs still apply. Submit a quotation request only when the user asks, using the separate inquiry contract and buyer confirmation flow.

### Warning codes

| Field | Meaning |
| --- | --- |
| INDOOR_AVERAGE_ONLY | Only average illuminance is estimated. Preserve this limitation with every result; matching the target is not a compliance or placement assessment. |

### Error codes

```
TOOLS_INVALID_JSON
TOOLS_QUERY_UNSUPPORTED
TOOLS_METHOD_NOT_ALLOWED
TOOLS_BODY_TIMEOUT
TOOLS_BODY_TOO_LARGE
TOOLS_MEDIA_TYPE_UNSUPPORTED
TOOLS_CONTENT_ENCODING_UNSUPPORTED
TOOLS_INPUT_INVALID
TOOLS_NUMERIC_DOMAIN_UNSUPPORTED
TOOLS_INTERNAL_ERROR
TOOLS_SERVICE_UNAVAILABLE
DMX_INPUT_INVALID
DMX_ADDRESS_NOT_ENCODABLE
DMX_CHANNEL_RANGE_EXCEEDED
DMX_SPACING_OVERLAP
DMX_UNIVERSE_RANGE_EXCEEDED
PHOTOMETRY_FILE_INVALID
PHOTOMETRY_FILE_UNSUPPORTED
PHOTOMETRY_LIMIT_EXCEEDED
```

