Flukto
LanguageEnglish

Flukto Pulse API

One public JSON with the live Flukto pulse: how many people are on air in the world, where the map is warm, and, if you tell us where you are, how many are on air in your city. Made for gadgets, desk displays, widgets and websites. No key, no sign-up.

The call

GET https://flukto.com/api/v1/pulse

Optional query parameters:

ParameterMeaning
lat, lngYour position in decimal degrees. Rounded to 0.01° (about 1 km) on our side. Adds near.
cityA city name instead of coordinates, e.g. city=K%C3%B6ln or city=Cologne. Adds near.
compact=1Leaves out cells. For small devices that only show numbers.
langen (default), de, ru: language of the ready-made text lines.

The answer

{
  "v": 1,
  "now": "2026-10-06T08:12:21.000Z",
  "at": "2026-10-06T08:12:00.000Z",
  "ttl": 20,
  "world": { "on_air": 29, "reachable": 12, "accounts": 128, "cities": 4,
             "text": "41 reachable · 4 cities alive" },
  "cells": [[50.47, 5.7, 0.75, 2], [51.41, 6.36, 0.65, 3]],
  "near":  { "name": "Köln", "country": "DE", "on_air": 7, "at_least": 7,
             "notes": 3, "warm": 0.6, "text": "7 on air in Köln" },
  "links": { "app": "https://flukto.com/get", "docs": "https://flukto.com/api",
             "logo": "https://flukto.com/assets/logo.svg",
             "wordmark": "https://flukto.com/assets/wordmark.svg" }
}

Limits

Answers are cached for 20 seconds per URL. Each IP address may ask 30 times a minute; after that you get 429 with a Retry-After header. The response carries Access-Control-Allow-Origin: *, so a browser widget on any site can read it directly.

What is not in it

No people, no positions, no profiles. The numbers are the same k-anonymous counts the app shows in its World tab: a city count only exists from five people upwards, a warm cell is at least 60 km wide, and nothing in the answer can be traced back to a person. Read more under Privacy.

Examples

Shell:

curl "https://flukto.com/api/v1/pulse?city=Cologne&compact=1&lang=en"

A line on a website:

<span id="flukto">…</span>
<script>
fetch('https://flukto.com/api/v1/pulse?compact=1')
  .then(r => r.json())
  .then(p => { document.getElementById('flukto').textContent = p.world.text; });
</script>

ESP32 (Arduino, ArduinoJson):

HTTPClient http;
http.begin(client, "https://flukto.com/api/v1/pulse?compact=1&lat=50.93&lng=6.96");
if (http.GET() == 200) {
  JsonDocument doc;
  deserializeJson(doc, http.getStream());
  long onAir = doc["world"]["on_air"];
  const char *line = doc["near"]["text"];   // "7 on air in Köln"
}
http.end();
delay(20000);  // ttl

Our own desk globe (ESP32-S3 with a 1.47" display) draws the planet from cells and shows world.on_air; its ready-to-flash firmware is on /gadgets, a browser preview at /iot/esp32s3174.

Logo

If a gadget or page shows the Flukto numbers, it may show the mark: logo.svg (the hexagon) and wordmark.svg (hexagon and name), ember #f2a25c on night #0b0e13. Do not change the colours or the shape.

Changes

The v field names the format. Fields may be added at any time; existing fields keep their meaning. If something has to break, it gets a new version and this page says so.