Desenvolvedores / Referência

Versão em texto ↗

A API do Placidus

O motor de cálculo do Placidus por HTTP. Mande um instante e um lugar; receba o mapa inteiro — posições, casas, aspectos, dignidades, estrelas fixas na data, partes árabes, temperamento e mentalidade. É o mesmo motor que a tela do aplicativo usa.

Base

https://placidus.app/api/public/v1

Autenticação

X-API-Key: plc_<43 caracteres>

Vai entregar esta documentação a uma IA? /docs/llms.txt serve a mesma coisa em texto puro, pronta para ser lida por um agente.

Versão desta documentação: 2026-10-08.1, publicada em 2026-10-08. O que mudou.

Começo rápido

Uma requisição, um mapa. Data e hora locais do lugar de nascimento, a cidade por extenso, e nada mais — o fuso vem junto com a cidade e a configuração cai no padrão tradicional.

Requisição
curl -X POST https://placidus.app/api/public/v1/chart \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"datetime_local":"1990-03-15T14:32:00","place":"Goiânia, GO"}'

Limite: 120 requisições por minuto, por chave. Toda resposta traz meta com o instante em Julian Day e em UTC, o fuso aplicado, a coordenada e a versão do motor.

Antes de começar

Cinco coisas que evitam a maioria dos erros de integração.

Um mapa é instante + lugar + config

Não existe 'tipo' de mapa no Placidus. Natal, horária e revolução são rótulos de leitura, não estruturas diferentes: os três são o mesmo cálculo sobre um instante, um lugar e uma configuração. Por isso a API tem um endpoint de mapa, e não um por técnica. O campo `technique` só escolhe uma configuração de partida.

Nada é guardado

A API pública calcula e esquece. Nenhuma requisição grava linha no banco — nem o input. O que chega numa chamada são data, hora e lugar de nascimento de alguém, e esse dado não pode ficar. Se você precisa persistir, persista do seu lado.

O fuso é o nome IANA, nunca um offset

Mande 'America/Sao_Paulo', não '-03:00'. O offset depende da data: o horário de verão brasileiro anterior a 2019 muda de ano para ano, e o Placidus aplica a regra vigente na data do mapa. Um offset fixo erra por uma hora todo mapa de verão antigo — o bastante para trocar o Ascendente de signo. Se você não souber o fuso, omita o campo: ele é resolvido pela coordenada ou pela cidade.

O cálculo é o mesmo do aplicativo

Esta API não é uma reimplementação nem uma versão reduzida. É o mesmo motor, chamado do mesmo jeito, com as mesmas tabelas de dignidade e o mesmo catálogo de estrelas que a tela do Placidus usa. Não existe divergência possível entre o que a API devolve e o que o app mostra. Vale para o DESENHO também: `/chart.png` e `/chart.svg` renderizam o mesmo componente da roda que está na tela, e não uma segunda versão dela.

Recalcular sempre, nunca cachear

A resposta não vem de cache e não deve ser cacheada como se fosse verdade permanente: o motor evolui e correções de doutrina entram nele. Guarde o INPUT (instante, lugar, config) e recalcule quando precisar do resultado.

Autenticação

Toda rota de cálculo exige uma chave de projeto no cabeçalho `X-API-Key`. Um `Authorization: Bearer plc_...` também é aceito, para clientes HTTP que só sabem mandar Bearer. A chave é emitida pelo administrador do Placidus, é revogável individualmente e aparece em claro uma única vez — na resposta que a criou.

Cabeçalho
X-API-Key: plc_<43 caracteres>
  • A chave identifica um PROJETO, não uma pessoa. Ela não abre mapas salvos, não lê conta de usuário e não alcança nada persistido.
  • Trate-a como senha: ela vive no servidor do integrador, em variável de ambiente. Uma chave num repositório público é uma chave a revogar.
  • Limite: 120 requisições por minuto, por chave. Ao estourar, a resposta é 429 com o cabeçalho `Retry-After` em segundos.
  • Chave revogada responde 403 a partir da requisição seguinte, sem período de tolerância.

Endpoints

Todos os caminhos são relativos a https://placidus.app/api/public/v1. Campos marcados com * são obrigatórios.

POST/chart

Calcula um mapa completo

O endpoint principal. Recebe um instante e um lugar; devolve o mapa inteiro — posições, casas, aspectos, dignidades, estrelas fixas, partes árabes, temperamento, mentalidade e motivação primária. Nada é gravado. A profecção NÃO sai daqui: ela precisa de um quarto dado que não é do mapa (o instante a situar), e por isso tem endpoint próprio.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
Requisição
curl -X POST https://placidus.app/api/public/v1/chart \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "datetime_local": "1875-07-26T19:32:00",
    "place": "Kesswil, CH"
  }'
Resposta
{
  "meta": {
    "jd_ut": 2406096.2932175924,
    "datetime_utc": "1875-07-26T19:02:14Z",
    "timezone": "Europe/Zurich",
    "tz_offset_hours": 0.4961111111111111,
    "location": { "lat": 47.5983, "lon": 9.3216 },
    "house_system": "placidus",
    "sect": "nocturnal",
    "engine_version": "0.2.0"
  },
  "bodies": [
    {
      "id": "sun",
      "name": "Sol",
      "longitude": 123.31565476363885,
      "sign": "Leão",
      "sign_index": 4,
      "deg": 3, "min": 18, "sec": 56,
      "latitude": 0.00006471318014565755,
      "speed": 0.9558238152095152,
      "speed_lat": 0.00001954998409620958,
      "retrograde": false,
      "motion": {
        "direction": "direct", "direction_pt": "direto",
        "pace": "slow", "pace_pt": "lento",
        "reading_pt": "direto e lento",
        "speed": 0.9564, "mean_speed": 0.9856
      },
      "house": 7,
      "solar_orientation": "occidental",
      "dignities": {
        "traditional": true,
        "domicile": true, "exaltation": false, "triplicity": false,
        "term": false, "face": false, "detriment": false, "fall": false,
        "peregrine": false,
        "triplicity_ruler": "jupiter", "term_ruler": "saturn", "face_ruler": "saturn",
        "sign_ruler": "saturn", "exaltation_ruler": null,
        "detriment_of": "sun", "fall_of": null,
        "score": 5
      },
      "accidental": {
        "score": 7,
        "factors": [
          { "name": "casa 7", "points": 4 },
          { "name": "lento", "points": -2 },
          { "name": "latitude norte aumentando", "points": 2 },
          { "name": "hayz", "points": 3 }
        ],
        "combust": false
      }
    }
    // … os outros 9 corpos
  ],
  "moon_phase": { "quadrant": 3, "humor": "phlegmatic", "humor_pt": "Fleumático" },
  "angles": [
    { "id": "asc", "name": "Ascendente", "longitude": 304.14859735082854,
      "sign": "Aquário", "sign_index": 10, "deg": 4, "min": 8, "sec": 55 }
    // … mc, ic, dsc
  ],
  "points": [
    { "id": "north_node", "name": "Nodo Norte", "longitude": 10.925703810632907,
      "sign": "Áries", "sign_index": 0, "deg": 10, "min": 55, "sec": 33, "house": 2 }
    // … south_node
  ],
  "houses": {
    "system": "placidus",
    "cusps": [304.14859735082854, 358.3127605423338 /* … 12 cúspides, em graus */]
  },
  "aspects": [
    { "from": "sun", "to": "neptune", "type": "square",
      "orb": 0.27333089374567976, "orb_deg": 0, "orb_min": 16,
      "applying": false, "sign_gated": true },
    { "from": "saturn", "to": "ic", "type": "conjunction",
      "orb": 4.73, "orb_deg": 4, "orb_min": 44,
      "applying": true, "sign_gated": true }
  ],
  "fixed_stars": {
    "mode": "closest",
    "magnitude_floor": { "value": 3, "inclusive": true, "chart_kind": "natal" },
    "magnitude_source": "swiss",
    "include_nebulae": false,
    "bypassed_floor_count": 0,
    "fundamental_list": ["ALDEBARAN", "ALGOL", "ANTARES", "ARCTURUS", "/* … 12 */"],
    "revolution_wide_orb_list": [],
    "orb_table": { "kind": "natal_by_magnitude", "nebula_deg": 1 },
    "conjunctions_found": 14,
    "discarded_by_magnitude": 9,
    "discarded_by_sign": 1,
    "mythological_list": ["ALDEBARAN", "ALFARD", "ALGOL", "/* … 13 */"],
    "pending": [],
    "formula_version": "estrelas-yuri-6",
    "active": [
      { "name_swiss": "Regulus", "name": "Regulus", "longitude": 149.08,
        "sign": "Leão", "deg": 29, "min": 5, "sec": 12,
        "magnitude": 1.35, "magnitude_source": "swiss",
        "object_type": "star", "fundamental": true, "mythological": true,
        "elected_by": "fundamental", "bypassed_floor": false,
        "planetary_nature": "Mars-Jupiter", "constellation": "Alpha Leonis",
        "conjunct_to": "asc", "conjunct_to_name": "Ascendente",
        "orb_deg": 0, "orb_min": 53, "orb_limit_deg": 2.0,
        "reading_source": "verbete_pt",
        "interpretation": {
          "key": "REGULUS", "verbete": "Regulus é a estrela do coração do Leão…",
          "significado": "…", "mitologia": "…", "encaixe_interpretativo": "…",
          "catalog_sign": "Virgem"
        },
        "won_over": [
          { "name_swiss": "Phecda", "magnitude": 2.5,
            "orb_deg": 0, "orb_min": 15, "reason": "a outra é fundamental" }
        ] }
    ],
    "searched": [ /* … */ ]
  },
  "arabic_parts": [
    { "id": "fortuna", "name": "Parte da Fortuna",
      "longitude": 21.877916825632383, "sign": "Áries",
      "deg": 21, "min": 52, "sec": 41, "house": 2,
      "formula": "asc + sol - lua", "sect": "nocturnal",
      "conjunctions": [], "description": "Indica onde se manifestam a sorte material…" }
    // … as outras 7
  ],
  "strength_ranking": [
    { "body": "moon", "name": "Lua", "score": 8, "accidental_score": 10,
      "combust": false, "house_strength": 2, "rank": 1, "lord_of_nativity": true }
    // … os demais, em ordem
  ],
  "antiscia": [
    { "body": "sun", "kind": "body", "name": "Sol",
      "antiscion": { "longitude": 56.68434523636115, "sign": "Touro", "deg": 26, "min": 41 },
      "contra_antiscion": { "longitude": 236.68434523636114, "sign": "Escorpião", "deg": 26, "min": 41 },
      "antiscion_hits": [
        { "point": "cusp_6", "point_name": "Cúspide 6",
          "orb_deg": 1, "orb_min": 12, "orb_limit_deg": 3 }
      ],
      "contra_antiscion_hits": [] }
  ],
  "temperament": {
    "result": "Fleumático",
    "humor": "phlegmatic",
    "signature_pt": "umidade forte, frio forte",
    "points": [
      { "point": "ascendant",  "detail": "Aquário (Ar)",     "humor": "sanguine",    "active": "hot",  "passive": "wet" },
      { "point": "asc_ruler",  "detail": "Saturno",          "humor": "melancholic", "active": "cold", "passive": "dry" },
      { "point": "moon_phase", "detail": "Minguante (Água)", "humor": "phlegmatic",  "active": "cold", "passive": "wet" },
      { "point": "sun_season", "detail": "Leão — verão",     "humor": "choleric",    "active": "hot",  "passive": "dry" }
    ],
    "tally": { "active": { "hot": 2, "cold": 2 }, "passive": { "dry": 2, "wet": 2 } },
    "modulation": [
      { "source": "lord",           "detail": "Lua",                    "active": "cold", "passive": "wet" },
      { "source": "lord_sign",      "detail": "Touro (Terra)",          "active": "cold", "passive": "dry" },
      { "source": "asc_ruler_sign", "detail": "Aquário (Ar)",           "active": "hot",  "passive": "wet" },
      { "source": "sun_sign",       "detail": "Leão (Fogo)",            "active": "hot",  "passive": "dry" },
      { "source": "aspect",         "detail": "Mercúrio à Lua, 1°49'",  "active": "cold", "passive": "wet" },
      { "source": "aspect",         "detail": "Vênus à Lua, 1°55'",     "active": "cold", "passive": "wet" },
      { "source": "aspect",         "detail": "Sol ao Ascendente, 0°50'", "active": "hot", "passive": "dry" }
    ],
    "modulation_tally": { "active": { "hot": 3, "cold": 4 }, "passive": { "dry": 3, "wet": 4 } },
    "reinforcement": {
      "active":  { "quality": "cold", "for": 4, "against": 3, "reinforced": true, "reading_pt": "frio forte" },
      "passive": { "quality": "wet",  "for": 4, "against": 3, "reinforced": true, "reading_pt": "umidade forte" }
    },
    "imbalance": { "quality": null, "tied": ["cold", "wet"], "testimonies": 4, "of": 7,
                   "reading_pt": "sem excesso definido — frio e umidade empatam" },
    "resolution": { "active": { "quality": "cold", "via": "modulation", "weak": true },
                    "passive": { "quality": "wet", "via": "modulation", "weak": true } },
    "notes": [],
    "formula_version": "temperamento-yuri-4"
  },
  "mentality": {
    "result": "Júpiter associado a Vênus",
    "combination": { "kind": "pair", "planets": ["jupiter", "venus"] },
    "moon_almuten": { "planet": "venus", "name": "Vênus", "score": 5 },
    "mercury_almuten": { "planet": "jupiter", "name": "Júpiter", "score": 4 },
    "pole": {
      "side": "light", "side_pt": "Luz",
      "decided_by": "essential_testimonies",
      "essential_counts": { "dignified": 2, "debilitated": 0, "mixed": 0, "peregrine": 2 },
      "counterweight": {
        "favorable": ["Mercúrio em lugar próprio", "Sol bem recebido (3 a favor, 1 contra)"],
        "unfavorable": ["Saturno retrógrado"],
        "neutral": ["modalidade cardinal", "significadores orientais"],
        "balance": "attenuated",
        "reading_pt": "luz confirmada — os definidores caem para o melhor, e o conjunto do mapa sustenta"
      }
    },
    "modality": { "mode": "cardinal", "text_pt": "Mente extrovertida, polêmica, engenhosa…" },
    "orientality": { "state": "oriental", "decided_by": "maioria na orientalidade", "text_pt": "Tornam a mente constante…" },
    "modifiers": [
      { "factor": "lua_nodos", "aspect": "square", "orb_deg": 2, "orb_min": 14,
        "text_pt": "Mentalidade mais sensível, artística e volúvel." }
    ],
    "formula_version": "mentalidade-yuri-7"
  },
  "primary_motivation": {
    "result": "Libra, por Vênus em Touro (domiciliado)",
    "question_pt": "Que tipo de bem eu sou capaz de realizar e desfrutar?",
    "inspiration": { "point": "ascendant", "ruled_by": "sign", "sign": "Libra",
      "text_pt": "Diferenciar os lados da situação; estabelecer alianças; equilibrar; compensar." },
    "best_action": { "point": "asc_ruler", "ruled_by": "planet", "planet": "venus", "name": "Vênus",
      "verbs": ["fruir", "adornar", "embelezar", "enriquecer"],
      "sign": "Touro", "mode_pt": "Enriquecer; aumentar o valor das coisas; embelezar." },
    "result_to_obtain": { "point": "dispositor", "planet": "venus", "chain_stopped": true,
      "reason": "ruler_in_domicile", "text_pt": "A dificuldade é descrita pela mesma função…" },
    "special_cases": [ { "kind": "ruler_in_domicile", "text_pt": "…" } ],
    "profession_examples": [ { "name": "designer de produto", "source_planet": "venus",
      "mode_sign": "Touro", "verb": "embelezar/adornar", "why": "…" } ],
    "hobby_criteria": { "automatic_examples_allowed": false,
      "examples_status": "action_candidates", "composition_rule_pt": "…" },
    "hobby_examples": [{ "name": "…", "source_planet": "venus", "verb": "…" }], "catalog_version": "2026-09-14",
    "formula_version": "motivacao-yuri-4"
  }
}
POST/advance

