Skip to content

API Reference

Everything the Synclet UI does goes through a public ConnectRPC API on the server’s main port (PUBLIC_HTTP_SERVER_ADDR, 8080 by default). Scripts, CI jobs and integrations call the same API.

Every RPC is an HTTP POST to /<package>.<Service>/<Method> with a JSON body:

Terminal window
curl -X POST https://synclet.example.com/synclet.publicapi.pipeline.v1.ConnectionService/ListConnections \
-H "Authorization: Bearer $SYNCLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
  • The body is the request message in protobuf JSON: field names are camelCase (connection_id becomes connectionId), enums are their names ("JOB_STATUS_FAILED"), timestamps are RFC 3339 strings, and int64 values come back as strings ("lastId": "1042").
  • Send {} when the request has no fields you need.
  • A success is HTTP 200 with the response message as JSON.

The protos are the contract. They live in the Synclet repository under proto/synclet/publicapi/.

The server speaks the Connect, gRPC and gRPC-Web protocols. To generate a typed client, copy the proto/ directory from the Synclet repository and run buf generate with a buf.gen.yaml for your language. For Go:

buf.gen.yaml
version: v2
plugins:
- remote: buf.build/protocolbuffers/go
out: gen
opt: paths=source_relative
- remote: buf.build/connectrpc/go
out: gen
opt: paths=source_relative
client := pipelinev1connect.NewJobServiceClient(http.DefaultClient, "https://synclet.example.com")
req := connect.NewRequest(&pipelinev1.TriggerSyncRequest{ConnectionId: connID})
req.Header().Set("Authorization", "Bearer "+os.Getenv("SYNCLET_API_KEY"))
resp, err := client.TriggerSync(ctx, req)

For TypeScript use buf.build/bufbuild/es with @connectrpc/connect; for other languages see the Connect and gRPC plugin lists.

Native gRPC needs HTTP/2. The server serves plain HTTP/1.1 unless TLS is on (PUBLIC_HTTP_SERVER_TLS_ENABLED, see Environment Variables), or unless an HTTP/2-capable proxy sits in front of it. The Connect protocol works over HTTP/1.1, so prefer a Connect client when in doubt.

To call a streaming RPC such as DownloadJobLogs without writing code, use buf curl with the protos:

Terminal window
buf curl --schema ./proto --protocol connect \
-H "Authorization: Bearer $SYNCLET_API_KEY" \
-d '{"jobId": "<job-id>", "attempt": 1}' \
https://synclet.example.com/synclet.publicapi.pipeline.v1.JobService/DownloadJobLogs

A request is authenticated by one of three credentials, checked in this order:

  1. Authorization: Bearer synclet_sk_… is an API key.
  2. Any other Authorization: Bearer <token> is a user access token (JWT).
  3. With no Authorization header, the synclet_at session cookie is used.

A request with none of them, or with an unknown, expired or revoked credential, fails with unauthenticated.

Create keys in Settings > API Keys (Settings & API Keys). A key looks like synclet_sk_ followed by 64 hex characters and is shown only once.

Authorization: Bearer synclet_sk_3f9c…

A key belongs to the workspace it was created in and acts as its creator with the creator’s current role there. You don’t send a workspace with an API key: the key’s workspace is used and a Workspace-Id header is ignored. To work with several workspaces, create a key in each.

The UI calls AuthService/Login (or completes OIDC sign-in), which sets three cookies:

CookieContents
synclet_atAccess token. HttpOnly.
synclet_rtRefresh token, exchanged by AuthService/RefreshToken. HttpOnly.
synclet_authExpiry times only, readable by the UI’s JavaScript.

Login returns no token in its response body, so for scripts use an API key rather than a session.

A user session (cookie or JWT) isn’t tied to a workspace. Workspace-scoped RPCs read the workspace from the Workspace-Id header, which carries the workspace UUID:

Workspace-Id: 4b0e6a52-0f7d-4c1e-9a43-6d1f0c2a9e11

Without it those RPCs fail with permission_denied (“workspace is required”). A value that isn’t a UUID fails with invalid_argument.

RPCs marked with a role in the tables below check the caller’s role in the workspace: Viewer < Editor < Admin, and a higher role passes a lower check. A caller who isn’t a member, or whose role is too low, gets permission_denied. See Members for what each role is meant for.

A failed call returns a non-200 status and a JSON body:

{
"code": "not_found",
"message": "connection not found"
}

code is the stable part; message is for people and may change. Some errors add a details array.

