Início rápido
Peça os tempos publicados de um filme em um revelador. Tudo fica em https://35mm.org/api/public/v1; as respostas são JSON com chaves em snake_case e datas ISO 8601 em UTC.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11"
Cada tempo vem com a sua fonte: de que tipo é, seu título e seu endereço como armazenado. Onde nenhuma está registrada, os campos são null — nada é preenchido. Só dados publicados são servidos: rascunhos, sugestões e qualquer coisa sobre pessoas nunca são.
Chaves
Requisições anônimas não precisam de nada. Para um limite maior, peça uma chave de API e envie-a como bearer token:
curl -H "Authorization: Bearer 35mm_…" "https://35mm.org/api/public/v1/films"
Uma chave errada ou revogada recebe 401 como resposta — nunca é tratada em silêncio como anônima. As chaves são para servidores e ferramentas: não ponha uma em uma página web, onde qualquer pessoa pode lê-la.
As chaves são emitidas à mão, sob pedido.
Limites de uso
- Sem chave: 60 requisições por minuto para cada endereço.
- Com chave: a cota dela, 600 por minuto, salvo acordo em contrário.
- Passado o limite, a resposta é 429 com um cabeçalho Retry-After (segundos de espera). Toda resposta traz X-RateLimit-Limit e X-RateLimit-Remaining.
Os endereços são contados em um cache e nunca armazenados. O uso de uma chave é contado por dia — um número, nada mais.
Atribuição
Toda resposta tem um objeto attribution. Por favor, faça um link de volta para o 35mm.org onde quer que mostre nossos dados — a url de um filme, revelador ou tempo aponta para a página dele — e mostre a fonte de cada tempo junto: um tempo de revelação sem fonte é só um número.
Os dados ainda não têm uma licença declarada. Faça o link de volta, mantenha a fonte de cada tempo junto e pergunte se tiver dúvida.
Endpoints
Todas são GET. Os exemplos abaixo são respostas reais para um pequeno catálogo de teste, não dados de produção.
GET/films
Filmes, de A a Z, cada um com o fabricante, os formatos e o número de tempos publicados.
curl "https://35mm.org/api/public/v1/films?manufacturer=ilford"
| Parâmetro | Significado |
|---|---|
| q | Busque no nome ou no fabricante, ignorando a pontuação: hp5, ilford hp5. |
| manufacturer | O slug de um fabricante, como ilford. |
| format | O slug de um formato, como 135 ou 120. |
| process | O processo: bw, c41, e6, ecn2 … |
| type | O tipo de filme: bw_negative, color_negative, color_reversal … |
| still_made | 1 para filmes ainda em produção, 0 para os demais. |
| has_times | 1 para filmes com tempo publicado, 0 para os sem. |
| page, per_page | Veja a paginação abaixo. |
Exemplo de resposta
{
"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}
Um filme com sua especificação e todos os tempos de revelação publicados.
curl "https://35mm.org/api/public/v1/films/ilford-hp5-plus"
Exemplo de resposta
{
"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
Reveladores e outros químicos.
curl "https://35mm.org/api/public/v1/developers?manufacturer=ilford"
| Parâmetro | Significado |
|---|---|
| q | Busque no nome ou no fabricante. |
| manufacturer | O slug de um fabricante. |
| type | O tipo de químico: bw_developer, c41_kit, fixer … |
| still_made | 1 para os ainda em produção, 0 para os demais. |
| page, per_page | Veja a paginação abaixo. |
Exemplo de resposta
{
"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}
Um revelador com suas diluições e os filmes para os quais tem tempos publicados.
curl "https://35mm.org/api/public/v1/developers/ilford-id-11"
Exemplo de resposta
{
"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
Busque tempos publicados. Um rebobinado sem tempos próprios responde com os do filme de origem, marcados com inherited_from.
curl "https://35mm.org/api/public/v1/development-times?film=ilford-hp5-plus&developer=ilford-id-11&ei=400"
| Parâmetro | Significado |
|---|---|
| film | O slug de um filme. |
| developer | O slug de um revelador. |
| dilution | O rótulo de uma diluição como publicado: Stock, 1+1 … |
| ei | O índice de exposição em que o filme foi usado. |
| temperature | A temperatura em °C. |
| format | O formato para o qual o tempo vale: 135, 120, sheet ou any. |
| page, per_page | Veja a paginação abaixo. |
Exemplo de resposta
{
"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"
}
}
Um tempo de revelação
| Campo | Significado |
|---|---|
| time_seconds, time | O tempo em segundos inteiros, e como m:ss. |
| ei, temperature_c | O índice de exposição e a temperatura em °C para os quais o tempo vale. |
| source | Sempre presente: type (manufacturer_datasheet, own_test, third_party, community), title e url como armazenados — null onde nenhum está registrado. |
| confidence | verified, community, unverified ou disputed: o quanto o tempo foi conferido com a sua fonte. |
| inherited_from | O slug do filme de origem quando um rebobinado usa os tempos dele, caso contrário null. |
Paginação
As listas são paginadas com page e per_page (50 por padrão, no máximo 100). links traz os endereços first, last, prev e next — null onde não há — e meta traz current_page, last_page, per_page, from, to e total. Siga links.next até ser null.
Cache
As respostas trazem ETag, Last-Modified e Cache-Control: public, max-age=300. Devolva o ETag em If-None-Match e uma resposta inalterada retorna 304 sem corpo — ainda conta como requisição. Faça cache do seu lado também: o catálogo não muda de minuto em minuto.
Navegadores de qualquer site podem ler estas rotas (CORS: GET de qualquer origem).
Erros
Os erros têm todos a mesma forma, com details para um parâmetro recusado:
{
"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 | Significado |
|---|---|---|
| 401 | invalid_api_key | A chave está errada ou foi revogada. |
| 404 | not_found | Nenhum filme ou revelador com esse slug. |
| 405 | method_not_allowed | A API é somente leitura: use GET. |
| 422 | invalid_parameter | Um parâmetro não é um valor válido. |
| 429 | rate_limited | Requisições demais: espere Retry-After segundos, ou peça uma chave. |
OpenAPI
A API inteira está descrita em um arquivo OpenAPI 3.1: /api/public/v1/openapi.json. Importe-o no Postman, no Insomnia ou em um gerador de código.
Incorpore um cartão de tempo
Blogs e fóruns podem mostrar um tempo de revelação como um pequeno cartão: filme, revelador, diluição, sensibilidade, temperatura, o tempo e a fonte, com um link de volta para o 35mm.org. É uma página simples — sem cookies, sem scripts, nada carregado de outros sites — feita para ser incorporada em um frame.
<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>
| Parâmetro | Significado |
|---|---|
| film, developer | Os slugs do filme e do revelador. |
| dilution, ei, temp | Restrinja a um só tempo. Se omitido, mostra-se o tempo na sensibilidade nominal. |
| id | Ou um tempo pelo seu id, da API. |
| theme | light ou dark. Se omitido, o cartão segue o esquema de cores do leitor. |
| lang | en, pl ou uk. |
Se nenhum tempo publicado corresponder, o cartão diz isso e leva ao filme — nunca mostra uma correspondência aproximada. O botão Incorporar em qualquer página filme × revelador gera o código para você, com uma prévia.
Contamos quantas vezes um cartão é exibido, por dia, por site (o host da página em que está, nada mais longo) e por combinação. Sem cookies, sem endereços.