Prompt untuk AI builder
Builder menulis kode lebih cepat darimu. Yang tidak diketahuinya adalah dua hal tentang API tertentu: di mana menaruh kunci dan mengapa permintaan dari browser tidak berhasil. Keduanya menghabiskan berjam-jam debugging, dan keduanya bisa diatasi dengan satu paragraf di prompt.
Di bawah ini paragraf tersebut lebih dulu, lalu tujuh resep.
Aturan yang harus disisipkan sebelum resep apa pun
Section titled “Aturan yang harus disisipkan sebelum resep apa pun”Salin blok ini ke builder sebelum teks resep. Ini bukan soal gaya kode, melainkan soal hal yang tanpanya tidak akan berjalan.
AstroWay API house rules. Apply these to every request you generate.
1. The API key is a server secret. Never put aw_live_* or aw_test_* into client code, into a VITE_* or NEXT_PUBLIC_* variable, or into a fetch that runs in the browser. Create a server route and call the API from there.2. The browser cannot call https://api.astroway.info/v1/* with that key. The one exception is a publishable pk_live_* key created for your app's origin: responses to that origin carry access-control-allow-origin, and the key works only from origins on its own list. Two prefixes answer any browser with no key: /v1/public/* returns JSON you can use, and /v1/embed/* returns a finished HTML page meant for an iframe, not for fetch.3. The auth header is exactly "X-Api-Key: <key>". Authorization: Bearer is rejected with 401, and so is an api_key query parameter.4. Send the birth time zone as an IANA name: "timezone": "Europe/Kyiv". Do not compute a UTC offset yourself. Kyiv in May 1990 was UTC+4, not the +3 it is today, and a wrong offset moves every house cusp.5. Every response is {"ok": true, "data": {...}} or {"ok": false, "error": {"code": "...", "message": "..."}}. Read data on success and show error.message to the user on failure. Do not assume a bare object.6. Planet positions arrive as ecliptic longitude in degrees, with no sign name. Derive it: SIGNS[Math.floor(longitude / 30)] where SIGNS runs Aries, Taurus, Gemini, Cancer, Leo, Virgo, Libra, Scorpio, Sagittarius, Capricorn, Aquarius, Pisces. Degrees inside the sign are longitude % 30.7. Responses carry X-Credits-Used and X-Credits-Remaining. Log both on the server so the cost of a feature is visible before the bill is.8. Ask for the fields you will render. Every endpoint takes ?fields= as a comma-separated list of dotted paths and ?precision= as decimal places: POST /v1/chart?fields=planets.name,planets.longitude,houses.cusp&precision=2 answers in 559 bytes where the full response is 32,410. Same credits, and the tokens are yours to pay either way.9. Get a free key at https://api.astroway.info/dashboard/sign-up and use an aw_test_* sandbox key while building: it spends no credits.1. Bagan natal dengan roda
Section titled “1. Bagan natal dengan roda”Dua respons untuk satu aksi pengguna: data bagan dan SVG siap pakai.
| Endpoint | Kredit |
|---|---|
/v1/chart | 20 |
/v1/render/wheel-western | 10 |
Build a single-page app: a birth data form (date, time, city with latitude andlongitude, IANA time zone) that renders a natal chart.
Server route POST /api/chart does two calls to AstroWay, in parallel: POST https://api.astroway.info/v1/chart POST https://api.astroway.info/v1/render/wheel-westernBoth take the same body: { "date": "1990-05-15", "time": "14:30:00", "timezone": "Europe/Kyiv", "latitude": 50.45, "longitude": 30.52 }Both need the X-Api-Key header.
/v1/chart returns data.planets (array with name, longitude, isRetrograde),data.houses.cusps (array of 12 longitudes) and data.aspects (array withplanet1, planet2 and a type object carrying name, symbol and color)./v1/render/wheel-western returns data.svg as a string.
The page shows the SVG at the top, then a table of planets with sign anddegree derived from longitude, then the aspect list using type.symbol andtype.color. Mark retrograde planets with an R.
Do not call AstroWay from the browser. The page calls /api/chart only.Periksa setelah generate: SVG disisipkan sebagai markup, bukan di <img src>; waktu dikirim sebagai string HH:mm:ss; kunci tidak masuk ke bundle (pencarian aw_ di file hasil build tidak boleh menemukan apa pun).
2. Kecocokan dua bagan
Section titled “2. Kecocokan dua bagan”Satu angka beserta komponennya, tanpa teks penjelasan. /v1/synastry/attraction-score, 50 kredit per pasangan.
Build a compatibility page: two birth-data forms side by side, one button.
Server route POST /api/compat calls POST https://api.astroway.info/v1/synastry/attraction-scorewith body { "chart1": {...}, "chart2": {...} }, where each chart is { "date", "time", "timezone", "latitude", "longitude" }.
The response has data.score (a number), data.components (the parts that madeit) and data.notes. Render score as a large number with a progress ring, thencomponents as labelled bars, then notes as a list.
Never show the score without the components: a single number with no reasonbehind it is the thing users distrust.3. Horoskop harian, sama sekali tanpa kunci
Section titled “3. Horoskop harian, sama sekali tanpa kunci”Satu-satunya resep yang tidak membutuhkan route server: endpoint ini merespons browser dan tidak memakan kredit.
Add a daily horoscope block to the page. Call this directly from the browser,no key and no server route needed:
GET https://api.astroway.info/v1/public/horoscope/daily?sign=leo&lang=en
Response: data.sign, data.date, data.period, data.horoscope (the text),data.disclaimer and data.language. Render a sign picker with the twelve signs,remember the choice in localStorage, and always show data.disclaimer under thetext.
The first request for a date that has not been generated yet can take a while,so show a skeleton, not a spinner that looks stuck.4. Human Design
Section titled “4. Human Design”Tipe, strategi, otoritas, profil, pusat, dan kanal dalam satu panggilan /v1/human-design, 50 kredit.
Build a Human Design page: birth data form, then the chart summary.
Server route POST /api/hd calls POST https://api.astroway.info/v1/human-designwith { "date", "time", "timezone", "latitude", "longitude" }.
The response has data.type, data.strategy, data.notSelfTheme, data.authority,data.profile, data.definition, data.cross, data.centers, and the activationarrays data.personalityActivations and data.designActivations.
Lay it out as: type and strategy as the headline, authority and profile as twocards, centers as a list with defined ones filled and undefined ones outlined,activations in a collapsible table. Birth time matters here more than anywhereelse, so refuse to submit without it and say why.5. Laporan PDF dengan merek pengguna
Section titled “5. Laporan PDF dengan merek pengguna”Untuk mereka yang menjual laporan, bukan menampilkan layar. /v1/reports/natal, 5000 kredit per dokumen, dan tautannya berlaku 24 jam.
Build a report generator: birth data form plus a branding form (company name,report title, accent colour), and a Generate button.
Server route POST /api/report calls POST https://api.astroway.info/v1/reports/natalwith { "chart": { "date", "time", "timezone", "latitude", "longitude" }, "whitelabel": { "companyName": "...", "reportName": "...", "themeColor": "#7c3aed", "footerText": "..." } }
The response has data.url, data.page_count, data.byte_length anddata.expires_at. The URL is valid for 24 hours only, so the server mustdownload the PDF immediately and store it on your side, then hand the useryour own link. Never give the AstroWay URL to the end user.
Show page_count and a download button. One report costs 5000 credits: put aconfirmation step before the call, not after.Katalog lengkap enam belas laporan, isi masing-masing dan jumlah halamannya: Reports API.
6. Kalender transit untuk sebulan
Section titled “6. Kalender transit untuk sebulan”Daftar peristiwa dalam rentang tanggal, yang bisa dijadikan feed maupun kalender. /v1/transit-calendar, 100 kredit per rentang.
Build a month view of transits.
Server route POST /api/transits calls POST https://api.astroway.info/v1/transit-calendarwith { "natal": { "date", "time", "timezone", "latitude", "longitude" }, "startDate": "2026-10-01", "endDate": "2026-10-31" }
The response has data.count and data.events, plus the echoed startDate,endDate and maxOrb. Render events on a month grid, one dot per day withevents, and a day panel listing that day's events.
One call covers the whole window, so fetch the month once and filter in theclient. Do not call the API per day: that is thirty-one calls and thirty-onetimes the credits for the same answer.7. Bentangan tarot
Section titled “7. Bentangan tarot”Cara termurah untuk menambahkan interaksi harian. /v1/tarot/rider-waite/draw/three-card, 10 kredit per bentangan, atau nol untuk kartu harian.
Add a three-card tarot spread.
Server route POST /api/tarot calls POST https://api.astroway.info/v1/tarot/rider-waite/draw/three-cardwith an optional { "seed": 7 }. The response has data.spread, data.seed anddata.drawn.
Pass a seed derived from the user id and today's date, so the same person getsthe same spread all day and a new one tomorrow. Without a seed every reloaddeals a new hand, which reads as a slot machine.
For a zero-cost daily card the browser can call GET https://api.astroway.info/v1/public/tarot/dailydirectly, no key.Delapan builder, satu perbedaan
Section titled “Delapan builder, satu perbedaan”Resep di atas sama untuk semuanya. Perbedaannya hanya di mana route server berada dan di mana kunci disimpan.
| Builder | Tempat panggilan server berjalan | Tempat menyimpan kunci |
|---|---|---|
| Lovable | edge function di Supabase | Secrets proyek Supabase |
| Bolt | server function | panel Secrets di Bolt |
| v0 | route handler Next.js di Vercel Functions | environment variable di Vercel, bertipe Secret |
| Replit | proses server biasa | Replit Secrets, dan sekali lagi secara terpisah di Deployments |
| Cursor, Claude Code, Devin Desktop, Copilot | yang ada di stack-mu | .env di luar git ditambah penyimpanan secret hosting-mu |
Empat jebakan terpisah, masing-masing menghabiskan satu malam.
- Lovable dan Bolt membangun frontend dengan Vite, dan Vite menyerahkan ke browser setiap variabel berawalan
VITE_. Kunci tidak boleh ditaruh di sana, bahkan sementara: kunci akan berakhir di bundle yang dibagikan ke semua orang. - Bolt menampilkan pratinjau di dalam WebContainer, dan itu adalah browser sungguhan dengan CORS sungguhan yang tidak bisa dimatikan di sana. Server function di sini bukan sekadar “lebih baik”, melainkan satu-satunya cara agar panggilan terjadi sama sekali.
- v0 menanamkan
NEXT_PUBLIC_*ke bundle saat build. Mengubah nilai di dasbor tidak cukup: selama belum ada deploy baru, aplikasi berjalan dengan kunci lama. Rotasi kunci berarti rotasi ditambah build ulang. - Replit menyimpan secret workspace dan secret Deployments secara terpisah. Yang berjalan di editor gagal dengan kunci kosong setelah dipublikasikan, sampai kamu menambahkannya sekali lagi di panel Deployments.
Empat baris terakhir tabel bukan platform, melainkan agen di repositorimu, dan masing-masing punya daftar izin jaringan sendiri untuk sandbox-nya. Saat agen ingin menguji kode yang baru ditulis, panggilan ke api.astroway.info bisa diblokir sampai domainnya ditambahkan. Untuk mereka ada jalan yang lebih singkat: hubungkan MCP kami dan agen akan memanggil API sendiri, tanpa kodemu. Petunjuknya ada di Penyiapan agen.
Jika agenmu berbicara function calling, bukan MCP
Section titled “Jika agenmu berbicara function calling, bukan MCP”Ambil definisi tool siap pakai dan berikan langsung ke model. Definisi ini dihasilkan dari dokumen OpenAPI, jadi skema yang diisi model sama dengan skema yang divalidasi endpoint.
curl "https://api.astroway.info/v1/agent/tools?format=openai&select=starter" \-H "X-Api-Key: aw_live_YOUR_KEY"format menerima openai dan anthropic, select mempersempit katalog ke set awal alih-alih semua tool.