Szybki start
Zapytaj o opublikowane czasy filmu w wywoływaczu. Wszystko jest pod adresem https://35mm.org/api/public/v1; odpowiedzi to JSON z kluczami w snake_case i datami ISO 8601 w UTC.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11"
Każdy czas ma swoje źródło: jego rodzaj, tytuł i adres tak, jak je zapisano. Gdy nic nie zapisano, pola mają wartość null — niczego nie uzupełniamy. Udostępniamy tylko opublikowane dane: nigdy wersji roboczych, zgłoszeń ani niczego, co dotyczy osób.
Klucze
Zapytania anonimowe nie wymagają niczego. Aby mieć wyższy limit, poproś o klucz API i wysyłaj go jako token Bearer:
curl -H "Authorization: Bearer 35mm_…" "https://35mm.org/api/public/v1/films"
Na błędny lub unieważniony klucz odpowiadamy kodem 401 — nigdy nie traktujemy go po cichu jak zapytania anonimowego. Klucze są dla serwerów i narzędzi: nie umieszczaj go na stronie, gdzie każdy może go odczytać.
Klucze wydajemy ręcznie, na prośbę.
Limity zapytań
- Bez klucza: 60 zapytań na minutę z jednego adresu.
- Z kluczem: własny limit klucza, 600 na minutę, o ile nie ustalono inaczej.
- Po przekroczeniu limitu odpowiadamy kodem 429 z nagłówkiem Retry-After (liczba sekund oczekiwania). Każda odpowiedź zawiera X-RateLimit-Limit i X-RateLimit-Remaining.
Adresy liczymy w pamięci podręcznej i nigdy ich nie zapisujemy. Użycie klucza liczymy dziennie — to tylko liczba.
Źródło danych
Każda odpowiedź zawiera obiekt attribution. Prosimy o odnośnik do 35mm.org wszędzie tam, gdzie pokazujesz nasze dane — pole url filmu, wywoływacza lub czasu wskazuje jego stronę — oraz o pokazywanie przy każdym czasie jego źródła: czas wywoływania bez źródła to tylko liczba.
Dane nie mają jeszcze określonej licencji. Dodaj odnośnik do nas, pokazuj przy każdym czasie jego źródło, a jeśli masz wątpliwości — zapytaj.
Punkty końcowe
Wszystkie to zapytania GET. Poniższe przykłady to prawdziwe odpowiedzi dla małego katalogu testowego, a nie dane produkcyjne.
GET /films
Filmy od A do Z, każdy z producentem, formatami i liczbą opublikowanych czasów.
curl "https://35mm.org/api/public/v1/films?manufacturer=ilford"
| Parametr | Znaczenie |
|---|---|
| q | Szukaj w nazwie lub producencie, pomijając znaki interpunkcyjne: hp5, ilford hp5. |
| manufacturer | Slug producenta, np. ilford. |
| format | Slug formatu, np. 135 lub 120. |
| process | Proces: bw, c41, e6, ecn2 … |
| type | Rodzaj filmu: bw_negative, color_negative, color_reversal … |
| still_made | 1 dla filmów wciąż produkowanych, 0 dla pozostałych. |
| has_times | 1 dla filmów z opublikowanym czasem, 0 dla tych bez czasu. |
| page, per_page | Zobacz stronicowanie poniżej. |
Przykładowa odpowiedź
{
"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}
Jeden film ze specyfikacją i wszystkimi opublikowanymi czasami wywoływania.
curl "https://35mm.org/api/public/v1/films/ilford-hp5-plus"
Przykładowa odpowiedź
{
"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
Wywoływacze i inna chemia.
curl "https://35mm.org/api/public/v1/developers?manufacturer=ilford"
| Parametr | Znaczenie |
|---|---|
| q | Szukaj w nazwie lub producencie. |
| manufacturer | Slug producenta. |
| type | Rodzaj chemii: bw_developer, c41_kit, fixer … |
| still_made | 1 dla wciąż produkowanych, 0 dla pozostałych. |
| page, per_page | Zobacz stronicowanie poniżej. |
Przykładowa odpowiedź
{
"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}
Jeden wywoływacz z rozcieńczeniami i filmami, dla których ma opublikowane czasy.
curl "https://35mm.org/api/public/v1/developers/ilford-id-11"
Przykładowa odpowiedź
{
"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
Wyszukiwanie opublikowanych czasów. Film przepakowany (respool) bez własnych czasów odpowiada czasami filmu macierzystego, oznaczonymi w polu inherited_from.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11&ei=400"
| Parametr | Znaczenie |
|---|---|
| film | Slug filmu. |
| developer | Slug wywoływacza. |
| dilution | Oznaczenie rozcieńczenia tak, jak je opublikowano: Stock, 1+1 … |
| ei | Czułość robocza (EI), na jaką naświetlono film. |
| temperature | Temperatura w °C. |
| format | Format, dla którego podano czas: 135, 120, sheet lub any. |
| page, per_page | Zobacz stronicowanie poniżej. |
Przykładowa odpowiedź
{
"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"
}
}
Czas wywoływania
| Pole | Znaczenie |
|---|---|
| time_seconds, time | Czas w pełnych sekundach oraz jako m:ss. |
| ei, temperature_c | Czułość robocza (EI) i temperatura w °C, dla których podano czas. |
| source | Zawsze obecne: rodzaj (manufacturer_datasheet, own_test, third_party, community), tytuł i adres tak, jak je zapisano — null, gdy nic nie zapisano. |
| confidence | verified, community, unverified lub disputed: w jakim stopniu czas sprawdzono ze źródłem. |
| inherited_from | Slug filmu macierzystego, gdy respool przejmuje jego czasy; w przeciwnym razie null. |
Stronicowanie
Listy są stronicowane parametrami page i per_page (domyślnie 50, najwyżej 100). Pole links zawiera adresy first, last, prev i next — null, gdy ich brak — a meta: current_page, last_page, per_page, from, to i total. Podążaj za links.next, aż będzie null.
Pamięć podręczna
Odpowiedzi mają nagłówki ETag, Last-Modified i Cache-Control: public, max-age=300. Odeślij ETag w If-None-Match, a niezmieniona odpowiedź wróci jako 304 bez treści — nadal liczy się jako zapytanie. Prosimy też o własne buforowanie: katalog nie zmienia się co minutę.
Przeglądarki na dowolnej stronie mogą odczytywać te adresy (CORS: GET z dowolnego źródła).
Błędy
Błędy mają jeden kształt, a przy odrzuconym parametrze także szczegóły:
{
"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 | Znaczenie |
|---|---|---|
| 401 | invalid_api_key | Klucz jest błędny lub został unieważniony. |
| 404 | not_found | Nie ma filmu ani wywoływacza o tym slugu. |
| 405 | method_not_allowed | API jest tylko do odczytu: używaj GET. |
| 422 | invalid_parameter | Parametr ma niedozwoloną wartość. |
| 429 | rate_limited | Za dużo zapytań: poczekaj tyle sekund, ile podano w Retry-After, lub poproś o klucz. |
OpenAPI
Całe API opisuje plik OpenAPI 3.1: /api/public/v1/openapi.json. Zaimportuj go do Postmana, Insomnii lub generatora kodu.
Osadź kartę z czasem
Blogi i fora mogą pokazać jeden czas wywoływania jako małą kartę: film, wywoływacz, rozcieńczenie, czułość, temperaturę, czas i jego źródło, z odnośnikiem do 35mm.org. To zwykła strona — bez ciasteczek, bez skryptów, bez niczego ładowanego z innych witryn — przygotowana do osadzenia w ramce.
<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>
| Parametr | Znaczenie |
|---|---|
| film, developer | Slugi filmu i wywoływacza. |
| dilution, ei, temp | Zawęź do jednego czasu. Bez tego pokazujemy czas dla czułości nominalnej. |
| id | Albo jeden czas według jego id z API. |
| theme | light lub dark. Bez tego karta dopasowuje się do schematu kolorów czytelnika. |
| lang | en, pl lub uk. |
Jeśli żaden opublikowany czas nie pasuje, karta mówi o tym i linkuje do filmu — nigdy nie pokazuje „prawie pasującego”. Przycisk „Osadź” na stronie każdej pary film × wywoływacz przygotuje kod, z podglądem.
Liczymy, jak często karta jest wyświetlana — dziennie, według witryny (sam host strony, nic dłuższego) i według kombinacji. Bez ciasteczek, bez adresów.