# FlutterFlow

FlutterFlow se kompiluje do aplikace, kterou má ve svých rukou tvůj uživatel, takže nejde o to, jaká pole vyplnit, ale kde se klíč objeví. Níže uvedený požadavek byl odeslán do produkce přesně v tom tvaru, v jakém jej sestaví volání; kroky ve FlutterFlow jsou napsány podle dokumentace FlutterFlow k 2026-09-17.

Nejprve vytvoř klíč, jak je popsáno v sekci [Klíč pro automatizaci](/integrations/#ключ-для-автоматизації), s oblastí `chart`.

<Aside type="caution" title="Klíč v běžném volání jde spolu s aplikací">
Volání, které není označeno jako soukromé, se provádí ze zařízení a jeho hlavička leží uvnitř zkompilovaného balíčku pro iOS, Android a web, kde ji může přečíst kdokoli. Udělej volání **soukromým**: pak FlutterFlow provede jeho přes Firebase Cloud Function a klíč zůstane na serveru. Vlastní kontrola FlutterFlow je stáhnout kód projektu a vyhledat klíč v souborech frontendu, a je dostupná jen v placeném tarifu.
</Aside>

## 1. Vytvoř volání

Otevři **API Calls**, klikni na **+ Add**, vyber **Create API Call** a vyplň:

- **API Call Name**: `Natal chart`.
- **Method Type**: `POST`.
- **URL**:

  ```
  https://api.astroway.info/v1/chart
  ```

- Záložka **Headers**, **+ Add Header**: jeden řádek `X-Api-Key: ` a pak tvůj klíč. Druhý řádek `Content-Type: application/json`.
- Záložka **Variables**: pět proměnných typu String, `date`, `time`, `timezone`, `latitude`, `longitude`, každá s výchozí hodnotou z JSON níže.
- Záložka **Body**, v rozbalovacím seznamu **JSON**: vlož JSON a přetáhni do něj proměnné.

```json
{
  "date": "1990-05-15",
  "time": "14:30:00",
  "timezone": "Europe/Kyiv",
  "latitude": "50.45",
  "longitude": "30.52"
}
```

Šířka a délka zůstávají řetězci úmyslně: API přijímá `"50.45"` jako číslo, ale řetězec usnadňuje přetahování proměnných.

Klikni na **Add Call**, otevři **Response & Test**, klikni na **Test API Call** a podívej se na odpověď v **Test Response**. `data.input.timezoneOffset` se vrací jako `4`: právě takový posun měl Kyjev v ten den.

## 2. Udělej volání soukromým

V **Advanced Settings** volání zapni **Make Private**, klikni na **Save**, pak **Deploy APIs**. Nyní se volání provádí v Firebase Cloud Function, takže projekt potřebuje připojený Firebase a tarif Firebase s Cloud Functions.

<Aside type="caution" title="Soukromá volání nezdědí hlavičky skupiny">
Pokud umístíš klíč na **API Group**, místo na samotné volání, FlutterFlow přestane jej odesílat ve stejném okamžiku, kdy se volání stane soukromým: hlavičky skupiny se nezdědí do soukromých volání. Přidej `X-Api-Key` na samotné volání, jinak první soukromý běh vrátí `401`.
</Aside>

Ještě dvě věci, o kterých dokumentace FlutterFlow říká přímo: klíč předaný z frontendu, například přes remote config, zůstává otevřený i v soukromém volání, a bezpečná forma je hlavička vložená přímo do volání.

## 3. Přečti si odpověď

V **JSON Paths** klikni na **+ Add JSON Path** a dej každému jméno:

| Jméno | JSON Path |
|---|---|
| `ascendant` | `$.data.houses.ascendant` |
| `sunLongitude` | `$.data.planets[0].longitude` |
| `moonLongitude` | `$.data.planets[1].longitude` |
| `offsetUsed` | `$.data.input.timezoneOffset` |

Znamení je délka, vydělená 30 a zaokrouhlená dolů, jako index v seznamu dvanácti názvů: například Ascendent `159.26` dává `5`, tedy Pannu. Stačí vlastní funkce na čtyři řádky nebo seznam dvanácti řádků a index.

## Webová sestava se nemůže obrátit na nás z prohlížeče

Měřeno 2026-09-17 ze stránky na cizím doméně: `POST /v1/chart` odpovídá na preflight bez hlavičky `access-control-allow-origin`, a Chrome blokuje požadavek. Prohlížeči na cizím doméně odpovídají jen `/v1/public/*` a `/v1/embed/*`.

FlutterFlow provádí volání přes vlastní proxy v návrháři, v Run mode a Test mode, takže volání, které tam funguje, může selhat po publikaci webové aplikace. Dva řešení, a první doporučujeme:

- **Udělej volání soukromým**, jak výše. Pak se provádí v Cloud Function, ne v prohlížeči, a to okamžitě řeší jak otázku klíče, tak otázku CORS.
- **Postav před nás vlastní backend**, pokud ho už máš. Nastavení proxy ve FlutterFlow, spolu s vlastním proxy URL, jsou zdokumentována pro návrhář a režimy Run a Test; o publikované webové sestavě dokumentace nic neříká, takže na ně spoléhat není vhodné.

Veřejný klíč `pk_` to nevyřeší: získává jen `/v1/public/*` a `/v1/embed/*`, a ze sestav pro iOS a Android je odmítán úplně, protože neposílají web-origin.

## Chyby

- **`401`** na soukromém volání: klíč leží na skupině, ne na volání.
- **`400 INVALID_FIELD` s `timezone` v `details`**: zóna je prázdná, je to zkratka jako `EST` nebo ne název zóny.
- **`400` s `date` nebo `time` v `details`**: formát není `YYYY-MM-DD` / `HH:MM:SS`.
- **`403 ENDPOINT_NOT_IN_SCOPE`**: v oblasti klíče není `chart`.
- **`429 KEY_BUDGET_EXHAUSTED`**: klíč vyčerpal svůj rozpočet; zvedni ho v dashboardu.

<Aside type="note">
Bezplatný tarif FlutterFlow umožňuje dva API-endpointy na projekt a nemá import OpenAPI, takže na něm se volání přidává ručně a zůstává ještě jeden slot. API negeokóduje: souřadnice se berou z tvých vlastních polí nebo ze služby geokódování, ke které máš klíč.
</Aside>
