# FlutterFlow

FlutterFlow는 사용자가 손에 쥐고 있는 앱으로 컴파일되므로 문제는 어떤 필드를 채울지가 아니라 키가 어디에 있게 되는 거야. 아래 요청은 프로덕션에 정확히 그 형태로 전송되고, FlutterFlow의 단계는 2026-09-17 기준 문서에 따라 작성됐어.

먼저 [자동화 키](/integrations/#ключ-для-автоматизації)에서 설명한 대로 키를 만들어, 범위는 `chart`로 설정해.

<Aside type="caution" title="Ключ у звичайному виклику їде разом із застосунком">
프라이빗으로 표시되지 않은 호출은 기기에서 실행되며, 그 헤더는 iOS, Android, 웹용 컴파일된 빌드 안에 들어 있어 누구나 볼 수 있어. 호출을 **프라이빗**으로 만들어: 그럼 FlutterFlow는これを Firebase Cloud Function을 통해 라우팅하고 키는 서버에 남아. FlutterFlow 자체 검사는 프로젝트 코드를 다운로드하고 프론트엔드 파일에서 키를 찾는 거야; 이건 유료 플랜에서만 사용할 수 있어.
</Aside>

## 1. Створіть виклик

**API Calls**를 열고, **+ Add**를 클릭하고, **Create API Call**을 선택해서 채워:

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

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

- **Headers** 탭에서 **+ Add Header**를 클릭해서 한 줄에 `X-Api-Key: ` 뒤에 당신의 키를 입력하고, 두 번째 줄에 `Content-Type: application/json`를 입력해.
- **Variables** 탭에서 String 타입 변수 다섯 개를 추가해: `date`, `time`, `timezone`, `latitude`, `longitude`. 각각은 아래 JSON의 기본값을 가져.
- **Body** 탭에서 **JSON** 무작위 목록을 선택하고 JSON을 붙여넣은 뒤 변수를 드래그해 넣어.

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

위도와 경도는 의도적으로 문자열로 남겨둬: API는 `"50.45"`를 숫자로 받아들이지만, 문자열이면 변수 드래그가 더 쉬워.

**Add Call**을 클릭하고, **Response & Test**를 열고, **Test API Call**을 눌러 **Test Response**에서 응답을 봐. `data.input.timezoneOffset`는 `4`로 반환돼;这就是 Kyiv가 그날 가지고 있던 오프셋이야.

## 2. Зробіть виклик приватним

**Advanced Settings**에서 호출의 **Make Private**를 켜고, **Save**를 클릭한 뒤 **Deploy APIs**를 진행해. 이제 호출은 Firebase Cloud Function에서 실행되므로 프로젝트에 연결된 Firebase와 Cloud Functions가 포함된 Firebase 플랜이 필요해.

<Aside type="caution" title="Приватні виклики не успадковують заголовки групи">
**API Group**에 키를 두고 호출 자체에 두지 않으면, 호출이 프라이빗이 될 때 FlutterFlow는 즉시 그 전송을 중단해: 그룹 헤더는 프라이빗 호출에 상속되지 않아. 호출 자체에 `X-Api-Key`를 추가해;不然 첫 번째 프라이빗 실행이 `401`을 반환할 거야.
</Aside>

FlutterFlow 문서에서 직접 언급하는 두 가지 사항이 있어: 프론트엔드에서 전달된 키(예: remote config를 통해)는 даже 프라이빗 호출에서도 노출된 채로 남아 있고, 안전한 형태는 호출 자체에 작성된 헤더야.

## 3. Прочитайте відповідь

**JSON Paths**에서 **+ Add JSON Path**를 클릭하고 각 항목에 이름을 붙여:

| 이름 | JSON 경로 |
|---|---|
| `ascendant` | `$.data.houses.ascendant` |
| `sunLongitude` | `$.data.planets[0].longitude` |
| `moonLongitude` | `$.data.planets[1].longitude` |
| `offsetUsed` | `$.data.input.timezoneOffset` |

이 숫자는 경도를 30으로 나누고 내림한 값으로, 12개 이름 목록의 인덱스야. 예를 들어 상승점 `159.26`은 `5`가 되는데, 즉 처녀자리야. 네 줄짜리 커스텀 함수나 12개 항목 목록과 인덱스로 충분해.

## Веб-збірка не може звертатися до нас із браузера

웹 빌드는 브라우저에서 우리에게 접근할 수 없어

2026-09-17에 외부 도메인의 페이지에서 측정했을 때, `POST /v1/chart`은 `access-control-allow-origin` 헤더 없이 프리플라이트에 응답해서 Chrome이 요청을 차단해. 외부 도메인의 브라우저에는 오직 `/v1/public/*`와 `/v1/embed/*`만 응답해.

FlutterFlow는 생성기의 자체 프록시를 통해 호출을 실행하는데, Run 모드와 Test 모드에서는 작동하지만 웹 앱을 게시한 후에는 실패할 수 있어. 두 가지 해결책이 있고, 첫 번째를 추천해:

- 호출을 **프라이빗**으로 만들어, 위에 설명한 대로. 그러면 Cloud Function에서 실행되고 브라우저에서는 실행되지 않아서 키 문제와 CORS 문제를 한 번에 해결해.
- **우리 앞에 자신만의 백엔드를 놓아**, 이미 있다면. FlutterFlow의 프록시 설정과 함께 자신의 proxy URL은 생성기와 Run/Test 모드에 문서화되어 있는데, publicados된 웹 빌드에 대해서는 문서가 아무것도 없으니 거기에 의존하지 마.

퍼블릭 키 `pk_`로는 이 문제를 해결할 수 없어: 오직 `/v1/public/*`와 `/v1/embed/*`에만 접근 가능하고, iOS와 Android 빌드는 완전히 거부돼; 왜냐하면 그들은 웹-오리진을 보내지 않기 때문이야.

## Помилки

- **`401`** 프라이빗 호출에서: 키가 그룹에 있고 호출 자체에 없어.
- **`400 INVALID_FIELD`**에서 `timezone`의 `details`에: 구역이 비어 있고,これは `EST` 같은 약어거나 유효한 구역 이름이 아니야.
- **`400`**에서 `date` 또는 `time`의 `details`에: 형식이 `YYYY-MM-DD` / `HH:MM:SS`가 아니야.
- **`403 ENDPOINT_NOT_IN_SCOPE`**: 키의 범위에 `chart`가 없어.
- **`429 KEY_BUDGET_EXHAUSTED`**: 키가 자체 예산을 소모했어; 대시보드에서 올려.

<Aside type="note">
FlutterFlow의 무료 플랜은 프로젝트당 두 개의 API 엔드포인트를 허용하고 OpenAPI 임포트를 지원하지 않아서 여기서 호출을 수동으로 추가하면 여전히 하나의 슬롯이 남아. API는 지오코딩을 하지 않아: 좌표는 당신의 власних 필드 또는 당신이 키를 가진 지오코딩 서비스에서 가져와.
</Aside>
