Add the meter
- Choose Add Meter… and pick Web Address.
- Paste the URL. Check it first with
curl -s URLto see what comes back. - Add a key path for JSON, set a range, and pick a refresh interval the API is happy with.
How it fetches
- A plain GET with a 15 second timeout, no cookies, and the User-Agent
Multimeter (Mac menu bar app). - Up to 256 KB of the reply is read.
- An error status shows as “The server answered 404” (or whichever code); a network failure as “Couldn’t reach the address”.
- Refresh Now in the meter’s menu fetches immediately.
What the reply can look like
Web addresses, files and scripts all read the same two formats.
A plain number, or any text with a number in it. Multimeter takes the first number it finds, and drops thousands separators between digits, so 1,284 stars reads as 1284.
JSON. Either a bare number, or an object with value and any of these extras:
{
"value": 38,
"min": 0,
"max": 50,
"label": "DEPLOY",
"unit": "today",
"formatted": "38 of 50"
}Pointing at bigger JSON you don’t control, like an API response? Give the meter a key path. Dots walk into objects and numbers pick array items: data.items.0.count. Numbers inside strings work too ("67012.45"), and true/false count as 1 and 0.
Without min and max the range is 0 to 100, so for bigger numbers set a range in Customize This Meter… or send max.
Examples
| What | URL | Key path |
|---|---|---|
| GitHub stars | https://api.github.com/repos/OWNER/REPO | stargazers_count |
| Open GitHub issues and PRs | https://api.github.com/repos/OWNER/REPO | open_issues_count |
| Bitcoin in USD | https://api.coinbase.com/v2/prices/BTC-USD/spot | data.amount |
| Polymarket odds of “Yes” (0 to 1) | https://gamma-api.polymarket.com/markets?slug=MARKET-SLUG | 0.outcomePrices |
GitHub allows 60 unauthenticated requests an hour from one address, so refresh those every 5 minutes or slower.
For the Polymarket row, the slug is the last part of the market’s address on polymarket.com. outcomePrices is a string like ["0.53", "0.47"]; Multimeter takes its first number, the price of Yes. Set the range to 0 to 1 so a Ring or Level Bar fills to the odds.
Your own endpoint: the easiest format to serve is the value object, so the meter gets its label and range too:
{ "value": 3, "max": 10, "label": "QUEUE" }APIs that need a token
Web Address meters don’t send headers. For an API that needs a token, use a Script meter with curl -H and jq, and keep the token in a file rather than in the command.
Check it worked
The meter shows the same number curl showed you, and Refresh Now updates it.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No number found in the response | The key path doesn’t match, or the reply is HTML. | Look at the JSON with curl -s URL | jq . and build the path from there; array items use numbers (items.0.count). |
| The server answered 403 or 429 | The API wants a token or you hit its rate limit. | Refresh less often, or switch to a Script meter that sends a token. |
| The bar is always full | The number is bigger than the default range of 0 to 100. | Set a range in Customize This Meter…, or use a text face. |