Warehouse export puts your organisation's 50heads data where your data team already works. There are two ways in:

  • Files in your own bucket. Every hour, six hours or day, 50heads writes what is new to your Amazon S3, Cloudflare R2 or Google Cloud Storage bucket. Load the files into Snowflake, BigQuery, Redshift or any warehouse.
  • The event stream. Your own job, or a tool such as Airbyte, reads the events through the API, a page at a time, and only what is new each time.

We're rolling warehouse export out to organisations gradually. If you don't see Warehouse export in Settings, then Organisation, it isn't on for your organisation yet. Contact us if you'd like it.

What you can send

  • Events: the same events webhooks send. Questions reserved, finished, short of answers, cancelled or refused, with their results summary; credits bought, running low or expiring; approvals; people and teams joining or leaving. Each event has an id, a type, createdAt, updatedAt and its data. Events never say who answered.
  • Audit log: who did what in the organisation, as in the audit log. The audit log needs to be on for your organisation too.

Add a bucket

Owners and admins of one of the organisation's teams can add up to five buckets. Adding one, pausing it, replacing its keys and deleting it need a fresh check that it's you. Choose Confirm it's you when asked. The check lasts 10 minutes.

  1. In your cloud account, make a key that can write files to the bucket under the folder you'll use, and nothing else. For Google Cloud Storage, make an HMAC key for a service account. For Cloudflare R2, make an R2 API token with write access to the bucket.
  2. Go to Settings, then Organisation, and choose Open warehouse export.
  3. Under Add a destination, give it a name and choose where: Amazon S3 (with its region, such as eu-west-2), Cloudflare R2 (with your Cloudflare account ID) or Google Cloud Storage.
  4. Enter the bucket and the folder, for example 50heads/.
  5. Tick what to send and choose how often.
  6. Enter the access key ID and secret, then choose Test and save.

Saving writes a small test file, _50heads/connection-test.json, under the folder. If the bucket refuses it, nothing is saved and the page says why. We keep the keys encrypted and never show them again. The first export runs within five minutes.

What lands in the bucket

Each export writes JSON lines (one object per line), then a manifest:

  • 50heads/events/dt=2026-10-13/<export>-0001.jsonl
  • 50heads/audit/dt=2026-10-13/<export>-0001.jsonl
  • 50heads/manifests/<time>-<export>.json

The manifest lists every file in that export, with its number of lines and a SHA-256 checksum. Load the files a manifest lists. A file without a manifest comes from an export that failed, and its lines are written again by the next one.

Each export sends only what is new since the last one that worked. Load by id so an event that arrives twice is kept once. Parquet files are not offered yet.

When an export fails

The page shows each bucket's recent exports and the last error. After three failures in a row the bucket is marked Failing, the audit log records it, and the organisation's owners and admins get one email. We keep trying: the next export that works picks up where the last good one stopped, so nothing is lost, as long as it works again within 90 days, which is how long events are kept.

Use Test connection to check the keys, and Export now to run an export within five minutes instead of waiting.

Read the event stream

Make an API key with the events:read scope, or give a service account that scope.

  • GET /v1/events reads the account the key belongs to.
  • GET /v1/organizations/current/events reads every team of the organisation. It needs an organisation admin's key or a service account.

Events come oldest first. Each page has a nextCursor: send it back as cursor for the next page, and keep the last one to read only what is new next time. since starts at a time instead.

An Airbyte source for the stream is in our code repository, in packages/airbyte-source-50heads: import its manifest.yaml into Airbyte's Connector Builder. See the developer docs for the full API.

Who can see what

  • Only organisation owners and admins see the Warehouse export page.
  • API keys and service accounts with organization:read can read each bucket's status, never its keys, and can't change anything.
  • The MCP server (the organization tool, action warehouse) and the command line (50heads org warehouse) show the same status.