O mesmo mapa em outro instante

Desloca o instante do mapa e recalcula, mantendo lugar e configuração. O deslocamento é ACUMULADO a partir do instante-base, não encadeado: cada chamada reconstrói o instante do zero, então avançar +1 mês e depois −1 mês devolve exatamente o ponto de partida, sem deriva de ponto flutuante nem perda do dia 31. Passando `jd_ut` (que vem em `meta.jd_ut`), o instante-base não precisa ser resolvido de novo.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
offsetsobjectDeslocamento acumulado por unidade: { "year": 1, "day": -3 }. Unidades: second, minute, hour, day, week, month, year.
unitstringPasso único — unidade. Padrão 'day'.
amountnumberPasso único — quantidade; negativa retrocede.
Requisição
curl -X POST https://placidus.app/api/public/v1/advance \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "jd_ut": 2406096.2932175924,
    "lat": 47.5983,
    "lon": 9.3216,
    "offsets": { "year": 30 },
    "sections": ["bodies", "angles"]
  }'
Resposta
{
  "base": { "jd_ut": 2406096.2932175924 },
  "jd_ut": 2417056.2932175924,
  "datetime_utc": "1905-07-26T19:02:14Z",
  "offsets": { "year": 30 },
  "result": {
    "meta": { "jd_ut": 2417056.2932175924, "sect": "nocturnal", "…": "…" },
    "bodies": [ /* … */ ],
    "angles": [ /* … */ ]
  }
}
POST/revolution

Revolução solar ou lunar

Encontra o instante em que o Sol (ou a Lua) volta à longitude que tinha no mapa dado, e calcula o mapa desse instante. Escolha o alvo por `year` (a revolução daquele ano) ou por `from_jd` + `direction` (a próxima ou a anterior a um ponto). A resposta traz o mapa da revolução em `result` (sem temperamento, mentalidade nem motivação — são só do natal), os aspectos cruzados com o natal em `cross_aspects` (planetas da revolução contra os planetas **e os ângulos** do natal; `from` é o lado natal) e, em `arabic_parts_arc`, as **partes árabes do natal transportadas por arco** — `parte − Asc_natal + Asc_da_revolução`. ⚠️ Elas **não** são as partes de `result.arabic_parts`, que são recalculadas com o Ascendente e os planetas da revolução: são duas camadas diferentes, e **as duas se usam**. Cada parte diz qual é em `method`.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
body'sun' | 'moon'Corpo que retorna. Padrão 'sun'.
yearnumberAno da revolução procurada.
from_jdnumberProcura a partir deste Julian Day.
direction'next' | 'prev'Sentido da busca com `from_jd`. Padrão 'next'.
Requisição
curl -X POST https://placidus.app/api/public/v1/revolution \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "datetime_local": "1875-07-26T19:32:00",
    "place": "Kesswil, CH",
    "body": "sun",
    "year": 1913
  }'
Resposta
{
  "jd_ut": 2419940.29,
  "datetime_utc": "1913-07-27T…Z",
  "body": "sun",
  "year": 1913,
  "target_longitude": 123.31565476363885,
  "result": { "meta": { "…": "…" }, "bodies": [ /* … */ ],
              "arabic_parts": [ { "id": "fortuna", "method": "recalculated", "…": "…" } ] },
  "cross_aspects": [ /* … */ ],
  "arabic_parts_arc": [
    { "id": "fortuna", "name": "Parte da Fortuna",
      "longitude": 188.55, "sign": "Libra", "house": 7,
      "natal_longitude": 103.57, "arc_deg": 84.97,
      "formula": "parte_natal − Asc_natal + Asc_do_mapa",
      "method": "arc_transported" }
  ]
}
POST/profection

Profecção anual, mensal e diária

Onde um instante cai na profecção de um mapa: a casa profeccionada, o senhor e a janela exata de cada nível. Três coisas divergem do padrão helenístico de mercado, e são deliberadas: as casas são as **do mapa** (Plácido por padrão), nunca signo inteiro; o senhor é o regente do signo **na cúspide** (a 29° de Leão, o senhor é o Sol, mesmo que o resto da casa seja Virgem); e a virada do ano é o **retorno solar exato**, com hora — não o aniversário civil, e a idade se conta do mesmo jeito. ⚠️ O nível ANUAL é régua fechada. O MENSAL e o DIÁRIO seguem o padrão helenístico, **validado pelo autor da régua em 19/08/2026** — não são técnica do professor dele: servem para afinar a data dentro de um período que a análise maior já apontou, e não decidem sozinhas. É o que diz o `weight` de cada nível (`primary` no ano, `refinement` nos outros dois). Não trate os três com o mesmo peso, e não hierarquize os senhores entre si.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
target_datetimestringInstante a situar, ISO local. Omitido, usa agora.
target_timezonestringFuso IANA do alvo. Omitido, herda o do mapa.
target_jdnumberJulian Day UT do alvo (alternativa ao datetime).
levelsstring[]Níveis a devolver: year, month, day. Padrão: os três.
timelinebooleanDevolve também a volta de 12 anos. Padrão false.
Requisição
curl -X POST https://placidus.app/api/public/v1/profection \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "datetime_local": "1996-08-28T13:45:00",
    "place": "Salvador, BA",
    "target_datetime": "2026-08-06T12:00:00"
  }'
