Census (as a reverse-ETL source)
Sync audiences and traits from your warehouse into Hober with Census's HTTP Request destination. Each synced record becomes a subscriber create-or-update against Hober's documented upsert API; the endpoint is an upsert, so Census's retries and full re-syncs are naturally idempotent.
Setup
- In Hober, copy your publishable SDK key from Settings → API keys.
- In Census, create an HTTP Request destination:
- URL:
https://api.hober.io/api/v1/subscribers/upsert - Method:
POST - Headers:
X-SDK-Key: <your SDK key>andContent-Type: application/json - Keep the default per-request record count at 1 (the endpoint takes one subscriber per request) and start at ≤ 10 requests/second.
- URL:
- Map your model's fields into the request body:
{
"external_id": "{{ record['user_id'] }}",
"email": "{{ record['email'] }}",
"attributes": {
"plan": "{{ record['plan'] }}",
"churn_risk": "{{ record['churn_risk'] }}"
}
}
Mapping
| Warehouse field | Hober field | Notes |
|---|---|---|
| Your primary user key | external_id | Required. Match the identifier your SDKs and server events already use so every source lands on one profile. |
email | Optional; becomes the subscriber's email identifier | |
| Anything else | attributes.* | Schemaless; immediately usable in segments and {{ subscriber.* }} personalization |
A 200 returns the stored subscriber; 401 means a missing/invalid SDK key;
422 names the failing field (external_id is the only required one).
Syncing warehouse-computed events
For model-derived events — milestone reached, score crossed a threshold —
target the Events API: POST https://api.hober.io/v1/events with your hober_srv_ server key as a Bearer
token, up to 1,000 events per request, with an idempotency_key per record
so re-syncs never double-fire journey triggers.
Consent caveat
Reverse-ETL syncs attributes, not permission. Upserting a subscriber does
not grant marketing consent — sends still pass Hober's consent and
suppression checks. To record an express opt-in your warehouse holds, use the
consent assertion field documented in the
subscribers API; never sync around a
suppression.