Sequin Backfills API
Trigger and manage backfills for a sink - replay existing Postgres rows (full or partial) into a destination at any point in time. Create, list, get, update, and delete backfills scoped to a given sink.
Trigger and manage backfills for a sink - replay existing Postgres rows (full or partial) into a destination at any point in time. Create, list, get, update, and delete backfills scoped to a given sink.
openapi: 3.0.3
info:
title: Sequin Management API
description: >-
The Sequin Management API configures and operates a Sequin Postgres change
data capture (CDC) deployment programmatically. Sequin is open source and
self-hostable, and also runs as Sequin Cloud. Most resources can be defined
declaratively in a sequin.yaml file; this API exposes the same resources -
Postgres database connections (sources), sink consumers (destinations),
HTTP endpoints, and backfills - over REST. The Sequin Stream sink also
exposes an HTTP pull consumption surface (receive / ack / nack). All
requests require a Bearer token found in the Sequin console under "Manage
account". Not all Sequin resources are available in the Management API.
version: '1.0'
contact:
name: Sequin
url: https://sequinstream.com
license:
name: MIT
url: https://github.com/sequinstream/sequin/blob/main/LICENSE
servers:
- url: https://api.sequinstream.com/api
description: Sequin Cloud
- url: http://localhost:7376/api
description: Local development (self-hosted)
security:
- bearerAuth: []
tags:
- name: Postgres Databases
description: Source Postgres database connections Sequin replicates from.
- name: Sink Consumers
description: Destinations that stream Postgres changes to external systems.
- name: HTTP Endpoints
description: Reusable HTTP endpoint destinations used by webhook sinks.
- name: Backfills
description: Replay existing Postgres rows into a sink.
- name: Stream Pull
description: HTTP pull consumption for the Sequin Stream sink.
paths:
/postgres_databases:
get:
operationId: listPostgresDatabases
tags:
- Postgres Databases
summary: List Postgres database connections
description: Lists all Postgres database connections in your account.
responses:
'200':
description: A list of Postgres database connections.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/PostgresDatabase'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createPostgresDatabase
tags:
- Postgres Databases
summary: Create a Postgres database connection
description: Creates a new Postgres database connection for Sequin to replicate from.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostgresDatabaseInput'
responses:
'200':
description: The created Postgres database connection.
content:
application/json:
schema:
$ref: '#/components/schemas/PostgresDatabase'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/postgres_databases/{id_or_name}:
parameters:
- $ref: '#/components/parameters/IdOrName'
get:
operationId: getPostgresDatabase
tags:
- Postgres Databases
summary: Retrieve a Postgres database connection
description: Retrieves a Postgres database connection by its ID or name.
responses:
'200':
description: The requested Postgres database connection.
content:
application/json:
schema:
$ref: '#/components/schemas/PostgresDatabase'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updatePostgresDatabase
tags:
- Postgres Databases
summary: Update a Postgres database connection
description: Updates an existing Postgres database connection.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostgresDatabaseInput'
responses:
'200':
description: The updated Postgres database connection.
content:
application/json:
schema:
$ref: '#/components/schemas/PostgresDatabase'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: deletePostgresDatabase
tags:
- Postgres Databases
summary: Delete a Postgres database connection
description: Deletes a Postgres database connection.
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/postgres_databases/{id_or_name}/test-connection:
parameters:
- $ref: '#/components/parameters/IdOrName'
post:
operationId: testPostgresDatabaseConnection
tags:
- Postgres Databases
summary: Test a Postgres database connection
description: Tests connectivity and replication permissions for a database connection.
responses:
'200':
description: Connection test result.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/postgres_databases/{id_or_name}/refresh-tables:
parameters:
- $ref: '#/components/parameters/IdOrName'
post:
operationId: refreshPostgresDatabaseTables
tags:
- Postgres Databases
summary: Refresh table cache
description: Refreshes Sequin's cached view of the database's tables and columns.
responses:
'200':
description: Refresh confirmation.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/sinks:
get:
operationId: listSinkConsumers
tags:
- Sink Consumers
summary: List sink consumers
description: >-
Lists all sink consumers. A sink consumer is a destination for Postgres
changes (Kafka, SQS, SNS, Kinesis, Redis, NATS, RabbitMQ, Elasticsearch,
Typesense, GCP Pub/Sub, Azure Event Hubs, webhooks, Sequin Stream, and
more), including its source, filters, transforms, and health.
responses:
'200':
description: A list of sink consumers.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/SinkConsumer'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createSinkConsumer
tags:
- Sink Consumers
summary: Create a sink consumer
description: Creates a new sink consumer that streams Postgres changes to a destination.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SinkConsumerInput'
responses:
'200':
description: The created sink consumer.
content:
application/json:
schema:
$ref: '#/components/schemas/SinkConsumer'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/sinks/{id_or_name}:
parameters:
- $ref: '#/components/parameters/IdOrName'
get:
operationId: getSinkConsumer
tags:
- Sink Consumers
summary: Get a sink consumer
description: Retrieves a sink consumer by its ID or name.
responses:
'200':
description: The requested sink consumer.
content:
application/json:
schema:
$ref: '#/components/schemas/SinkConsumer'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateSinkConsumer
tags:
- Sink Consumers
summary: Update a sink consumer
description: Updates an existing sink consumer.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SinkConsumerInput'
responses:
'200':
description: The updated sink consumer.
content:
application/json:
schema:
$ref: '#/components/schemas/SinkConsumer'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: deleteSinkConsumer
tags:
- Sink Consumers
summary: Delete a sink consumer
description: Deletes a sink consumer.
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/destinations/http_endpoints:
get:
operationId: listHttpEndpoints
tags:
- HTTP Endpoints
summary: List HTTP endpoints
description: Lists all reusable HTTP endpoint destinations used by webhook sinks.
responses:
'200':
description: A list of HTTP endpoints.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/HttpEndpoint'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createHttpEndpoint
tags:
- HTTP Endpoints
summary: Create an HTTP endpoint
description: Creates a reusable HTTP endpoint destination.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/HttpEndpointInput'
responses:
'200':
description: The created HTTP endpoint.
content:
application/json:
schema:
$ref: '#/components/schemas/HttpEndpoint'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/destinations/http_endpoints/{id_or_name}:
parameters:
- $ref: '#/components/parameters/IdOrName'
get:
operationId: getHttpEndpoint
tags:
- HTTP Endpoints
summary: Get an HTTP endpoint
description: Retrieves an HTTP endpoint by its ID or name.
responses:
'200':
description: The requested HTTP endpoint.
content:
application/json:
schema:
$ref: '#/components/schemas/HttpEndpoint'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateHttpEndpoint
tags:
- HTTP Endpoints
summary: Update an HTTP endpoint
description: Updates an existing HTTP endpoint.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/HttpEndpointInput'
responses:
'200':
description: The updated HTTP endpoint.
content:
application/json:
schema:
$ref: '#/components/schemas/HttpEndpoint'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: deleteHttpEndpoint
tags:
- HTTP Endpoints
summary: Delete an HTTP endpoint
description: Deletes an HTTP endpoint.
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/sinks/{sink_id_or_name}/backfills:
parameters:
- $ref: '#/components/parameters/SinkIdOrName'
get:
operationId: listBackfills
tags:
- Backfills
summary: List backfills
description: Lists the backfills for a specific sink.
responses:
'200':
description: A list of backfills.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Backfill'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: createBackfill
tags:
- Backfills
summary: Create a backfill
description: >-
Creates a new backfill for a specific sink, replaying existing Postgres
rows into the destination. Supports full backfills or partial backfills
scoped to specific tables.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BackfillInput'
responses:
'200':
description: The created backfill.
content:
application/json:
schema:
$ref: '#/components/schemas/Backfill'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
/sinks/{sink_id_or_name}/backfills/{backfill_id}:
parameters:
- $ref: '#/components/parameters/SinkIdOrName'
- name: backfill_id
in: path
required: true
description: The ID of the backfill.
schema:
type: string
get:
operationId: getBackfill
tags:
- Backfills
summary: Get a backfill
description: Retrieves a backfill by ID for a specific sink.
responses:
'200':
description: The requested backfill.
content:
application/json:
schema:
$ref: '#/components/schemas/Backfill'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateBackfill
tags:
- Backfills
summary: Update a backfill
description: Updates a backfill (for example, to pause or cancel it).
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BackfillInput'
responses:
'200':
description: The updated backfill.
content:
application/json:
schema:
$ref: '#/components/schemas/Backfill'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteBackfill
tags:
- Backfills
summary: Delete a backfill
description: Deletes a backfill.
responses:
'200':
description: Deletion confirmation.
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteResponse'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/http_pull_consumers/{consumer_name}/receive:
parameters:
- name: consumer_name
in: path
required: true
description: The name of the Sequin Stream sink / consumer group.
schema:
type: string
get:
operationId: receiveMessages
tags:
- Stream Pull
summary: Receive messages
description: >-
Retrieves a batch of available messages from a Sequin Stream consumer
group. Each message carries an ack_id used to later acknowledge or
negatively acknowledge it.
parameters:
- name: batch_size
in: query
required: false
description: Maximum number of messages to return.
schema:
type: integer
default: 1
responses:
'200':
description: A batch of messages.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/StreamMessage'
'401':
$ref: '#/components/responses/Unauthorized'
/http_pull_consumers/{consumer_name}/ack:
parameters:
- name: consumer_name
in: path
required: true
description: The name of the Sequin Stream sink / consumer group.
schema:
type: string
post:
operationId: ackMessages
tags:
- Stream Pull
summary: Acknowledge messages
description: >-
Acknowledges messages by ack_id so the consumer group will not deliver
them again.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AckRequest'
responses:
'200':
description: Acknowledgement result.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
'401':
$ref: '#/components/responses/Unauthorized'
/http_pull_consumers/{consumer_name}/nack:
parameters:
- name: consumer_name
in: path
required: true
description: The name of the Sequin Stream sink / consumer group.
schema:
type: string
post:
operationId: nackMessages
tags:
- Stream Pull
summary: Negatively acknowledge messages
description: >-
Negatively acknowledges messages by ack_id so they become available for
redelivery immediately.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/AckRequest'
responses:
'200':
description: Nack result.
content:
application/json:
schema:
type: object
properties:
success:
type: boolean
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
Bearer token found in the Sequin console under "Manage account". Passed
as `Authorization: Bearer YOUR_API_TOKEN`.
parameters:
IdOrName:
name: id_or_name
in: path
required: true
description: The ID (UUID) or unique name of the resource.
schema:
type: string
SinkIdOrName:
name: sink_id_or_name
in: path
required: true
description: The ID (UUID) or unique name of the sink.
schema:
type: string
responses:
Unauthorized:
description: Missing or invalid Bearer token.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ValidationError:
description: The request payload failed validation.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: object
additionalProperties: true
DeleteResponse:
type: object
properties:
id:
type: string
deleted:
type: boolean
PostgresDatabaseInput:
type: object
required:
- name
- hostname
- database
- username
properties:
name:
type: string
description: Unique name for the database connection.
hostname:
type: string
port:
type: integer
default: 5432
database:
type: string
username:
type: string
password:
type: string
ssl:
type: boolean
ipv6:
type: boolean
pool_size:
type: integer
PostgresDatabase:
allOf:
- $ref: '#/components/schemas/PostgresDatabaseInput'
- type: object
properties:
id:
type: string
format: uuid
SinkConsumerInput:
type: object
required:
- name
- database
- destination
properties:
name:
type: string
status:
type: string
enum:
- active
- disabled
- paused
database:
type: string
description: Name or ID of the source Postgres database.
table:
type: string
description: Source table in schema.table form.
filters:
type: array
items:
type: object
additionalProperties: true
transform:
type: string
description: Name of a transform to apply to messages.
destination:
type: object
description: >-
The destination configuration. The `type` field selects the sink
kind - e.g. kafka, sqs, sns, kinesis, redis_stream, redis_string,
nats, rabbitmq, elasticsearch, typesense, meilisearch, gcp_pubsub,
azure_event_hub, webhook, sequin_stream, s2.
properties:
type:
type: string
enum:
- kafka
- sqs
- sns
- kinesis
- redis_stream
- redis_string
- nats
- rabbitmq
- elasticsearch
- typesense
- meilisearch
- gcp_pubsub
- azure_event_hub
- webhook
- sequin_stream
- s2
additionalProperties: true
SinkConsumer:
allOf:
- $ref: '#/components/schemas/SinkConsumerInput'
- type: object
properties:
id:
type: string
format: uuid
health:
type: object
additionalProperties: true
HttpEndpointInput:
type: object
required:
- name
- url
properties:
name:
type: string
url:
type: string
format: uri
headers:
type: object
additionalProperties:
type: string
encrypted_headers:
type: object
additionalProperties:
type: string
HttpEndpoint:
allOf:
- $ref: '#/components/schemas/HttpEndpointInput'
- type: object
properties:
id:
type: string
format: uuid
BackfillInput:
type: object
properties:
state:
type: string
enum:
- active
- paused
- cancelled
tables:
type: array
description: Optional list of tables to scope a partial backfill.
items:
type: string
sort_column:
type: string
Backfill:
allOf:
- $ref: '#/components/schemas/BackfillInput'
- type: object
properties:
id:
type: string
format: uuid
sink:
type: string
rows_ingested_count:
type: integer
inserted_at:
type: string
format: date-time
StreamMessage:
type: object
properties:
ack_id:
type: string
action:
type: string
enum:
- insert
- update
- delete
- read
record:
type: object
additionalProperties: true
changes:
type: object
additionalProperties: true
metadata:
type: object
additionalProperties: true
AckRequest:
type: object
required:
- ack_ids
properties:
ack_ids:
type: array
items:
type: string