Resposta
{
  "age": 29,
  "month_index": 11,
  "day_index": 3,
  "house_system": "placidus",
  "year": {
    "house": 6, "cusp_sign": "Gêmeos", "cusp_deg": 11, "cusp_min": 12,
    "ruler": { "id": "mercury", "name": "Mercúrio" },
    "start": "2025-08-28T16:52:26Z", "end": "2026-08-28T22:42:33Z",
    "provisional": false, "weight": "primary"
  },
  "month": {
    "index": 11, "house": 5, "cusp_sign": "Touro",
    "ruler": { "id": "venus", "name": "Vênus" },
    "start": "2026-07-29T12:13:23Z", "end": "2026-08-28T22:42:33Z",
    "provisional": false, "weight": "refinement",
    "weight_note_pt": "Afina a data dentro do período que a análise maior apontou. Não abre período nem decide sozinha."
  },
  "day": { "index": 3, "house": 8, "cusp_sign": "Leão", "…": "…", "provisional": false, "weight": "refinement" },
  "formula_version": "profeccao-yuri-2"
}
POST/progression

Progressão secundária (um dia por ano de vida)

O mapa progredido de um instante, e o que ele toca. **Um dia de efeméride para cada ano de vida**, e o mapa avança INTEIRO — posições, ângulos, cúspides e **partes árabes**, que nascem do Ascendente e por isso mudam quando ele anda. O mapa sai completo em `result`. Os contatos vêm em **duas matrizes**: `progressed_to_progressed` e `progressed_to_natal`, e elas não se deduplicam — são perguntas diferentes. ⛔ **Só conjunção e oposição**, e o **antiscion conta** como caminho próprio (`via`: `direct` · `antiscion` · `contra_antiscion`). **Progridem** Sol, Lua, Ascendente, MC, Fortuna, Mercúrio, Vênus e Marte; ⛔ Júpiter, Saturno, os transaturninos e as estrelas fixas **recebem, mas não progridem**. Contato que envolva Lua ou Fortuna sai com `weight: "lesser"` — elas se movem rápido demais para cravar um ano sozinhas. 🔴 **Na leitura médica esta técnica pesa mais que a profecção**: é o filtro de quais anos podem ter problemas, e a cadeia é progressão → revolução solar → revolução lunar. ⚠️ **Dois orbes, e eles não se confundem:** os contatos **diretos** valem 4°, contados em **grau cheio** (4°59' ainda entra; transaturnino como alvo também), e os **refletidos** (antiscion e contra-antiscion) valem 3° exatos, que é orbe próprio do antiscion e não uma fração do outro. Cada contato declara o seu em `orb_limit_deg` e como ele se conta em `orb_counting`. 📌 A chave da técnica sai na resposta (`day_for_a_year.key`: `one_day_per_year`) — a secundária é uma progressão entre várias, e quem integra não deveria ter de inferi-la do resultado. 📌 `houses_jd` na resposta declara de que instante saíram as CASAS, e ele **não** é o dos corpos: a fração do ano vira fração de dia, e o Ascendente dá uma volta completa a cada dia — o que se interpola ali é o tempo sideral, para que ele avance ~1° por ano.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
target_datetimestringInstante a situar, ISO local. Omitido, usa agora.
target_timezonestringFuso IANA do alvo. Omitido, herda o do mapa.
target_jdnumberJulian Day UT do alvo (alternativa ao datetime).
orb_degreesnumberOrbe dos contatos DIRETOS, de 0 a 10. Padrão 4°.
orb_whole_degreebooleanConta o orbe dos contatos diretos em GRAU CHEIO: com 4°, um contato de 4°59' entra e um de 5°00' não. Padrão true. Não vale no antiscion.
antisciabooleanInclui os contatos por antiscion. Padrão true.
antiscion_orb_degreesnumberOrbe dos caminhos refletidos, de 0 a 10. Padrão 3° — orbe próprio do antiscion, não uma fração do de cima.
fixed_starsbooleanInclui as estrelas alcançadas pelos progressores. Padrão true.
fixed_star_orbnumberForça um orbe único para as estrelas. Ausente, vale a régua da revolução: 3° para as 16 maiores (as 12 fundamentais + Procyon, Vindemiatrix, Alfard e Betelgeuse) e 1° para as demais, com o piso de magnitude < 3 antes.
Requisição
curl -X POST https://placidus.app/api/public/v1/progression   -H "X-API-Key: $PLACIDUS_API_KEY"   -H "Content-Type: application/json"   -d '{
    "datetime_local": "1996-08-28T13:45:00",
    "place": "Salvador, BA",
    "target_datetime": "2026-08-06T12:00:00"
  }'
Resposta
{
  "age": 29,
  "age_exact": 29.938886,
  "progressed_datetime_utc": "1996-09-27T…Z",
  "houses_jd": 2450353.19,
  "day_for_a_year": { "key": "one_day_per_year", "days_elapsed": 29.938886, "year_basis": "solar_return" },
  "house_system": "placidus",
  "orb_degrees": 4,
  "orb_counting": "whole_degree",
  "antiscion_orb_degrees": 3,
  "progressors": ["sun", "moon", "asc", "mc", "fortuna", "mercury", "venus", "mars"],
  "natal_sect": "diurnal", "progressed_sect": "diurnal",
  "weight": "primary",
  "result": { "meta": { "…": "…" }, "bodies": [ /* … */ ], "arabic_parts": [ /* … */ ] },
  "contacts": {
    "progressed_to_progressed": [
      { "from": "sun", "from_name": "Sol", "to": "saturn", "to_name": "Saturno",
        "type": "opposition", "via": "direct", "orb_deg": 0, "orb_min": 53,
        "orb_limit_deg": 4, "orb_counting": "whole_degree", "applying": false, "rate_per_year": 0.981,
        "weight": "primary" }
    ],
    "progressed_to_natal": [ /* … */ ],
    "fixed_stars": { "active": [ /* … */ ] }
  },
  "notes": [],
  "formula_version": "progressao-yuri-4"
}
POST/chart.png · /chart.svg

A Roda desenhada, em imagem

O mesmo corpo de `/chart`, e a resposta é a **imagem** do mapa em vez do JSON — `image/png` ou `image/svg+xml`. É o desenho do próprio Placidus, o mesmo componente que a tela usa: não é uma segunda roda que possa divergir daquela. O SVG sai **autossuficiente** — a paleta em valores literais e as fontes embutidas em base64 —, então abre igual no navegador, no Illustrator e dentro de um PDF, sem depender de nenhuma fonte instalada. O PNG é rasterizado no servidor a partir do mesmo SVG. ⚠️ Os glifos astrológicos vêm de uma fonte embutida de propósito: a pilha de fontes do sistema desenha ♄ diferente em cada máquina, e em servidor nenhum ela existe. Aceita **GET** também, com o mapa na query (`datetime_local`, `place`, `lat`/`lon`, `timezone`, `technique`) — o formato cabe num `curl`. 📌 **Os parâmetros de desenho (de `width` para baixo na tabela) valem nos DOIS lugares: no corpo do POST e na query da URL.** Vindo o mesmo nome dos dois lados, a query vence — é o que permite trocar o tema de uma chamada já pronta mexendo só no endereço. Até 16/08/2026 eles só funcionavam na query e eram descartados **em silêncio** no corpo, com resposta 200: quem pedisse 1600 px sem estrelas recebia 1200 px com o aro cheio delas e não tinha como saber.

Corpo

CampoTipoDescrição
datetime_local*stringData e hora LOCAIS do lugar, ISO 8601: '1990-03-15T14:32:00'. Não converta para UTC — o Placidus faz isso com a regra de fuso da data. Alternativa: `jd_ut`.
timezonestringFuso IANA ('America/Sao_Paulo'). Opcional: sem ele, é resolvido pela cidade (`place`) ou pela coordenada.
jd_utnumberJulian Day UT — o instante já resolvido, sem ambiguidade de fuso. Use quando estiver encadeando chamadas: ele vem em `meta.jd_ut` de toda resposta.
latnumberLatitude decimal, −90 a 90. Obrigatória junto com `lon`, salvo se mandar `place`.
lonnumberLongitude decimal, −180 a 180. Negativa a oeste de Greenwich.
placestringCidade por extenso: 'Goiânia, GO', 'Kesswil, CH'. Resolve lat, lon e fuso de uma vez. Havendo homônimos, vence a de maior população — a cidade escolhida volta em `meta.place`, então dá para conferir. Para escolher você mesmo, use `GET /places`.
techniquestringConfiguração de partida: 'natal' (padrão), 'horaria' (Regiomontanus, orbe apertado, Parte da Demissão) ou 'eleicao'. Acentos e apelidos em inglês são aceitos. Consulte `GET /techniques`. Técnica é rótulo: isto muda defaults, não comportamento.
configobjectConfiguração explícita do cálculo — sistema de casas, orbes, tabelas de dignidade, o que ligar e desligar. Vence a `technique`. Ver a seção Configuração.
sectionsstring[]Só estas seções voltam. Omitido, vem tudo. `meta` volta sempre. Recorta a RESPOSTA, não o cálculo.
excludestring[]Seções a remover da resposta. Útil para cortar as pesadas (`fixed_stars`).
widthnumber⬇️ **Daqui para baixo são os parâmetros de DESENHO: valem no corpo e na query** (a query vence no empate). Lado do quadrado em pixels, de 200 a 4000. Padrão 1200. No PNG é a resolução; no SVG é só o tamanho declarado, porque vetor não perde qualidade.
theme'light' | 'dark'Padrão 'light'. É tema fixo da imagem — não segue o aparelho de quem abre. 'dark' é o tema escuro do app: a mesma roda, na paleta que a tela usa no escuro.
transparentbooleanSem o fundo de papel. Padrão false. No PNG devolve canal alfa de verdade.
titlestringNome no miolo da roda. Vazio, não desenha.
subtitlestringLinha sob o nome — costuma ser o instante.
aspects'all' | 'major' | 'none'Quais aspectos traçar. Padrão 'major'.
starsbooleanEstrelas fixas no aro. Padrão true.
partsbooleanPartes árabes. Padrão true.
termsbooleanAnel dos TERMOS, por fora do zodíaco — uma célula por segmento, com o glifo do regente (a escola é a do mapa — `dignity_tables`). Padrão false. A roda cresce para fora; o anel dos signos não muda.
facesbooleanAnel das FACES (decanatos de 10°), por fora do dos termos. Padrão false.
degreesbooleanGrau e minuto ao lado dos planetas. Padrão true.
identitybooleanNome, instante e seita no miolo. Padrão true — um arquivo que circula precisa se identificar.
Requisição
# POST, com o mapa e o desenho no MESMO corpo
curl -X POST "https://placidus.app/api/public/v1/chart.png" \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "datetime_local": "1875-07-26T19:32:00",
    "place": "Kesswil, CH",
    "width": 1600,
    "stars": false
  }' \
  -o mapa.png

