Быстрый старт
Запросите опубликованные времена плёнки в проявителе. Всё находится по адресу https://www.35mm.org/api/public/v1; ответы — JSON с ключами в snake_case и датами ISO 8601 в UTC.
curl "https://www.35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11"
Каждое время приходит с источником: его вид, название и адрес в том виде, в каком они хранятся. Если ничего не записано, поля равны null — ничего не подставляется. Отдаются только опубликованные данные: черновики, предложения и всё, что касается людей, — никогда.
Ключи
Анонимным запросам ничего не нужно. Для более высокого лимита запросите ключ API и отправляйте его как bearer-токен:
curl -H "Authorization: Bearer 35mm_…" "https://www.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
Плёнки от A до Z, у каждой — производитель, форматы и число опубликованных времён.
curl "https://www.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://www.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://www.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://www.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
Поиск опубликованных времён. Перемотка без собственных времён отвечает временами исходной плёнки с пометкой inherited_from.
curl "https://www.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 | Индекс экспозиции, при котором оценивалась плёнка. |
| 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 | Время в целых секундах и в виде м:сс. |
| ei, temperature_c | Индекс экспозиции и температура в °C, для которых указано время. |
| source | Всегда присутствует: type (manufacturer_datasheet, own_test, third_party, community), title и url в том виде, в каком они хранятся, — null, если ничего не записано. |
| confidence | verified, community, unverified или disputed: насколько время сверено с источником. |
| inherited_from | Slug исходной плёнки, если перемотка берёт её времена, иначе 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 с любого источника).
Ошибки
Ошибки имеют единый вид, с details для отклонённого параметра:
{
"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://www.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 плёнки и slug проявителя. |
| dilution, ei, temp | Сузьте до одного времени. Если не указано, показывается время при номинальной светочувствительности. |
| id | Или одно время по его id из API. |
| theme | light или dark. Если не указано, карточка следует цветовой схеме читателя. |
| lang | en, pl или uk. |
Если подходящего опубликованного времени нет, карточка сообщает об этом и ссылается на плёнку — приблизительное совпадение она не показывает никогда. Кнопка «Встроить» на любой странице «плёнка × проявитель» создаёт код за вас, с предпросмотром.
Мы считаем, как часто карточка показывается, по дням, по сайтам (по домену страницы, на которой она находится, и ничему длиннее) и по сочетаниям. Без cookie и адресов.