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
- 73 ms
- Server probes · 24h
- Subscribers
- 3,029
- active
- Total calls
- 80
- 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.
Letterboxd API
Live Letterboxd film-diary data as an API — Letterboxd is the social network for film lovers, and this returns any member's public diary and ratings from their RSS feed. The diary endpoint lists the films a member has recently watched, each with its title, year, the member's star rating, the date watched, whether it was a rewatch, a review excerpt and the film link. The stats endpoint computes a summary of their recent watching: the number of films, their average rating, the full rating distribution, the rewatch rate and the highest-rated film. The film-social and watch-activity layer for film, social and dashboard apps. Live, no key, no cache. Distinct from TV-listings and movie-catalogue APIs — this is a Letterboxd member's own diary and ratings.
api.oanor.com/letterboxd-api
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
Flickr Photos API
Live public photo streams from Flickr, the original photo-sharing community, served from Flickr's open public feeds — no key, nothing cached. Flickr has hosted billions of photos from photographers, museums and agencies for two decades. The recent endpoint returns the newest public photos uploaded across all of Flickr right now, each with its title, photographer, capture and publish dates, tags and ready-to-use image URLs at several sizes. The tag endpoint returns the newest public photos for one or more tags — sunset, wildlife, street — the hashtag feed of Flickr, with a match-any or match-all mode. The user endpoint returns a photographer's most recent public photostream by their Flickr ID; institutions like NASA on The Commons publish here. Every photo comes back cleaned up: the photographer name pulled out of the raw author field, machine tags filtered away from human tags, and the static image URL expanded into square, small, medium and large variants plus a link to the photo page. Everything is live from Flickr's public feeds, nothing stored. This is the Flickr photo-discovery layer for any gallery, wallpaper, photography, moodboard or social app. Distinct from Pixelfed and mainstream social-network APIs — this is Flickr's public photo stream by recency, tag and user. Feeds return the 20 most recent public photos per query. 3 endpoints, no key on our side.
api.oanor.com/flickr-api
Time-lapse API
Time-lapse photography maths as an API, computed locally and deterministically — the clip-length, interval and storage numbers a photographer, filmmaker or camera app plans a sequence with. The clip-length endpoint trades a long shoot for a short clip: the frames captured = the shoot duration ÷ the interval, and the clip length = those frames ÷ the playback frame rate — shooting for 60 minutes at one frame every 5 seconds gives 720 frames, and at 24 fps that plays back in 30 seconds, a 120× speed-up. Longer intervals compress time harder but can stutter on fast motion. The interval endpoint works backwards from a target clip: the frames needed = the target clip length × the frame rate, and the interval = the shoot duration ÷ those frames, so a 60-minute shoot for a 20-second clip at 24 fps needs 480 frames, one every 7.5 seconds. The storage endpoint sizes the card and disk: total storage = the frame count × the size of one frame, and because time-lapse shoots full-resolution stills (RAW ~20–30 MB each), 720 RAW frames at 25 MB is about 18 GB for a single 30-second clip — which is why a long lapse eats cards fast. Everything is computed locally and deterministically, so it is instant and private. Ideal for time-lapse and intervalometer apps, photography-planning tools, and production calculators. Pure local computation — no key, no third-party service, instant. 3 compute endpoints. For video bitrate and file size use a bitrate API.
api.oanor.com/timelapse-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.