# ou o desenho na query, por cima de um corpo fixo — a query vence
curl -X POST "https://placidus.app/api/public/v1/chart.png?width=2000&theme=dark" \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"datetime_local":"1875-07-26T19:32:00","place":"Kesswil, CH"}' \
  -o mapa.png

# GET, com tudo na query
curl "https://placidus.app/api/public/v1/chart.svg?datetime_local=1990-03-15T14:32:00&place=Goi%C3%A2nia,%20GO&title=Maria" \
  -H "X-API-Key: $PLACIDUS_API_KEY" -o mapa.svg
Resposta
HTTP/1.1 200 OK
Content-Type: image/png
Cache-Control: no-store

<bytes do PNG>

# Um parâmetro inválido é 422 com JSON, e diz o limite:
{ "detail": "'width' vai de 200 a 4000 pixels, e veio 9000." }
POST/synastry

Dois mapas sobrepostos

Calcula os dois mapas e as relações entre eles: aspectos cruzados (planeta de um a planeta do outro) e os corpos de cada um nas casas do outro. Exatamente dois mapas.

Corpo

CampoTipoDescrição
charts*ChartInput[]Dois mapas, cada um com os mesmos campos de `/chart` (instante, lugar, config). A configuração de aspectos usada nos cruzamentos é a do primeiro.
Requisição
curl -X POST https://placidus.app/api/public/v1/synastry \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "charts": [
      { "datetime_local": "1875-07-26T19:32:00", "place": "Kesswil, CH" },
      { "datetime_local": "1856-05-06T18:30:00", "place": "Příbor, CZ" }
    ]
  }'
Resposta
{
  "charts": [ { "meta": { "…": "…" }, "bodies": [ /* … */ ] }, { /* … */ } ],
  "synastry": {
    "cross_aspects": [
      { "from": "sun", "to": "moon", "type": "trine", "orb": 1.4, "applying": true }
    ],
    "a_bodies_in_b_houses": [ { "body": "sun", "house": 9 } ],
    "b_bodies_in_a_houses": [ { "body": "moon", "house": 3 } ]
  }
}
GET/places

Cidade → coordenada e fuso

Busca cidade no catálogo mundial e devolve coordenada e fuso IANA. Use quando quiser ESCOLHER entre homônimos em vez de aceitar a de maior população — há mais de uma Springfield, e mais de uma Londres.

Parâmetros de consulta

CampoTipoDescrição
q*stringTexto: 'Goiânia, GO', 'Munich, DE'. Mínimo 2 caracteres.
limitnumber1 a 20. Padrão 8.
Requisição
curl "https://placidus.app/api/public/v1/places?q=Kesswil&limit=3" \
  -H "X-API-Key: $PLACIDUS_API_KEY"
Resposta
{
  "query": "Kesswil",
  "count": 1,
  "results": [
    { "display_name": "Kesswil, Thurgau, CH", "city": "Kesswil",
      "state": "Thurgau", "uf": "", "lat": 47.5983, "lon": 9.3216,
      "country": "CH", "tz_name": "Europe/Zurich", "population": 0 }
  ]
}
GET/techniques

Configuração inicial de cada técnica

As técnicas reconhecidas em `technique`, com os apelidos aceitos e a configuração de partida de cada uma. Horária, por exemplo, nasce com Regiomontanus, orbe apertado e a Parte da Demissão ligada.

Requisição
curl https://placidus.app/api/public/v1/techniques -H "X-API-Key: $PLACIDUS_API_KEY"
Resposta
{
  "default": "natal",
  "techniques": [
    { "id": "natal", "aliases": ["natal", "nascimento"], "config": { "house_system": "placidus", "…": "…" } },
    { "id": "horaria", "aliases": ["horaria", "horária"], "config": { "house_system": "regiomontanus", "…": "…" } }
  ]
}
GET/house-systems

Sistemas de casas suportados

Os identificadores válidos em `config.house_system`.

Requisição
curl https://placidus.app/api/public/v1/house-systems -H "X-API-Key: $PLACIDUS_API_KEY"
Resposta
{ "house_systems": [ { "id": "placidus", "name": "Placidus" }, { "id": "regiomontanus", "…": "…" } ] }
GET/fixed-stars

Catálogo de estrelas fixas

O catálogo validado, com magnitude, natureza planetária e tipo de objeto. Passando `jd_ut`, devolve a posição de cada estrela NAQUELA data — a precessão é calculada para o instante pedido, nunca para hoje. Com `interpretations=1`, cada estrela vem com o verbete em português — desligado por padrão porque uma listagem de 50 com verbete passa de 200 KB.

Parâmetros de consulta

CampoTipoDescrição
searchstringFiltro por nome ou constelação.
limitnumber1 a 500. Padrão 50.
jd_utnumberJulian Day UT: inclui a posição na data.
interpretationsbooleanInclui o verbete em português. Padrão false — é pesado.
Requisição
curl "https://placidus.app/api/public/v1/fixed-stars?search=Regulus&jd_ut=2406096.29" \
  -H "X-API-Key: $PLACIDUS_API_KEY"
Resposta
{ "count": 1, "stars": [ { "name_swiss": "Regulus", "magnitude": 1.36, "longitude": 146.9, "sign": "Leão", "…": "…" } ] }
GET/sectionssem chave

As seções que um mapa devolve

A lista de nomes válidos em `sections` e `exclude`, servida pela mesma constante que os valida no servidor. Sem chave: serve para conferir o vocabulário antes de gastar uma chamada de cálculo com um nome errado.

Requisição
curl https://placidus.app/api/public/v1/sections
Resposta
{ "sections": ["bodies", "moon_phase", "angles", "points", "houses", "aspects", "fixed_stars", "arabic_parts", "strength_ranking", "antiscia", "temperament", "mentality", "primary_motivation"] }
GET/healthsem chave

Status da API

Checagem de conectividade. Sem chave — serve para testar o caminho antes de ter uma.

Requisição
curl https://placidus.app/api/public/v1/health
Resposta
{ "status": "ok", "api": "placidus-public", "version": "v1" }

Seções da resposta

O que existe no corpo de um mapa. Estes são também os nomes válidos em sections e exclude.

