Skip to main content

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.
A 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 the X-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

The destination 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:
  1. Schema as body: Records land in the JSONL artifact in the shape declared by record_schema, with no additional shaping.
  2. Custom body: Use a body template to customize each record. Only supported when format is json.
  3. Routed by provider: uri and/or headers vary at delivery time using the ProviderID delivery-level identifier.
  4. Destination per provider: A separate destination is registered for each provider, with a record_schema that includes provider-specific custom fields.
POST destination payload
{
  "name": "users-batch-destination",
  "type": "webhook_batch",
  "record_schema": {
    "type": "object",
    "properties": {
      "id":    { "type": "string" },
      "email": { "type": "string" },
      "subscription": { "type": "string" }
    },
    "required": ["id", "email"]
  },
  "webhook_batch": {
    "request_template": {
      "method": "POST",
      "uri": "https://example.com/prequel/batch",
      "headers": { "Content-Type": "application/json" }
    },
    "format": "json"
  }
}
1

Name your destination

Set name (string, required) to a unique identifier for this destination within your account.
2

Set the destination type

Set type (string, required) to webhook_batch for batch deliveries.
3

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.
4

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.
5

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.
6

Tune optional throughput limits

Optionally set webhook_batch.max_size_per_batch (integer, default 24000), webhook_batch.max_records_per_minute (integer, default 3000), and webhook_batch.max_concurrency (integer, default 1) to control delivery throughput.

Template variables

The body template has access to every variable below; the uri and headers templates only have access to the .Prequel.* namespace.
VariableTypeDescription
{{.Record.<field>}}anyValue of a specific field from the record (e.g. {{.Record.email}}). The field must be declared in record_schema.
{{.Record.AsJson}}objectThe full record serialized as a JSON object.
{{.IsDeleted}}booleantrue when Prequel is delivering a record deletion, false otherwise.
{{.Prequel.ProviderID}}stringIdentifier for the provider whose data is being delivered.
{{.Prequel.LoadID}}stringIdentifier for the active load job.
{{.Prequel.DestinationID}}stringIdentifier for the destination receiving this delivery.
{{.Prequel.StreamID}}stringIdentifier 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:
FieldTypeDescription
urlstringPresigned URL to the batch file. The URL itself carries a 24-hour TTL set by object storage.
formatstringFormat of the file at url. One of json, csv, or parquet.
record_countintegerNumber of records contained in the batch file.
batch_idstringUnique identifier for this batch.
provider_idstringIdentifier for the provider whose data is being delivered. Omitted when unavailable.
load_idstringIdentifier for the active load job. Omitted when unavailable.
Your endpoint reads the envelope, downloads the file at url, and processes the records inside. The format field on the destination controls what kind of file the URL points to:
FormatFile at url
jsonJSONL. Each line is one record, optionally shaped by the body template.
csvCSV. Body templates are not supported.
parquetParquet. Body templates are not supported.

Webhook headers

Prequel includes the following headers on every delivery request.
HeaderDescription
X-Prequel-Webhook-SignatureSHA-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-TimestampRFC 3339 timestamp of when the request was sent. Reject stale timestamps to prevent replay attacks.
X-Prequel-Webhook-DigestSHA-256 hash of the raw request body.
Content-TypeDefaults 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.
CodeDescription
2xxSuccess. Prequel treats a 2xx response as a successful delivery.
400Bad Request. Malformed or missing fields. Prequel will not retry.
403Forbidden. Invalid signature or credentials. Prequel will not retry.
404Not Found. Endpoint or resource could not be found. Prequel will not retry.
413Payload Too Large. Request body exceeds your endpoint’s size limit. Prequel will not retry.
422Unprocessable Entity. Validation failed for specific fields. Prequel will not retry.
429Too Many Requests. Rate limit exceeded. Prequel will back off and retry.
431Request Header Fields Too Large. Prequel will not retry.
Other 4xxOther client error. Prequel will not retry.
500Internal Server Error. Unexpected error during processing. Prequel will retry.
502Bad Gateway. Upstream error. Prequel will retry.
503Service Unavailable. Prequel will retry.
504Gateway Timeout. Request timed out. Prequel will retry.
Other 5xxOther server error. Prequel will retry.