Documentation Index
Fetch the complete documentation index at: https://import-docs.prequel.co/llms.txt
Use this file to discover all available pages before exploring further.
A Batch-based API endpoint is the recommended implementation for most use cases. Contact the Prequel team if you have questions.
webhook_batch destination delivers multiple records in a single HTTP request.
For the API call to register a destination with Prequel, including a complete example, see Create Destination.
Authentication
Prequel signs every delivery request with theX-Prequel-Webhook-Signature header so your endpoint can validate the request originated from Prequel. Fetch the public key for verification from GET /public/signatures/webhook-public-key. See Webhook headers for the full header list and verification steps.
After verifying the request signature, you can optionally read provider_id and load_id from the envelope body to confirm the request belongs to an expected provider and load.
Creating your destination spec
Thedestination object allows you to customize the contract between data shared by your customers and the shape Prequel provides to your receiving endpoint.
Example: Suppose you are importing a users table with string fields id, email, and subscription.
Below are four possible shapes for a webhook_batch destination. These are not exhaustive and features can be combined to confirm to your endpoint’s requirements:
- Schema as body: Records land in the JSONL artifact in the shape declared by
record_schema, with no additional shaping. - Custom body: Use a
bodytemplate to customize each record. Only supported whenformatisjson. - Routed by provider:
uriand/orheadersvary at delivery time using theProviderIDdelivery-level identifier. - Destination per provider: A separate destination is registered for each provider, with a
record_schemathat includes provider-specific custom fields.
- Schema as body
- Custom body
- Routed by provider
- Destination per provider
POST destination payload
Name your destination
Set
name (string, required) to a unique identifier for this destination within your account.Declare your record schema
Set
record_schema (object, required) to a JSON Schema (draft-07) document that declares the fields each record contains. Prequel validates records against this schema before delivery.Configure the request template
Set
webhook_batch.request_template (object, required) with the HTTP method (string, defaults to POST), uri (string, required), and optional headers (object). The uri and headers templates support the .Prequel.* namespace.Pick a delivery format
Set
webhook_batch.format (string, required) to one of json, csv, or parquet. See Delivery format for what each option produces.Template variables
Thebody template has access to every variable below; the uri and headers templates only have access to the .Prequel.* namespace.
| Variable | Type | Description |
|---|---|---|
{{.Record.<field>}} | any | Value of a specific field from the record (e.g. {{.Record.email}}). The field must be declared in record_schema. |
{{.Record.AsJson}} | object | The full record serialized as a JSON object. |
{{.IsDeleted}} | boolean | true when Prequel is delivering a record deletion, false otherwise. |
{{.Prequel.ProviderID}} | string | Identifier for the provider whose data is being delivered. |
{{.Prequel.LoadID}} | string | Identifier for the active load job. |
{{.Prequel.DestinationID}} | string | Identifier for the destination receiving this delivery. |
{{.Prequel.StreamID}} | string | Identifier for the stream this delivery came from. |
Delivery format
Prequel makes one HTTP request per batch. The request body is an envelope with the following fields:| Field | Type | Description |
|---|---|---|
url | string | Presigned URL to the batch file. The URL itself carries a 24-hour TTL set by object storage. |
format | string | Format of the file at url. One of json, csv, or parquet. |
record_count | integer | Number of records contained in the batch file. |
batch_id | string | Unique identifier for this batch. |
provider_id | string | Identifier for the provider whose data is being delivered. Omitted when unavailable. |
load_id | string | Identifier for the active load job. Omitted when unavailable. |
url, and processes the records inside. The format field on the destination controls what kind of file the URL points to:
| Format | File at url |
|---|---|
json | JSONL. Each line is one record, optionally shaped by the body template. |
csv | CSV. Body templates are not supported. |
parquet | Parquet. Body templates are not supported. |
Webhook headers
Prequel includes the following headers on every delivery request.| Header | Description |
|---|---|
X-Prequel-Webhook-Signature | SHA-256 RSA PKCS1 v1.5 signature of the payload. To verify, fetch the public key from GET /public/signatures/webhook-public-key and check the hex-decoded signature against the SHA-256 of <X-Prequel-Webhook-Timestamp>.<raw body> using PKCS1 v1.5. |
X-Prequel-Webhook-Timestamp | RFC 3339 timestamp of when the request was sent. Reject stale timestamps to prevent replay attacks. |
X-Prequel-Webhook-Digest | SHA-256 hash of the raw request body. |
Content-Type | Defaults to application/json unless overridden by the headers template. |
Response codes
Your endpoint should respond with an appropriate HTTP status code. Prequel uses the response to determine whether to retry delivery.| Code | Description |
|---|---|
2xx | Success. Prequel treats a 2xx response as a successful delivery. |
400 | Bad Request. Malformed or missing fields. Prequel will not retry. |
403 | Forbidden. Invalid signature or credentials. Prequel will not retry. |
404 | Not Found. Endpoint or resource could not be found. Prequel will not retry. |
413 | Payload Too Large. Request body exceeds your endpoint’s size limit. Prequel will not retry. |
422 | Unprocessable Entity. Validation failed for specific fields. Prequel will not retry. |
429 | Too Many Requests. Rate limit exceeded. Prequel will back off and retry. |
431 | Request Header Fields Too Large. Prequel will not retry. |
| Other 4xx | Other client error. Prequel will not retry. |
500 | Internal Server Error. Unexpected error during processing. Prequel will retry. |
502 | Bad Gateway. Upstream error. Prequel will retry. |
503 | Service Unavailable. Prequel will retry. |
504 | Gateway Timeout. Request timed out. Prequel will retry. |
| Other 5xx | Other server error. Prequel will retry. |