Enlarger exposure by magnification
API · /darkroom-api
Darkroom API
Analog darkroom and film maths as an API, computed locally and deterministically — the three corrections that bite when you develop film and make prints by hand. The reciprocity endpoint corrects long exposures for reciprocity failure, where film loses sensitivity past about a second: corrected time = metered^p (Schwarzschild p ≈ 1.3 for many films, settable per datasheet), so a metered 10-second exposure really wants about 20 seconds, a full stop more, while anything under the threshold is left untouched. The printexposure endpoint adjusts enlarger exposure when you change print size — light spreads as you raise the head, so exposure is proportional to (magnification + 1)², where magnification is print size ÷ negative size: going from 2× to 4× magnification turns a 10-second exposure into 27.8 seconds, about 1.5 stops, ready for f-stop printing. The pushpull endpoint scales development time for pushing or pulling film by N stops — time = base × factor^stops, roughly +40 % per stop pushed — turning a 7-minute base into 13.7 minutes at +2 stops, or 5 minutes pulled a stop. Everything is computed locally and deterministically, so it is instant and private. Ideal for film-photography and darkroom apps, light-meter and timer companions, lab and workshop tools, and analog-photography sites. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 compute endpoints. For digital depth-of-field use a photography API; for lab molarity use a dilution API.
API health
healthy- Uptime
- 100.00%
- Server probes · 24h
- Avg latency
- 80 ms
- Server probes · 24h
- Subscribers
- 3,029
- active
- Total calls
- 0
- last 7 days
Pricing
Pick a tier — billed monthly, cancel anytime.
Free
Free
- 400 calls / month
- 2 requests / second
- Hard cap (429 above quota, no overage)
- 400 calls/month
- 2 req/sec
- Reciprocity + enlarger + push/pull
- No credit card
Starter
€4.60 /month
- 11,000 calls / month
- 6 requests / second
- Hard cap (429 above quota, no overage)
- 11,000 calls/month
- 6 req/sec
- f-stop printing, any film
- Email support
Pro
€16.10 /month
- 72,000 calls / month
- 15 requests / second
- Hard cap (429 above quota, no overage)
- 72,000 calls/month
- 15 req/sec
- App & timer integrations
- Priority support
Mega
€48.80 /month
- 240,000 calls / month
- 36 requests / second
- Hard cap (429 above quota, no overage)
- 240,000 calls/month
- 36 req/sec
- Platform scale
- Dedicated SLA
Built by
Related APIs
Other APIs with overlapping tags.
Window Tint API
Window-tint maths as an API, computed locally and deterministically — the net VLT numbers an installer or car owner picks a film by. The catch with tint is that visible light transmission multiplies through layers: factory automotive glass already passes only about 70–80 % of light, so a film’s rated VLT is not what you end up with. The vlt endpoint multiplies it out — net % = the product of each layer’s VLT ÷ 100 — so a 35 % film on 78 % factory glass nets 27.3 %, a 5 % limo film on the same glass nets 3.9 %, and you can stack several layers in one call; it also describes how dark that looks, from near-clear down to blackout. The required endpoint runs it backwards: to land on a target net VLT through known glass you need a film of target ÷ glass × 100, so hitting a 35 % net on 78 % glass takes a 44.9 % film — and it flags the impossible case where the target is lighter than the bare glass already allows. Everything is computed locally and deterministically, so it is instant and private. Ideal for auto-tint, detailing, glass and automotive app developers, film-selection and compliance tools, and shop software. Pure local computation — no key, no third-party service, instant. Legal limits vary by jurisdiction — check local law. Live, nothing stored. 2 compute endpoints.
api.oanor.com/windowtint-api
Photography Calculator API
Camera and optics maths as an API. The depth-of-field endpoint computes the near and far limits of sharp focus, the total depth of field and the hyperfocal distance from a focal length, aperture and focus distance, using the circle of confusion for your sensor format — full-frame, APS-C, Micro Four Thirds, 1-inch, medium format, Super 35 and more, or your own value. The field-of-view endpoint gives the horizontal, vertical and diagonal angle of view for a focal length on a given sensor, plus the crop factor and the 35 mm-equivalent focal length. The exposure endpoint computes the exposure value (EV) from aperture, shutter speed and ISO, and can also solve for the shutter speed or aperture that hits a target EV. Everything is computed locally and deterministically, so it is instant and private. Ideal for photography and videography apps, camera and lens tools, focus-stacking and landscape planning, and teaching exposure and optics. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 4 endpoints. This computes camera optics; for reading EXIF metadata from photo files use an EXIF API.
api.oanor.com/photography-api
EXIF API
Extract the hidden metadata baked into a photo. Pass an image URL (we fetch it) or a base64 image and get back its EXIF, GPS, IPTC and XMP data: the camera make and model, lens, software, the capture date/time, full exposure settings (shutter speed, aperture / f-number, ISO, focal length, flash, metering and white balance), orientation, colour space and resolution, plus the GPS location (latitude, longitude, altitude) with a ready Google Maps link — and the complete raw tag map. A dedicated /v1/gps endpoint returns just the geotag. Supports JPEG, TIFF, HEIC and PNG. Parsing runs locally (no third-party service) and nothing is stored. Live. 3 endpoints. Built for photo-management apps, geotagging, digital forensics, copyright/credit checks and image pipelines. Distinct from a basic image-info or resize service. No upstream key.
api.oanor.com/exif-api
Chimney & Flue API
Chimney and flue sizing maths as an API, computed locally and deterministically — the draft and dimension numbers a stove installer, sweep or builder runs so a fire pulls cleanly and safely. The flue-size endpoint gives the minimum flue cross-section for a fireplace opening: at least a tenth of the opening area for a square or rectangular liner, a twelfth for a round one (which draws better) — a 36 × 30 inch opening needs about 108 square inches of rectangular flue, or a 10.7-inch round. The draft endpoint gives the theoretical draft from the stack effect, ΔP ≈ 3465 × height × (1/T_outside − 1/T_flue) with temperatures in kelvin, so a 6-metre chimney with 200 °C flue gas on a freezing day pulls about 32 pascals (0.13 inches of water column) — taller and hotter draws harder. The height endpoint applies the 3-2-10 rule: a chimney must finish at least 3 feet above where it pierces the roof and at least 2 feet above anything within 10 feet, whichever is higher. Everything is computed locally and deterministically, so it is instant and private. Ideal for hearth and stove-installer apps, chimney-sweep and inspection tools, building-design calculators, and DIY-safety sites. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 compute endpoints. Educational estimates — verify against your appliance listing and adopted code.
api.oanor.com/chimney-api
Frequently asked questions
Quick answers about pricing, quotas, and integration.
How do I get an API key for Darkroom API?
What's the rate limit for Darkroom API?
How much does Darkroom API cost?
Can I cancel my subscription anytime?
Is Darkroom API GDPR-compliant?
Pick an endpoint from the list on the left to see its details and try it.
Code snippets
Sign up to get an API key, then call any path under your slug.
curl https://api.oanor.com/darkroom-api/SOME_PATH \
-H "x-oanor-key: oanor_test_..."
const res = await fetch("https://api.oanor.com/darkroom-api/SOME_PATH", {
headers: { "x-oanor-key": "oanor_test_..." }
});
const data = await res.json();
$ch = curl_init("https://api.oanor.com/darkroom-api/SOME_PATH");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-oanor-key: oanor_test_..."]);
$response = curl_exec($ch);
import requests
r = requests.get(
"https://api.oanor.com/darkroom-api/SOME_PATH",
headers={"x-oanor-key": "oanor_test_..."},
)
print(r.json())
Ratings
Sign in to rate.
No reviews yet.
Discussion
Ask questions, share usage tips, get answers from the provider and other developers. Public — anyone can read.
Sign in to start a thread or reply.
Sign inNew thread
·
-
Provider answer
🔒 This thread is locked — no new replies.
-
·
- No threads yet — start the discussion.
Support
Private 1:1 support with the provider — billing questions, integration issues, account problems. Only you and the provider team can see these threads.
Sign in to open a support ticket.
Sign inOpen new ticket
Describe what you need help with. The provider team gets an email and replies on the ticket page.
-
·
Urgent - No tickets yet for this API.