Galovu
← galovu.com
Developer API

Connect your app to Galovu.

A simple REST API over HTTPS/JSON. Read your developments, inventory and leads, or push leads in from anywhere — this is how DoeAsk and any third-party tool plug into a Galovu account.

Base URL  ·  https://galovu.com/api/v1

Authentication

Every request (except the index) needs an API key sent as a Bearer token. Create one in your Galovu dashboard under Connect → API keys. One key maps to exactly one account, so a key only ever sees that account's data.

Authorization: Bearer glv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Treat a key like a password. Prefer calling the API server-to-server; if you must call it from a browser, that key is exposed to anyone who views the page. Revoke a key any time from the dashboard.

Endpoints

Method & pathReturns
GET/api/v1Self-describing index (no key required).
GET/meThe account this key belongs to + usage counts.
GET/projectsYour developments, each with a selling-status summary.
GET/projects/{id|slug}One development: presentation + full inventory.
GET/projects/{id|slug}/unitsJust the inventory/availability (for stock syncs).
GET/projects/{id|slug}/leadsLeads for one development.
GET/leadsLeads across the whole account (for polling).
POST/projects/{id|slug}/leadsPush a lead into Galovu from an outside app.

Query params on /leads: after={id} (cursor — pass the last nextAfter you saw), since={iso}, kind=lead|viewing|share, project={id}, limit={n} (max 500, default 100). Leads come back newest-first with an id and a nextAfter cursor.

Examples

List your developments

curl -s https://galovu.com/api/v1/projects \
  -H "Authorization: Bearer $GALOVU_KEY"

Pull new leads (incremental polling)

# First call: newest 100 leads
curl -s "https://galovu.com/api/v1/leads?limit=100" \
  -H "Authorization: Bearer $GALOVU_KEY"

# Later calls: only what's new since the last nextAfter cursor
curl -s "https://galovu.com/api/v1/leads?after=4821" \
  -H "Authorization: Bearer $GALOVU_KEY"
{
  "leads": [
    { "id": 4822, "ts": "2026-10-09T10:14:03-07:00", "kind": "viewing",
      "name": "Lara Chen", "email": "lara@example.com", "phone": "012 345",
      "unit": "07C", "source": "Galovu", "channel": "api",
      "project": { "id": "p_284a…", "slug": "citadel-manor", "name": "Citadel Manor" } }
  ],
  "count": 1,
  "nextAfter": 4822
}

Push a lead in

curl -s -X POST https://galovu.com/api/v1/projects/citadel-manor/leads \
  -H "Authorization: Bearer $GALOVU_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Sok Dara","email":"dara@example.com","unit":"12B","message":"Price?","source":"doeask"}'

Connecting DoeAsk

Two ways to get leads into DoeAsk — use either or both; both are labelled source: "Galovu":

1. Pull (polling). DoeAsk calls GET /api/v1/leads?after={cursor} on a schedule and advances its stored cursor by the nextAfter it gets back. Unit-aware fields (unit, type, price) ride along.

2. Push (webhook). In each development's settings, set the enquiry webhook to a DoeAsk URL; Galovu POSTs every new lead there in real time ({event:"lead", source:"Galovu", lead:{…, unit, unitType, unitPrice, kind, when}}).

Rate limits & errors

600 requests / 10 minutes per account (429 if exceeded). Errors are JSON: { "error": "unauthorized", "message": "…" } with the matching HTTP status (401 no/bad key, 403 not your development, 404 unknown, 400 bad input). CORS is open, so browser clients work too (mind the key-exposure note above).

Need a key? Sign in at galovu.com/dashboard → Connect. The same key also works with Galovu's MCP endpoint for AI tools.