meta
Sempre presente, e não removível: instante em Julian Day e em UTC, fuso e offset aplicados, coordenada, sistema de casas, seita (diurno/noturno) e versão do motor. É o que torna a resposta auditável — sem ela não dá para saber o que produziu aqueles números. Quando o lugar veio de `place`, traz também `meta.place` com a cidade escolhida.
bodies
Os 10 corpos (7 tradicionais + Urano, Netuno e Plutão). Cada um com longitude, signo, grau/minuto/segundo, latitude, velocidade, retrogradação, casa, orientalidade solar, dignidades essenciais (com os regentes de triplicidade, termo e face, e a pontuação) e dignidades acidentais (com os fatores somados e o estado de combustão). ⚠️ **Combustão exige o MESMO SIGNO do Sol**, além dos 8°30' — em signos diferentes o planeta fica `sob os raios do Sol` (−4), nunca combusto (−5), ainda que a distância seja a de combustão. Sem Lilith e sem Quíron — decisão de escopo do projeto.
moon_phase
Quadrante da lunação e o humor correspondente, em código e em português.
angles
Ascendente, Meio-do-Céu, Fundo-do-Céu e Descendente, com posição completa.
points
Nodo Norte e Nodo Sul (nodo verdadeiro), com signo, grau e casa.
houses
O sistema usado e as 12 cúspides em graus de longitude eclíptica.
aspects
Aspectos entre os corpos, com tipo, orbe (em decimal e em grau/minuto), se é aplicativo e se passou pelo portão do signo. O orbe é por ASTRO, somado em metades — não por aspecto.
fixed_stars
As conjunções de estrela fixa encontradas, calculadas com a precessão da data do mapa. Cada estrela traz magnitude, natureza planetária, constelação, o ponto ao qual está conjunta, o orbe e a chave editorial (`interpretation_key`). Com `config.fixed_stars.interpretations` ligado, traz também o **verbete em português** (`interpretation`); `fixed_stars.interpretation_version` identifica exatamente a edição do catálogo. A ordem das operações é fixa: primeiro o PISO DE MAGNITUDE (`magnitude_floor`: ≤3 no natal, <3 na revolução — e estrela sem magnitude fica sempre fora), depois o orbe, que é por magnitude (quanto mais brilhante, mais longe alcança), e o **mesmo signo**: estrela e ponto em signos diferentes não estão em conjunção, mesmo dentro do orbe (`discarded_by_sign` conta o corte). No desempate, a estrela **fundamental** vence o brilho; depois, a **mitológica** (13: Algol, Aldebaran, Regulus, Antares, Fomalhaut, Sirius, Spica, Castor, Pollux, Procyon, Vindemiatrix, Alfard, Betelgeuse — `mythological_list`); senão vence a MAIS BRILHANTE, não a mais colada, e o orbe só desempata brilho igual. `elected_by` diz qual degrau elegeu cada estrela, e `pending` lista os pontos em que nenhuma candidata era mitológica. As **12 fundamentais** são Algol, Aldebaran, Regulus, Antares, Fomalhaut, Sirius, Spica, Arcturus, Vega, Capella, Castor e Pollux — `fundamental_list` na resposta diz qual lista estava valendo. Em **revolução** o orbe não sai da magnitude: são **3°** para dezesseis estrelas (as 12 mais Procyon, Vindemiatrix, Alfard e Betelgeuse) e **1°** para todas as demais; `orb_table` e `revolution_wide_orb_list` declaram o que rodou. ⚠️ As duas listas não se fundem: as quatro extras alcançam mais longe e **não** ganham o desempate por importância. `won_over` mostra quem ela expulsou e por quê, `discarded_by_magnitude` diz quantas conjunções o piso derrubou, `magnitude_source` diz de que tabela veio a magnitude e `object_type` distingue estrela de aglomerado, nebulosa e galáxia. Entrada com `bypassed_floor: true` **não passou pelo piso**: é um objeto não-estelar admitido por tema (visão, olhos, cegueira) porque `config.fixed_stars.include_nebulae` estava ligado.
arabic_parts
As 8 partes, com longitude, signo, casa, a fórmula usada e a seita aplicada (as fórmulas invertem em mapa noturno). Partes opcionais entram por `config.arabic_parts_extra`.
strength_ranking
Os SETE planetas tradicionais ordenados por força — Urano, Netuno e Plutão não entram, porque não regem signo nem recebem dignidade essencial. `rank: 1` com `lord_of_nativity: true` é o Senhor da Natividade — apurado por SOMA DE DIGNIDADES ESSENCIAIS, com as acidentais como coluna de desempate. Não é almuten figuris.
antiscia
Antiscion e contra-antiscion de cada corpo e de cada parte árabe (`kind`: `body` · `part`), e o que cada um toca. A reflexão é conferida contra os corpos, os ângulos, os nodos, as partes e as **cúspides intermediárias** (2, 3, 5, 6, 8, 9, 11 e 12) — cúspide que coincide com um ângulo não sai duas vezes. O orbe da incidência é **3°**, e cada toque o declara em `orb_limit_deg`.
temperament
O humor resultante e a assinatura em português ('umidade forte, frio forte') — é a assinatura que o produto usa, porque 'Fleumático' sozinho não separa dois fleumáticos de regimes diferentes. Vem em DUAS camadas que nunca se somam: `tally` são os QUATRO pontos (Ascendente pelo elemento, regente do Ascendente pela natureza, fase da Lua pelo elemento da fase, estação do Sol pelo signo), e é ele que decide o humor; `modulation_tally` é a lista fechada de moduladores, e ela desempata o eixo que ficou 2×2 e aponta a qualidade em excesso. Cada linha vale UM voto: não há peso, não há escala com sinal. Os planetas que aspectam a Lua ou o Ascendente entram TODOS, com portão de signo e orbe de 4° — e esses 4° contam-se em GRAU CHEIO, então um aspecto de 4°06' entra e só cai a partir de 5°00'. `resolution` diz por qual camada cada eixo foi decidido — a escada tem QUATRO degraus, nesta ordem: os pontos (`points`), a modulação (`modulation`), o **Senhor da Natividade** (`lord_of_nativity`, pela natureza dele — 'o primeiro entre os iguais') e, só quando não há senhor apurado, o aspecto mais justo (`tightest_aspect`). Qualidade que só passou nesses dois últimos degraus sai marcada na assinatura com **'(por desempate)'** — é a mais fraca que existe, e o texto diz isso. `notes` traz o que o motor não decidiu sozinho — hoje, Mercúrio conjunto a naturezas divergentes. Traz também `balancing`, que é a assinatura virada em DIREÇÃO DE CONDUTA, em **três papéis que não se confundem**: `targets` (a qualidade em excesso e a ação contrária, com prioridade), `constraints` (o que a correção não pode piorar) e `support` (a ação branda que pode acompanhar, sempre com `required_compatibility`). O `mode` diz qual dos quatro caminhos a resposta tomou: `single_axis`, `dual_axis`, `maintenance` ou `indefinite`. ⚠️ **Só vira alvo a qualidade REFORÇADA**: as duas reforçadas são dois alvos (`dual_axis`, resfriar E umedecer num colérico forte nos dois eixos); uma só é um alvo — e é isso que faz um melancólico de secura forte e frio fraco receber "umedecer é o alvo; aquecer brando pode acompanhar, desde que não use calor seco" em vez de "aquecer e umedecer com o mesmo peso". ⚠️ **Serve para não tratar o NOME do temperamento:** sanguíneo de tabela pede "resfriar e secar", mas se o calor dele é fraco, resfriar retira o pouco que há; por isso o eixo fraco nunca vira alvo e ganha uma restrição `do_not_remove_vital` — o que se preserva é sempre calor ou umidade, nunca frio nem secura. Quando um eixo não fecha, `mode` vem `indefinite` e não há direção: é caso de leitura humana. ⛔ Isto é classificação, não prescrição — o motor não escolhe dieta, hábito, erva nem procedimento, e quem escreve o texto consome estes campos e **não inventa limiar próprio**.
mentality
A combinação que define a mentalidade (almuten da Lua e almuten de Mercúrio), o polo, a tabela de testemunhos, modalidade, orientalidade e os textos de leitura. `strength_table.counts` conta dignificados e debilitados — os pesos numéricos de Lilly continuam somente no cálculo do Almuten. Empate essencial desce para a dignidade acidental por hierarquia, sem usar `accidental_score`; `pole.decided_by` declara qual camada decidiu. O contrapeso continua dizendo se o restante do mapa abranda ou agrava o polo. Os textos descrevem disposições sem os rótulos penais da fonte antiga.
primary_motivation
Responde a "que tipo de bem eu sou capaz de realizar e desfrutar?". Traz `inspiration` (o que se quer realizar), `best_action` (regente + signo: a melhor ação) e `result_to_obtain` (dispositor + signo: resultado e problema a organizar). `profession_examples` parte dos verbos do regente e preserva planeta, modo, verbo e justificativa. `hobby_criteria` exige que uma prática exercite a melhor ação e, ao mesmo tempo, produza o resultado e corrija o risco do terceiro ponto. Quando há composição publicada, `hobby_examples` traz alternativas validadas pela cadeia inteira; nos demais casos, traz candidatos concretos do catálogo da melhor ação. `hobby_criteria.examples_status` distingue `validated_compositions` de `action_candidates`. A lista nunca é escolhida apenas pelo dispositor.

Configuração

O objeto config governa o cálculo. Todo campo é opcional: o que faltar cai no padrão tradicional do Placidus. Diferente de sections, que só recorta a resposta, isto muda a conta.

CampoTipoDescrição
house_systemstringSistema de casas. Padrão 'placidus'. Ver GET /house-systems.
dignity_tablesobjectEscola de cada tabela: `triplicity` ('ptolemy' | 'dorotheus'), `terms` ('ptolemaic' | 'egyptian' | 'ptolemaic_houlding'), `faces` ('chaldean' | 'triplicity' | 'manilius'). O padrão dos mapas existentes permanece ptolomaico/caldeu.
house_offsetstringPromoção para a casa seguinte, no mesmo signo: 'five_degrees' (padrão, até 5° antes da cúspide), 'sixth' (até 1/6 da casa) ou 'off'. Partes árabes não seguem esta régua — elas só promovem por minutos.
bodiesstring[]Quais corpos calcular. Padrão: os 10.
pointsstring[]Pontos: asc, mc, ic, dsc, north_node, south_node.
aspectsobject`major` (lista), `minor` (vazia por padrão — aspectos menores não existem no esquema por signo) e `orbs`, que é por ASTRO: sun, moon, mercury, venus, mars, jupiter, saturn, `modern` (Urano/Netuno/Plutão), `point_planet` (planeta com ângulo, nodo ou parte — 5°, a regra dos 5 graus) e `point` (quando os DOIS lados são pontos sem corpo, ex.: ASC × MC). Mais dois campos: `flat_orb` é um limite ÚNICO do par, que ignora `orbs` inteiro — é o que horária e eleição usam (3° estritos), porque escrever 3 em cada astro daria 1°30' ao par pelo modelo de metades. E `include_points` diz quais pontos entram na tabela de aspectos além dos corpos: padrão ASC, MC, DSC, IC e os dois nodos; lista vazia devolve só os aspectos entre planetas. Duas restrições de natureza, e não de orbe: Urano/Netuno/Plutão só formam CONJUNÇÃO e OPOSIÇÃO (a 3°, o padrão de `modern`), e os nodos só conjunção e trígono. E uma régua de eixo, para cada figura sair UMA vez e na forma em que se lê: a ponta primária (ASC, MC) carrega conjunção, trígono e quadratura; a segunda (DSC, IC) carrega conjunção e trígono; entre dois pontos de eixo, só as primárias. Assim sai `saturn conjunction ic` e não `saturn opposition mc` — é a mesma figura, e a primeira é a que o astrólogo lê. As duas pontas de um mesmo eixo nunca aspectam uma à outra: estão a 180° por definição, não por posição. ⚠️ A régua só vale quando a outra ponta está em `include_points`; sem ela, o ponto volta a carregar todos os aspectos, para nenhuma configuração perder figura em silêncio.
fixed_starsobject`mode`: 'closest' (padrão — uma estrela por ponto, a mais brilhante; o nome do modo é histórico), 'all' (todas as conjunções legítimas, para auditar o desempate) ou 'off'. `extra_search` acrescenta estrelas por nome. `chart_kind`: 'natal' (padrão) ou 'revolution', que aperta o piso de magnitude de ≤3 para <3 — a rota /revolution já marca sozinha. O piso não tem como ser desligado. `interpretations`: padrão true; false tira o verbete em português do payload (≈ 1,5 KB por estrela). `include_nebulae`: padrão **false**; true deixa aglomerado, nebulosa e galáxia atravessarem o piso — e só o piso, o orbe continua valendo —, marcando a entrada com `bypassed_floor`. Ligue só quando a leitura tocar visão, olhos ou cegueira: quem sabe o contexto é quem faz a pergunta, não o motor. `fundamental_list` (as 12 do desempate), `mythological_list` (as 13 do degrau seguinte) e `revolution_wide_orb_list` (as 16 de 3° na revolução) sobrescrevem as listas do motor sem precisar de deploy — mande-as só para auditar ou para reproduzir um mapa antigo. `revolution_list` restringe o **universo** da revolução e vem vazia: por padrão a revolução vê o catálogo inteiro sob o piso `<3`.
arabic_partsbooleanPadrão true — as 8 partes.
arabic_parts_extrastring[]Partes opcionais por id (ex.: 'demissao', do padrão de horária).
antisciabooleanPadrão true.
dignitiesbooleanPadrão true.
strength_rankingbooleanPadrão true — inclui o Senhor da Natividade.
temperamentbooleanPadrão true.
mentalitybooleanPadrão true.
primary_motivationbooleanPadrão true.

Erros

Todo erro volta como JSON com um campo detail em português, dizendo o que aconteceu.

CódigoSignificadoO que fazer
401Chave ausente ou inválida.Confira o cabeçalho `X-API-Key` e o valor da chave.
403Chave revogada.Peça uma chave nova ao administrador.
422O pedido está mal formado ou incompleto.O campo `detail` diz exatamente o quê — cidade não encontrada, técnica desconhecida, seção inexistente, tabela de dignidade inválida. É erro do pedido: repetir sem mudar nada dá o mesmo resultado.
429Limite de requisições estourado para a chave.Espere o número de segundos do cabeçalho `Retry-After`. Se acontecer em uso normal, o laço está chamando mais do que precisa.
502O motor recusou ou falhou.Tente de novo; persistindo, é falha nossa.
503Serviço de cálculo ou de localidades indisponível.Tente de novo em instantes.

