Przejdź do treści

API

API danych 35mm.org.

Filmy, wywoływacze i czasy wywoływania jako JSON — każdy czas z kartą techniczną lub tabelą, z której go odczytano. Tylko do odczytu, a na początek nie potrzeba klucza.

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"
Parametry
ParametrZnaczenie
qSzukaj w nazwie lub producencie, pomijając znaki interpunkcyjne: hp5, ilford hp5.
manufacturerSlug producenta, np. ilford.
formatSlug formatu, np. 135 lub 120.
processProces: bw, c41, e6, ecn2 …
typeRodzaj filmu: bw_negative, color_negative, color_reversal …
still_made1 dla filmów wciąż produkowanych, 0 dla pozostałych.
has_times1 dla filmów z opublikowanym czasem, 0 dla tych bez czasu.
page, per_pageZobacz 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"
Parametry
ParametrZnaczenie
qSzukaj w nazwie lub producencie.
manufacturerSlug producenta.
typeRodzaj chemii: bw_developer, c41_kit, fixer …
still_made1 dla wciąż produkowanych, 0 dla pozostałych.
page, per_pageZobacz 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"
Parametry
ParametrZnaczenie
filmSlug filmu.
developerSlug wywoływacza.
dilutionOznaczenie rozcieńczenia tak, jak je opublikowano: Stock, 1+1 …
eiCzułość robocza (EI), na jaką naświetlono film.
temperatureTemperatura w °C.
formatFormat, dla którego podano czas: 135, 120, sheet lub any.
page, per_pageZobacz 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

Pola czasu wywoływania
PoleZnaczenie
time_seconds, timeCzas w pełnych sekundach oraz jako m:ss.
ei, temperature_cCzułość robocza (EI) i temperatura w °C, dla których podano czas.
sourceZawsze obecne: rodzaj (manufacturer_datasheet, own_test, third_party, community), tytuł i adres tak, jak je zapisano — null, gdy nic nie zapisano.
confidenceverified, community, unverified lub disputed: w jakim stopniu czas sprawdzono ze źródłem.
inherited_fromSlug 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."] }
    }
}
Błędy
HTTPcodeZnaczenie
401invalid_api_keyKlucz jest błędny lub został unieważniony.
404not_foundNie ma filmu ani wywoływacza o tym slugu.
405method_not_allowedAPI jest tylko do odczytu: używaj GET.
422invalid_parameterParametr ma niedozwoloną wartość.
429rate_limitedZa 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>
Parametry
ParametrZnaczenie
film, developerSlugi filmu i wywoływacza.
dilution, ei, tempZawęź do jednego czasu. Bez tego pokazujemy czas dla czułości nominalnej.
idAlbo jeden czas według jego id z API.
themelight lub dark. Bez tego karta dopasowuje się do schematu kolorów czytelnika.
langen, 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.