Швидкий старт
Запитайте опубліковані часи плівки в проявнику. Усе доступне за адресою https://35mm.org/api/public/v1; відповіді — це JSON із ключами в snake_case і датами ISO 8601 у UTC.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11"
Кожен час має джерело: його тип, назву й адресу так, як їх збережено. Якщо нічого не записано, поля мають значення null — нічого не домислюємо. Віддаємо лише опубліковані дані: ніколи чернеток, пропозицій чи будь-чого, що стосується людей.
Ключі
Анонімні запити нічого не потребують. Щоб мати вищий ліміт, попросіть ключ API й надсилайте його як токен Bearer:
curl -H "Authorization: Bearer 35mm_…" "https://35mm.org/api/public/v1/films"
На хибний або скасований ключ ми відповідаємо кодом 401 — його ніколи мовчки не вважають анонімним запитом. Ключі призначені для серверів і програм: не розміщуйте його на вебсторінці, де його може прочитати будь-хто.
Ключі ми видаємо вручну, на прохання.
Ліміти запитів
- Без ключа: 60 запитів на хвилину з однієї адреси.
- З ключем: власний ліміт ключа, 600 на хвилину, якщо не домовлено інакше.
- Після перевищення ліміту відповідь має код 429 із заголовком Retry-After (скільки секунд чекати). Кожна відповідь містить X-RateLimit-Limit і X-RateLimit-Remaining.
Адреси ми лічимо в кеші й ніколи не зберігаємо. Використання ключа рахуємо за днями — це лише число.
Зазначення авторства
Кожна відповідь містить об’єкт attribution. Просимо давати посилання на 35mm.org скрізь, де ви показуєте наші дані — поле url плівки, проявника чи часу веде на його сторінку, — і показувати біля кожного часу його джерело: час проявлення без джерела — лише число.
Для даних ще не визначено ліцензії. Дайте посилання на нас, показуйте біля кожного часу його джерело, а якщо є сумніви — запитайте.
Ендпоінти
Усі вони — запити GET. Наведені нижче приклади — справжні відповіді для невеликого тестового каталогу, а не робочі дані.
GET /films
Плівки від А до Я, кожна з виробником, форматами та кількістю опублікованих часів.
curl "https://35mm.org/api/public/v1/films?manufacturer=ilford"
| Параметр | Значення |
|---|---|
| q | Пошук за назвою чи виробником без урахування розділових знаків: hp5, ilford hp5. |
| manufacturer | Slug виробника, напр. ilford. |
| format | Slug формату, напр. 135 чи 120. |
| process | Процес: bw, c41, e6, ecn2 … |
| type | Тип плівки: bw_negative, color_negative, color_reversal … |
| still_made | 1 для плівок, що досі виробляються, 0 для решти. |
| has_times | 1 для плівок з опублікованим часом, 0 для тих, що його не мають. |
| page, per_page | Див. нижче про посторінкове виведення. |
Приклад відповіді
{
"data": [
{
"id": 101,
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"full_name": "Ilford HP5 Plus",
"manufacturer": {
"slug": "ilford",
"name": "Ilford"
},
"iso": 400,
"type": "bw_negative",
"process": "bw",
"is_chromogenic_bw": false,
"status": "in_production",
"still_made": true,
"formats": [
{
"slug": "135",
"name": "35mm (135)"
}
],
"respool_of": null,
"published_times_count": 2,
"url": "https://35mm.org/film/ilford-hp5-plus",
"api_url": "https://35mm.org/api/public/v1/films/ilford-hp5-plus",
"updated_at": "2026-10-01T12:00:00Z"
}
],
"links": {
"first": "https://35mm.org/api/public/v1/films?manufacturer=ilford&page=1",
"last": "https://35mm.org/api/public/v1/films?manufacturer=ilford&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 50,
"from": 1,
"to": 1,
"total": 1
},
"attribution": {
"text": "Data from 35mm.org — each time with its source. Please link back to 35mm.org.",
"url": "https://35mm.org"
}
}
GET /films/{slug}
Одна плівка з характеристиками та всіма опублікованими часами проявлення.
curl "https://35mm.org/api/public/v1/films/ilford-hp5-plus"
Приклад відповіді
{
"data": {
"id": 101,
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"full_name": "Ilford HP5 Plus",
"manufacturer": {
"slug": "ilford",
"name": "Ilford"
},
"iso": 400,
"type": "bw_negative",
"process": "bw",
"is_chromogenic_bw": false,
"status": "in_production",
"still_made": true,
"formats": [
{
"slug": "135",
"name": "35mm (135)"
}
],
"respool_of": null,
"published_times_count": 2,
"url": "https://35mm.org/film/ilford-hp5-plus",
"api_url": "https://35mm.org/api/public/v1/films/ilford-hp5-plus",
"updated_at": "2026-10-01T12:00:00Z",
"base": null,
"emulsion_type": null,
"spectral_sensitivity": null,
"has_remjet": false,
"first_released_year": 1989,
"discontinued_year": null,
"grain_rms": 14.0,
"resolving_power_lpmm": null,
"dmax": null,
"latitude_stops_under": null,
"latitude_stops_over": null,
"datasheet_url": null,
"image_url": null,
"development_times": [
{
"id": 501,
"film": {
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"url": "https://35mm.org/film/ilford-hp5-plus"
},
"developer": {
"slug": "ilford-id-11",
"name": "ID-11",
"url": "https://35mm.org/developer/ilford-id-11"
},
"dilution": {
"label": "Stock",
"is_stock": true
},
"format": "any",
"ei": 400,
"temperature_c": 20.0,
"time_seconds": 450,
"time": "7:30",
"agitation": "10 s at the start, then 10 s every minute",
"process_type": "tank",
"confidence": "verified",
"notes": "Tank, 10 s initial agitation.",
"source": {
"type": "manufacturer_datasheet",
"title": "ILFORD HP5 PLUS technical information, 2023",
"url": "https://example.com/ilford-hp5-plus-datasheet.pdf"
},
"inherited_from": null,
"url": "https://35mm.org/film/ilford-hp5-plus/developed-in/ilford-id-11",
"updated_at": "2026-10-01T12:00:00Z"
},
{
"id": 502,
"film": {
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"url": "https://35mm.org/film/ilford-hp5-plus"
},
"developer": {
"slug": "ilford-id-11",
"name": "ID-11",
"url": "https://35mm.org/developer/ilford-id-11"
},
"dilution": {
"label": "1+1",
"is_stock": false
},
"format": "any",
"ei": 800,
"temperature_c": 20.0,
"time_seconds": 600,
"time": "10:00",
"agitation": null,
"process_type": "tank",
"confidence": "community",
"notes": null,
"source": {
"type": "community",
"title": null,
"url": null
},
"inherited_from": null,
"url": "https://35mm.org/film/ilford-hp5-plus/developed-in/ilford-id-11",
"updated_at": "2026-10-01T12:00:00Z"
}
]
},
"attribution": {
"text": "Data from 35mm.org — each time with its source. Please link back to 35mm.org.",
"url": "https://35mm.org"
}
}
GET /developers
Проявники та інша хімія.
curl "https://35mm.org/api/public/v1/developers?manufacturer=ilford"
| Параметр | Значення |
|---|---|
| q | Пошук за назвою чи виробником. |
| manufacturer | Slug виробника. |
| type | Тип хімії: bw_developer, c41_kit, fixer … |
| still_made | 1 для тих, що досі виробляються, 0 для решти. |
| page, per_page | Див. нижче про посторінкове виведення. |
Приклад відповіді
{
"data": [
{
"id": 201,
"slug": "ilford-id-11",
"name": "ID-11",
"full_name": "Ilford ID-11",
"manufacturer": {
"slug": "ilford",
"name": "Ilford"
},
"type": "bw_developer",
"form": "powder",
"status": "in_production",
"still_made": true,
"reuse": "depends",
"is_one_shot": false,
"is_replenishable": null,
"reuse_source": {
"title": "ILFORD PERCEPTOL, ID-11 AND MICROPHEN FILM DEVELOPERS",
"url": "https://www.ilfordphoto.com/wp/wp-content/uploads/2024/09/ILFORD-POWDER-CHEM-190824.pdf"
},
"published_times_count": 2,
"url": "https://35mm.org/developer/ilford-id-11",
"api_url": "https://35mm.org/api/public/v1/developers/ilford-id-11",
"updated_at": "2026-10-01T12:00:00Z"
}
],
"links": {
"first": "https://35mm.org/api/public/v1/developers?manufacturer=ilford&page=1",
"last": "https://35mm.org/api/public/v1/developers?manufacturer=ilford&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 50,
"from": 1,
"to": 1,
"total": 1
},
"attribution": {
"text": "Data from 35mm.org — each time with its source. Please link back to 35mm.org.",
"url": "https://35mm.org"
}
}
GET /developers/{slug}
Один проявник із розведеннями та плівками, для яких у нього є опубліковані часи.
curl "https://35mm.org/api/public/v1/developers/ilford-id-11"
Приклад відповіді
{
"data": {
"id": 201,
"slug": "ilford-id-11",
"name": "ID-11",
"full_name": "Ilford ID-11",
"manufacturer": {
"slug": "ilford",
"name": "Ilford"
},
"type": "bw_developer",
"form": "powder",
"status": "in_production",
"still_made": true,
"reuse": "depends",
"is_one_shot": false,
"is_replenishable": null,
"reuse_source": {
"title": "ILFORD PERCEPTOL, ID-11 AND MICROPHEN FILM DEVELOPERS",
"url": "https://www.ilfordphoto.com/wp/wp-content/uploads/2024/09/ILFORD-POWDER-CHEM-190824.pdf"
},
"published_times_count": 2,
"url": "https://35mm.org/developer/ilford-id-11",
"api_url": "https://35mm.org/api/public/v1/developers/ilford-id-11",
"updated_at": "2026-10-01T12:00:00Z",
"shelf_life_unopened_months": 24,
"shelf_life_opened_months": 3,
"capacity_rolls_per_litre": 10.0,
"datasheet_url": null,
"dilutions": [
{
"label": "Stock",
"is_stock": true,
"parts_developer": 1.0,
"parts_water": 0.0
},
{
"label": "1+1",
"is_stock": false,
"parts_developer": 1.0,
"parts_water": 1.0
}
],
"films": [
{
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"published_times_count": 2,
"times_url": "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11"
}
]
},
"attribution": {
"text": "Data from 35mm.org — each time with its source. Please link back to 35mm.org.",
"url": "https://35mm.org"
}
}
GET /development-times
Пошук опублікованих часів. Перепакована плівка (respool) без власних часів відповідає часами материнської плівки, позначеними в полі inherited_from.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11&ei=400"
| Параметр | Значення |
|---|---|
| film | Slug плівки. |
| developer | Slug проявника. |
| dilution | Позначення розведення так, як його опубліковано: Stock, 1+1 … |
| ei | Робоча чутливість (EI), на яку експоновано плівку. |
| temperature | Температура в °C. |
| format | Формат, для якого вказано час: 135, 120, sheet або any. |
| page, per_page | Див. нижче про посторінкове виведення. |
Приклад відповіді
{
"data": [
{
"id": 501,
"film": {
"slug": "ilford-hp5-plus",
"name": "HP5 Plus",
"url": "https://35mm.org/film/ilford-hp5-plus"
},
"developer": {
"slug": "ilford-id-11",
"name": "ID-11",
"url": "https://35mm.org/developer/ilford-id-11"
},
"dilution": {
"label": "Stock",
"is_stock": true
},
"format": "any",
"ei": 400,
"temperature_c": 20.0,
"time_seconds": 450,
"time": "7:30",
"agitation": "10 s at the start, then 10 s every minute",
"process_type": "tank",
"confidence": "verified",
"notes": "Tank, 10 s initial agitation.",
"source": {
"type": "manufacturer_datasheet",
"title": "ILFORD HP5 PLUS technical information, 2023",
"url": "https://example.com/ilford-hp5-plus-datasheet.pdf"
},
"inherited_from": null,
"url": "https://35mm.org/film/ilford-hp5-plus/developed-in/ilford-id-11",
"updated_at": "2026-10-01T12:00:00Z"
}
],
"links": {
"first": "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11&ei=400&page=1",
"last": "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11&ei=400&page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 50,
"from": 1,
"to": 1,
"total": 1
},
"attribution": {
"text": "Data from 35mm.org — each time with its source. Please link back to 35mm.org.",
"url": "https://35mm.org"
}
}
Час проявлення
| Поле | Значення |
|---|---|
| time_seconds, time | Час у цілих секундах і у вигляді m:ss. |
| ei, temperature_c | Робоча чутливість (EI) і температура в °C, для яких вказано час. |
| source | Завжди присутнє: тип (manufacturer_datasheet, own_test, third_party, community), назва й адреса так, як їх збережено, — null, якщо нічого не записано. |
| confidence | verified, community, unverified або disputed: наскільки час звірено з джерелом. |
| inherited_from | Slug материнської плівки, коли respool переймає її часи; інакше null. |
Посторінкове виведення
Списки розбито на сторінки параметрами page і per_page (типово 50, щонайбільше 100). Поле links містить адреси first, last, prev і next — null, якщо їх немає, — а meta: current_page, last_page, per_page, from, to і total. Переходьте за links.next, доки не отримаєте null.
Кешування
Відповіді мають заголовки ETag, Last-Modified і Cache-Control: public, max-age=300. Надішліть ETag назад у If-None-Match — і незмінена відповідь повернеться як 304 без тіла; вона все одно враховується як запит. Будь ласка, кешуйте й у себе: каталог змінюється не щохвилини.
Браузери на будь-якому сайті можуть читати ці адреси (CORS: GET з будь-якого джерела).
Помилки
Помилки мають єдиний вигляд, а для відхиленого параметра ще й подробиці:
{
"error": {
"code": "invalid_parameter",
"message": "One or more parameters are not valid.",
"details": { "per_page": ["The per page field must not be greater than 100."] }
}
}
| HTTP | code | Значення |
|---|---|---|
| 401 | invalid_api_key | Ключ хибний або скасований. |
| 404 | not_found | Немає плівки чи проявника з таким slug. |
| 405 | method_not_allowed | API лише для читання: використовуйте GET. |
| 422 | invalid_parameter | Параметр має недопустиме значення. |
| 429 | rate_limited | Забагато запитів: зачекайте стільки секунд, скільки вказано в Retry-After, або попросіть ключ. |
OpenAPI
Усе API описано у файлі OpenAPI 3.1: /api/public/v1/openapi.json. Імпортуйте його в Postman, Insomnia або генератор коду.
Вбудуйте картку з часом
Блоги та форуми можуть показати один час проявлення як невелику картку: плівка, проявник, розведення, чутливість, температура, час і його джерело, з посиланням на 35mm.org. Це проста сторінка — без cookie, без скриптів, без нічого, що завантажується з інших сайтів, — створена для вбудовування у фрейм.
<iframe src="https://35mm.org/embed/time?film=ilford-hp5-plus&developer=ilford-id-11&dilution=Stock&ei=400&temp=20" width="100%" height="214" style="border:0;max-width:440px" loading="lazy" title="HP5 Plus in ID-11 — 35mm.org"></iframe>
| Параметр | Значення |
|---|---|
| film, developer | Slug плівки та проявника. |
| dilution, ei, temp | Звузьте до одного часу. Без цього показуємо час для номінальної чутливості. |
| id | Або один час за його id з API. |
| theme | light або dark. Без цього картка підлаштовується під колірну схему читача. |
| lang | en, pl або uk. |
Якщо жоден опублікований час не підходить, картка повідомляє про це й веде до плівки — «майже відповідний» вона ніколи не показує. Кнопка «Вбудувати» на сторінці будь-якої пари плівка × проявник створить код із попереднім переглядом.
Ми рахуємо, як часто показується картка, — за днями, за сайтами (лише хост сторінки, нічого довшого) і за комбінаціями. Без cookie, без адрес.