Receitas

Mapa completo, em uma chamada

O caminho mais curto: data, hora e cidade. O fuso vem junto com a cidade.

bash
curl -X POST https://placidus.app/api/public/v1/chart \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"datetime_local":"1990-03-15T14:32:00","place":"Goiânia, GO"}'

Só o que você vai usar

`sections` corta a resposta. Um mapa inteiro passa de **110 KB** — subiu de 80 KB em 20/08/2026, quando as estrelas ganharam o verbete em português; pedindo três seções ele cabe em poucos KB, o que importa quando a resposta vai para dentro do contexto de um modelo de linguagem. 📌 Se o que pesa forem as estrelas e você só quer as conjunções, `config.fixed_stars.interpretations: false` devolve os 20 KB do verbete sem tirar a seção.

json
{
  "datetime_local": "1990-03-15T14:32:00",
  "place": "Goiânia, GO",
  "sections": ["bodies", "houses", "temperament"]
}

Node.js

Sem SDK: é HTTP e JSON.

javascript
const res = await fetch("https://placidus.app/api/public/v1/chart", {
  method: "POST",
  headers: {
    "X-API-Key": process.env.PLACIDUS_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    datetime_local: "1990-03-15T14:32:00",
    place: "Goiânia, GO",
  }),
});
if (!res.ok) throw new Error((await res.json()).detail);
const mapa = await res.json();
console.log(mapa.strength_ranking[0]); // o Senhor da Natividade

Python

O mesmo, com httpx ou requests.

python
import os, httpx

r = httpx.post(
    "https://placidus.app/api/public/v1/chart",
    headers={"X-API-Key": os.environ["PLACIDUS_API_KEY"]},
    json={
        "datetime_local": "1990-03-15T14:32:00",
        "place": "Goiânia, GO",
        "sections": ["bodies", "angles", "temperament"],
    },
    timeout=30,
)
r.raise_for_status()
mapa = r.json()
print(mapa["temperament"]["result"], "—", mapa["temperament"]["signature_pt"])

Andar no tempo sem acumular erro

Guarde o `jd_ut` do mapa base e mande o deslocamento ACUMULADO a cada passo — nunca encadeie. Assim, +1 e depois −1 voltam ao instante exato.

json
// base: meta.jd_ut do /chart
{ "jd_ut": 2406096.2932175924, "lat": 47.5983, "lon": 9.3216,
  "offsets": { "year": 1, "month": 2 } }

A roda como arquivo

Troque `/chart` por `/chart.png` ou `/chart.svg` e o mesmo pedido devolve a imagem. O SVG é autossuficiente — abre em qualquer lugar sem fonte instalada —, e o PNG sai na resolução que você pedir, até 4000px.

bash
curl -X POST "https://placidus.app/api/public/v1/chart.png?width=2000" \
  -H "X-API-Key: $PLACIDUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"datetime_local":"1990-03-15T14:32:00","place":"Goiânia, GO","title":"Maria"}' \
  -o mapa.png

Horária com a régua da horária

`technique` traz a configuração de partida certa — não é preciso saber que horária pede Regiomontanus e orbe apertado.

json
{
  "datetime_local": "2026-08-12T15:10:00",
  "place": "Goiânia, GO",
  "technique": "horaria"
}

O que a API não faz

Melhor ler aqui do que descobrir depois de construir em cima.

  • `primary_motivation` devolve profissões validadas pelo verbo do regente. Hobbies exigem composição da cadeia inteira; quando ela já foi publicada, `hobby_examples` traz as alternativas validadas. Fora desses casos, o campo traz candidatos concretos do catálogo da melhor ação e `hobby_criteria` diz o que ainda precisa ser conferido no resultado. A API não usa o dispositor como catálogo autônomo nem inventa atividade por semelhança.
  • Os blocos de análise trazem `pending`: onde a doutrina não fechou, o motor DECLARA em vez de chutar. Leia esse campo antes de tratar um resultado como definitivo.
  • A profecção mensal e a diária não são mais provisórias, mas continuam pesando menos: `weight: "refinement"`. Elas afinam a data dentro de um período que a análise maior já apontou — não abrem período nem decidem sozinhas. Só o nível anual é `primary`.
  • As duas listas que a régua de estrelas fixas ainda espera do astrólogo vêm **vazias**: as estrelas `fundamental` (que venceriam o brilho no desempate) e a lista curta da revolução. O campo existe, a régua está escrita, e o comportamento de hoje é o de antes delas.
  • `synastry` aceita exatamente 2 mapas. A estrutura prevê até 4, mas 3 e 4 não estão implementados.
  • Não há paginação nem processamento em lote: um mapa por requisição.
  • Planetas: os 7 tradicionais mais Urano, Netuno e Plutão. Sem Lilith, sem Quíron, sem asteroides — é decisão de escopo, não omissão.
  • A API não guarda nada. Não existe endpoint para reler um cálculo anterior: guarde o input e recalcule.

Histórico de mudanças

