Log any sensor that speaks HTTP.

Map the fields of your own payload to gravity, temperature, pressure, pH, weight or volume. BrewForge parses each request with your mapping and adds the readings to the brew the device is attached to.

brewforge.sh/devices · Custom Stream
POST /api/devices/webhooksending…
{
  "sensor": "fv2-probe",
  "data": {
    "sg": 1.0142,
    "temp_f": 50.4,
    "psi": 12.3
  },
  "ts": 1792680000
}
4A Munich Helles
Helles #47
FV2 probe · Custom Stream
OG
1.048
Current
1.011
Projected FG
1.010
Gravity Temperature11.4 °C

Map your payload, field by field

Choose the payload format, then map a source path to a BrewForge field. Nested JSON uses dot paths like data.sg. Paste a sample payload into Test Parse to see exactly what BrewForge reads before you save.

  • JSON, query parameters or form URL-encoded
  • Gravity, temperature, battery, angle, RSSI, pH, pressure, weight, volume and timestamp
  • Units converted: °Plato and °Brix to SG, °F and K to °C, bar and kPa to PSI, grams, ounces and pounds to kg, mL and gallons to litres
  • Or read the unit from another field in the payload
Source pathMaps to
data.sgGravity · SG1.0142
data.temp_fTemperature · °F → °C10.2 °C
data.psiPressure · PSI12.3 PSI
tsTimestamp · Unix seconds22 Oct, 14:40
Test Parse: 4 fields mapped

Pressure, pH and keg scales

Readings with a gravity value go into the attached brew's fermentation log, together with temperature, pH and pressure when your payload has them.

A stream that maps weight or volume can measure a keg instead: attach it to a keg in the Cellar and the amount left stays up to date. The Cellar is part of Pro; everything else on this page works on every plan.

Set up in three steps

The device key is a secret: anyone with the URL can send readings to that device. Keep it out of public code repositories.

Looking for the REST API to read and write your brews, inventory and profiles instead? See the API docs.

  1. 1
    Add a Custom Stream device
    Open Devices → Add Device, choose Custom Stream and click Configure Schema. Pick the payload format, map your fields, check them with Test Parse and create the device.
  2. 2
    Send readings to the webhook URL
    POST (or PUT) each reading to the webhook URL. Keep ?key=… in the URL or send the key as Authorization: Bearer. Payloads can be up to 64 KB.
  3. 3
    Attach it to a brew
    Use Attach to Brew in the device menu, or connect the device from the brew's Fermentation tab.
Device Created · Custom Stream
Webhook URL
https://brewforge.sh/api/devices/webhook?key=3f9c2a7e-…
Or with a Bearer token
curl -X POST "https://brewforge.sh/api/devices/webhook" \
  -H "Authorization: Bearer $DEVICE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"data":{"sg":1.0142,"temp_f":50.4,"psi":12.3},"ts":1792680000}'

Example payload

With the mapping above, BrewForge reads data.sg as gravity, converts data.temp_f from °F to °C, stores data.psi as pressure and uses ts as the time of the reading. Fields you don't map are ignored.

The response tells you what was parsed, so you can check a new firmware from the command line before you leave it running.

POST /api/devices/webhook200 OK
{
  "sensor": "fv2-probe",
  "data": {
    "sg": 1.0142,
    "temp_f": 50.4,
    "psi": 12.3
  },
  "ts": 1792680000
}
FV2 probe → logged to Helles #47

If readings don’t show up

  • Use Send Test under Recent Data on the device to post a sample payload and see the parse result.
  • A 401 means the key is missing or wrong. Copy the complete webhook URL, or send the key as a Bearer token, not both with different values.
  • A 400 with a JSON parse error means the body isn't valid JSON for a JSON stream.
  • Fields come back empty: check the source paths against your payload with Test Parse, including dot paths for nested objects.
  • Readings arrive but not on your brew: attach the device to the brew. Only readings with a gravity value are added to the fermentation log.

Custom Streams work on every plan: Free (up to 20 brews), Basic and Pro. Keg sensors in the Cellar need Pro.

Compare plans

FAQ

Custom webhook questions

Which devices can I connect with a Custom Stream?

Anything that can send an HTTP request: a DIY ESP32 or ESP8266 sensor, a pressure transducer, a keg scale, a Node-RED flow or a Home Assistant automation. If it can POST JSON, query parameters or form fields, you can map it.

How does the device authenticate?

With the device key BrewForge creates for it. Either keep it in the webhook URL as ?key=… or send it as an Authorization: Bearer header.

Can I send the time a reading was taken?

Yes. Map a payload field to Timestamp (Unix seconds) or append &timestamp=<Unix seconds> to the webhook URL. BrewForge still stores at most one reading about every 15 minutes per device, so it is not meant for uploading a backlog in one go.

Is the Custom Stream included in the Free plan?

Yes. Devices, including Custom Streams, can be connected on every plan. Attaching a keg scale or volume sensor to a keg uses the Cellar, which is part of Pro.

Your next batch starts here.

Free for up to 20 brews. No credit card.

Create free account