API — Ext (widget-facing)
The /ext/ route group exposes the four endpoints the embeddable widget calls at runtime. These routes are not authenticated with JWT — the widget has no user session. Authorization uses the finder’s public token. See Integration points: External → Backend for the full protocol.
Unauthenticated widget endpoints
GET /ext/finders/details/{key}
The widget’s primary data fetch. Returns the full finder payload (design config, settings, location list, advanced refinements).
Params: key — finder token (public string, not numeric ID)
Headers checked: Origin or Referer against the finder’s authorized_urls list.
Response 200: Full finder payload JSON. Response is cached server-side for 60 seconds (Laravel Cache) to absorb widget spike traffic.
Response 403: Origin not in authorized_urls list (if restrictions are configured).
GET /mapping/autocomplete
Proxy for the autocomplete provider configured on the finder.
Query params: q (search text), finder_key, lat?, lng?, country?
Throttle: throttle:30,1 (30 requests per IP per minute)
The backend resolves the finder’s autocomplete provider via a 60-second server-side cache (provider slug only, not the API key). The key is decrypted fresh per request from FinderIntegration. Falls back to DropaSearch (Nominatim) if no provider is configured.
Response 200: { suggestions: [{ place_id, description }] }
GET /mapping/places
Fetch place details for a selected autocomplete result (coordinates, address components).
Query params: place_id, provider, finder_key
Throttle: throttle:30,1
Response 200: { lat, lng, address, ... }
POST /analytics
Capture widget events (views, searches, clicks, location selections).
Body: { finder_token, events: [{ type, ... }] }
This endpoint is unauthenticated and has no rate limit documented in routes.php. Events are stored in the analytics table.
Response 200: { received: N }
Authenticated ext endpoints (dashboard-only)
These routes require auth:api, auth_session, audit.
POST /ext/finders/details/{key}/sync
Publish a finder. Builds the full payload, computes a SHA-1 hash, uploads v/{hash}.json to R2, and overwrites the pointer file config.json. This is the endpoint the V2 builder calls on “Publish”.
Params: key — finder token
Response 200: { hash } — the new payload hash.
GET /ext/finders/details/{key}/info
Return metadata about the current published payload (hash, last_synced_at).
DELETE /ext/finders/details/{key}
Delete the finder’s CDN payload (pointer + versioned file). Used during finder deletion.
Related pages
- Integration points: External → Backend — full request/response shapes
- Architecture: Data flow — end user — widget fetch chain
- Architecture: Data flow — builder — publish flow