CodeHTTPTypical cause
unauthenticated401No credential, or an invalid, expired or revoked key or token.
permission_denied403No workspace on a user session, not a member, or role too low.
not_found404The ID doesn’t exist or belongs to another workspace.
invalid_argument400Malformed ID, missing or invalid field. Also “connection already has an active job” from TriggerSync.
already_exists409A resource with that name already exists.
failed_precondition400The resource is in use, the connector has no cached spec, a workflow has an active run, a connection to run has no configured streams, or streams were given before the source’s catalog is discovered.
resource_exhausted429Rate limit exceeded (see below).
internal500Server-side failure. The details are in the server log, not the response.

Only the unauthenticated auth endpoints are rate-limited, per client IP and per RPC (app/public_http_server_module.go, pkg/connectutil/rate_limiter.go):

RPCSustained rateBurst
AuthService/Login1 per 6 s (~10/min)10
AuthService/Register1 per 20 s (~3/min)3
AuthService/RefreshToken1 per 3 s (~20/min)20
AuthService/RequestPasswordReset1 per 6 s (~10/min)10
AuthService/ResetPassword1 per 6 s (~10/min)10

Exceeding a limit returns resource_exhausted. Behind a reverse proxy, set RATE_LIMIT_TRUSTED_PROXIES so the limit applies to the real client IP from X-Forwarded-For instead of the proxy’s. Other RPCs have no rate limit.

Public RPCs need no credential. User RPCs need a signed-in user but no workspace role. The other RPCs need the listed role in the workspace.

synclet.publicapi.auth.v1.AuthService

RPCDescriptionAccess
RegisterCreate an account with email and password.Public
LoginSign in with email and password; sets session cookies.Public
RefreshTokenExchange the refresh cookie for a new access token.Public
LogoutClear the session cookies.Public
GetCurrentUserReturn the signed-in user.User
UpdateProfileChange the user’s name.User
ChangePasswordChange the user’s password.User
RequestPasswordResetEmail a password reset link.Public
ResetPasswordSet a new password with a reset token.Public
CreateAPIKeyCreate an API key in the current workspace; returns the raw key once.Viewer
RevokeAPIKeyRevoke an API key.Viewer
ListAPIKeysList the workspace’s API keys.Viewer
GetOIDCProvidersList the configured OIDC sign-in providers.Public

synclet.publicapi.workspace.v1.WorkspaceService

RPCDescriptionAccess
CreateWorkspaceCreate a workspace; the caller becomes its admin.User
UpdateWorkspaceRename the workspace.Admin
DeleteWorkspaceDelete the workspace.Admin
GetWorkspaceGet the workspace.Viewer
ListWorkspacesList the workspaces the user belongs to.User
RemoveMemberRemove a member.Admin
UpdateMemberRoleChange a member’s role.Admin
ListMembersList members and their roles.Viewer
CreateInviteInvite someone by email.Admin
AcceptInviteAccept an invite as the signed-in user.User
DeclineInviteDecline an invite by token.Public
RevokeInviteRevoke a pending invite.Admin
ResendInviteResend an invite email.Admin
ListInvitesList pending invites.Viewer
GetInviteByTokenLook up an invite from its link token.Public

synclet.publicapi.pipeline.v1.SourceService

RPCDescriptionAccess
CreateSourceCreate a source.Editor
UpdateSourceUpdate a source’s name or config.Editor
DeleteSourceDelete a source.Editor
GetSourceGet a source.Viewer
ListSourcesList the workspace’s sources.Viewer
TestSourceConnectionStart a connection check; returns a task ID.Editor
DiscoverSourceSchemaStart schema discovery; returns a task ID.Editor
GetSourceCatalogGet the source’s last discovered catalog.Viewer
GetSystemInfoServer capabilities: registration, workspaces mode, email.Public
GetRuntimeDefaultsDefault resource limits for connector containers.Viewer
ListExecutorsExecutors that reported to the control plane recently.Viewer

synclet.publicapi.pipeline.v1.DestinationService

RPCDescriptionAccess
CreateDestinationCreate a destination.Editor
UpdateDestinationUpdate a destination’s name or config.Editor
DeleteDestinationDelete a destination.Editor
GetDestinationGet a destination.Viewer
ListDestinationsList the workspace’s destinations.Viewer
TestDestinationConnectionStart a connection check; returns a task ID.Editor

synclet.publicapi.pipeline.v1.ConnectionService

