Перейти до вмісту

API

API даних 35mm.org.

Плівки, проявники та часи проявлення у форматі JSON — кожен час із технічним описом чи таблицею, звідки його взято. Лише для читання, а для початку ключ не потрібен.

Швидкий старт

Запитайте опубліковані часи плівки в проявнику. Усе доступне за адресою 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.
manufacturerSlug виробника, напр. ilford.
formatSlug формату, напр. 135 чи 120.
processПроцес: bw, c41, e6, ecn2 …
typeТип плівки: bw_negative, color_negative, color_reversal …
still_made1 для плівок, що досі виробляються, 0 для решти.
has_times1 для плівок з опублікованим часом, 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Пошук за назвою чи виробником.
manufacturerSlug виробника.
typeТип хімії: bw_developer, c41_kit, fixer …
still_made1 для тих, що досі виробляються, 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"
Параметри
ПараметрЗначення
filmSlug плівки.
developerSlug проявника.
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, якщо нічого не записано.
confidenceverified, community, unverified або disputed: наскільки час звірено з джерелом.
inherited_fromSlug материнської плівки, коли 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."] }
    }
}
Помилки
HTTPcodeЗначення
401invalid_api_keyКлюч хибний або скасований.
404not_foundНемає плівки чи проявника з таким slug.
405method_not_allowedAPI лише для читання: використовуйте GET.
422invalid_parameterПараметр має недопустиме значення.
429rate_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, developerSlug плівки та проявника.
dilution, ei, tempЗвузьте до одного часу. Без цього показуємо час для номінальної чутливості.
idАбо один час за його id з API.
themelight або dark. Без цього картка підлаштовується під колірну схему читача.
langen, pl або uk.

Якщо жоден опублікований час не підходить, картка повідомляє про це й веде до плівки — «майже відповідний» вона ніколи не показує. Кнопка «Вбудувати» на сторінці будь-якої пари плівка × проявник створить код із попереднім переглядом.

Ми рахуємо, як часто показується картка, — за днями, за сайтами (лише хост сторінки, нічого довшого) і за комбінаціями. Без cookie, без адрес.