O que mudou para quem consome a API. Se você mantém uma cópia local desta documentação, é aqui que se descobre o que ela perdeu — antes de tratar qualquer diferença como defeito de cálculo.

  1. 2026-10-08.12026-10-08
    • 🔴 `fixed_stars` (`estrelas-yuri-6`): a conjunção com estrela fixa exige **estrela e ponto no mesmo signo**, além do orbe — a régua que os aspectos já seguiam (o signo define o tipo; o orbe só delimita). Uma estrela a 29° de Escorpião não conjunta um planeta a 1° de Sagitário, mesmo dentro do orbe dela. Vale para `active`, `on_cusps`, `on_reflections`, para os contatos de `POST /progression` e `POST /revolution`, e para Regulus, Spica e Algol nas dignidades acidentais. Campo novo `discarded_by_sign`: quantas conjunções o orbe alcançava do outro lado da fronteira. ⚠️ Muda resultado: nesses pontos sai a estrela do mesmo signo, ou nenhuma.
    • `GET/POST /chart.svg` e `/chart.png`: o glifo de um planeta afastado do vizinho para não sobrepor **não atravessa mais a linha da casa** (nem a do eixo) — ele anda dentro da própria casa. Só sai dela quando a casa não comporta os planetas que tem. Planeta sem vizinho continua exatamente no grau.
  2. 2026-10-01.12026-10-01
    • 🔴 `mentality` (`mentalidade-yuri-7`): os aspectos da mentalidade vão até **5° do par** (antes, moiety) — independem da config da roda. Na tabela de testemunhos do Sol, do regente do Ascendente e dos planetas no Ascendente, a dignidade entra pela CONDIÇÃO: dignidade e debilidade juntas sai `side: "mixed"` ("misto") e **não vota** (antes, o saldo de pontos decidia). Cada testemunho de aspecto traz `orb`. Na hierarquia acidental, planeta lento conta contra mesmo em casa angular. ⚠️ Muda o contrapeso (`balance`) e, em empate essencial, o polo.
    • 🔴 `primary_motivation` (`motivacao-yuri-4`): não lê mais aspecto nenhum — o caso `dependent_on_dispositor` (regente conjunto ao dispositor) **deixou de existir**. A cadeia é Ascendente e signo → regente e signo → dispositor e signo.
    • 🔴 `temperament.balancing` (`balanceamento-yuri-3`): as **duas qualidades fortes** viram dois alvos (`dual_axis`) mesmo sem empate na contagem — um colérico muito quente e muito seco resfria E umedece. Uma qualidade forte continua sendo um alvo só.
    • 🔴 `POST /revolution`: `cross_aspects` traz também os planetas da revolução aspectando os **ângulos do natal** (`from`: `asc`, `mc`, `dsc`, `ic`), com a régua dos eixos — cada figura uma vez (oposição ao Ascendente sai como conjunção ao Descendente). O mapa da revolução sai com `mentality` e `primary_motivation` desligados, como o `temperament`: são só do natal.
    • `POST /progression` (`progressao-yuri-4`): os 4° dos contatos diretos contam em **grau cheio** — 4°59' entra, 5°00' não —, também para os transaturninos como alvo. Cada contato traz `orb_counting` (`whole_degree` no direto, `exact` no refletido) e a resposta, `orb_counting`; o parâmetro `orb_whole_degree: false` volta ao corte exato. O antiscion continua em 3° exatos.
    • `antiscia`: as **partes árabes também refletem** — cada uma sai como fonte, com `kind: "part"` (os corpos, `kind: "body"`).
    • `fixed_stars`: campos novos `on_cusps` (estrela em cúspide intermediária), `on_reflections` (antiscion ou contra-antiscion sobre estrela) e `cusps_and_reflections`. A régua (3° para a estrela brilhante, 1° para as demais) espera o corte de magnitude do astrólogo: até lá as listas saem vazias e `status: "pending"`.
  3. 2026-09-30.22026-09-30
    • 🔴 **Seita pelo horizonte em qualquer sistema de casas.** Em signos inteiros, casas iguais pelo MC, Vehlow, Meridiano, Morinus e azimutal a seita era lida pela cúspide 1, que ali não é o Ascendente, e saía trocada em até 1 de cada 4 mapas — e com ela a Fortuna, as partes, a triplicidade, o Halb/Hayz e o Senhor da Natividade. Nos outros sistemas nada muda.
    • 🔴 **A análise (`temperament`, `mentality`, `primary_motivation`) calcula com régua própria**, e não com os aspectos da config: os cinco maiores, moiety, sem limite único. Mudar `aspects` (menores, `flat_orb`, `major`) ou desligar `strength_ranking` não muda mais a análise. O temperamento sempre recebe o Senhor da Natividade, mesmo com `strength_ranking: false` (aí a lista sai vazia, mas o Senhor é apurado).
    • Técnica **natal** (e mapa sem técnica no app) nasce com `aspects.flat_orb: 5`; horária e eleição seguem com 3 (`GET /techniques`). Quem chama `/chart` sem config continua no moiety. Com qualquer `flat_orb`, Urano, Netuno e Plutão não passam de 3°.
    • Aspectos: o **Ascendente/MC conjunto (ou trígono) ao Nodo Sul** voltou a sair — sumia pela régua dos eixos. Cada figura sai uma vez: ASC ☌ Nodo Sul, e não ASC ☍ Nodo Norte.
    • `antiscia`: as **partes árabes** passaram a ser alvo do antiscion e do contra-antiscion, como a doc já dizia.
    • `POST /profection`: as casas são **sempre as de Plácido** do natal, qualquer que seja `config.house_system` (o campo `house_system` da resposta diz isso). `POST /progression`: casas de Plácido, e a config das estrelas (`include_nebulae` e as listas) passa a valer.
    • `POST /revolution`: o mapa da revolução sai com `temperament` desligado (*"temperamento é só mapa natal"*).
    • Estrelas: `fundamental` e `mythological` saem certos também nas estrelas de `extra_search` e em `GET /fixed-stars`.
    • `primary_motivation.result_to_obtain` não traz mais `crafts_pt`/`modern_pt`: profissão sai do regente (`profession_examples`). Textos da mentalidade e da motivação sem markdown cru; nomes de aspecto em português; minutos truncados (nunca "4°60'"). `temperament.resolution.*.via` sem decisão é sempre `undefined`.
    • Desligar um planeta tradicional em `config.bodies` não derruba mais o mapa (era 422): a parte árabe que depende dele fica de fora. "Cercado" (acidental) passou a funcionar na virada de 0° de Áries.
  4. 2026-09-30.12026-09-30
    • 🔴 **Senhor da Natividade: só os sete planetas tradicionais disputam.** `strength_ranking` passou a ter **7** entradas — Urano, Netuno e Plutão saíram, porque não regem signo nem recebem dignidade essencial. Antes eles entravam com essencial 0 e, num mapa em que os sete somavam 0 ou menos, um transaturnino angular podia vencer o desempate e sair como Senhor. ⚠️ Nesses mapas o Senhor muda, e com ele o modulador nº 1 e o 3º degrau do desempate do `temperament`.
    • `bodies[].dignities.traditional` (novo): `false` para Urano, Netuno e Plutão — fora da régua das dignidades. Neles `peregrine` passou a vir `false` (peregrino é o planeta que poderia ter dignidade ali e não tem).
  5. 2026-09-26.12026-09-26
    • 🔴 **Motor astronômico novo** (`engine_version` 0.2.0): o cálculo saiu do Swiss Ephemeris para o **Skyfield** com a efeméride **DE440** da NASA/JPL e os dados de estrela do **SIMBAD**. A régua não mudou: casas, aspectos, dignidades, estrelas, partes, temperamento, mentalidade, profecção e progressão leem os mesmos campos. Conferido contra o Swiss em 471 mapas de 1850 a 2150: planetas a menos de 0,05", Lua a 0,4", casas dos 16 sistemas a 0,01" até 2049, nodo a 0,05", estrelas a 0,05", magnitudes idênticas. Numa bateria de 690 mapas, nenhum signo, casa, seita, aspecto, estrela eleita, temperamento, mentalidade ou Senhor da Natividade mudou.
    • Datas **futuras** (revolução de 2026 em diante): o instante pode diferir do anterior em até ~3 s, e a Lua em até 2", porque o ΔT do futuro é uma previsão e cada motor usa a sua. Depois de 2050 as cúspides podem diferir alguns segundos de arco (o Swiss trocava de fórmula de tempo sideral).
    • Datas fora de **1550 a 2650** respondem **422** com o motivo — antes, fora dos arquivos do Swiss, a posição saía de um cálculo aproximado, sem aviso. Entre 1550 e 1800 os mapas passam a sair da efeméride de verdade.
    • ⚠️ Dignidade acidental do **Sol**, fator "latitude norte/sul aumentando" (±2): a latitude do Sol é da ordem de 0,0002°, ruído de referencial, e os dois motores discordam do sentido em ~3% dos mapas — nesses, o acidental do Sol muda 2 pontos. É a única mudança de pontuação da troca, e a regra está em avaliação com o astrólogo.
    • Estrelas fixas: `magnitude_source` e as magnitudes não mudaram (copiadas estrela por estrela). A **Tabit** é a π³ Orionis, a que a API já devolvia. Em empate exato de orbe, a Lua em quadratura ao eixo nodal (`mentality`) passa a ser nomeada sempre pelo Nodo Norte, e os contatos de `POST /progression` com orbe idêntico saem em ordem alfabética.
  6. 2026-09-25.12026-09-25
    • 🔴 Estrelas fixas (`estrelas-yuri-5`): o desempate ganhou o degrau das **mitológicas** entre a importância e o brilho — primeiro as 12 fundamentais, depois as **13 mitológicas** (Algol, Aldebaran, Regulus, Antares, Fomalhaut, Sirius, Spica, Castor, Pollux, Procyon, Vindemiatrix, Alfard, Betelgeuse), por fim a magnitude. Cada estrela traz `mythological` e `elected_by` (`fundamental` · `mythological` · `magnitude` · `orb` · `only`: o degrau que a elegeu); `fixed_stars.mythological_list` diz qual lista rodou e `config.fixed_stars.mythological_list` a sobrescreve; `fixed_stars.pending` lista os pontos disputados em que nenhuma candidata era mitológica e o brilho decidiu. ⚠️ Muda a eleição onde uma mitológica disputava com uma estrela mais brilhante.
    • 🔴 Aspectos: **Urano, Netuno e Plutão formam conjunção E oposição**, a **3°** (antes, só conjunção, a 1°). Quadratura, trígono e sextil continuam fora. O padrão de `config.aspects.orbs.modern` passou a 3.
    • `POST /progression` (`progressao-yuri-3`): as estrelas alcançadas usam a régua da revolução — **3°** para as 16 maiores, **1°** para as demais —, com o piso `< 3` antes. `magnitude_floor.chart_kind` e `orb_table.kind` saem como `progression`.
    • `mentality` (`mentalidade-yuri-6`): "próximo ao MC/FC" vale só **antes** da cúspide (até 5°, mesmo signo); o Sol, o regente do Ascendente e os planetas no Ascendente entram por uma **tabela de testemunhos** — `modifiers[].side`, `counts` e `testimonies` (dignidade essencial e cada aspecto com um dos sete, pela qualidade do aspecto e pela natureza do planeta). As pendências respondidas saíram de `pending`.
    • `GET/POST /chart.svg` e `/chart.png` com `theme=dark`: a paleta escura agora é a do **tema escuro do app** (fundo neutro, anel do zodíaco em tons escuros com o matiz de cada elemento) — a paleta dourada antiga saiu.
  7. 2026-09-24.22026-09-24
    • `GET/POST /chart.svg` e `/chart.png` no tema `light` (o padrão) saem na **paleta do app**: fundo branco, traço e texto em cinza neutro, as marcas que eram douradas (ponto do planeta, rótulo de seita) no cinza da interface, e os aspectos nas cores da tela (tenso `#b23d4d`, harmônico `#247057`). As cores dos signos e elementos não mudaram. O nome do mapa no canto passou de EB Garamond a DM Sans.
  8. 2026-09-24.12026-09-24
    • `GET/POST /chart.svg` e `/chart.png`: os números da roda (casas, graus, ângulos) passaram a **DM Sans**, a mesma fonte do texto do app, embutida no SVG e no PNG. O mono ficou só para código.
    • Os anéis de `terms` e `faces` deixaram de alternar o tom entre células vizinhas: a alternância não significava nada e era lida como força do planeta no signo. Cada anel tem agora um tom só; as divisas separam as células.
    • Glifos: Saturno foi redesenhado (haste com a cruz e a perna em gancho) e a Lua passou ao mesmo traço dos demais corpos.
    • Anti-colisão: o número da casa desvia da parte árabe dentro da própria casa; com `degrees` ligado, a parte desvia do bloco de grau dos planetas; a conjunção curta deixou de sair tracejada (o orbe largo aparece por espessura e opacidade). Nenhum grau calculado mudou.
  9. 2026-09-23.12026-09-23
    • Estrelas fixas ganharam `interpretation_key` e `fixed_stars.interpretation_version`. São campos aditivos: permitem buscar e cachear o conteúdo editorial separadamente; quando `config.fixed_stars.interpretations` permanece ligado, `interpretation` continua vindo na própria resposta como antes.
  10. 2026-09-15.12026-09-15
    • 🔴 `mentality` passou a `mentalidade-yuri-5`: o polo é decidido por CONTAGEM de testemunhos essenciais, não pela soma dos pesos de Lilly; empate desce para a hierarquia acidental. `strength_table.counts` substitui `total`, e as linhas expõem `condition`.
    • Os 30 textos de `mentality` foram reescritos em registro descritivo: o diagnóstico e o polo permanecem, mas saem os rótulos penais do século XVII.
    • 🔴 `primary_motivation` passou a `motivacao-yuri-3`: `best_action` e `result_to_obtain` substituem a divisão sustento × satisfação. Profissões partem do regente; hobbies já compostos são identificados como validados e, nos demais casos, a API mostra candidatos da melhor ação. `hobby_criteria` explicita ação, resultado e risco.
    • Catálogos de Motivação Primária atualizados para 146 profissões e 112 práticas planetárias (`catalog_version: 2026-09-14`). O catálogo de hobbies é repertório da composição, não lista automática por dispositor.
  11. 2026-09-04.22026-09-04
    • 🔴 `GET/POST /chart.svg` e `/chart.png`: os anéis de `terms` e `faces` foram REDESENHADOS no mesmo dia — agora são anéis próprios POR FORA do zodíaco (célula por segmento, fundo alternado, glifo do regente), e o anel dos signos não muda de tamanho. A versão da manhã os espremia dentro do anel do signo e não sobreviveu à primeira olhada do cliente.
    • 🔴 Estrela fixa no desenho virou **ícone de estrela** — o nome escrito saiu da borda (ficava grande e truncado); ele continua no `<title>` do SVG e, na tela, no tooltip e na ficha. Com isso a sobreposição (bi-wheel) parou de encolher quando as estrelas ligam: o encolhimento existia só para o nome caber.
  12. 2026-09-04.12026-09-04
    • 🆕 `meta.dignity_tables`: toda resposta de mapa passou a declarar as tabelas de **termos e faces RESOLVIDAS** — a escola que o cálculo usou (`school`) e as linhas por signo (`rows`). É o que permite desenhar as faixas sem manter cópia local da tabela, que é como um limite de termo já divergiu em silêncio.
    • 🆕 `GET/POST /chart.svg` e `/chart.png`: dois parâmetros de desenho novos, `terms` e `faces` — as faixas dos termos e das faces (decanatos) dentro do anel do zodíaco, com o regente de cada segmento. **Padrão false nos dois**: ligar encolhe o glifo do signo, e uma faixa nova ligada por padrão mudaria a imagem de quem já integra.
  13. 2026-09-03.12026-09-03
    • 🔴 **Temperamento: o desempate ganhou o degrau do SENHOR DA NATIVIDADE.** A escada agora tem quatro degraus, nesta ordem: pontos → modulação → Senhor da Natividade (pela natureza dele) → aspecto mais justo, que só entra quando não há senhor apurado. Mapa que empatava nas duas camadas podia sair com o humor INVERTIDO (o aspecto mais justo decidia contra o Senhor). `resolution.via` pode vir `lord_of_nativity`, e `formula_version` passou a `temperamento-yuri-4`.
    • Temperamento: qualidade decidida no voto de minerva (`lord_of_nativity` ou `tightest_aspect`) sai marcada na `signature_pt` com **"(por desempate)"** — é a mais fraca que existe, e o texto agora diz isso.
    • 🔴 **Aspecto entre dois ÂNGULOS do mapa não sai mais** (ASC×MC, e qualquer par entre ASC/MC/DSC/IC). A quadratura Ascendente–Meio do Céu é geometria das casas — todo mapa a tem — e saía como figura no topo da lista. No cruzado de sinastria/revolução nada muda: ângulo de um instante sobre ângulo de outro é posição, e continua saindo.
    • `GET /chart.svg` e `/chart.png`: as sete partes árabes herméticas saem com o **glifo do planeta de referência num círculo** (Fortuna→Lua, Espírito→Sol, Necessidade→Mercúrio, Amor→Vênus, Valor→Marte, Vitória→Júpiter, Cativeiro→Saturno) em vez do losango genérico; Casamento e Demissão seguem no losango.
  14. 2026-08-20.32026-08-20
    • 🔴 Estrelas fixas: a lista das **12 fundamentais** foi fechada pelo astrólogo e está **ligada** — Algol, Aldebaran, Regulus, Antares, Fomalhaut, Sirius, Spica, Arcturus, Vega, Capella, Castor e Pollux. No desempate de um ponto disputado, a fundamental **vence a mais brilhante**: onde duas estrelas alcançam o mesmo ponto e só uma é fundamental, a estrela que sai pode ser outra que a de ontem. `formula_version` passou a `estrelas-yuri-4`.
    • 🔴 A **revolução** ganhou tabela de orbe própria: **3°** para dezesseis estrelas — as 12 acima **+ Procyon, Vindemiatrix, Alfard e Betelgeuse** — e **1° para todas as demais**. A escala por magnitude (2,5° / 2° / 1°) deixa de valer em revolução; o piso `<3` não mudou. A resposta traz `orb_table` e `revolution_wide_orb_list`.
    • ⚠️ As duas listas são **independentes e não se fundem**: `fundamental` (12) decide o desempate, `orb_limit_deg` (16) decide o alcance. As quatro extras alcançam mais longe e **não** vencem o desempate por importância.
    • Aglomerado, nebulosa e galáxia passaram a ter orbe declarado de **1°**, fixo — atravessar o piso por tema (`include_nebulae`) **não promove de orbe**. Na prática nenhum objeto do catálogo muda de resultado hoje; a régua é que deixou de depender da magnitude deles.
    • 🔴 `POST /progression`: o orbe dos contatos passou de 1° para **4°**, e o antiscion ganhou orbe próprio de **3°** (`antiscion_orb_degrees`). Os dois vêm da régua que o astrólogo fechou; um mapa progredido acende bem mais contatos que na versão anterior. `formula_version` passou a `progressao-yuri-2`.
    • `POST /progression` passou a declarar a chave da técnica na resposta (`day_for_a_year.key`: `one_day_per_year`).
    • 🔴 **Antiscion e contra-antiscion**: o orbe das incidências passou de **1° para 3°**, e a reflexão passou a alcançar as **cúspides intermediárias** (2, 3, 5, 6, 8, 9, 11 e 12) além dos corpos, ângulos, nodos e partes. Cúspide que coincide com um ângulo não sai duas vezes. Cada incidência declara `orb_limit_deg`.
  15. 2026-08-20.22026-08-20
    • 🆕 `POST /progression` — **progressão secundária**, um dia de efeméride para cada ano de vida. O mapa avança inteiro (posições, ângulos, cúspides e **partes árabes**, que nascem do Ascendente), e a resposta traz o mapa progredido completo mais duas matrizes de contato: progredido × progredido e progredido × natal.
    • ⛔ Só conjunção e oposição, e o antiscion conta como caminho próprio (`via`). Progridem Sol, Lua, Ascendente, MC, Fortuna, Mercúrio, Vênus e Marte; Júpiter, Saturno, os transaturninos e as estrelas fixas recebem mas não progridem.
    • 🔴 Na leitura médica a progressão **pesa mais que a profecção** — é o filtro de quais anos podem ter problemas. A cadeia é progressão → revolução solar → revolução lunar.
  16. 2026-08-20.12026-08-20
    • 🔴 Profecção: o MENSAL e o DIÁRIO **saíram de provisórios**. A aula que a régua esperava aconteceu, e o autor da doutrina os validou — `provisional` agora é `false` nos três níveis e `provisional_note_pt` sumiu. `formula_version` passou a `profeccao-yuri-2`.
    • No lugar entrou `weight`: `primary` no ano, `refinement` no mês e no dia. Não é a mesma coisa que provisório — os dois níveis menores **afinam a data dentro do período que a análise maior apontou**, não abrem período nem decidem sozinhos. Continue não tratando os três com o mesmo peso.
    • `POST /revolution` passou a devolver `arabic_parts_arc`: as partes do **natal** transportadas para a revolução pelo arco entre os dois Ascendentes (`parte − Asc_natal + Asc_da_revolução`). É uma camada diferente das partes recalculadas, e **as duas se usam** — cada parte diz qual é em `method` (`recalculated` · `arc_transported`).
    • Estrelas fixas: cada estrela ativa passou a trazer o **verbete em português** (`interpretation.verbete`, mais `significado`, `mitologia` e `encaixe_interpretativo`) — 286 chaves, o manual mestre do astrólogo. `config.fixed_stars.interpretations: false` desliga, e `GET /fixed-stars?interpretations=1` os traz na busca.
    • 🔴 Três estrelas voltaram ao catálogo: **Denebola** (mag 2,13), **Kaus Medius** (2,67) e **Kerb**. As duas primeiras passam do piso — ou seja, **faltavam em mapa**. A extração do catálogo original tinha duplicado três linhas e perdido três.
    • Estrelas fixas: `magnitude_source` em toda estrela (de que tabela veio a magnitude), `object_type` (`star` · `cluster` · `nebula` · `galaxy`) e `fundamental`. `formula_version` passou a `estrelas-yuri-3`.
    • Aglomerado e nebulosa passaram a poder entrar **por tema** (visão, olhos, cegueira): `config.fixed_stars.include_nebulae` — desligado por padrão — os deixa atravessar o piso de magnitude, e só ele; a entrada volta marcada com `bypassed_floor: true`.
  17. 2026-08-16.52026-08-16
    • Esta documentação passou a se identificar: versão e data de publicação no topo, e este histórico. Uma cópia local agora carrega a própria idade — antes, um snapshot velho era indistinguível de um novo, e a diferença só aparecia como divergência de cálculo.
  18. 2026-08-16.42026-08-16
    • `temperament.balancing`: a assinatura do temperamento virada em direção de conduta, em três papéis — `targets` (a qualidade em excesso e a ação contrária), `constraints` (o que a correção não pode piorar) e `support` (a ação branda que acompanha). `mode` diz o caminho: `single_axis`, `dual_axis`, `maintenance` ou `indefinite`.
    • O alvo sai de `imbalance`, não da força do eixo: qualidade fraca nunca vira alvo, e o que se preserva num eixo fraco é sempre calor ou umidade — nunca frio nem secura.
  19. 2026-08-16.32026-08-16
    • 🔴 `POST /profection` estava documentada e respondia **404**: a rota existia no motor, mas não passava pela porta pública. Agora responde.
    • 🔴 Os parâmetros de desenho de `/chart.png` e `/chart.svg` (`width`, `theme`, `stars`, `identity` e os demais) eram lidos **só da query**, embora a tabela os liste no corpo. Mandados no corpo, eram descartados em silêncio com resposta 200 — 1600 px pedido, 1200 px entregue. Agora valem nos dois lugares; a query vence no empate, e valor inválido é 422 com o limite.
  20. 2026-08-16.22026-08-16
    • Régua dos eixos nos aspectos: a ponta primária (ASC, MC) carrega conjunção, trígono e quadratura; a segunda (DSC, IC), conjunção e trígono. Cada figura sai uma vez e na forma em que se lê — `saturn conjunction ic`, e não `saturn opposition mc`.
  21. 2026-08-16.12026-08-16
    • Profecção: as setas miram no **começo** do período, não no meio. Mirar no meio devolvia um instante sem sentido astrológico apresentado como a data pedida.
    • Recepção negativa: o grau passou a devolver `detriment_of` e `fall_of` — de quem aquele signo é o exílio e a queda. Descrevem o lugar e **não pontuam**.
  22. 2026-08-15.12026-08-15
    • Aspectos aos pontos: a tabela passou a incluir ASC, MC, DSC, IC e os dois nodos (`aspects.include_points`). Antes entravam só os 10 corpos, e o mapa saía sem aspecto nenhum ao Ascendente.
    • `aspects.flat_orb`: limite único do par, que ignora o modelo por astro. É o que horária e eleição usam (3° estritos) — escrever 3 em cada astro daria 1°30' ao par, pelo modelo de metades.
    • Urano, Netuno e Plutão só formam conjunção e oposição (3°); os nodos, só conjunção e trígono.
  23. 2026-08-14.12026-08-14
    • `POST /profection` (anual, mensal e diária) e `POST /chart.png` · `/chart.svg` (a Roda desenhada).
    • `primary_motivation` saiu de `null`: a cadeia de três pontos, os casos especiais e as atividades, cada linha com o verbo que a justifica.
    • Estrelas fixas: piso de magnitude antes do orbe (≤3 natal, <3 revolução), e quem fica com o ponto é a **mais brilhante**, não a mais colada.
    • Temperamento: quatro pontos com contagem de testemunhos, e o senhor da natividade passou a modular em vez de pontuar. Corrige o que esta documentação ensinava antes.
    • Mentalidade: contrapeso do polo, e o empate do almuten decidido pela dignidade acidental.
    • Combustão exige o **mesmo signo** do Sol; em signos diferentes é `sob os raios`. As três distâncias: combustão 8°30', sob os raios até 15°, cazimi 17' de arco.
  24. 2026-08-12.12026-08-12
    • Primeira publicação da documentação da API pública.