RPCDescriptionAccess
CreateConnectionCreate a connection between a source and a destination. streams configures its streams in the same call, as ConfigureStreams does; before the source’s catalog is discovered that fails with failed_precondition and creates nothing. A connection without configured streams cannot run (streams_configured is false).Editor
UpdateConnectionUpdate schedule, namespace, retries, tags and other settings. A schedule on a connection that is a workflow step is rejected.Editor
DeleteConnectionDelete a connection. Fails with failed_precondition while it is a workflow step.Editor
GetConnectionGet a connection, with the workflows it is a step of in workflows.Viewer
ListConnectionsList connections, filtered by source, destination or tags.Viewer
ListConnectionTagsList the tags in use with their connection counts.Viewer
EnableConnectionActivate a connection’s schedule.Editor
DisableConnectionDeactivate a connection.Editor
DiscoverSchemaStart schema discovery for the connection’s source.Editor
ConfigureStreamsSave the selected streams, sync modes and mappers. An empty list is rejected with invalid_argument.Editor
GetDiscoveredCatalogGet the latest discovered catalog.Viewer
GetConfiguredCatalogGet the saved stream configuration.Viewer
ValidateMappersCompile unsaved mappers, optionally against a sample record.Viewer
GetSchemaChangesDiff the configured catalog against the latest discovered one.Viewer
ResetStreamStateReset the state of one stream.Editor
ResetConnectionStateReset the state of all streams.Editor
ListStreamStatesList per-stream state.Viewer
UpdateStreamStateOverwrite one stream’s state.Editor
ExportWorkspaceConfigExport the workspace’s sources, destinations and connections.Admin
ImportWorkspaceConfigImport an exported configuration.Admin
GetPipelineSettingsGet workspace pipeline settings.Viewer
UpdatePipelineSettingsUpdate workspace pipeline settings.Admin

synclet.publicapi.pipeline.v1.JobService

RPCDescriptionAccess
TriggerSyncQueue a sync job for a connection. Fails with failed_precondition when the connection has no configured streams.Editor
CancelJobCancel a scheduled or running job.Editor
GetJobGet a job with its attempts.Viewer
ListJobsList jobs, filtered by connection and status.Viewer
GetJobLogsRead a job’s log lines from a cursor.Viewer
DownloadJobLogsStream the full log of one attempt as plain text (server streaming).Viewer

synclet.publicapi.pipeline.v1.WorkflowService

RPCDescriptionAccess
CreateWorkflowCreate a workflow from a name, an optional cron schedule and its steps.Editor
UpdateWorkflowReplace a workflow’s name, schedule and steps.Editor
DeleteWorkflowDelete a workflow and its runs.Editor
GetWorkflowGet a workflow with its steps.Viewer
ListWorkflowsList the workspace’s workflows.Viewer
RunWorkflowStart a run now (trigger manual).Editor
RerunWorkflowRunRerun a failed run from its failed and skipped steps.Editor
ListWorkflowRunsList a workflow’s runs with their step runs.Viewer
GetWorkflowRunGet one run with its step runs.Viewer

A step is {"connectionId": "…", "afterConnectionIds": ["…"]}: it runs after the steps of the listed connections. A cycle, a connection listed twice or a connection of another workspace is invalid_argument. UpdateWorkflow, DeleteWorkflow and RunWorkflow fail with failed_precondition while a run is active, and RerunWorkflowRun also for a run that did not fail. See Workflows.

synclet.publicapi.pipeline.v1.ConnectorTaskService

RPCDescriptionAccess
GetConnectorTaskResultGet the status and result of a check, spec or discover task.Viewer

synclet.publicapi.registry.v1.ConnectorRegistryService

RPCDescriptionAccess
ListConnectorsList connectors available from the registries.Viewer
GetConnectorSpecGet a connector’s configuration spec.Viewer
AddConnectorAdd a connector to the workspace.Editor
GetManagedConnectorGet a connector added to the workspace.Viewer
ListManagedConnectorsList the workspace’s connectors.Viewer
DeleteManagedConnectorRemove a connector from the workspace.Editor
StarManagedConnectorStar a connector.Editor
UnstarManagedConnectorUnstar a connector.Editor
AddRepositoryAdd a connector repository.Admin
ListRepositoriesList connector repositories.Viewer
DeleteRepositoryRemove a connector repository.Admin
SyncRepositoryRefresh a repository’s connector list.Admin
ListRepositoryConnectorsList the connectors in a repository.Viewer
GetConnectorVersionsList the available versions of a connector image.Viewer
UpdateManagedConnectorUpdate a connector to the latest version in its repository.Editor
BatchUpdateConnectorsUpdate several connectors to their latest versions.Editor

synclet.publicapi.stats.v1.StatsService

