ETL Pipelines integration is available for the Scale plan.

Events can be published directly to a supported message queue source of your ETL pipelines. This means you need not provision Internet reachable, unauthenticated HTTPS endpoints in order to ingest Vital events as webhooks.

Scalable

Offload the pressure on your public HTTP services.

Secure

Events are published through authenticated channels over TLS.

Compressed

Data events larger than 1 KiB are compressed before publication.

Ordered

Publication order can be preserved for select destination types.

Destinations

The following destinations are supported:

NameAuthenticationPublication Order
RabbitMQPasswordDepends on your RabbitMQ broker configuration.
Google Cloud Pub/SubIAMPub/Sub Message Ordering is supported.
Azure Event HubSAS KeyDepends on your Azure Event Hub configuration.

Event Schema

Webhooks, ETL Pipelines and our API endpoints all share the same JSON object schema. Webhooks and ETL Pipelines use identical JSON event payload structure.

Check out our Event Catalog.

Features

Data compression

Vital does not compress payload blobs that are smaller than 1 KiB. Please refer to the destination-specific documentation below on how to detect a compressed blob versus an uncompressed blob.

Static outbound IPs

Vital establish connections to your ETL Pipeline destination through a static pool of IPs. Contact Vital support to obtain the up-to-date static IP list.

Double writing during transition

To ensure smooth switchover from Webhooks to your new ETL Pipelines destination, Vital supports double writing events to the combination of:

  • all your Webhook endpoints; and
  • your ETL Pipelines destination.

Pushed Historical Data

When you use ETL Pipelines, Vital can push all the historical data as daily.data.* data events to your ETL Pipelines destination. The data-less historical.data.*.created event would still be emitted to denote the completion of historical pull.

Configuring ETL Pipelines

You can change the ETL Pipelines configuration on your Teams at any time through the Set Team ETL Pipelines endpoint of the Org Management API.

Your new configuration is typically active as soon as the endpoint has acknowledged your request.

Feel free to reach out Vital support if you need assisted setup, or if you need a Vital Org Key to access the Org Management API.

Google Cloud Pub/Sub

Message Structure

Each message would be published by Vital with the following attributes:

TypeKeyValue
Attributeevent_typeVital event type, e.g., daily.data.activity.created
Attributeblob_typejson : UTF8 JSON document
Attributeblob_codecgzip: The blob is compressed by gzip. null or absent: The blob is uncompressed.
Attributeidempotency_keyUnique key that allows detection of subsequent retries of the same request
Data-Encoded JSON blob. This may or may not be compressed — see blob_codec.
Ordering Key-Vital User ID (If you have enabled Message Ordering)
Payload smaller than 1KiB would not be compressed.

At this time, Vital publishes exclusively JSON blobs (blob_type == json).

Having said that, you are strongly encouraged to check for and drop any messages with unrecognized blob_type and blob_codec.

Pub/Sub message ordering

If you wish to receive message for each Vital user in their publication order, Vital supports Pub/Sub Message Ordering, and uses the Vital User ID as the message ordering key.

Vital publishes all messages through the us-central1 and europe-west1 PubSub regional endpoints.

Pub/Sub Exactly Once Delivery is discouraged to be used together with Message Ordering. Our own trial suggested that the combination would struggle to move high volume of messages.

IAM Permission

Grant the relevant IAM Principals on your topic with these pre-defined roles:

  • Pub/Sub Publisher (roles/pubsub.publisher)
  • Pub/Sub Viewer (roles/pubsub.viewer)

Or more specifically these permissions if you wish to create a custom IAM role with a minimized grant:

  • pubsub.topics.get
  • pubsub.topics.publish
EnvironmentRegionService Account
SandboxUScustomer-topics-us@vital-sandbox.iam.gserviceaccount.com
SandboxEuropecustomer-topics-eu@vital-sandbox.iam.gserviceaccount.com
ProductionUScustomer-topics-us@vital-prod-307415.iam.gserviceaccount.com
ProductionEuropecustomer-topics-eu@vital-prod-307415.iam.gserviceaccount.com

RabbitMQ

Message Structure

Each message would be published by Vital with the following attributes:

KeyValue
Routing KeyVital event type, e.g., daily.data.activity.created
Content-Typeapplication/json : UTF8 JSON document
Content-Encodinggzip: The blob is compressed by gzip. null/absent: The blob is uncompressed.
DataEncoded JSON blob. This may or may not be compressed — see blob_codec.
Payload smaller than 1KiB would not be compressed.

At this time, Vital publishes exclusively JSON blobs (blob_type == json).

Having said that, you are strongly encouraged to check for and drop any messages with unrecognized Content-Type and Content-Encoding.

Exchange requirements

Vital only supports password authentication at this time.

Vital publishes messages with the following settings:

  • Publisher Confirm mode is required
  • Messages are published with the Mandatory flag but without the Immediate flag.
  • Messages are published with Event Type as the Routing Key.

Please get in touch if these need to be configured differently for your RabbitMQ exchange.

Azure Event Hub

Message Structure

Each message would be published by Vital with the following attributes:

TypeKeyValue
Attributeevent_typeVital event type, e.g., daily.data.activity.created
Attributeblob_typejson: UTF8 JSON document
Attributeblob_codecgzip: The blob is compressed by gzip. null or absent: The blob is uncompressed.
Attributeidempotency_keyUnique key that allows detection of subsequent retries of the same request
Data-Encoded JSON blob. This may or may not be compressed — see blob_codec.
Partition Key-Vital User ID
Payload smaller than 1KiB would not be compressed.

At this time, Vital publishes exclusively JSON blobs (blob_type == json).

Having said that, you are strongly encouraged to check for and drop any messages with unrecognized Content-Type and Content-Encoding.