# No-code integrations

Everything on these pages was run against production on 2026-09-17. The n8n workflow was imported and executed in a real n8n; the Zapier and Make steps follow each tool's own documentation, and the requests they build were sent exactly as written.

## Where the request leaves from

That one fact decides which key you need.

- **Zapier, Make and n8n** send it from their own servers. Use a server-only key with an endpoint scope and a budget, set up below. Guides: [Zapier](/en/integrations/zapier/), [Make](/en/integrations/make/), [n8n](/en/integrations/n8n/).
- **Bubble** sends from its own servers too, with the key in a header that stays there: [Bubble](/en/integrations/bubble/).
- **FlutterFlow** compiles into an app your users hold, so the call has to be made private: [FlutterFlow](/en/integrations/flutterflow/).
- **Wix, Squarespace, Shopify, Webflow and Tilda** show your page in the visitor's browser. Paste a widget rather than a key: [site builders](/en/integrations/site-builders/).
- **WordPress** calls from your own server. The [AstroWay plugin](https://wordpress.org/plugins/astroway/) handles the key.

<Aside type="caution">
A publishable `pk_` key does not work from Zapier, Make or n8n. It is refused unless the request carries an origin from its list, and those tools send none. From a web page it reaches `/v1/public/*` and `/v1/embed/*` only.
</Aside>

## A key for an automation

Anyone who can edit a Zap, a scenario or a workflow can read the key inside it. So give each automation its own key and narrow it to what that automation does.

1. In the dashboard open [API Keys](https://api.astroway.info/dashboard/keys) and press **New key**. Name it after the automation, for example `zapier-intake-form`.
2. Under **Where will this key be used?** keep **Server-only**.
3. Copy the key. The dialog shows it in full once; later it is under **Reveal** in the key's menu.
4. In the key's menu open **Endpoint scope** and list the paths the automation calls, one per line: `chart` for a natal chart, `public/horoscope/*` for the daily horoscopes.
5. In the same menu open **Set budget** and enter the credits this key may spend per cycle.

A call outside the scope gets `403 ENDPOINT_NOT_IN_SCOPE`. A key that reaches its budget gets `429 KEY_BUDGET_EXHAUSTED`, even when the account still has credits, so a loop that runs away stops at the number you wrote. Both limits work on any plan and are described in [Authentication](/en/authentication/).

## Send the birth moment, not an offset

A form gives you a date, a clock time and a place. Send them like this:

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

- **`timezone`** is the zone name, and the server works out the UTC offset those clocks kept on that date, summer time included. Kyiv on 1990-05-15 was UTC+4, not +3, which is the kind of mistake a hand-typed offset makes. Send `auto` to take the zone from the coordinates.
- **Leave out `timezone` and the offset**, and the chart is computed for UTC. The answer is still a `200`, so check the field is mapped.
- **An empty `timezone`** is refused with `400`, because an unmapped form field would otherwise read as UTC.
- **`date`** is `YYYY-MM-DD` and **`time`** is `HH:MM:SS`. Use the tool's date formatter if the form stores them differently.
- **Numbers may arrive as text.** `"latitude": "50.45"` is accepted, which is what most form fields send.
- **The API does not geocode.** Coordinates have to come from the form or from a geocoding step in the tool. The `city` field is a label only.

More on the rules for clock changes and dates before 1970 in [Field formats](/en/agent-setup/field-formats/#timezone-a-zone-name-instead-of-an-offset).

## Turning longitudes into signs

`POST /v1/chart` answers in degrees along the zodiac, wrapped in `{ "ok": true, "data": { ... } }`. The sign is `floor(longitude / 30)`, counted from zero:

0 Aries, 1 Taurus, 2 Gemini, 3 Cancer, 4 Leo, 5 Virgo, 6 Libra, 7 Scorpio, 8 Sagittarius, 9 Capricorn, 10 Aquarius, 11 Pisces.

Where the three most asked-for values live:

- **Sun**: the entry of `data.planets` with `"name": "Sun"`, the first one.
- **Moon**: the entry of `data.planets` with `"name": "Moon"`, the second one.
- **Ascendant**: `data.houses.ascendant`.
- **Offset that was used**: `data.input.timezoneOffset`.

For the example above: Sun 54.34, so Taurus; Moon 296.39, Capricorn; Ascendant 159.26, Virgo; offset 4.

## What it costs

- `POST /v1/chart` is 20 credits. The full table is on [Per-endpoint cost](/en/credits/).
- The same request sent again within five minutes is answered from cache and is not charged. A test run that repeats one body does not spend your budget.
- `GET /v1/public/horoscope/daily` spends no credits. Without a key, or with a key on the Free plan, it counts against 30 requests an hour per IP address, and automation platforms share their addresses between customers. A key on a paid plan gets a limit of its own.