RPCDescriptionAccess
GetWorkspaceStatsWorkspace sync totals for a time range.Viewer
GetConnectionStatsSync totals for one connection.Viewer
GetSyncTimelineSync activity over time for the workspace or one connection.Viewer

synclet.publicapi.notify.v1.NotificationService

RPCDescriptionAccess
CreateNotificationChannelCreate a Slack, email or Telegram channel.Admin
UpdateNotificationChannelUpdate a channel.Admin
DeleteNotificationChannelDelete a channel.Admin
ListNotificationChannelsList channels.Viewer
TestNotificationChannelSend a test notification.Admin
CreateNotificationRuleCreate a rule that routes events to a channel.Editor
UpdateNotificationRuleUpdate a rule.Editor
DeleteNotificationRuleDelete a rule.Editor
ListNotificationRulesList rules.Viewer

synclet.publicapi.webhook.v1.WebhookService

RPCDescriptionAccess
CreateWebhookCreate a webhook.Admin
UpdateWebhookUpdate a webhook.Admin
DeleteWebhookDelete a webhook.Admin
ListWebhooksList webhooks.Admin
TestWebhookSend a test delivery.Admin

synclet.publicapi.audit.v1.AuditService

RPCDescriptionAccess
ListAuditEventsList audit events.Admin
GetAuditEventGet one audit event with its before/after values.Admin
GetAuditRetentionGet the audit log retention period.Admin
UpdateAuditRetentionSet the audit log retention period.Admin

The examples use jq and these variables:

Terminal window
export SYNCLET_URL=https://synclet.example.com
export SYNCLET_API_KEY=synclet_sk_...
sapi() {
curl -sS -X POST "$SYNCLET_URL/synclet.publicapi.$1" \
-H "Authorization: Bearer $SYNCLET_API_KEY" \
-H "Content-Type: application/json" \
-d "$2"
}
Terminal window
sapi pipeline.v1.ConnectionService/ListConnections '{"pageSize": 50, "tags": ["prod"]}' \
| jq -r '.connections[] | [.id, .name, .status, .sourceName, .destinationName] | @tsv'

ListConnections pages with pageSize and offset; total is the full count.

Terminal window
JOB_ID=$(sapi pipeline.v1.JobService/TriggerSync "{\"connectionId\": \"$CONNECTION_ID\"}" | jq -r '.job.id')
while :; do
STATUS=$(sapi pipeline.v1.JobService/GetJob "{\"jobId\": \"$JOB_ID\"}" | jq -r '.job.status')
echo "$STATUS"
case "$STATUS" in
JOB_STATUS_COMPLETED) exit 0 ;;
JOB_STATUS_FAILED|JOB_STATUS_CANCELLED) exit 1 ;;
esac
sleep 10
done

A job moves through JOB_STATUS_SCHEDULED, JOB_STATUS_STARTING and JOB_STATUS_RUNNING to JOB_STATUS_COMPLETED, JOB_STATUS_FAILED or JOB_STATUS_CANCELLED. A connection has at most one active job: triggering while one is scheduled or running returns invalid_argument. On failure, .job.error and .job.attempts[].error hold the reasons.

GetJobLogs returns lines after a cursor. Pass lastId back as afterId until hasMore is false:

Terminal window
AFTER=0
while :; do
RESP=$(sapi pipeline.v1.JobService/GetJobLogs "{\"jobId\": \"$JOB_ID\", \"afterId\": \"$AFTER\", \"limit\": 1000}")
echo "$RESP" | jq -r '.lines[]?'
[ "$(echo "$RESP" | jq -r '.hasMore // false')" = "true" ] || break
AFTER=$(echo "$RESP" | jq -r '.lastId')
done

limit is capped at 5000. While the job runs, keep polling with the last cursor to tail new lines. For the complete log of one attempt as plain text, use DownloadJobLogs (see Generated clients).

Terminal window
sapi pipeline.v1.JobService/ListJobs '{"statuses": ["JOB_STATUS_FAILED"], "pageSize": 20}' \
| jq -r '.jobs[] | [.completedAt, .connectionId, .error] | @tsv'

Leave out connectionId to list the whole workspace, or set it to list one connection. pageSize is capped at 100.

The server also serves an internal API on port 8081 (INTERNAL_HTTP_SERVER_ADDR) for executors; it is not a public API and is not covered here.

Airbyte is a trademark of Airbyte, Inc. Synclet is not affiliated with, endorsed by or sponsored by Airbyte, Inc. Connector images keep their own licenses: see Connector licenses.