# FlutterFlow

FlutterFlow एक एप्लिकेशन में कंपाइल होता है, जिसे तेरा उपयोगकर्ता अपने हाथ में रखता है, इसलिए सवाल यह नहीं है कि कौन‑से फ़ील्ड भरने हैं, बल्कि यह है कि कुंजी कहाँ रहती है। नीचे दिया गया अनुरोध ठीक उसी रूप में प्रोडक्शन पर भेजा गया है, जैसा कि कॉल बनाता है; FlutterFlow में कदम 2026-09-17 की FlutterFlow दस्तावेज़ीकरण के अनुसार लिखे गए हैं।

पहले कुंजी बनाओ, जैसा कि सेक्शन [ऑटोमेशन के लिए कुंजी](/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**: पाँच स्ट्रिंग प्रकार के वेरिएबल, `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"
}
```

Latitude और longitude को जानबूझकर स्ट्रिंग के रूप में रखा गया है: API `"50.45"` को संख्या के रूप में लेता है, लेकिन स्ट्रिंग वेरिएबल ड्रैग को आसान बनाती है।

**Add Call** पर क्लिक करो, **Response & Test** खोलो, **Test API Call** पर क्लिक करो और **Test Response** में जवाब देखो। `data.input.timezoneOffset` `4` के रूप में लौटता है: यही किव की उस तारीख का ऑफ़सेट था।

## 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 Path |
|---|---|
| `ascendant` | `$.data.houses.ascendant` |
| `sunLongitude` | `$.data.planets[0].longitude` |
| `moonLongitude` | `$.data.planets[1].longitude` |
| `offsetUsed` | `$.data.input.timezoneOffset` |

साइन वह longitude है, जिसे 30 से भाग देकर नीचे की ओर राउंड किया जाता है, जैसे 12 नामों की सूची में इंडेक्स: उदाहरण के लिए Ascendant `159.26` देता है `5`, यानी Virgo। चार पंक्तियों की कस्टम फ़ंक्शन या 12 पंक्तियों की सूची और इंडेक्स पर्याप्त है।

## वेब बिल्ड ब्राउज़र से हमसे संपर्क नहीं कर सकता

2026-09-17 को एक बाहरी डोमेन पेज से मापा गया: `POST /v1/chart` preflight का जवाब `access-control-allow-origin` हेडर के बिना देता है, और Chrome अनुरोध को ब्लॉक करता है। बाहरी डोमेन पर ब्राउज़र को केवल `/v1/public/*` और `/v1/embed/*` जवाब देते हैं।

FlutterFlow कॉल को अपने प्रॉक्सी के माध्यम से Designer, Run mode और Test mode में चलाता है, इसलिए जो कॉल वहाँ काम करता है, वेब‑ऐप प्रकाशित करने के बाद फेल हो सकता है। दो समाधान हैं, और पहला मैं सुझाता हूँ:

- **कॉल को निजी बनाओ**, ऊपर की तरह। तब यह Cloud Function में चलता है, ब्राउज़र में नहीं, और यह तुरंत कुंजी और CORS दोनों की समस्या हल करता है।
- **हमारे सामने अपना बैकएंड रखो**, अगर तरे पास पहले से है। FlutterFlow में प्रॉक्सी सेटिंग, अपने proxy URL के साथ, Designer और Run तथा Test मोड के लिए दस्तावेज़ित हैं; प्रकाशित वेब‑बिल्ड के बारे में दस्तावेज़ कुछ नहीं कहता, इसलिए उन पर भरोसा नहीं करना चाहिए।

पब्लिक कुंजी `pk_` यह नहीं सुलझाती: यह केवल `/v1/public/*` और `/v1/embed/*` तक पहुँचती है, और iOS और Android बिल्ड्स से पूरी तरह ब्लॉक हो जाती है, क्योंकि वे वेब‑origin नहीं भेजते।

## त्रुटियाँ

- **`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>
