Services
DeliveriesService
(synq.deliveries.v1.DeliveriesService) DeliveriesService reports what was sent to your notification integrations — webhooks, PagerDuty, Opsgenie — and what came back. It answers the three questions an integration owner has. “Did this event reach my endpoint”: list the deliveries for an event id and read the outcome of each. “Why did my endpoint reject it”: read the attempts, which carry the request as it was sent and the response as it came back. “Why did I get nothing at all”: every delivery that sent nothing records a reason, so a silent integration can be explained rather than guessed at. Deliveries are kept for 90 days. Credential-bearing header values are never returned, on either side of an attempt — seeHeader.
ListDeliveries
ListDeliveries (ListDeliveriesRequest) ListDeliveriesResponse List deliveries, newest event first. With nointegration_id this is the
whole workspace’s feed; with one it is that integration’s.
BatchGetDeliveries
BatchGetDeliveries (BatchGetDeliveriesRequest) BatchGetDeliveriesResponse Fetch deliveries by id. Ids that do not exist, or have passed out of the retention window, are omitted from the response rather than causing an error. UnlikeListDeliveries, this always returns the routing provenance.
GetDelivery
GetDelivery (GetDeliveryRequest) GetDeliveryResponse Fetch a single delivery by id.BatchGetDeliveries does the same for many
at once and is the variant exposed over REST.
ListAttempts
ListAttempts (ListAttemptsRequest) ListAttemptsResponse List every attempt made for one delivery, oldest first. A delivery is attempted at most ten times, so the result is small and is not paginated.SummariseDeliveries
SummariseDeliveries (SummariseDeliveriesRequest) SummariseDeliveriesResponse Count deliveries over a window, bucketed by outcome, by skip reason and by HTTP status class. Use it to watch your own delivery failure rate without paging through the feed.Redeliver
Redeliver (RedeliverRequest) RedeliverResponse Send an earlier delivery again, to the same integration, with the same event. The replay is a new delivery with its own id, linked to the original throughredelivery_of, and appears in ListDeliveries like any other.
It is signed with the integration’s current secret rather than the one the
original used, which makes it the way to confirm that a rotated secret is
accepted by the receiver.
Retrying this call sends the delivery again. Rate-limited per integration;
over the limit it fails with RESOURCE_EXHAUSTED rather than queueing.
SendTestDelivery
SendTestDelivery (SendTestDeliveryRequest) SendTestDeliveryResponse Send a test delivery to an integration, to confirm the endpoint is reachable and that it accepts what is sent. It is always sent, whatever event types the integration subscribes to — a test that silently matches nothing would report the same as a broken endpoint. Returns the id of the delivery it created. The send is asynchronous: pollBatchGetDeliveries with that id until the outcome leaves OUTCOME_PENDING.
Retrying this call sends another test. Rate-limited per integration; over
the limit it fails with RESOURCE_EXHAUSTED rather than queueing.
SqlMeshService
(synq.ingest.sqlmesh.v1.SqlMeshService)IngestMetadata
IngestMetadata (IngestMetadataRequest) IngestMetadataResponseIngestExecution
IngestExecution (IngestExecutionRequest) IngestExecutionResponseCloudwatchService
(synq.ingest.cloudwatch.v1.CloudwatchService)IngestCloudwatchLogsData
IngestCloudwatchLogsData (IngestCloudwatchLogsDataRequest) IngestCloudwatchLogsDataResponseDwhService
(synq.ingest.dwh.v1.DwhService)IngestObjectInformation
IngestObjectInformation (IngestObjectInformationRequest) IngestObjectInformationResponseIngestSqlDefinitions
IngestSqlDefinitions (IngestSqlDefinitionsRequest) IngestSqlDefinitionsResponseIngestSchemas
IngestSchemas (IngestSchemasRequest) IngestSchemasResponseIngestObjectMetrics
IngestObjectMetrics (IngestObjectMetricsRequest) IngestObjectMetricsResponseIngestTaskResults
IngestTaskResults (IngestTaskResultsRequest) IngestTaskResultsResponseIngestQueryLogs
IngestQueryLogs (IngestQueryLogsRequest) IngestQueryLogsResponseIngestTableConstraints
IngestTableConstraints (IngestTableConstraintsRequest) IngestTableConstraintsResponseIngestLineage
IngestLineage (IngestLineageRequest) IngestLineageResponse IngestLineage pushes data-flow lineage between warehouse objects (and, optionally, between their columns) into the platform. Send the lineage you extract from the warehouse — for example from Snowflake’s GET_LINEAGE — as a batch of directed edges. Usereplace_mode to choose between an
incremental update (MERGE) and an authoritative refresh of a region of the
warehouse (REPLACE_SCOPE); REPLACE_SCOPE is what lets the platform expire
edges that no longer exist. Safe to retry: re-sending the same batch
converges to the same state.
OpenlineageService
(synq.ingest.openlineage.v1.OpenlineageService)Ingest
Ingest (IngestRequest) IngestResponseDbtService
(synq.ingest.dbt.v1.DbtService)IngestInvocation
IngestInvocation (IngestInvocationRequest) IngestInvocationResponseAirflowLogsService
(synq.ingest.airflow.v1.AirflowLogsService)IngestLog
IngestLog (IngestLogRequest) IngestLogResponseIngestDatahubAspects
IngestDatahubAspects (IngestDatahubAspectsRequest) IngestDatahubAspectsResponseAlertsService
(synq.alerts.services.v1.AlertsService) AlertsService provides operations for managing alert configurations. Deprecated: use synq.alerts.services.v2.AlertsService. The v2 service selects entities with the canonical synq.queries.v1.Query + resolver_ql trigger; this v1 service, which uses the bespoke EntityGroupQuery selection, is scheduled for removal. Migrate existing integrations to v2.Create
Create (CreateRequest) CreateResponse Create a new alert configuration.List
List (ListRequest) ListResponse Retrieves a list of alert configurations based on filters.BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Get multiple alert configurations by their identifiers.Update
Update (UpdateRequest) UpdateResponse Update an existing alert configuration. The config can be identified by either ID or FQN.Delete
Delete (DeleteRequest) DeleteResponse Delete an existing alert configuration. The config can be identified by either ID or FQN.ToggleEnabled
ToggleEnabled (ToggleEnabledRequest) ToggleEnabledResponse Enables or disables an existing alert configuration. The config can be identified by either ID or FQN.AlertsService
(synq.alerts.services.v2.AlertsService) AlertsService provides operations for managing alert configurations. It supersedes synq.alerts.services.v1.AlertsService: entities are selected with the canonical synq.queries.v1.Query + resolver_ql trigger rather than the bespoke EntityGroupQuery.Create
Create (CreateRequest) CreateResponse Create a new alert configuration.List
List (ListRequest) ListResponse Retrieves a list of alert configurations based on filters.BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Get multiple alert configurations by their identifiers.Rename
Rename (RenameRequest) RenameResponse Rename an existing alert configuration. The config can be identified by either ID or FQN.UpdateTargets
UpdateTargets (UpdateTargetsRequest) UpdateTargetsResponse Replace the delivery targets of an existing alert configuration. The config can be identified by either ID or FQN.UpdateSettings
UpdateSettings (UpdateSettingsRequest) UpdateSettingsResponse Update the trigger and/or the kind-specific settings of an alert. The config can be identified by either ID or FQN.UpdateTemplate
UpdateTemplate (UpdateTemplateRequest) UpdateTemplateResponse Set or clear the message template of an existing alert configuration. The config can be identified by either ID or FQN.Delete
Delete (DeleteRequest) DeleteResponse Delete an existing alert configuration. The config can be identified by either ID or FQN.ToggleEnabled
ToggleEnabled (ToggleEnabledRequest) ToggleEnabledResponse Enables or disables an existing alert configuration. The config can be identified by either ID or FQN.ToggleIncidentOwnerAlert
ToggleIncidentOwnerAlert (ToggleIncidentOwnerAlertRequest) ToggleIncidentOwnerAlertResponse Turns the workspace’s incident-owner alert on or off. This alert notifies each incident’s owner on its configured channels and has no other configuration, so it is managed here rather than through Create / Delete and does not appear in List or BatchGet.SendTestAlert
SendTestAlert (SendTestAlertRequest) SendTestAlertResponse Delivers a static test message to the given targets so you can confirm that delivery reaches each channel before relying on a real alert. Nothing is stored and the targets need not belong to a saved alert, so this can be called while an alert is still being authored.FoldersService
(synq.entities.folders.v1.FoldersService) FoldersService discovers and browses the folder / containment hierarchy of the catalog: the roots data hangs from, the sub-folders under any folder, the folders a given entity lives in, and the entities contained in a folder. It is a read / navigation surface, not folder management — there are no create, move, or delete operations. Addressing: every folder has an opaquefolder_entity_id (round-trip it
verbatim) and a structured FolderRef{root_entity_id, folders[]} (the
human-friendly form). Entities — both folder members and the ids you pass to
GetFolderOf — are named by their opaque entity id, the same id used across
the rest of the entities API.
Depth footgun: membership is SHALLOW by default. Browse returns only the
direct children of a folder, and ListMembers returns only the entities
placed directly in the folder. Set deep = true (or raise Browse.depth) to
recurse into sub-folders.
Browse
Browse (BrowseRequest) BrowseResponse Browse the hierarchy one level at a time. With noparent, returns the
roots (top-level integrations / containers). With a parent folder, returns
that folder’s direct sub-folders and the entity ids of its direct,
non-folder members.
One level per call — sub-folders are returned as Folders (each with a
child_folder_count), which you Browse into in turn; there is no nested
tree in the response. filter narrows the returned members to entities
matching a query.
GetFolderOf
GetFolderOf (GetFolderOfRequest) GetFolderOfResponse Given entity ids, return the folder breadcrumb(s) each entity lives in — ordered root first, leaf (immediate parent) last. An entity may appear in more than one hierarchy; the response carries every folder along its containing chain. Compose withListMembers on an entity’s immediate parent
to list its siblings.
ListMembers
ListMembers (ListMembersRequest) ListMembersResponse List the entity ids contained in a folder, paginated. Direct members only by default; setdeep = true to include members of all nested sub-folders.
Narrow with types and/or filter.
Pagination is a stable client-side window over the folder’s fully-resolved
member set: each page recomputes and re-orders that set, then returns the
requested slice. Results are consistent, but paging deep through a very
large folder repeats work — prefer a larger page_size over many small
pages.
TypeDefsService
(synq.entities.typedefs.v1.TypeDefsService) TypeDefsService tells you what the type values in every other endpoint mean. Responses across the API describe things by enum — an entity is anENTITY_TYPE_BQ_TABLE, it belongs to DATA_PLATFORM_TYPE_BIGQUERY, a run is an
EXECUTION_TYPE_DBT_INVOCATION. This service turns each of those into a name you
can display and a set of facts you can act on: is this a transformation model,
does it live in a warehouse, can it be monitored.
Read it instead of keeping your own copy of the list. New entity types and new
platforms are added as Coalesce Quality supports more tools, and a hard-coded
table in your code will label them with whatever its fallback produces and miss
that an existing type gained a capability. Everything here comes from the server,
so you pick both up without changing your code.
A typical integration calls them once at startup, keeps them in a map, and looks
types up as responses arrive.
It also tells you what a selection query can ask for: ListEntityTraitDefs is the
vocabulary behind traits, which selects entities by what they are rather than
by naming every type.
Scoping and freshness:
- ListEntityTypeDefs is per workspace, because the types you defined yourself are part of your workspace’s vocabulary. It returns the built-in types and your own custom types together.
- ListPlatformDefs, ListExecutionTypeDefs and ListEntityTraitDefs are the same for everyone.
- The built-in half changes only when Coalesce Quality is upgraded, so caching it for the life of your process is fine. You can add or edit your own custom types at any time, so if a newly created type needs to appear promptly, cache the entity types for minutes rather than hours, or re-read after you change one.
ListEntityTypeDefs
ListEntityTypeDefs (ListEntityTypeDefsRequest) ListEntityTypeDefsResponse List every kind of entity in your workspace, the built-in types and your own. The built-in half covers every value ofsynq.entities.v1.EntityType this
server serves, so this is also how you discover a type that your generated code
is too old to name. Your own types have no enum value of their own — each one
is identified by its type_id.
ListPlatformDefs
ListPlatformDefs (ListPlatformDefsRequest) ListPlatformDefsResponse List every platform Coalesce Quality connects to, with its display name. Use it to name the platform on an entity — “BigQuery”, “Microsoft SQL Server” — rather than deriving a name from the enum value.ListEntityTraitDefs
ListEntityTraitDefs (ListEntityTraitDefsRequest) ListEntityTraitDefsResponse List every trait a selection query can filter entities by. Read it before writing a selection that usestraits, and to show a person
what one covers. A trait name this list does not contain selects nothing, so
reading the list is how you tell a trait that does not exist from one your
client is too old to know about.
ListExecutionTypeDefs
ListExecutionTypeDefs (ListExecutionTypeDefsRequest) ListExecutionTypeDefsResponse List every kind of run Coalesce Quality records against an entity. A dbt invocation, a warehouse query job, a detected schema change. Use it to name theexecution_type that execution and run endpoints return.
EntitiesService
(synq.entities.entities.v1.EntitiesService) EntitiesService is a service for retriving any entity.GetEntity
GetEntity (GetEntityRequest) GetEntityResponse Get specific entity by its identifier.BatchGetEntities
BatchGetEntities (BatchGetEntitiesRequest) BatchGetEntitiesResponse Get multiple entities by their identifiers.ListEntities
ListEntities (ListEntitiesRequest) ListEntitiesResponse List entities matching the given filterSearchEntities
SearchEntities (SearchEntitiesRequest) SearchEntitiesResponse Search for entities.ChecksCoverageService
(synq.entities.checks.v1.ChecksCoverageService) ChecksCoverageService provides functionality to retrieve and analyze the coverage of checks for entities in the system. It helps track which checks are applied to entities, including both direct checks and propagated checks from upstream entities.GetCoverage
GetCoverage (GetCoverageRequest) GetCoverageResponse GetCoverage retrieves the coverage of checks for a specific entity. This includes both direct checks applied to the entity and checks propagated from upstream entities. The response provides detailed information about:- Table-level checks
- Column-level checks
- Check propagation paths
- Column usage statistics
ChecksCategoriesService
(synq.entities.checks.v1.ChecksCategoriesService) ChecksCategoriesService lets workspace admins set explicit category overrides on individual checks. An explicit category is the authoritative category for a check — it takes precedence over the categories computed by the workspace’s categorisation rules. It is a public API so customers can manage check categories programmatically; the same service is also mounted on the internal API. The workspace and the acting identity are always taken from the request context, never from the payload.UpsertCheckCategories
UpsertCheckCategories (UpsertCheckCategoriesRequest) UpsertCheckCategoriesResponse UpsertCheckCategories sets (or replaces) the explicit category for one or more checks. Each entry is the complete state for its check — both dimensions — so an emptycategory / governance_category means
“no explicit value for that dimension”.
DeleteCheckCategories
DeleteCheckCategories (DeleteCheckCategoriesRequest) DeleteCheckCategoriesResponse DeleteCheckCategories clears the explicit category (both dimensions) for the given checks. Checks fall back to their rule-computed categories afterwards.ListCheckCategories
ListCheckCategories (ListCheckCategoriesRequest) ListCheckCategoriesResponse ListCheckCategories returns every explicit check category in the caller’s workspace.ChecksCategorisationRulesService
(synq.entities.checks.v2.ChecksCategorisationRulesService) ChecksCategorisationRulesService manages the rules that categorise a workspace’s checks automatically. A rule says “checks matching this predicate get this category on this dimension”. Rules are the scalable way to categorise: they apply to checks that already exist and to every check ingested afterwards, so a new dbt package or a new warehouse does not mean a fresh round of manual tagging. A rule-computed category is the lowest-precedence source — a category set explicitly on a check through ChecksCategoriesService, and one the producing tool declared, both win over it. A typical loop is: ListCategorisationFilters to see what the workspace’s checks look like, PreviewRule to check the reach of a candidate, UpsertRule to save it, then GetRecategorisationStatus to confirm the existing checks have caught up. Every workspace starts with a set of platform-provided rules covering the common cases. They are visible here, they can be superseded by a workspace rule of any priority, and they cannot be edited from a workspace.UpsertRule
UpsertRule (UpsertRuleRequest) UpsertRuleResponse Create or update a categorisation rule. The rule id is supplied by the caller (a UUID), which makes this operation idempotent — repeating the same request converges to the same rule rather than creating a duplicate. On create,dimension, title, category and
matcher are required. On update, a field that is set is written and a
field that is omitted is left unchanged. To guard against overwriting a
concurrent edit, pass the etag you last read.
Saving a rule schedules a sweep that recategorises the workspace’s existing
checks. It normally completes in seconds; GetRecategorisationStatus
confirms it.
DeleteRule
DeleteRule (DeleteRuleRequest) DeleteRuleResponse Delete a categorisation rule. Checks the rule categorised fall back to the next rule that matches them, or become uncategorised. Idempotent — deleting an already-deleted or unknown rule succeeds. Passetag to guard
against deleting a concurrently-edited rule.
ListRules
ListRules (ListRulesRequest) ListRulesResponse List the rules that apply to the caller’s workspace — its own rules plus the platform-provided ones — in the order they are tried. Narrow withdimension and scope.
BatchGetRules
BatchGetRules (BatchGetRulesRequest) BatchGetRulesResponse Read specific rules by id — typically to resolve therule_id a
ResolvedCategory carries into the rule that produced it. Ids the caller
cannot see, or that do not exist, are omitted from the response rather than
causing an error.
PreviewRule
PreviewRule (PreviewRuleRequest) PreviewRuleResponse Report what a candidate rule would change, without saving it. The candidate is slotted into the workspace’s live rule set — replacing an existing rule whenid names one — and the whole resolution is run over
every check, so scope, priority, explicit categories and producer-declared
categories are all honoured. The response separates the candidate’s raw
reach from its real effect, which are rarely the same number.
Preview a rule before saving it: one that matches broadly can recategorise
a large part of a workspace in a single sweep.
ListRuleMatches
ListRuleMatches (ListRuleMatchesRequest) ListRuleMatchesResponse Report how many checks each rule currently categorises, with a sample of them — the state already applied, not a projection. Use it to show “categorises N checks” next to each rule, and to spot a rule that has stopped matching anything. For the full, paginated list of one rule’s checks, call ChecksCategoriesService.ListCheckCategories with the rule id.GetRecategorisationStatus
GetRecategorisationStatus (GetRecategorisationStatusRequest) GetRecategorisationStatusResponse Progress of the re-categorisation sweep a rule change schedules. The sweep normally completes in seconds, so this is how to confirm that the workspace’s existing checks have caught up with the new rules — not something a client has to wait on.ChecksCategoriesService
(synq.entities.checks.v2.ChecksCategoriesService) ChecksCategoriesService reads and edits the categories of the checks in a workspace. Categorising checks is what turns a long list of tests into a picture of data quality: it lets you ask how much of a data product is covered for completeness, or which freshness checks exist across three warehouses that each name the same idea differently. Every check resolves to at most one category per dimension:- technical — what kind of check this is, mechanically (“nullness”, “uniqueness”, “freshness”);
- governance — what the check is for, in data-quality terms (“Completeness”, “Accuracy”, “Timeliness”).
UpsertCheckCategories
UpsertCheckCategories (UpsertCheckCategoriesRequest) UpsertCheckCategoriesResponse Set the category of one or more checks explicitly. An explicit category is authoritative for its check: it overrides both the producer-declared category and anything the categorisation rules compute, and it survives every later rule change. Each dimension updates independently. A field that is omitted leaves that dimension as it is; a field set to the empty string clears the explicit category on that dimension, so the check falls back to its producer-declared or rule-computed value. Repeating the same request converges to the same state rather than accumulating changes.DeleteCheckCategories
DeleteCheckCategories (DeleteCheckCategoriesRequest) DeleteCheckCategoriesResponse Clear the explicit categories of one or more checks, on both dimensions. Each check falls back to its producer-declared or rule-computed category. Idempotent — clearing a check that has no explicit category succeeds.ListCheckCategories
ListCheckCategories (ListCheckCategoriesRequest) ListCheckCategoriesResponse List the workspace’s checks with their resolved categories. Returns every check by default; the filters combine, so one call answers questions like “which dbt tests still have no governance category” or “which checks did this rule categorise”.BatchGetCheckCategories
BatchGetCheckCategories (BatchGetCheckCategoriesRequest) BatchGetCheckCategoriesResponse Read the categories of specific checks. Ids that do not exist are omitted from the response rather than causing an error, so a partially-stale list of ids still returns what it can.ListCategories
ListCategories (ListCategoriesRequest) ListCategoriesResponse List the workspace’s category vocabulary: the category names in use on each dimension, whether a workspace or platform rule produces each one, and how many checks carry it. Use it to populate a category picker so a workspace converges on one spelling per concept, and to see how much of the workspace is still uncategorised.ListCategorisationFilters
ListCategorisationFilters (ListCategorisationFiltersRequest) ListCategorisationFiltersResponse List the attribute values the workspace’s checks actually have — the platforms, entity types, packages and kinds available to build a categorisation rule or a listing filter from. Passselected to narrow each list to values that co-occur with the
current selection, so a rule editor never offers a combination that matches
nothing. A list never constrains itself: choosing one platform still leaves
every other platform selectable.
CodeService
(synq.entities.code.v1.CodeService) CodeService is a service for retrieving code associated with entities in the system. It provides functionality to access and manage code artifacts such as SQL queries, Python scripts, dbt models, and other code configurations that are part of Coalesce Quality entities.ListCode
ListCode (ListCodeRequest) ListCodeResponse ListCode retrieves all code artifacts associated with a specific entity. This includes SQL queries, Python scripts, dbt models, and other code configurations that define or are part of the entity’s functionality.SchemaMismatchesService
(synq.entities.schemas.v1.SchemaMismatchesService) SchemaMismatchesService provides access to schema drift information between data platform tables and their definitions (e.g., dbt models).BatchSchemaMismatches
BatchSchemaMismatches (BatchSchemaMismatchesRequest) BatchSchemaMismatchesResponse Get schema mismatches for a batch of entities by their identifiers.SchemasService
(synq.entities.schemas.v1.SchemasService) EntitiesService is a service for retriving any entity.GetSchema
GetSchema (GetSchemaRequest) GetSchemaResponse Get schema of the entity its identifier.TableConstraintsService
(synq.entities.constraints.v1.TableConstraintsService) TableConstraintsService provides access to table constraint and index information.GetTableConstraints
GetTableConstraints (GetTableConstraintsRequest) GetTableConstraintsResponse Get table constraints (primary keys, foreign keys, indexes, etc.) for a given entity.SqlInsightsService
(synq.entities.sql_insights.v1.SqlInsightsService) SqlInsightsService exposes analytical information about the SQL used across a workspace’s entities. It answers questions such as “which SQL constructs are used in my warehouse, and by how many entities” and “what SQL constructs does this specific entity use”, without requiring the caller to re-parse any SQL.ListSqlConstructs
ListSqlConstructs (ListSqlConstructsRequest) ListSqlConstructsResponse ListSqlConstructs returns the distribution of SQL constructs across all entities in the workspace. Every count is a number of entities, not a number of occurrences: an entity whose SQL contains five GROUP BY clauses adds one to the HAS_GROUP_BY count, not five. The result is workspace-scoped (derived from the authenticated request) — no entity paths are supplied. Useful for building filter/autocomplete UIs and for high-level “shape of our SQL” analytics.BatchSqlDetails
BatchSqlDetails (BatchSqlDetailsRequest) BatchSqlDetailsResponse BatchSqlDetails returns the SQL details (currently the set of detected SQL constructs) for each of the requested entities, keyed by their synq path. Every requested path appears in the response, including a path with no SQL details and a path matching no entity; both are returned with an empty set of constructs.OrchestrationService
(synq.entities.orchestration.v1.OrchestrationService) OrchestrationService provides information about orchestration relationships between entities. This includes relationships between Airflow tasks and transformation models (dbt, SQLMesh), as well as task-to-task dependencies.BatchOrchestration
BatchOrchestration (BatchOrchestrationRequest) BatchOrchestrationResponse BatchOrchestration retrieves orchestration relationships for multiple entities. For each entity, it returns both upstream entities (what orchestrates it) and downstream entities (what it orchestrates).IdentifierResolveService
(synq.entities.resolve.v1.IdentifierResolveService) IdentifierResolveService resolves identifiers to their Coalesce Quality paths and identities.BatchResolveIdentifiers
BatchResolveIdentifiers (BatchResolveIdentifiersRequest) BatchResolveIdentifiersResponse Resolve multiple identifiers, returning their Coalesce Quality paths and identity groups.EntityIssuesService
(synq.entities.status.v1.EntityIssuesService) EntityIssuesService is the service which retrieves entity issues status.GetIssuesStatus
GetIssuesStatus (GetIssuesStatusRequest) GetIssuesStatusResponse Get specific entity status by its identifier.BatchGetIssuesStatus
BatchGetIssuesStatus (BatchGetIssuesStatusRequest) BatchGetIssuesStatusResponse Get multiple entity statuses by their identifiers.EntityIncidentsService
(synq.entities.status.v1.EntityIncidentsService) EntityIncidentsService is the service which retrieves entity status.GetIncidents
GetIncidents (GetIncidentsRequest) GetIncidentsResponse Get specific entity status by its identifier.BatchGetIncidents
BatchGetIncidents (BatchGetIncidentsRequest) BatchGetIncidentsResponse Get multiple entity statuses by their identifiers.ChangesService
(synq.entities.changes.v1.ChangesService) ChangesService provides functionality to track and retrieve all types of changes to data entities. This unified service returns ALL change types for an entity:- Git commits: Changes to code files (dbt models, SQL files) tracked in version control
- Schema changes: Database schema modifications (columns added/removed/changed)
- SQL definition changes: View/materialized view definition updates detected by Coalesce Quality
- For git commits: structured statistics (directories, file types, top changes)
- For schema changes: detailed column-level diffs
- For SQL changes: before/after SQL definitions
- “What changed in the last week for table X?” → Returns git commits, schema changes, SQL changes
- “Show me all commits affecting this dbt model” → Returns git commits with lineage context
- “What schema changes happened to this table?” → Returns schema changes detected by Coalesce Quality
List
List (ListRequest) ListResponse Retrieves the complete change history for specified entities. Returns all change types (git commits, schema changes, SQL changes) in chronological order (newest first). Changes include lineage context showing upstream_distance when changes affect dependencies.BatchChange
BatchChange (BatchChangeRequest) BatchChangeResponse BatchChange retrieves multiple entity changes by their IDs in a single request. This is an optimized endpoint for fetching specific changes when you already know their IDs, rather than listing changes for an entity.AnnotationsService
(synq.entities.annotations.v1.AnnotationsService) AnnotationsService provides operations for managing and querying entity annotations. Annotations are key-value pairs that can be attached to entities for categorization and filtering.ListAnnotations
ListAnnotations (ListAnnotationsRequest) ListAnnotationsResponse List all available annotations with their usage counts across entities.BatchGetEntityAnnotations
BatchGetEntityAnnotations (BatchGetEntityAnnotationsRequest) BatchGetEntityAnnotationsResponse Read the annotations carried by specific entities. ListAnnotations answers what the workspace annotates by and how often; this answers what one entity carries. They are separate reads because an entity’s annotations are not part of the entity:synq.entities.v1.Entity
is the shape synq.entities.custom.v1.UpsertEntity accepts, so the
annotations field on it is what a producer ASSERTS about an entity, and
answering a read with it would make a read-edit-write round trip write one
entity’s annotations onto another.
LineageService
(synq.entities.lineage.v1.LineageService) LineageService allows you to fetch:- Entity level lineage from a starting point of one or more entities.
- Column Level lineage from a starting point of multiple columns of a single entity.
GetLineage
GetLineage (GetLineageRequest) GetLineageResponseEntityExecutionsService
(synq.entities.custom.v1.EntityExecutionsService)UpsertExecution
UpsertExecution (UpsertExecutionRequest) UpsertExecutionResponse Execution affects status of the custom entityUpsertLogEntry
UpsertLogEntry (UpsertLogEntryRequest) UpsertLogEntryResponse LogEntry is a log message for the custom entityGroupsService
(synq.entities.custom.v1.GroupsService) It eliminates the need to keep state on client side to remember which assets were already created and which should be deleted. The server will keep track of the current state of the group and client can always send the intended new state. The server will calculate the diff and entities that are no longer present in the group will be removed. Example:- group has entities A, B, C at time t1
- client sends group with entities B, C, D at time t2
- server will remove entity A from the system and update the current state of the group to B, C, D
ListEntityGroups
ListEntityGroups (ListEntityGroupsRequest) ListEntityGroupsResponse ListEntityGroups lists all groups.UpsertEntitiesGroup
UpsertEntitiesGroup (UpsertEntitiesGroupRequest) UpsertEntitiesGroupResponse UpsertEntitiesGroup updates current definition of group to the server. As part of the upsert operation the difference of entity ids is calculated between past state and the current state and entities that are no longer part of the group are removed.DeleteEntitiesGroup
DeleteEntitiesGroup (DeleteEntitiesGroupRequest) DeleteEntitiesGroupResponse DeleteEntitiesGroup deletes a group by its identifier. If the group does not exist, it will be a no-op.EntitiesService
(synq.entities.custom.v1.EntitiesService) custom.EntitiesService is a service for managing custom entities. Entities can represent various data platform concepts such as services, consumers, applications or data pipelines that are not natively available in Coalesce Quality. Entities are identified by a unique identifier and can be created, updated, read and deleted.UpsertEntity
UpsertEntity (UpsertEntityRequest) UpsertEntityResponse Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace.DeleteEntity
DeleteEntity (DeleteEntityRequest) DeleteEntityResponse Delete an entity by its identifier. If the entity does not exist, it will be a no-op.ListEntities
ListEntities (ListEntitiesRequest) ListEntitiesResponse List all entities.TypesService
(synq.entities.custom.v1.TypesService) TypesService is a service for managing custom entity types.UpsertType
UpsertType (UpsertTypeRequest) UpsertTypeResponse Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace.DeleteType
DeleteType (DeleteTypeRequest) DeleteTypeResponse Delete an entity by its identifier. If the entity does not exist, it will be a no-op.ListTypes
ListTypes (ListTypesRequest) ListTypesResponse List all entities.RelationshipsService
(synq.entities.custom.v1.RelationshipsService) RelationshipsService allow management of relationships between entities. Relationships can be created, updated, and deleted between 2 custom entities, or between a custom entity and Coalesce Quality native entity.enum There is no option to create relationships between 2 Coalesce Quality native entities (dbt model, BI dashboard, etc.).UpsertRelationships
UpsertRelationships (UpsertRelationshipsRequest) UpsertRelationshipsResponse Create or update relationships between entities. If the relationship already exists, it will be updated, otherwise it will be created. The response reports what each requested relationship did to the stored graph, and under which pair of entities it was stored. Read it: a relationship whose endpoints resolve to a pair another relationship in the same batch also resolves to is one edge, and only the last write to it survives.DeleteRelationships
DeleteRelationships (DeleteRelationshipsRequest) DeleteRelationshipsResponse Delete relationships between entities. If the relationship does not exist, it will be ignored. The response says which of them actually removed something, so a caller reconciling a set of edges can tell a withdrawal from a no-op.ListRelationships
ListRelationships (ListRelationshipsRequest) ListRelationshipsResponse List relationships touching the given entities, or every relationship in the workspace when ids is left empty.ChecksRelationshipsService
(synq.entities.custom.v1.ChecksRelationshipsService)UpsertCheckRelationships
UpsertCheckRelationships (UpsertCheckRelationshipsRequest) UpsertCheckRelationshipsResponse Create or update relationships that attach a check (e.g. a SQL test) to the entities it validates. Idempotent per (check, checked) pair: an existing relationship is updated, otherwise it is created. The response reports what each requested relationship did, and under which (check, checked) pair of entities it was stored.DeleteCheckRelationships
DeleteCheckRelationships (DeleteCheckRelationshipsRequest) DeleteCheckRelationshipsResponse Delete relationships between checks and the entities they validate. Relationships that do not exist are ignored. The response says which of them actually removed something.ListCheckRelationships
ListCheckRelationships (ListCheckRelationshipsRequest) ListCheckRelationshipsResponse List every relationship that attaches a check to the entities it validates, across the whole workspace.FeaturesService
(synq.entities.custom.v1.FeaturesService)UpsertEntityFeature
UpsertEntityFeature (UpsertEntityFeatureRequest) UpsertEntityFeatureResponse Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace.DeleteEntityFeature
DeleteEntityFeature (DeleteEntityFeatureRequest) DeleteEntityFeatureResponse Delete an entity by its identifier. If the entity does not exist, it will be a no-op.ListEntityFeatures
ListEntityFeatures (ListEntityFeaturesRequest) ListEntityFeaturesResponse List the features of one entity, or of every custom entity in the workspace when entity_id is left unset.ImpactService
(synq.entities.impact.v1.ImpactService)GetImpact
GetImpact (GetImpactRequest) GetImpactResponseEntityExecutionsService
(synq.entities.executions.v1.EntityExecutionsService) Deprecated: Use [synq.entities.custom.v1.EntityExecutionsService] insteadUpsertExecution
UpsertExecution (UpsertExecutionRequest) UpsertExecutionResponse Execution affects status of the custom entityUpsertLogEntry
UpsertLogEntry (UpsertLogEntryRequest) UpsertLogEntryResponse LogEntry is a log message for the custom entityEntityExecutionsService
(synq.entities.executions.v2.EntityExecutionsService) EntityExecutionsService provides read-only access to entity execution history. This service allows customers to retrieve information about all executions that happened on their entities, including execution status, timing, and messages. Use cases:- Retrieve execution history for specific entities
- Filter executions by time range, status, or execution type
- Get aggregated summaries of execution activity
- Track execution trends and patterns
ListExecutions
ListExecutions (ListExecutionsRequest) ListExecutionsResponse ListExecutions retrieves a paginated list of executions for one or more entities. Executions are returned in reverse chronological order (newest first). Supports filtering by:- Entity identifiers (required)
- Time range
- Execution type(s)
- Status(es)
BatchGetExecutions
BatchGetExecutions (BatchGetExecutionsRequest) BatchGetExecutionsResponse BatchGetExecutions retrieves multiple executions by their IDs. This is useful when you already know the execution IDs and want to fetch their details.GetExecutionsSummary
GetExecutionsSummary (GetExecutionsSummaryRequest) GetExecutionsSummaryResponse GetExecutionsSummary provides aggregated statistics about executions for specified entities. This is useful for quickly understanding execution patterns without fetching all execution details. Returns:- Counts by execution type
- Counts by status
- Time range of available executions
- Latest execution per entity
GetLatestExecutions
GetLatestExecutions (GetLatestExecutionsRequest) GetLatestExecutionsResponse GetLatestExecutions retrieves the most recent execution for each specified entity. IMPORTANT: Only returns executions where the entity appears in EntityExecution.entities (what executed). This means it returns executions OF the entity (e.g., model runs, monitor runs, task runs), NOT executions that merely reference the entity in targets or extra_references. For example, querying for a table won’t return results because tables don’t execute on their own - they are created/updated by models (which do execute). Optionally filter by execution status to get the latest execution with a specific status.DatabaseCoordinatesService
(synq.entities.coordinates.v1.DatabaseCoordinatesService) DatabaseCoordinatesService is a service for getting database coordinates of Entities.BatchDatabaseCoordinates
BatchDatabaseCoordinates (BatchDatabaseCoordinatesRequest) BatchDatabaseCoordinatesResponse Get multiple DatabaseCoordinates for identifiers.BatchIdsByCoordinates
BatchIdsByCoordinates (BatchIdsByCoordinatesRequest) BatchIdsByCoordinatesResponse Given database FQN return possible entity ids.UsersService
(synq.users.v1.UsersService)ListUsers
ListUsers (ListUsersRequest) ListUsersResponseBatchGetUsers
BatchGetUsers (BatchGetUsersRequest) BatchGetUsersResponseGetByAlias
GetByAlias (GetByAliasRequest) GetByAliasResponseGetByEmail
GetByEmail (GetByEmailRequest) GetByEmailResponseUpsertUserAliases
UpsertUserAliases (UpsertUserAliasesRequest) UpsertUserAliasesResponseDeleteUserAliases
DeleteUserAliases (DeleteUserAliasesRequest) DeleteUserAliasesResponseGetUserAliases
GetUserAliases (GetUserAliasesRequest) GetUserAliasesResponseGetUserIdentities
GetUserIdentities (GetUserIdentitiesRequest) GetUserIdentitiesResponse Returns all canonical identity strings for a user. If user_id is omitted, returns identities for the currently authenticated user. These identity strings can be passed to ListIssues(interacted_by_identities) to filter issues the user has interacted with. Format: “synq:<user_id>”, “email:<email>”, “slack:<slack_user_id>”, “msteams:<member_id>”, etc.OverlaysService
(synq.overlays.v1.OverlaysService) OverlaysService answers which organizational overlays claim an entity. An overlay is a grouping you lay over your catalog rather than something the warehouse itself knows about. Two kinds exist today: a data product, which groups the assets that make up something your organization delivers, and an owner, which names the person or team responsible for a set of assets and where alerts about them go. Each is defined by a membership rule, not by an explicit list, so what belongs to one changes as your warehouse does. “Owner” here means stewardship — who is accountable for an asset and who hears about it when something breaks. It is not the structural containment sense the word carries elsewhere in the API, where an asset can be said to own the checks and monitors declared on it. Nothing this service returns describes that relationship. This service reads that membership backwards. The defining services answer “what is in this data product”; this one answers “which data products and owners claim this table” — the question you have when you are looking at one asset and want to know who cares about it and what it feeds. Membership follows identity. Where the same table is represented more than once in your catalog — a transformation model and the warehouse table it builds — an overlay whose rule matches one of them claims the others too. So an alert routed by ownership reaches the responsible party whichever representation raised it, and you do not have to know which one a rule was written against. Two consequences worth planning around. You can ask about whichever representation you happen to hold and get the same answer, so there is no need to resolve an identity group first. And if you do ask about several members of one group in a single call, each comes back with its own entry carrying the same overlays — correct, but redundant, so ask about one member per group when you are near the request limit. Related services:synq.dataproducts.v2.DataproductsServiceandsynq.owners.v1.OwnersServicedefine the overlays read here, and turn an id from a response into a name, a description and its contact channels.synq.entities.resolve.v1.IdentifierResolveServiceturns an identifier you already hold — a warehouse table name, a dbt model — into theentity_idthese calls take.
BatchGetEntityOverlays
BatchGetEntityOverlays (BatchGetEntityOverlaysRequest) BatchGetEntityOverlaysResponse For each entity, list every overlay that claims it. The response has one entry per requested id, in the order you asked, so you can match results positionally and never have to tell “absent” from “empty”. An entity that belongs to no overlay comes back with empty lists. Freshness. Which overlays exist and what they are attached to is up to date the moment you change it — create an overlay, delete one, point an ownership at a different data product, and the next call reflects it. What each overlay contains is recomputed periodically, so an asset that newly satisfies an existing rule — a table appearing in a folder a rule watches — shows up shortly afterwards rather than instantly. Returns PERMISSION_DENIED if your credential can read neither data products nor owners. If it can read one but not the other, the call succeeds and the list you may not read comes back empty rather than failing.BatchGetOverlayMemberCounts
BatchGetOverlayMemberCounts (BatchGetOverlayMemberCountsRequest) BatchGetOverlayMemberCountsResponse Count the members of each named overlay. The cheap way to answer “how big is this” — use it for a summary line or a badge. When you need the assets themselves, list them through the service that defines the overlay. Counts distinct members, so an owner responsible for two data products that overlap is not charged twice for the assets they share. Same freshness asBatchGetEntityOverlays: counts follow the periodic
recomputation of what each overlay contains.
Returns PERMISSION_DENIED if your credential can read neither data products
nor owners.
ListEntityCoverage
ListEntityCoverage (ListEntityCoverageRequest) ListEntityCoverageResponse List the candidate assets together with the overlays claiming each, and narrow them to what is or is not covered. This is the question behind a governance audit: of the assets you care about, which belong to no data product, and which have nobody responsible for them. You give the candidate set as a query — every asset, one platform, one folder, one domain — and each row comes back carrying the same owner and data-product listsBatchGetEntityOverlays returns, so a
single call is both the count and the worklist.
total_count is how many candidates match filter across every page, so
you can say “312 of 4,190 tables are in no data product” without paging to
the end.
Freshness. By default this reads the same periodically recomputed
membership the rest of this service reads, and tells you how old it is in
members_computed_at. Ask for FRESHNESS_LIVE when the answer has to
reflect every definition as of now — it re-resolves them, which is far
slower and far more expensive, so keep it for a one-off audit rather than a
page that refreshes.
Returns PERMISSION_DENIED if your credential can read neither data products
nor owners, and also if filter names a kind it may not read: an empty list
must not be the answer to both “nothing is uncovered” and “you may not
look”. A kind you may not read still comes back as an empty list on each
row, as it does elsewhere in this service.
Returns INVALID_ARGUMENT if the selection resolves to more assets than one
call will report on — see CoverageSelection for the limit and for how to
choose a candidate set worth reading.
GetCoverageSummary
GetCoverageSummary (GetCoverageSummaryRequest) GetCoverageSummaryResponse Count coverage over one or more named candidate sets, without listing the assets themselves. The aggregate behind a coverage dashboard. Each selection you send comes back as one row of totals, keyed by the label you gave it, so a breakdown by type, platform, folder or domain is one round trip rather than one call per bucket. There is no server-side grouping, on purpose. This service knows what claims an asset, not what kind of thing the asset is, so naming the selections yourself —with_type("dbt_model"), in_folder(...), in_domain(...) —
keeps the buckets in your own vocabulary and costs the same.
Selections are counted independently and may overlap. An asset in two of
them is counted in both.
Returns PERMISSION_DENIED unless your credential can read both data products
and owners. Every row names both, and a zero that was never looked at is
indistinguishable from a zero that was.
HistoryService
(synq.monitors.history.v1.HistoryService)History
History (HistoryRequest) HistoryResponseMonitorInfoService
(synq.monitors.info.v1.MonitorInfoService)MonitorInfo
MonitorInfo (MonitorInfoRequest) MonitorInfoResponseMonitorPredictionsService
(synq.monitors.predictions.v1.MonitorPredictionsService) Access to anomaly detection model predictions and raw metric timeseries.GetMonitorPredictions
GetMonitorPredictions (GetMonitorPredictionsRequest) GetMonitorPredictionsResponse Returns prediction timeseries for a monitor. The monitor must exist and not be deleted. Defaults to the monitor’s current metrics_version.GetEntityMetrics
GetEntityMetrics (GetEntityMetricsRequest) GetEntityMetricsResponse Returns raw metric timeseries for an entity. Identity-aware: resolves logical assets (e.g., dbt models) to their underlying physical tables.BatchGetLatestEntityMetrics
BatchGetLatestEntityMetrics (BatchGetLatestEntityMetricsRequest) BatchGetLatestEntityMetricsResponse Returns the most recent observed table-stats sample (row count, freshness) for each requested entity. Identity-aware: resolves logical assets to their underlying physical tables. Paths with no recent sample are omitted from the response rather than returned with empty values — callers should treat a missing entry as “no data”. Lookback matches GetEntityMetrics (30 days).DeploymentRulesService
(synq.monitors.automated_monitors.v1.DeploymentRulesService)GetDeployOverview
GetDeployOverview (GetDeployOverviewRequest) GetDeployOverviewResponseGetDeployDeleteOverview
GetDeployDeleteOverview (GetDeployDeleteOverviewRequest) GetDeployDeleteOverviewResponseDeleteDeploymentRule
DeleteDeploymentRule (DeleteDeploymentRuleRequest) DeleteDeploymentRuleResponseListDeploymentRules
ListDeploymentRules (ListDeploymentRulesRequest) ListDeploymentRulesResponseListDeploymentRulesForAsset
ListDeploymentRulesForAsset (ListDeploymentRulesForAssetRequest) ListDeploymentRulesForAssetResponseBatchGetDeploymentRules
BatchGetDeploymentRules (BatchGetDeploymentRulesRequest) BatchGetDeploymentRulesResponseUpsertDeploymentRule
UpsertDeploymentRule (UpsertDeploymentRuleRequest) UpsertDeploymentRuleResponseBatchUpdateDeploymentRuleTitle
BatchUpdateDeploymentRuleTitle (BatchUpdateDeploymentRuleTitleRequest) BatchUpdateDeploymentRuleTitleResponseDeployDeploymentRule
DeployDeploymentRule (DeployDeploymentRuleRequest) DeployDeploymentRuleResponseBatchDeployDeploymentRules
BatchDeployDeploymentRules (BatchDeployDeploymentRulesRequest) BatchDeployDeploymentRulesResponseBatchUpsertDeploymentRules
BatchUpsertDeploymentRules (BatchUpsertDeploymentRulesRequest) BatchUpsertDeploymentRulesResponseBatchDeleteDeploymentRules
BatchDeleteDeploymentRules (BatchDeleteDeploymentRulesRequest) BatchDeleteDeploymentRulesResponseCustomMonitorsService
(synq.monitors.custom_monitors.v1.CustomMonitorsService)BatchCreateMonitor
BatchCreateMonitor (BatchCreateMonitorRequest) BatchCreateMonitorResponseBatchUpdateMonitor
BatchUpdateMonitor (BatchUpdateMonitorRequest) BatchUpdateMonitorResponseBatchDeleteMonitor
BatchDeleteMonitor (BatchDeleteMonitorRequest) BatchDeleteMonitorResponseBatchUpdateMonitorMode
BatchUpdateMonitorMode (BatchUpdateMonitorModeRequest) BatchUpdateMonitorModeResponseConfigChangesOverview
ConfigChangesOverview (ConfigChangesOverviewRequest) ConfigChangesOverviewResponseBatchUpdateMonitorSeverity
BatchUpdateMonitorSeverity (BatchUpdateMonitorSeverityRequest) BatchUpdateMonitorSeverityResponseListConfigsMonitors
ListConfigsMonitors (ListConfigsMonitorsRequest) ListConfigsMonitorsResponseListMonitors
ListMonitors (ListMonitorsRequest) ListMonitorsResponseMonitorSegmentsService
(synq.monitors.segments.v1.MonitorSegmentsService) Reads and names the segments of a segmented custom monitor. A monitor configured with a segmentation expression splits the data it monitors into one time series per distinct value of that expression, and each of those is a segment. The label is what every downstream surface shows for a segment: the name of the check it produces, the search result, the alert. A segment with no label falls back to its raw value, so a monitor segmented on something encoded (an id, a code, a hashed bucket) reads as that raw value everywhere until the segment is named.ListMonitorSegments
ListMonitorSegments (ListMonitorSegmentsRequest) ListMonitorSegmentsResponse Lists the segments a monitor has ingested so far, with their raw value and current label. A segment appears only once data has been observed for it, so a monitor that has not run yet lists none.BatchUpdateMonitorSegmentLabels
BatchUpdateMonitorSegmentLabels (BatchUpdateMonitorSegmentLabelsRequest) BatchUpdateMonitorSegmentLabelsResponse Sets or clears the label of one or more segments. Segments are addressed by the id ListMonitorSegments returns. A segment id encodes a sanitised form of the segment value, so it cannot be constructed from that value: read the ids first, then write against them.NLQueryService
(synq.queries.v1.NLQueryService) NLQueryService generates structured Query protos from natural language descriptions using an LLM.GenerateQuery
GenerateQuery (GenerateQueryRequest) GenerateQueryResponse GenerateQuery generates a Query from a natural language description.QueriesService
(synq.queries.v1.QueriesService) QueriesService compiles and evaluates ResolverQL — the compact text query language used across Coalesce Quality to select entities — over the public API. ResolverQL is a string DSL (for examplewith_type("TABLE") or
in_folder(...)); a structured synq.queries.v1.Query is its parsed,
machine-readable form. This service is the bridge between the two and the
read-only execution surface for both:
TranslateResolverQlcompiles a ResolverQL expression into a structuredQuerywithout evaluating it — inspect it, validate it, or reuse it as a filter on another API (entity listing, folder browsing, …).ResolveQuerycompiles a ResolverQL expression (or takes an already-structuredQuery), evaluates it against the catalog, and returns the matched entity ids. This is the general author -> resolve loop.DescribeResolverQlreturns the language itself — every function, every accepted enum value — so you author against what this deployment compiles rather than against a table baked into your client.
DescribeResolverQl additionally needs no permission of its own, so any
credential can read it; the other two read the catalog and are scoped.
DescribeResolverQl
DescribeResolverQl (DescribeResolverQlRequest) DescribeResolverQlResponse Describe the ResolverQL this deployment accepts: every function with its arguments and documentation, the category order to group them by, and the accepted values of every enum-typed argument. Read it before authoring a selection, and validate against it rather than against a copy compiled into your client. The language gains functions and accepted values as Coalesce Quality supports more, and a client working from its own table both misses what was added and refuses a query this server would compile. Nothing is passed, and no permission is needed beyond being authenticated — so a client holding a narrow credential, one that may write a deployment rule but cannot read entities, can still find out how to write the selection it is being asked for. Read it as an answer for your workspace, not as a constant. Most of it is the same for everyone, but the entity types you defined yourself are part of the language too: today they are reachable only throughResolverQlEnumDomain.pattern, which is why that field exists, and named by
synq.entities.typedefs.v1.TypeDefsService.ListEntityTypeDefs.
Caching it for the life of your process is fine; re-read it after you add or
rename an entity type of your own.
TranslateResolverQl
TranslateResolverQl (TranslateResolverQlRequest) TranslateResolverQlResponse Compile a ResolverQL expression into a structured publicQuery. Unlike
ResolveQuery, it does not evaluate the query against the catalog. A
syntactically invalid or uncompilable expression fails with
INVALID_ARGUMENT.
ResolveQuery
ResolveQuery (ResolveQueryRequest) ResolveQueryResponse Evaluate a selection and return the matched entity ids, paginated. Pass a ResolverQL expression viaresolver_ql (it is compiled server-side) or an
already-structured query. Invalid ResolverQL fails with INVALID_ARGUMENT.
TriggerService
(synq.datachecks.v1.TriggerService) TriggerService provides synchronous execution of datachecks on entities.TriggerDatachecks
TriggerDatachecks (TriggerDatachecksRequest) TriggerDatachecksResponse TriggerDatachecks executes datachecks for the specified entities.SqlTestsDeploymentRulesService
(synq.datachecks.sqltests.v1.SqlTestsDeploymentRulesService) SqlTestsDeploymentRulesService manages SqlTestDeploymentRules — rules that dynamically deploy SQL test templates onto every table or view a query matches, resyncing over time as the match set changes.GetSqlTestDeployOverview
GetSqlTestDeployOverview (GetSqlTestDeployOverviewRequest) GetSqlTestDeployOverviewResponse Preview the effect of deploying a rule (which have not yet been saved), without deploying it.GetSqlTestDeployDeleteOverview
GetSqlTestDeployDeleteOverview (GetSqlTestDeployDeleteOverviewRequest) GetSqlTestDeployDeleteOverviewResponse Preview the effect of deleting a rule, without deleting it.ListSqlTestDeploymentRules
ListSqlTestDeploymentRules (ListSqlTestDeploymentRulesRequest) ListSqlTestDeploymentRulesResponseBatchGetSqlTestDeploymentRules
BatchGetSqlTestDeploymentRules (BatchGetSqlTestDeploymentRulesRequest) BatchGetSqlTestDeploymentRulesResponseDeploySqlTestDeploymentRule
DeploySqlTestDeploymentRule (DeploySqlTestDeploymentRuleRequest) DeploySqlTestDeploymentRuleResponse Deploy (create or update) a SqlTestDeploymentRule and immediately sync tests onto its current match set.BatchDeploySqlTestDeploymentRules
BatchDeploySqlTestDeploymentRules (BatchDeploySqlTestDeploymentRulesRequest) BatchDeploySqlTestDeploymentRulesResponseDeleteSqlTestDeploymentRule
DeleteSqlTestDeploymentRule (DeleteSqlTestDeploymentRuleRequest) DeleteSqlTestDeploymentRuleResponseBatchDeleteSqlTestDeploymentRules
BatchDeleteSqlTestDeploymentRules (BatchDeleteSqlTestDeploymentRulesRequest) BatchDeleteSqlTestDeploymentRulesResponseSqlTestsService
(synq.datachecks.sqltests.v1.SqlTestsService) SqlTestsService is a service for managing SqlTests.BatchUpsertSqlTests
BatchUpsertSqlTests (BatchUpsertSqlTestsRequest) BatchUpsertSqlTestsResponse Upsert SqlTests based on a unique ID.ListSqlTests
ListSqlTests (ListSqlTestsRequest) ListSqlTestsResponse List SqlTests for given annotations.BatchGetSqlTests
BatchGetSqlTests (BatchGetSqlTestsRequest) BatchGetSqlTestsResponse Get SqlTests by their IDs.BatchDeleteSqlTests
BatchDeleteSqlTests (BatchDeleteSqlTestsRequest) BatchDeleteSqlTestsResponse Delete SqlTests by their IDs.GetSqlTestAudit
GetSqlTestAudit (GetSqlTestAuditRequest) GetSqlTestAuditResponse Get SqlTest audit from a given execution ID in jwt token.TestSuggestionsService
(synq.datachecks.testsuggestions.v1.TestSuggestionsService)BatchCreateTestSuggestions
BatchCreateTestSuggestions (BatchCreateTestSuggestionsRequest) BatchCreateTestSuggestionsResponseBatchGetTestSuggestionsForEntities
BatchGetTestSuggestionsForEntities (BatchGetTestSuggestionsForEntitiesRequest) BatchGetTestSuggestionsForEntitiesResponseBatchAcceptTestSuggestions
BatchAcceptTestSuggestions (BatchAcceptTestSuggestionsRequest) BatchAcceptTestSuggestionsResponseBatchRejectTestSuggestions
BatchRejectTestSuggestions (BatchRejectTestSuggestionsRequest) BatchRejectTestSuggestionsResponseIntegrationsService
(synq.integrations.v1.IntegrationsService) IntegrationsService manages connections from Coalesce Quality to your data systems (warehouses, databases, and transformation tools). Concurrency: every integration carries an opaqueetag. Read it from
GetIntegration / ListIntegrations, then pass it back on
UpdateIntegration / DeleteIntegration to ensure you modify the version you
last saw. A stale etag is rejected with ABORTED (HTTP 409). Omit
the etag for last-write-wins.
Quota: each workspace has a limit on the number of integrations. Creating
beyond the limit is rejected with RESOURCE_EXHAUSTED.
Secrets: credential fields (passwords, tokens, keys) are write-only. They are
masked (returned empty) on every read. On update, omit a secret to keep it,
send a new value to rotate it, or send an explicit empty string to clear it
(where the field is optional).
CreateIntegration
CreateIntegration (CreateIntegrationRequest) CreateIntegrationResponse Create a new integration. The server assigns the id and returns the created integration including any generated outputs. The integration type is fixed by the populatedconfig variant and cannot
be changed later. Counts against the per-workspace quota.
Not safe to blindly retry: the server mints a new id on each call, so a
retried create produces a second integration. On a transport error, list /
look up before retrying.
GetIntegration
GetIntegration (GetIntegrationRequest) GetIntegrationResponse Fetch a single integration by id. Secret config fields are masked.ListIntegrations
ListIntegrations (ListIntegrationsRequest) ListIntegrationsResponse List all integrations in the workspace (optionally filtered by enabled state). Secret config fields are masked. The full set is returned in one response — a workspace has only a handful of integrations.BatchGetIntegrations
BatchGetIntegrations (BatchGetIntegrationsRequest) BatchGetIntegrationsResponse Fetch multiple integrations by id in one call. Ids not found (or not in the workspace) are omitted from the response rather than erroring.UpdateIntegration
UpdateIntegration (UpdateIntegrationRequest) UpdateIntegrationResponse Update an integration. Theconfig is replaced wholesale — send the
complete desired config (omitted secrets are preserved; see the
service-level secret semantics). title is patch-style: omit it to leave
it unchanged.
The config variant must match the existing integration’s type; changing
the type is rejected with FAILED_PRECONDITION.
Safe to retry: addresses an existing id and converges to the same state.
With an etag set, a retry after success returns ABORTED
(the version moved) — treat that as “already applied”.
DeleteIntegration
DeleteIntegration (DeleteIntegrationRequest) DeleteIntegrationResponse Delete an integration. The integration stops being scheduled and is removed from listings. Safe to retry (deleting an already-deleted id is a no-op).EnableIntegration
EnableIntegration (EnableIntegrationRequest) EnableIntegrationResponse Enable a previously disabled integration. No-op if already enabled.DisableIntegration
DisableIntegration (DisableIntegrationRequest) DisableIntegrationResponse Disable an integration without deleting it. The configuration is kept but the integration is no longer scheduled or refreshed. No-op if already disabled.RefreshIntegration
RefreshIntegration (RefreshIntegrationRequest) RefreshIntegrationResponse Trigger an immediate, ad-hoc refresh of an integration. Available only for types whoseCapabilities.can_refresh is true; otherwise rejected with
FAILED_PRECONDITION.
Not idempotent: each call enqueues a new refresh.
GetIntegrationHealth
GetIntegrationHealth (GetIntegrationHealthRequest) GetIntegrationHealthResponse Return current health plus a paginated history of recent runs for an integration. When pagination is omitted, a bounded recent window is returned (the most recent runs from the last 7 days).IssuesService
(synq.issues.issues.v1.IssuesService) IssuesService is a service for managing Issues.BatchGetIssues
BatchGetIssues (BatchGetIssuesRequest) BatchGetIssuesResponseListIssues
ListIssues (ListIssuesRequest) ListIssuesResponseMarkInvestigating
MarkInvestigating (MarkInvestigatingRequest) MarkInvestigatingResponse Mark issue as being investigated.MarkFixed
MarkFixed (MarkFixedRequest) MarkFixedResponse Mark issue as fixed.MarkExpected
MarkExpected (MarkExpectedRequest) MarkExpectedResponse Mark issue as expected.MarkNoActionNeeded
MarkNoActionNeeded (MarkNoActionNeededRequest) MarkNoActionNeededResponse Mark issue as no action needed.PostComment
PostComment (PostCommentRequest) PostCommentResponse Post a comment on an issue.IssuesService
(synq.issues.v2.IssuesService) IssuesService is a service for managing Issues.BatchGetIssues
BatchGetIssues (BatchGetIssuesRequest) BatchGetIssuesResponseListIssues
ListIssues (ListIssuesRequest) ListIssuesResponseMarkInvestigating
MarkInvestigating (MarkInvestigatingRequest) MarkInvestigatingResponse Mark issue as being investigated.MarkFixed
MarkFixed (MarkFixedRequest) MarkFixedResponse Mark issue as fixed.MarkExpected
MarkExpected (MarkExpectedRequest) MarkExpectedResponse Mark issue as expected.MarkNoActionNeeded
MarkNoActionNeeded (MarkNoActionNeededRequest) MarkNoActionNeededResponse Mark issue as no action needed.ClearStatus
ClearStatus (ClearStatusRequest) ClearStatusResponse Clear the triage status of an issue, returning it to an untriaged state. Reverses a previous MarkInvestigating / MarkFixed / MarkExpected / MarkNoActionNeeded so the issue shows up again in open/untriaged views.PostComment
PostComment (PostCommentRequest) PostCommentResponse Post a comment on an issue.DeleteComment
DeleteComment (DeleteCommentRequest) DeleteCommentResponse Delete a comment on an issue. Only the actor who posted the comment may delete it. Deleting an already-deleted comment succeeds.DataproductsService
(synq.dataproducts.v1.DataproductsService) DataproductsService can be used to manage data products.Upsert
Upsert (UpsertRequest) UpsertResponse Create or update a dataproduct.Get
Get (GetRequest) GetResponse Get multiple dataproducts by their identifiers.List
List (ListRequest) ListResponse List all the dataproducts in the current scope.Delete
Delete (DeleteRequest) DeleteResponse Delete a dataproduct by its identifier. Soft deletes by default. Optionally purge the dataproduct to release the identifier.SetDefinition
SetDefinition (SetDefinitionRequest) SetDefinitionResponse Set the definition for an existing dataproduct.UpsertDefinitionPart
UpsertDefinitionPart (UpsertDefinitionPartRequest) UpsertDefinitionPartResponse Upsert definition part to the definition of an existing dataproduct.RemoveDefinitionPart
RemoveDefinitionPart (RemoveDefinitionPartRequest) RemoveDefinitionPartResponse Remove definition part from the definition of an existing dataproduct.DataproductsService
(synq.dataproducts.v2.DataproductsService) DataproductsService manages data products — named, owned groupings of data assets with a membership definition, a priority and an optional folder. Ids are opaque UUIDs supplied by the caller, which makes writes idempotent (a retried create converges instead of duplicating). Mutable fields are optional on Upsert: a field that is set is written, a field that is omitted is left unchanged. Pass theetag you last read to guard against overwriting a
concurrent edit.
A data product is a leaf in the reference graph — its definition may not
reference another data product or domain — so membership resolution always
terminates.
Upsert
Upsert (UpsertRequest) UpsertResponse Create or update a data product. The id is supplied by the caller (a UUID); repeating the same request converges to the same product. Mutable fields are optional: a set field is written, an omitted field is left unchanged. Passetag to guard against overwriting a concurrent edit.
BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Fetch multiple data products by id. Ids that do not exist (or, unlessinclude_deleted is set, are deleted) are omitted from the response rather
than causing an error.
List
List (ListRequest) ListResponse List the data products in the workspace, paginated. Narrow withfolder
and priorities.
Delete
Delete (DeleteRequest) DeleteResponse Delete a data product. Idempotent — deleting an already-deleted or unknown product succeeds. Soft-deletes by default; setpurge to hard-delete and
release the id. Pass etag to guard against deleting a concurrently-edited
product.
SetDefinition
SetDefinition (SetDefinitionRequest) SetDefinitionResponse Replace the entire membership definition of a data product.UpsertDefinitionPart
UpsertDefinitionPart (UpsertDefinitionPartRequest) UpsertDefinitionPartResponse Add or replace a single definition part (matched by its part id).RemoveDefinitionPart
RemoveDefinitionPart (RemoveDefinitionPartRequest) RemoveDefinitionPartResponse Remove a single definition part by its part id. Idempotent.ListMembers
ListMembers (ListMembersRequest) ListMembersResponse List the assets that currently belong to a data product, resolved from its definition and returned as opaque entity ids. Paginated.ScheduleService
(synq.schedule.v1.ScheduleService) ScheduleService provides schedule evaluation utilities.PreviewSchedules
PreviewSchedules (PreviewSchedulesRequest) PreviewSchedulesResponse PreviewSchedules returns the next occurrences for one or more schedule expressions. Never fails at the RPC level; per-schedule errors are returned in the response items. Response items match request items by index.OwnersService
(synq.owners.v1.OwnersService) OwnersService manages owners and their ownerships — the “alert routing as code” surface. An owner is a named responsible party with notification channels (contacts); an ownership assigns a set of assets to an owner and configures the alerts routed to it. Owner is the resource, ownership its sub-resource: an ownership is meaningless without its owner, and deleting an owner deletes its ownerships. Ids are opaque UUIDs supplied by the caller, which makes writes idempotent (a retried create converges instead of duplicating). Mutable fields are optional on the Upsert calls: a set field is written, an omitted field is left unchanged. Pass theetag you last read to guard against overwriting a
concurrent edit.
Related: synq.dataproducts.v2.DataproductsService (an ownership can own a
whole data product), synq.alerts.v1.AlertsService (how the configured alerts
are reported), and synq.users.v1.UsersService (resolve the users behind
UserContact and Slack/Teams mentions).
UpsertOwner
UpsertOwner (UpsertOwnerRequest) UpsertOwnerResponse Create or update an owner. The id is supplied by the caller (a UUID); repeating the same request converges to the same owner. Mutable fields are optional: a set field is written, an omitted field is left unchanged. Passetag to guard against overwriting a concurrent edit.
BatchGetOwners
BatchGetOwners (BatchGetOwnersRequest) BatchGetOwnersResponse Fetch multiple owners by id. Ids that do not exist (or, unlessinclude_deleted is set, are deleted) are omitted from the response rather
than causing an error.
ListOwners
ListOwners (ListOwnersRequest) ListOwnersResponse List the owners in the workspace, paginated.DeleteOwner
DeleteOwner (DeleteOwnerRequest) DeleteOwnerResponse Delete an owner and all of its ownerships. Idempotent — deleting an already-deleted or unknown owner succeeds. Soft-deletes by default; setpurge to hard-delete and release the id. Pass etag to guard against
deleting a concurrently-edited owner.
UpsertOwnership
UpsertOwnership (UpsertOwnershipRequest) UpsertOwnershipResponse Create or update an ownership under an owner. The ownership id is supplied by the caller (a UUID). Assigning a data product that is already owned by a different ownership moves it (the previous ownership of that product is removed), matching the app.ListOwnerships
ListOwnerships (ListOwnershipsRequest) ListOwnershipsResponse List the ownerships of an owner, paginated.BatchGetOwnerships
BatchGetOwnerships (BatchGetOwnershipsRequest) BatchGetOwnershipsResponse Fetch multiple ownerships by id (across owners). Ids that do not exist (or, unlessinclude_deleted is set, are deleted) are omitted.
DeleteOwnership
DeleteOwnership (DeleteOwnershipRequest) DeleteOwnershipResponse Delete an ownership by id. Idempotent — deleting an already-deleted or unknown ownership succeeds. Passetag to guard against deleting a
concurrently-edited ownership.
DwhAgentService
(synq.agent.dwh.v1.DwhAgentService)Connect
Connect (ConnectRequest) ConnectResponse buf:lint:ignore RPC_NO_CLIENT_STREAMINGConnectionsService
(synq.agent.dwh.v1.ConnectionsService) ConnectionsService provides methods for managing data warehouse connections. These connections represent data warehouse integrations configured in Coalesce Quality that can be used by:- DWH Agent: For metadata extraction and data quality monitoring
- Coalesce Quality Scout: On-premise AI agent for data exploration and analysis Both agents share the same or very similar configuration file format.
ListConnections
ListConnections (ListConnectionsRequest) ListConnectionsResponse ListConnections retrieves data warehouse connections for a workspace. Converts Coalesce Quality integration configurations to a standardized connection format. Requires workspace context in the request metadata.GenerateConnectionsYaml
GenerateConnectionsYaml (GenerateConnectionsYamlRequest) GenerateConnectionsYamlResponse GenerateConnectionsYaml converts data warehouse connections to YAML configuration format. The generated YAML can be used directly as a config file for DWH Agent or Coalesce Quality Scout. Secret fields are replaced with environment variable placeholders (e.g.,${CONNECTION_ID_PASSWORD}).
Documentation: https://docs.synq.io/dw-integrations/agent#config-file-schema
SreAgentService
(synq.agent.sre.v1.SreAgentService)Connect
Connect (ConnectRequest) ConnectResponse buf:lint:ignore RPC_NO_CLIENT_STREAMINGGetConfig
GetConfig (GetConfigRequest) GetConfigResponse GetConfig returns the Scout configuration (system prompts + DWH connection summary) for the caller’s workspace. Authorized for the agent itself (SCOPE_SRE_AGENT), for any caller with workspace integration-read access (SCOPE_INTEGRATION_READ) so admins / owners can inspect the live prompts via synqctl / fe-app without an agent token, and for MCP read tokens (SCOPE_MCP_READ) — matches the sibling DWH ConnectionsService scope shape.ListPromptSuggestions
ListPromptSuggestions (ListPromptSuggestionsRequest) ListPromptSuggestionsResponse ListPromptSuggestions returns prompt-improvement suggestions recorded for the caller’s workspace. Default scope is pending suggestions only; set statuses to include accepted / dismissed / superseded rows. Sorted newest first.AcceptPromptSuggestion
AcceptPromptSuggestion (AcceptPromptSuggestionRequest) AcceptPromptSuggestionResponse AcceptPromptSuggestion applies a pending suggestion to the matching SRE agent prompt field. The applied value issuggested_value unless edited_value is set.
Returns FAILED_PRECONDITION when the live prompt has drifted from the suggestion’s
baseline_value since it was produced — the client should re-fetch and re-render.
DismissPromptSuggestion
DismissPromptSuggestion (DismissPromptSuggestionRequest) DismissPromptSuggestionResponse DismissPromptSuggestion marks a pending suggestion as dismissed with an optional free-text reason. The SRE agent configuration is left untouched.RecordPromptSuggestion
RecordPromptSuggestion (RecordPromptSuggestionRequest) RecordPromptSuggestionResponse RecordPromptSuggestion is the producer-side endpoint used by the offline analyser to register a new suggestion for a workspace. The server snapshots the current value of the targeted prompt field asbaseline_value. Any
pending suggestion for the same (workspace, field) pair is marked as
superseded before the new row is inserted. Returns the recorded suggestion,
or an empty response when the baseline already matches suggested_value
(no-op).
Authorized for the agent / offline analyser (SCOPE_SRE_AGENT) and for
admins / owners with workspace integration-edit access
(SCOPE_INTEGRATION_EDIT), so an admin running synqctl can publish a
suggestion against a customer workspace via x-synq-workspace-override
without minting an agent token.
LlmService
(synq.agent.sre.v1.LlmService) Service for evaluating LLM requests and producing structured output.Evaluate
Evaluate (EvaluateRequest) EvaluateResponse Evaluates an LLM request with a structured output schema and message history. The main prompt should be constant as it will be cached for efficiency.TriageService
(synq.agent.sre.v1.TriageService) Service for managing issue triage operations, allowing LLM agents to conclude investigations and record evidence during the triage process.Conclude
Conclude (ConcludeRequest) ConcludeResponse Concludes the triage investigation for one or more issues by providing a structured conclusion and supporting evidence. This method is used by the LLM agent to finalize its investigation.RecordEvidence
RecordEvidence (RecordEvidenceRequest) RecordEvidenceResponse Records evidence collected during the triage investigation. This method allows the LLM agent to incrementally add evidence as it discovers information during the investigation process.BatchLatestConclusions
BatchLatestConclusions (BatchLatestConclusionsRequest) BatchLatestConclusionsResponse Retrieves the latest triage state for one or more issues. This method is used by the LLM agent to retrieve the current state of the issues it is working on.BatchTriageState
BatchTriageState (BatchTriageStateRequest) BatchTriageStateResponse Retrieves the triage state for one or more issues. This method is used by the LLM agent to retrieve the current state of the issues it is working on.ListTriageState
ListTriageState (ListTriageStateRequest) ListTriageStateResponse Retrieves the triage state for one or more issues. This method is used by the LLM agent to retrieve the current state of the issues it is working on.MarkAsInProgress
MarkAsInProgress (MarkAsInProgressRequest) MarkAsInProgressResponse Marks an issue as in progress. This method is used by the LLM agent to indicate that it has started working on an issue.MarkFailed
MarkFailed (MarkFailedRequest) MarkFailedResponse Marks an issue as failed triaging. This method is used by the LLM agent to indicate that it was unable to triage.TestsSuggestionStateService
(synq.agent.sre.v1.TestsSuggestionStateService)SuggestFor
SuggestFor (SuggestForRequest) SuggestForResponseGetActiveSuggestionStatesFor
GetActiveSuggestionStatesFor (GetActiveSuggestionStatesForRequest) GetActiveSuggestionStatesForResponseBatchSuggestionStates
BatchSuggestionStates (BatchSuggestionStatesRequest) BatchSuggestionStatesResponseListSuggestionStates
ListSuggestionStates (ListSuggestionStatesRequest) ListSuggestionStatesResponseMarkAsRunning
MarkAsRunning (MarkAsRunningRequest) MarkAsRunningResponseMarkAsCompleted
MarkAsCompleted (MarkAsCompletedRequest) MarkAsCompletedResponseMarkAsFailed
MarkAsFailed (MarkAsFailedRequest) MarkAsFailedResponseMarkAsCancelled
MarkAsCancelled (MarkAsCancelledRequest) MarkAsCancelledResponseFeatureRequestService
(synq.agent.sre.v1.FeatureRequestService) FeatureRequestService allows MCP clients to submit feature requests when users encounter missing capabilities. This is a last-resort service — it should only be used when no existing tool can fulfill the user’s request.SubmitFeatureRequest
SubmitFeatureRequest (SubmitFeatureRequestRequest) SubmitFeatureRequestResponse SubmitFeatureRequest submits a feature request to the Coalesce Quality product team. This method should only be called as a last resort when the user’s request cannot be fulfilled by any existing tool. It logs the request for product team review.AuditLogService
(synq.agent.recon.v1.AuditLogService) AuditLogService provides methods to ingest and query reconciliation audit logs.IngestAuditLog
IngestAuditLog (IngestAuditLogRequest) IngestAuditLogResponse IngestAuditLog stores a reconciliation run audit log. Reporting a locally executed run is part of running one, so the scope that authorises editing and running suites also authorises reporting their results — a pipeline needs one credential, not two.ListAuditLogs
ListAuditLogs (ListAuditLogsRequest) ListAuditLogsResponse ListAuditLogs returns audit logs ordered from newest to oldest, optionally filtered by suite and time range.GetAuditLog
GetAuditLog (GetAuditLogRequest) GetAuditLogResponse GetAuditLog returns a single audit log by invocation ID.RunStateService
(synq.agent.recon.v1.RunStateService) RunStateService exposes lifecycle status of reconciliation runs. Polling-based read API — clients fetch the current state for one or more suites and display progress. No notifications are emitted; clients re-poll to observe transitions.BatchReconciliationRunState
BatchReconciliationRunState (BatchReconciliationRunStateRequest) BatchReconciliationRunStateResponse BatchReconciliationRunState returns the latest concluded run and any ongoing (SCHEDULED or IN_PROGRESS) run for each suite_id. Returned map is keyed by suite_id. Suites with no recorded runs are omitted from the response map.ListReconciliationRunState
ListReconciliationRunState (ListReconciliationRunStateRequest) ListReconciliationRunStateResponse ListReconciliationRunState returns runs filtered by status and/or suite_id. Sorted newest-first by scheduled_at.CancelReconciliationRun
CancelReconciliationRun (CancelReconciliationRunRequest) CancelReconciliationRunResponse CancelReconciliationRun marks a SCHEDULED or IN_PROGRESS run as CANCELLED so the suite is no longer “occupied” by a stuck occurrence — used to recover from local-dev / executor outages where a run was queued but never executed. Already-terminal runs are returned unchanged. Idempotent: calling on an already-cancelled run is a no-op. Note: this only updates the run-state row. The corresponding execution-job row is independent — when an executor eventually wakes up to that job it will see the run is CANCELLED and skip.SuiteConfigService
(synq.agent.recon.v1.SuiteConfigService) SuiteConfigService manages reconciliation suite configurations. Managed suites are long-lived, optionally scheduled configs identified by suite_name. Ad-hoc suites are one-off configs that get a generated UUID as suite_id.UpsertSuiteConfig
UpsertSuiteConfig (UpsertSuiteConfigRequest) UpsertSuiteConfigResponse Upsert a managed suite config. Creates if new, updates with new version if exists. The suite_id equals the suite name (from ReconciliationSuite.name). Validates the ReconciliationSuite proto. Does NOT validate connections exist.SubmitAdhocSuite
SubmitAdhocSuite (SubmitAdhocSuiteRequest) SubmitAdhocSuiteResponse Submit an ad-hoc suite for one-off execution. Provide either an inline suite or a suite_id referencing an existing managed suite. Optionally apply environment overrides before execution. The client-provided invocation_id ensures idempotency.GetSuiteConfig
GetSuiteConfig (GetSuiteConfigRequest) GetSuiteConfigResponse Get the latest version of a suite config by suite_id. Works for both managed (suite_id = suite_name) and ad-hoc (suite_id = UUID) configs.ListSuiteConfigs
ListSuiteConfigs (ListSuiteConfigsRequest) ListSuiteConfigsResponse List latest suite configs with filtering and pagination. By default returns only managed suites. Set include_adhoc to also include ad-hoc configs.DeleteSuiteConfig
DeleteSuiteConfig (DeleteSuiteConfigRequest) DeleteSuiteConfigResponse Delete a managed suite config (soft delete — inserts a deleted version).ListSuiteConfigVersions
ListSuiteConfigVersions (ListSuiteConfigVersionsRequest) ListSuiteConfigVersionsResponse Get version history for a suite config.GetSuiteConfigVersion
GetSuiteConfigVersion (GetSuiteConfigVersionRequest) GetSuiteConfigVersionResponse Get a specific historical version of a suite config.YamlService
(synq.agent.recon.v1.YamlService) YamlService provides stateless conversion between YAML config format and proto. This is useful for UI editors that need to display/edit suite configs as YAML.ParseYaml
ParseYaml (ParseYamlRequest) ParseYamlResponse ParseYaml parses a YAML config string into a ReconciliationSuite proto. Only the suite configuration fields are extracted (connections are ignored).RenderYaml
RenderYaml (RenderYamlRequest) RenderYamlResponse RenderYaml renders a ReconciliationSuite proto as a YAML config string.SuiteDeploymentService
(synq.agent.recon.v1.SuiteDeploymentService) SuiteDeploymentService is the platform plane of reconciliation. SuiteConfigService is the developer/authoring sandbox (edit, version, run ad-hoc with your own credentials — preview-only, no Entity, no Run, no Issue). A deployment is what SYNQ actually runs on the workspace’s behalf: a frozen snapshot of a suite config, mapped to workspace-level SYNQ integrations, optionally scheduled or triggerable by API. Identity: every deployment has a stable deployment_id (UUIDv7) assigned on first promote. It survives re-promotes, schedule/mapping changes, and pause/resume. Downstream AssetCommand / RunCommand publication keys off deployment_id so Entity identity does not fragment on promote churn.PromoteSuite
PromoteSuite (PromoteSuiteRequest) PromoteSuiteResponse Promote a suite config into production. Freezes a snapshot of the config and stores the connection → integration mapping. Creates a new deployment on first call; re-promotes the same suite_id (reusing its deployment_id) on subsequent calls.UnpromoteSuite
UnpromoteSuite (UnpromoteSuiteRequest) UnpromoteSuiteResponse Unpromote a deployment. Marks it inactive; scheduler and API triggers stop. Deployment history is preserved; re-promoting the same suite_id reuses the original deployment_id.UpdateDeploymentSchedule
UpdateDeploymentSchedule (UpdateDeploymentScheduleRequest) UpdateDeploymentScheduleResponse Change schedule and/or triggerable_by_api on an existing deployment without re-promoting the config snapshot or touching mappings.UpdateDeploymentMappings
UpdateDeploymentMappings (UpdateDeploymentMappingsRequest) UpdateDeploymentMappingsResponse Rewire connection → integration mappings on an existing deployment without re-promoting the config snapshot.UpdateDeploymentAnnotations
UpdateDeploymentAnnotations (UpdateDeploymentAnnotationsRequest) UpdateDeploymentAnnotationsResponse Replace the deployment-level annotation overlay on an existing deployment. Annotations are merged with suite-level and case-level annotations from the frozen suite snapshot at promote/update time, then surfaced on PromotedReconSuiteMetadata / PromotedReconCaseMetadata for every asset under the deployment.UpdateDeploymentCategories
UpdateDeploymentCategories (UpdateDeploymentCategoriesRequest) UpdateDeploymentCategoriesResponse Change the categories declared for a deployment’s reconciliation checks without re-promoting the suite snapshot. Each field is patched independently: omitting one leaves it as it was, sending an empty string clears it, and sending a value sets or replaces it — so changing the governance category can never disturb the technical one. The new categories reach the published checks immediately; a re-promote is not needed for them to take effect.UpdateDeploymentCaseImpacts
UpdateDeploymentCaseImpacts (UpdateDeploymentCaseImpactsRequest) UpdateDeploymentCaseImpactsResponse Patch the per-case ReconciliationFailureImpact map on an existing deployment without re-promoting the suite snapshot. Useful for “apply to all” FE actions and one-off toggles between RAISE_ISSUE_ON_TABLES and SHOW_ON_TABLES. Re-renders PromotedReconCaseMetadata so the error_tables / shown_tables split reflects the new policy immediately. Merge semantics: keys present in the request overwrite the stored value for that case. Keys absent from the request are left untouched (no implicit reset). Sending RECONCILIATION_FAILURE_IMPACT_UNSPECIFIED clears the override for that case (falls back to the default RAISE_ISSUE_ON_TABLES). Unknown case names are rejected with INVALID_ARGUMENT so the FE catches typos before the deployment is mutated.PauseDeployment
PauseDeployment (PauseDeploymentRequest) PauseDeploymentResponse Pause a deployment. Scheduled and API-triggered runs are suppressed untiluntil is reached, or indefinitely when until is absent.
ResumeDeployment
ResumeDeployment (ResumeDeploymentRequest) ResumeDeploymentResponse Resume a paused deployment.GetSuiteDeployment
GetSuiteDeployment (GetSuiteDeploymentRequest) GetSuiteDeploymentResponse Fetch a deployment by suite_id or deployment_id.ListSuiteDeployments
ListSuiteDeployments (ListSuiteDeploymentsRequest) ListSuiteDeploymentsResponse List deployments for the caller’s workspace. Filters support answering “what is SYNQ running on behalf of this workspace?” and “which deployments use this SYNQ integration?”.ListSuiteDeploymentHistory
ListSuiteDeploymentHistory (ListSuiteDeploymentHistoryRequest) ListSuiteDeploymentHistoryResponse List the append-only history of a deployment (every promote, re-promote, schedule/mapping change, pause/resume, unpromote).TriggerDeployment
TriggerDeployment (TriggerDeploymentRequest) TriggerDeploymentResponse Trigger an on-demand execution of a promoted deployment. Enqueues a run using the frozen suite snapshot and connection mappings stored on the deployment row — execution uses platform integration credentials, not the caller’s. Returns the freshly-allocatedrun_id so callers can poll
RunStateService for status.
Preconditions:
- Deployment must exist and be
active. - Deployment must have
triggerable_by_api = true(FAILED_PRECONDITION otherwise). - Deployment must not be paused (FAILED_PRECONDITION when
paused_untilis set and in the future).
SavedViewsService
(synq.savedviews.v1.SavedViewsService) SavedViewsService manages saved views — named, reusable selections over your entities (and other surfaces) with display configuration, sharing and per-user pinning. A saved view is owned by the user who created it. It can be kept private, shared with the whole workspace, or granted to specific users. Reads return, for the calling user, how each view relates to them (mine / shared / granted) and what they are allowed to do with it. Workspace administrators can manage any view in the workspace.Upsert
Upsert (UpsertRequest) UpsertResponse Create or update a saved view. The view id is supplied by the caller (a UUID), which makes this operation idempotent — repeating the same request converges to the same view rather than creating a duplicate. Mutable fields are optional: a field that is set is written, a field that is omitted is left unchanged. To guard against overwriting a concurrent edit, pass theetag you last read.
Delete
Delete (DeleteRequest) DeleteResponse Delete a saved view. Idempotent — deleting an already-deleted or unknown view succeeds. Passetag to guard against deleting a concurrently-edited
view.
BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Fetch multiple saved views by id. Ids the caller cannot see, or that do not exist, are omitted from the response rather than causing an error.List
List (ListRequest) ListResponse List the saved views the calling user can see. By default returns every visible view (their own, workspace-owned, shared-with-workspace and granted-to-them); narrow withscopes, context and only_pinned.
SetPin
SetPin (SetPinRequest) SetPinResponse Pin or unpin a saved view to the calling user’s main screen. Pinning is a per-user preference: it applies only to the caller and does not modify the view or its version, so any user who can see a view may pin it.IamService
(synq.auth.iam.v1.IamService)Iam
Iam (IamRequest) IamResponse Iam returns information about caller authenticationPlatformsService
(synq.platforms.v1.PlatformsService) PlatformsService is a service for managing Platforms and Integrations.SetPlatformAuthentication
SetPlatformAuthentication (SetPlatformAuthenticationRequest) SetPlatformAuthenticationResponseIncidentsService
(synq.incidents.v1.IncidentsService) IncidentsService is a service for managing Incidents.CreateIncident
CreateIncident (CreateIncidentRequest) CreateIncidentResponseRenameIncident
RenameIncident (RenameIncidentRequest) RenameIncidentResponseUpdateIncidentState
UpdateIncidentState (UpdateIncidentStateRequest) UpdateIncidentStateResponseCancelIncident
CancelIncident (CancelIncidentRequest) CancelIncidentResponse Cancel an incidentCloseIncident
CloseIncident (CloseIncidentRequest) CloseIncidentResponse Close an incidentMergeIncidents
MergeIncidents (MergeIncidentsRequest) MergeIncidentsResponseSplitIncident
SplitIncident (SplitIncidentRequest) SplitIncidentResponseAddIssuesToIncident
AddIssuesToIncident (AddIssuesToIncidentRequest) AddIssuesToIncidentResponseRemoveIssuesFromIncident
RemoveIssuesFromIncident (RemoveIssuesFromIncidentRequest) RemoveIssuesFromIncidentResponseListIncidents
ListIncidents (ListIncidentsRequest) ListIncidentsResponseBatchGetIncidents
BatchGetIncidents (BatchGetIncidentsRequest) BatchGetIncidentsResponseAssignIncidentOwner
AssignIncidentOwner (AssignIncidentOwnerRequest) AssignIncidentOwnerResponsePostComment
PostComment (PostCommentRequest) PostCommentResponse Post a comment on an incident.DeleteComment
DeleteComment (DeleteCommentRequest) DeleteCommentResponse Delete a comment on an incident. Only the actor who posted the comment may delete it. Deleting an already-deleted comment succeeds.CommitsService
(synq.git.commits.v1.CommitsService)GetDiffByChangeId
GetDiffByChangeId (GetDiffByChangeIdRequest) GetDiffByChangeIdResponseGetDiffByCommit
GetDiffByCommit (GetDiffByCommitRequest) GetDiffByCommitResponseDomainsService
(synq.domains.v1.DomainsService) DomainsService can be used to manage domains.Upsert
Upsert (UpsertRequest) UpsertResponse Create or update a domain.BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Get multiple domains by their identifiers.FetchDomainWithSubDomains
FetchDomainWithSubDomains (FetchDomainWithSubDomainsRequest) FetchDomainWithSubDomainsResponse Get a domain with its sub-domainsList
List (ListRequest) ListResponse List all the domains in the current workspace.Delete
Delete (DeleteRequest) DeleteResponse Delete a domain by its identifier.SetDefinition
SetDefinition (SetDefinitionRequest) SetDefinitionResponse Set the definition for an existing domain.UpsertDefinitionPart
UpsertDefinitionPart (UpsertDefinitionPartRequest) UpsertDefinitionPartResponse Upsert definition part to the definition of an existing domain.RemoveDefinitionPart
RemoveDefinitionPart (RemoveDefinitionPartRequest) RemoveDefinitionPartResponse Remove definition part from the definition of an existing domain.GetUsage
GetUsage (GetUsageRequest) GetUsageResponse Report how many domains the workspace uses, split into top-level and sub-domains.DomainsService
(synq.domains.v2.DomainsService) DomainsService manages data domains — named areas of ownership that group the assets, data products and sub-domains belonging to one part of the business. Ids are opaque UUIDs supplied by the caller, which makes writes idempotent (a retried create converges instead of duplicating). Mutable fields are optional on Upsert: a field that is set is written, a field that is omitted is left unchanged. Pass theetag you last read to guard against overwriting a
concurrent edit.
A domain may contain other domains and data products, so membership resolution
is recursive. Every write that adds such a reference — including a change of
parent_id — is rejected if it would close a loop, so a definition can always
be resolved in finite time.
Upsert
Upsert (UpsertRequest) UpsertResponse Create or update a domain. The id is supplied by the caller (a UUID); repeating the same request converges to the same domain. Mutable fields are optional: a set field is written, an omitted field is left unchanged. Passetag to guard against overwriting a concurrent edit.
BatchGet
BatchGet (BatchGetRequest) BatchGetResponse Fetch multiple domains by id. Ids that do not exist (or, unlessinclude_deleted is set, are deleted) are omitted from the response rather
than causing an error.
List
List (ListRequest) ListResponse List the domains in the workspace, paginated. Narrow to one level of the hierarchy withparent_id.
FetchDomainWithSubDomains
FetchDomainWithSubDomains (FetchDomainWithSubDomainsRequest) FetchDomainWithSubDomainsResponse Fetch a domain together with its direct sub-domains, keyed by id.Delete
Delete (DeleteRequest) DeleteResponse Delete a domain. Idempotent — deleting an already-deleted or unknown domain succeeds. Soft-deletes by default; setpurge to hard-delete and release the
id, which is refused while the domain still has sub-domains. Pass etag to
guard against deleting a concurrently-edited domain.
SetDefinition
SetDefinition (SetDefinitionRequest) SetDefinitionResponse Replace the entire membership definition of a domain.UpsertDefinitionPart
UpsertDefinitionPart (UpsertDefinitionPartRequest) UpsertDefinitionPartResponse Add or replace a single definition part (matched by its part id).RemoveDefinitionPart
RemoveDefinitionPart (RemoveDefinitionPartRequest) RemoveDefinitionPartResponse Remove a single definition part by its part id. Idempotent.ListMembers
ListMembers (ListMembersRequest) ListMembersResponse List the assets that currently belong to a domain, resolved from its definition — including everything contributed by the data products and domains it references, and by its own sub-domains — and returned as opaque entity ids. Paginated.GetUsage
GetUsage (GetUsageRequest) GetUsageResponse Report how many domains the workspace uses, split into top-level and sub-domains.DomainMembersService
(synq.domains.members.v1.DomainMembersService) DomainMembersService can be used to manage domain memberships.AddDomainMembers
AddDomainMembers (AddDomainMembersRequest) AddDomainMembersResponse Add domain members.RemoveDomainMembers
RemoveDomainMembers (RemoveDomainMembersRequest) RemoveDomainMembersResponse Remove domain members.ListDomainMembers
ListDomainMembers (ListDomainMembersRequest) ListDomainMembersResponse List domain members.ListUserDomains
ListUserDomains (ListUserDomainsRequest) ListUserDomainsResponse List domains for the given user.SetDefaultUserDomain
SetDefaultUserDomain (SetDefaultUserDomainRequest) SetDefaultUserDomainResponse Set default domain for user.AtlanIntegrationService
(synq.extensions.atlan.integrations.v1.AtlanIntegrationService)Upsert
Upsert (UpsertRequest) UpsertResponse Upserts an integration and validates it by checking if the provided API URL and token are valid.Ping
Ping (PingRequest) PingResponse Pings Atlan with the given connection credentials.Get
Get (GetRequest) GetResponseRemove
Remove (RemoveRequest) RemoveResponseActivate
Activate (ActivateRequest) ActivateResponse Activate or deactivate the integration.AtlanWorkflowService
(synq.extensions.atlan.workflows.v1.AtlanWorkflowService)SetConnectionMappings
SetConnectionMappings (SetConnectionMappingsRequest) SetConnectionMappingsResponseRemoveConnectionMappings
RemoveConnectionMappings (RemoveConnectionMappingsRequest) RemoveConnectionMappingsResponseGetConnectionMappings
GetConnectionMappings (GetConnectionMappingsRequest) GetConnectionMappingsResponseGetProductMappings
GetProductMappings (GetProductMappingsRequest) GetProductMappingsResponseGetDomainMappings
GetDomainMappings (GetDomainMappingsRequest) GetDomainMappingsResponseSynchronize
Synchronize (SynchronizeRequest) SynchronizeResponse Run a synchronization job for the integration.FetchRuns
FetchRuns (FetchRunsRequest) FetchRunsResponseSetMappingToggles
SetMappingToggles (SetMappingTogglesRequest) SetMappingTogglesResponseGetMappingToggles
GetMappingToggles (GetMappingTogglesRequest) GetMappingTogglesResponseAtlanProviderService
(synq.extensions.atlan.provider.v1.AtlanProviderService)GetAtlanConnections
GetAtlanConnections (GetAtlanConnectionsRequest) GetAtlanConnectionsResponseGetAtlanDataProducts
GetAtlanDataProducts (GetAtlanDataProductsRequest) GetAtlanDataProductsResponseGetAtlanDomains
GetAtlanDomains (GetAtlanDomainsRequest) GetAtlanDomainsResponseMessages
Delivery
(synq.deliveries.v1.Delivery) Delivery is one event as it was addressed to one integration: what it was about, whether it went, and what happened when it did. One event reaches every integration subscribed to it, so an event that fans out to three integrations produces three deliveries. They shareevent_id
and each has its own id.
Always populated by
BatchGetDeliveries; populated by ListDeliveries only when the request sets include_routing. |
| correlation_key | string | The key the destination deduplicates on — a PagerDuty dedup_key, an Opsgenie alias — so an incident in your own tool can be traced back to the delivery that opened it. Empty for destinations that create no such object.
Populated on the same terms as matched_alert_configs. |
DeliverySubject
(synq.deliveries.v1.DeliverySubject) DeliverySubject is the object an event is about.MatchedAlertConfig
(synq.deliveries.v1.MatchedAlertConfig) MatchedAlertConfig names one alert configuration that selected an integration for an event.Attempt
(synq.deliveries.v1.Attempt) Attempt is one try at handing a delivery to its destination, recorded as it happened: what was sent, what came back, and how long it took. A delivery can produce more than one outgoing request — an integration that creates an object and then annotates it makes two — and each request is retried on its own. Attempts of the same request sharerequest_id and count
up in attempt.
Header
(synq.deliveries.v1.Header) Header is one HTTP header of an attempt. A header whose value carries a credential is never returned, on either the request or the response side. That covers headers you configured as secret, credentials held for the destination, and the standard credential-bearing names (Authorization, Proxy-Authorization, Cookie, Set-Cookie,
X-Api-Key, X-Auth-Token) whatever their contents — a destination echoing
its own authorization header back is withheld too.
Signature headers are returned in full: X-Coalesce-Signature is a digest of
the body and X-Coalesce-Timestamp is a timestamp, neither of which is the
signing secret, and the exact bytes are what you need to reproduce a
verification that failed.
HttpAttempt
(synq.deliveries.v1.HttpAttempt) HttpAttempt is one HTTP request and the response it got. Credential-bearing headers are never returned, whichever side they appear on — seeHeader.
BatchGetDeliveriesRequest
(synq.deliveries.v1.BatchGetDeliveriesRequest)BatchGetDeliveriesResponse
(synq.deliveries.v1.BatchGetDeliveriesResponse)BatchGetDeliveriesResponse.DeliveriesEntry
(synq.deliveries.v1.BatchGetDeliveriesResponse.DeliveriesEntry)GetDeliveryRequest
(synq.deliveries.v1.GetDeliveryRequest)GetDeliveryResponse
(synq.deliveries.v1.GetDeliveryResponse)ListAttemptsRequest
(synq.deliveries.v1.ListAttemptsRequest)ListAttemptsResponse
(synq.deliveries.v1.ListAttemptsResponse)ListDeliveriesRequest
(synq.deliveries.v1.ListDeliveriesRequest)ListDeliveriesResponse
(synq.deliveries.v1.ListDeliveriesResponse)OutcomeCount
(synq.deliveries.v1.OutcomeCount)RedeliverRequest
(synq.deliveries.v1.RedeliverRequest)RedeliverResponse
(synq.deliveries.v1.RedeliverResponse)SendTestDeliveryRequest
(synq.deliveries.v1.SendTestDeliveryRequest)SendTestDeliveryResponse
(synq.deliveries.v1.SendTestDeliveryResponse)SkipReasonCount
(synq.deliveries.v1.SkipReasonCount)StatusClassCount
(synq.deliveries.v1.StatusClassCount)SummariseDeliveriesRequest
(synq.deliveries.v1.SummariseDeliveriesRequest)SummariseDeliveriesResponse
(synq.deliveries.v1.SummariseDeliveriesResponse)IngestExecutionRequest
(synq.ingest.sqlmesh.v1.IngestExecutionRequest)IngestExecutionRequest.EnvironmentVarsEntry
(synq.ingest.sqlmesh.v1.IngestExecutionRequest.EnvironmentVarsEntry)IngestExecutionResponse
(synq.ingest.sqlmesh.v1.IngestExecutionResponse)IngestMetadataRequest
(synq.ingest.sqlmesh.v1.IngestMetadataRequest)IngestMetadataRequest.Error
(synq.ingest.sqlmesh.v1.IngestMetadataRequest.Error)IngestMetadataRequest.FileContentEntry
(synq.ingest.sqlmesh.v1.IngestMetadataRequest.FileContentEntry)IngestMetadataRequest.ModelDetailsEntry
(synq.ingest.sqlmesh.v1.IngestMetadataRequest.ModelDetailsEntry)IngestMetadataRequest.ModelLineageEntry
(synq.ingest.sqlmesh.v1.IngestMetadataRequest.ModelLineageEntry)IngestMetadataResponse
(synq.ingest.sqlmesh.v1.IngestMetadataResponse)CloudwatchLogsLogEvent
(synq.ingest.cloudwatch.v1.CloudwatchLogsLogEvent)IngestCloudwatchLogsDataRequest
(synq.ingest.cloudwatch.v1.IngestCloudwatchLogsDataRequest)IngestCloudwatchLogsDataResponse
(synq.ingest.cloudwatch.v1.IngestCloudwatchLogsDataResponse)LineageColumnEdge
(synq.ingest.dwh.v1.LineageColumnEdge) LineageColumnEdge is a single column-to-column dependency carried inside a table-level edge. Optional: omit to declare table-level lineage only. The columns name positions on the parent LineageEdge’supstream and
downstream objects respectively.
LineageEdge
(synq.ingest.dwh.v1.LineageEdge) LineageEdge is one directed dependency: data flows fromupstream into
downstream. Represent multi-hop lineage as the set of its direct
(distance-1) edges; do not collapse intermediate hops, so the graph stays
explicit and each hop keeps its own object domain and column edges.
LineageNode
(synq.ingest.dwh.v1.LineageNode) LineageNode identifies one object that participates in a lineage edge.DatabasesScope
(synq.ingest.dwh.v1.DatabasesScope) DatabasesScope makes the batch authoritative for the listed databases only.IngestLineageRequest
(synq.ingest.dwh.v1.IngestLineageRequest) IngestLineageRequest carries one batch of lineage edges for a single warehouse connection. Send many batches with the same connection_id over time; each batch is interpreted against the others according toreplace_mode.
IngestLineageResponse
(synq.ingest.dwh.v1.IngestLineageResponse) IngestLineageResponse is intentionally empty; a successful call means the batch was accepted for processing.IngestObjectInformationRequest
(synq.ingest.dwh.v1.IngestObjectInformationRequest)IngestObjectInformationResponse
(synq.ingest.dwh.v1.IngestObjectInformationResponse)IngestObjectMetricsRequest
(synq.ingest.dwh.v1.IngestObjectMetricsRequest)IngestObjectMetricsResponse
(synq.ingest.dwh.v1.IngestObjectMetricsResponse)IngestQueryLogsRequest
(synq.ingest.dwh.v1.IngestQueryLogsRequest)IngestQueryLogsResponse
(synq.ingest.dwh.v1.IngestQueryLogsResponse)IngestSchemasRequest
(synq.ingest.dwh.v1.IngestSchemasRequest)IngestSchemasResponse
(synq.ingest.dwh.v1.IngestSchemasResponse)IngestSqlDefinitionsRequest
(synq.ingest.dwh.v1.IngestSqlDefinitionsRequest)IngestSqlDefinitionsResponse
(synq.ingest.dwh.v1.IngestSqlDefinitionsResponse)IngestTableConstraintsRequest
(synq.ingest.dwh.v1.IngestTableConstraintsRequest)IngestTableConstraintsResponse
(synq.ingest.dwh.v1.IngestTableConstraintsResponse)IngestTaskResultsRequest
(synq.ingest.dwh.v1.IngestTaskResultsRequest)IngestTaskResultsResponse
(synq.ingest.dwh.v1.IngestTaskResultsResponse)LineageScope
(synq.ingest.dwh.v1.LineageScope) LineageScope declares the set of downstream objects a REPLACE_SCOPE batch is authoritative for — the boundary inside which omitted edges are expired. The scope is always additionally bounded by the request’s connection_id. Ignored when the mode is MERGE.SchemasScope
(synq.ingest.dwh.v1.SchemasScope) SchemasScope makes the batch authoritative for the listed schemas only.WholeConnectionScope
(synq.ingest.dwh.v1.WholeConnectionScope) WholeConnectionScope makes the batch authoritative for the entire connection.Fqn
(synq.ingest.dwh.v1.Fqn)ObjectInformation
(synq.ingest.dwh.v1.ObjectInformation)ObjectMetrics
(synq.ingest.dwh.v1.ObjectMetrics)Schema
(synq.ingest.dwh.v1.Schema)SchemaColumn
(synq.ingest.dwh.v1.SchemaColumn)SchemaColumnField
(synq.ingest.dwh.v1.SchemaColumnField)SqlDefinition
(synq.ingest.dwh.v1.SqlDefinition)TableConstraint
(synq.ingest.dwh.v1.TableConstraint) TableConstraint represents a single constraint or index on a database table.TableConstraints
(synq.ingest.dwh.v1.TableConstraints) TableConstraints contains all constraints and indexes for a single table.Tag
(synq.ingest.dwh.v1.Tag)QueryLog
(synq.ingest.dwh.v1.QueryLog) QueryLog represents a single query execution log entry from a data warehouse. This is the format used for ingesting query logs via the DWH agent. The structure mirrors the internal QueryLogRawRow with protobuf serialization.
SQL text (may be obfuscated based on sql_obfuscation_mode) |
| oneof _sql_hash.sql_hash | optional string | SHA256 hash of original SQL for deduplication (computed during storage if not provided) |
| oneof _normalized_query_hash.normalized_query_hash | optional string | Hash of normalized query for lineage caching (empty if not available from platform) |
| sql_dialect | string | SQL dialect (e.g., “snowflake”, “bigquery”, “clickhouse”) |
| query_type | string | Platform-specific query type (e.g., “CREATE_TABLE_AS_SELECT”, “SELECT”) |
| status | string | Execution status: “SUCCESS”, “FAILED”, “CANCELED” |
| oneof _dwh_context.dwh_context | optional QueryLogDwhContext | DWH execution context |
| sql_obfuscation_mode | SqlObfuscationMode | Obfuscation and parsing hints |
| has_complete_native_lineage | bool | If true, native lineage is complete and SQL parsing can be skipped |
| is_truncated | bool | If true, SQL was truncated by the warehouse |
| oneof _metadata.metadata | optional Struct | Platform-specific metadata (arbitrary key-value pairs) Contains execution metrics, costs, etc. depending on the platform |
| oneof _native_lineage.native_lineage | optional QueryLogNativeLineage | Native lineage from the platform (if available) |
QueryLogDwhContext
(synq.ingest.dwh.v1.QueryLogDwhContext) QueryLogDwhContext represents the execution context of a query. Contains information about where and by whom the query was executed. Platform-specific mappings (Instance, Database, Schema):- Snowflake: account, database_name, schema_name
- Databricks: workspace_url, catalog_name, schema_name
- BigQuery: "", project_id, dataset_id
- Redshift: host, database_name, schema_name
- Postgres: host, database_name, schema_name
- Trino: host, catalog, schema
- MySQL: "", host, schema_name
- ClickHouse: hostname, database_name, "" (2-level: hostname.database)
- DuckDB: motherduck_account, database_name, schema_name
QueryLogNativeLineage
(synq.ingest.dwh.v1.QueryLogNativeLineage) QueryLogNativeLineage contains lineage information provided natively by the data warehouse. Not all platforms provide this - when available, it can be more accurate than SQL parsing.GitContext
(synq.ingest.git.v1.GitContext)IngestRequest
(synq.ingest.openlineage.v1.IngestRequest)IngestResponse
(synq.ingest.openlineage.v1.IngestResponse)DbtArtifact
(synq.ingest.dbt.v1.DbtArtifact) https://docs.getdbt.com/reference/artifacts/dbt-artifactsIngestInvocationRequest
(synq.ingest.dbt.v1.IngestInvocationRequest)IngestInvocationRequest.EnvironmentVarsEntry
(synq.ingest.dbt.v1.IngestInvocationRequest.EnvironmentVarsEntry)IngestInvocationResponse
(synq.ingest.dbt.v1.IngestInvocationResponse)IngestDatahubAspectsRequest
(synq.ingest.airflow.v1.IngestDatahubAspectsRequest)IngestDatahubAspectsResponse
(synq.ingest.airflow.v1.IngestDatahubAspectsResponse)IngestLogRequest
(synq.ingest.airflow.v1.IngestLogRequest)IngestLogResponse
(synq.ingest.airflow.v1.IngestLogResponse)AlertingTarget
(synq.alerts.v1.AlertingTarget) AlertingTarget represents a destination where alert notifications will be sent. Each target type has its own specific configuration requirements.EmailTarget
(synq.alerts.v1.EmailTarget) EmailTarget configures alert delivery via email.MsTeamsTarget
(synq.alerts.v1.MsTeamsTarget) MsTeamsTarget configures alert delivery to Microsoft Teams. Alerts are sent to either a Microsoft Teams channel or a specific member.OwnerTarget
(synq.alerts.v1.OwnerTarget) OwnerTarget configures alert delivery to the owner of the monitored entity. This allows alerts to be automatically sent to whoever owns the data being monitored.SlackTarget
(synq.alerts.v1.SlackTarget) SlackTarget configures alert delivery to Slack. Alerts are sent to a Slack channel.WebhookTarget
(synq.alerts.v1.WebhookTarget) WebhookTarget configures alert delivery via webhook/hook integrations. This allows integration with external systems and custom notification workflows.Alert
(synq.alerts.v1.Alert) Alert represents the configuration for an alert. It contains all the necessary information to trigger and send alerts. Deprecated: use synq.alerts.v2.Alert, whose trigger is the canonical synq.queries.v1.Query + resolver_ql selection. This message is served only by the deprecated synq.alerts.services.v1.AlertsService and is scheduled for removal.Alert.Owner
(synq.alerts.v1.Alert.Owner) Owner information for the alert configuration. If set, the alert is attributed to the specified owner and ownership.AlertSettings
(synq.alerts.v1.AlertSettings) AlertSettings defines the properties that affect the trigger and presentation of an alert. It specifies the conditions under which an alert should be fired and how it should behave.EntityGroupQuery
(synq.alerts.v1.EntityGroupQuery) EntityGroupQuery defines a query to select a group of entities. This is used to specify which entities should be monitored by an alert. Deprecated: the v2 trigger selects entities with synq.queries.v1.Query + resolver_ql instead. Scheduled for removal with synq.alerts.services.v1.IssueAlertSettings
(synq.alerts.v1.IssueAlertSettings) IssueAlertSettings is the unified alert settings type for issue-based alerts. It replaces both EntityFailureAlertSettings and IssueLifecycleAlertSettings.IssueGroupingStrategy
(synq.alerts.v1.IssueGroupingStrategy) IssueGroupingStrategy controls how issues are grouped for alerting purposes.IssueGroupingStrategy.NoGrouping
(synq.alerts.v1.IssueGroupingStrategy.NoGrouping) NoGrouping - each issue triggers a separate alert.IssueGroupingStrategy.SystemDetected
(synq.alerts.v1.IssueGroupingStrategy.SystemDetected) SystemDetected - the system automatically groups related issues.OngoingAlertsStrategy
(synq.alerts.v1.OngoingAlertsStrategy) OngoingAlertsStrategy defines how to handle ongoing/repeated alerts. This prevents alert spam by controlling notification frequency.OngoingAlertsStrategy.Disabled
(synq.alerts.v1.OngoingAlertsStrategy.Disabled) Disabled strategy - no ongoing alerts will be sent after the initial alert. No configuration needed - alerts are simply disabled after the first one.OngoingAlertsStrategy.Schedule
(synq.alerts.v1.OngoingAlertsStrategy.Schedule) Schedule strategy - alerts are sent on a scheduled basis.OngoingAlertsStrategy.Stream
(synq.alerts.v1.OngoingAlertsStrategy.Stream) Stream strategy - alerts are sent continuously as issues persist. No configuration needed - alerts stream continuously.SchemaChangeAlertSettings
(synq.alerts.v1.SchemaChangeAlertSettings) SchemaChangeAlertSettings configures alerts for schema changes. This alert triggers when the schema of monitored entities changes.SelectionQuery
(synq.alerts.v1.SelectionQuery) SelectionQuery represents a query that selects entities based on various criteria. It combines multiple query parts with a logical operand. Deprecated: the v2 trigger selects entities with synq.queries.v1.Query + resolver_ql instead. Scheduled for removal with synq.alerts.services.v1.SelectionQuery.QueryPart
(synq.alerts.v1.SelectionQuery.QueryPart) A single part of a selection query.AlertIdentifier
(synq.alerts.services.v1.AlertIdentifier)BatchGetRequest
(synq.alerts.services.v1.BatchGetRequest)BatchGetResponse
(synq.alerts.services.v1.BatchGetResponse)BatchGetResponse.AlertsEntry
(synq.alerts.services.v1.BatchGetResponse.AlertsEntry)CreateRequest
(synq.alerts.services.v1.CreateRequest) CreateRequest creates a new alert configuration.CreateResponse
(synq.alerts.services.v1.CreateResponse) CreateResponse returns the created alert configuration.DeleteRequest
(synq.alerts.services.v1.DeleteRequest) DeleteRequest specifies which alert configuration to delete. The config can be identified by either ID or FQN.DeleteResponse
(synq.alerts.services.v1.DeleteResponse) DeleteResponse confirms the deletion (empty response). Empty response - successful deletion is indicated by HTTP 200 status.ListRequest
(synq.alerts.services.v1.ListRequest) ListRequest filters alert configurations to retrieve.ListResponse
(synq.alerts.services.v1.ListResponse) ListResponse returns the filtered list of alert configurations.ToggleEnabledRequest
(synq.alerts.services.v1.ToggleEnabledRequest) ToggleEnabledRequest enables or disables an alert configuration. The config can be identified by either ID or FQN.ToggleEnabledResponse
(synq.alerts.services.v1.ToggleEnabledResponse) ToggleEnabledResponse confirms the toggle operation (empty response). Empty response - successful toggle is indicated by HTTP 200 status.UpdateRequest
(synq.alerts.services.v1.UpdateRequest) UpdateRequest updates an existing alert configuration. The config can be identified by either ID or FQN.UpdateResponse
(synq.alerts.services.v1.UpdateResponse) UpdateResponse returns the updated alert configuration.AlertIdentifier
(synq.alerts.services.v2.AlertIdentifier)BatchGetRequest
(synq.alerts.services.v2.BatchGetRequest)BatchGetResponse
(synq.alerts.services.v2.BatchGetResponse)BatchGetResponse.AlertsEntry
(synq.alerts.services.v2.BatchGetResponse.AlertsEntry)CreateRequest
(synq.alerts.services.v2.CreateRequest) CreateRequest creates a new alert configuration. Thekind oneof carries the
full specification of the alert; its target and trigger constraints are
enforced on the concrete kind messages.
Incident-owner alerts are not created here — turn them on with
ToggleIncidentOwnerAlert.
CreateResponse
(synq.alerts.services.v2.CreateResponse) CreateResponse returns the created alert configuration.DeleteRequest
(synq.alerts.services.v2.DeleteRequest) DeleteRequest specifies which alert configuration to delete. The config can be identified by either ID or FQN.DeleteResponse
(synq.alerts.services.v2.DeleteResponse) DeleteResponse confirms the deletion (empty response). Empty response - successful deletion is indicated by HTTP 200 status.ListRequest
(synq.alerts.services.v2.ListRequest) ListRequest filters alert configurations to retrieve.ListResponse
(synq.alerts.services.v2.ListResponse) ListResponse returns the filtered list of alert configurations.RenameRequest
(synq.alerts.services.v2.RenameRequest) RenameRequest changes an alert’s human-readable name.RenameResponse
(synq.alerts.services.v2.RenameResponse) RenameResponse returns the renamed alert configuration.SendTestAlertRequest
(synq.alerts.services.v2.SendTestAlertRequest) SendTestAlertRequest delivers a static test message to the given targets.SendTestAlertResponse
(synq.alerts.services.v2.SendTestAlertResponse) SendTestAlertResponse reports the per-target outcome of the test send.TestAlertDispatch
(synq.alerts.services.v2.TestAlertDispatch) TestAlertDispatch is the outcome of delivering the test message to one target.ToggleEnabledRequest
(synq.alerts.services.v2.ToggleEnabledRequest) ToggleEnabledRequest enables or disables an alert configuration. The config can be identified by either ID or FQN.ToggleEnabledResponse
(synq.alerts.services.v2.ToggleEnabledResponse) ToggleEnabledResponse confirms the toggle operation (empty response). Empty response - successful toggle is indicated by HTTP 200 status.ToggleIncidentOwnerAlertRequest
(synq.alerts.services.v2.ToggleIncidentOwnerAlertRequest) ToggleIncidentOwnerAlertRequest turns the workspace’s incident-owner alert on or off.ToggleIncidentOwnerAlertResponse
(synq.alerts.services.v2.ToggleIncidentOwnerAlertResponse) ToggleIncidentOwnerAlertResponse reports the resulting state.UpdateSettingsRequest
(synq.alerts.services.v2.UpdateSettingsRequest) UpdateSettingsRequest updates an alert’s trigger and/or its kind-specific settings. At least one of the two must be provided; whichever is omitted is left unchanged (neither can be cleared). The provided settings must match the alert’s existing kind — switching an alert from one kind to another is not permitted.UpdateSettingsResponse
(synq.alerts.services.v2.UpdateSettingsResponse) UpdateSettingsResponse returns the updated alert configuration.UpdateTargetsRequest
(synq.alerts.services.v2.UpdateTargetsRequest) UpdateTargetsRequest replaces an alert’s delivery targets.UpdateTargetsResponse
(synq.alerts.services.v2.UpdateTargetsResponse) UpdateTargetsResponse returns the updated alert configuration.UpdateTemplateRequest
(synq.alerts.services.v2.UpdateTemplateRequest) UpdateTemplateRequest sets or clears an alert’s message template.UpdateTemplateResponse
(synq.alerts.services.v2.UpdateTemplateResponse) UpdateTemplateResponse returns the updated alert configuration.AlertingTarget
(synq.alerts.v2.AlertingTarget) AlertingTarget represents a destination where alert notifications will be sent. Each target type has its own specific configuration requirements.EmailTarget
(synq.alerts.v2.EmailTarget) EmailTarget configures alert delivery via email.MsTeamsTarget
(synq.alerts.v2.MsTeamsTarget) MsTeamsTarget configures alert delivery to Microsoft Teams. Alerts are sent to a Microsoft Teams channel.OwnerTarget
(synq.alerts.v2.OwnerTarget) OwnerTarget configures alert delivery to the owner of the monitored entity. This allows alerts to be automatically sent to whoever owns the data being monitored.SlackTarget
(synq.alerts.v2.SlackTarget) SlackTarget configures alert delivery to Slack. Alerts are sent to a Slack channel.WebhookTarget
(synq.alerts.v2.WebhookTarget) WebhookTarget configures alert delivery via webhook/hook integrations. This allows integration with external systems and custom notification workflows.Alert
(synq.alerts.v2.Alert) Alert represents the configuration for an alert. An alert is exactly one concrete kind, distinguished by thekind oneof:
issue_lifecycle: fires on the issues of selected entities.schema_change: fires on the schema changes of selected entities.incident_lifecycle: fires on incident state transitions. The identity, template and ownership fields are shared; everything specific to how an alert triggers and delivers lives on its kind message.
EmailCustomizationOptions
(synq.alerts.v2.EmailCustomizationOptions) EmailCustomizationOptions customises the addresses used when an alert is delivered by email. Unset addresses fall back to the workspace defaults.EmailSender
(synq.alerts.v2.EmailSender) EmailSender is an email address paired with an optional display name.IncidentLifecycleAlert
(synq.alerts.v2.IncidentLifecycleAlert) IncidentLifecycleAlert fires when an incident transitions into one of the selected states. It takes no entity selection.IncidentLifecycleAlertSettings
(synq.alerts.v2.IncidentLifecycleAlertSettings) IncidentLifecycleAlertSettings configures an alert that fires when an incident enters one of the selected states.IssueAlertSettings
(synq.alerts.v2.IssueAlertSettings) IssueAlertSettings is the unified alert settings type for issue-based alerts.IssueGroupingStrategy
(synq.alerts.v2.IssueGroupingStrategy) IssueGroupingStrategy controls how issues are grouped for alerting purposes.IssueGroupingStrategy.NoGrouping
(synq.alerts.v2.IssueGroupingStrategy.NoGrouping) NoGrouping - each issue triggers a separate alert.IssueGroupingStrategy.SystemDetected
(synq.alerts.v2.IssueGroupingStrategy.SystemDetected) SystemDetected - the system automatically groups related issues.IssueLifecycleAlert
(synq.alerts.v2.IssueLifecycleAlert) IssueLifecycleAlert fires on the issues of the entities its trigger selects.OngoingAlertsStrategy
(synq.alerts.v2.OngoingAlertsStrategy) OngoingAlertsStrategy defines how to handle ongoing/repeated alerts. This prevents alert spam by controlling notification frequency.OngoingAlertsStrategy.Disabled
(synq.alerts.v2.OngoingAlertsStrategy.Disabled) Disabled strategy - no ongoing alerts will be sent after the initial alert. No configuration needed - alerts are simply disabled after the first one.OngoingAlertsStrategy.Schedule
(synq.alerts.v2.OngoingAlertsStrategy.Schedule) Schedule strategy - alerts are sent on a scheduled basis.OngoingAlertsStrategy.Stream
(synq.alerts.v2.OngoingAlertsStrategy.Stream) Stream strategy - alerts are sent continuously as issues persist. No configuration needed - alerts stream continuously.Owner
(synq.alerts.v2.Owner) Owner attributes an alert to an owner and ownership. Only entity-scoped alerts (issue and schema change) can be owned.SchemaChangeAlert
(synq.alerts.v2.SchemaChangeAlert) SchemaChangeAlert fires on the schema changes of the entities its trigger selects.SchemaChangeAlertSettings
(synq.alerts.v2.SchemaChangeAlertSettings) SchemaChangeAlertSettings configures alerts for schema changes. This alert triggers when the schema of monitored entities changes.Trigger
(synq.alerts.v2.Trigger) Trigger selects the entities whose issues or schema changes fire this alert: a structuredquery, an optional ResolverQL string that takes precedence when
set, and a read-only canonical rendering.
AlertTemplate
(synq.alerts.templates.v2.AlertTemplate) AlertTemplate customises the message rendered for an alert. The body is either verbatim text (plain), rendered exactly as given, or a
structured template (structured) assembled from named blocks written in
Jinja-compatible syntax and grouped by where they render.
StructuredTemplate
(synq.alerts.templates.v2.StructuredTemplate) StructuredTemplate is a dynamic template split into the two tiers a message renders in. Within each tier, blocks render in list order. A block that should appear in both tiers is listed in bothsummary and
issue_details with the same name.
TemplateBlock
(synq.alerts.templates.v2.TemplateBlock) TemplateBlock is one unit of Jinja-compatible source.Folder
(synq.entities.folders.v1.Folder) Folder is one node in the folder / containment hierarchy: an integration root, a container (database, schema, project), or a nested folder. Members that are not themselves folders (tables, models, …) are returned as entity ids, not asFolders.
BrowseRequest
(synq.entities.folders.v1.BrowseRequest)BrowseResponse
(synq.entities.folders.v1.BrowseResponse)GetFolderOfRequest
(synq.entities.folders.v1.GetFolderOfRequest)GetFolderOfResponse
(synq.entities.folders.v1.GetFolderOfResponse)GetFolderOfResponse.Breadcrumb
(synq.entities.folders.v1.GetFolderOfResponse.Breadcrumb) One containing breadcrumb: the folders from a root down to (and including) the entity’s immediate parent, ordered root first.GetFolderOfResponse.Breadcrumbs
(synq.entities.folders.v1.GetFolderOfResponse.Breadcrumbs) All breadcrumbs for one entity. Most entities have a single breadcrumb; an entity placed in several hierarchies has one per hierarchy.GetFolderOfResponse.BreadcrumbsByEntityIdEntry
(synq.entities.folders.v1.GetFolderOfResponse.BreadcrumbsByEntityIdEntry)ListMembersRequest
(synq.entities.folders.v1.ListMembersRequest)ListMembersResponse
(synq.entities.folders.v1.ListMembersResponse)EntityTraitDef
(synq.entities.typedefs.v1.EntityTraitDef) EntityTraitDef describes one trait a selection query can filter entities by. A trait names a property a type has rather than a type itself, so a selection can ask for “everything a monitor can run on” instead of listing the forty-odd types that satisfy it today. The set of types it stands for is worked out each time the query runs, so a selection saved this way covers a new platform’s types as soon as Coalesce Quality supports them, and you never have to revisit it. In a query written as text this iswith_type(traits="is_monitorable"); in a
structured query it is the traits field on synq.queries.v1.WithType.
Read this list rather than keeping your own. Traits are added as the platform
grows, and a name that is not in the list selects NOTHING — so a stale copy
narrows a selection to empty rather than failing where you would notice.
It is this server’s current answer, not a definition — the point of selecting by trait is that this set grows without your query changing. Use it to show or preview what a selection covers, never to expand a trait into types and store that instead. |
EntityTypeDef
(synq.entities.typedefs.v1.EntityTypeDef) EntityTypeDef describes one kind of entity that exists in your workspace — a BigQuery table, a dbt model, an Airflow DAG, or a type you defined yourself. Use it to turn theentity_type that other endpoints return into something you
can show a person or make a decision about: a name to display, the platform it
came from, and what Coalesce Quality does with it.
The built-in types and your own custom types both come back here, in this same
shape. A custom type is the one with a non-zero type_id.
If your generated code is older than the server, a type it does not know arrives as an unrecognised number —
name still identifies it. |
| name | string | A stable name for the type that never changes, safe to store and to compare against. Built-in types use the enum spelling, e.g. ENTITY_TYPE_BQ_TABLE. Your own types are named CUSTOM_TYPE_<type_id>, e.g. CUSTOM_TYPE_20, which stays the same even if you rename the type.
Prefer this over the numeric value whenever you store a reference to a type.
It is also the name a selection query spells the type by, lowercased and without the ENTITY_TYPE_ prefix: with_type("bq_table") for a built-in, with_type("custom_type_20") for one of your own. Matching there ignores case, so this value can be passed through as it is. |
| short_name | string | The type’s name without its platform: “Table”, “View”, “DAG”. Use it where the platform is already clear from the surrounding context.
For a type you defined yourself, this is the name you gave it. |
| short_plural_name | string | The plural of short_name, for counts and headings: “Tables”, “Views”.
Empty for a type you defined yourself, since you gave it a single name — fall back to short_name. |
| full_name | string | The type’s name including its platform: “BigQuery Table”, “Snowflake View”. Use it where a type appears on its own, so that a table from two different warehouses still reads clearly.
For a type you defined yourself, this is the same as short_name. |
| full_plural_name | string | The plural of full_name: “BigQuery Tables”. Empty under the same condition as short_plural_name. |
| description | string | A sentence explaining the type, where there is one. Often empty. |
| platform | DataPlatformType | The platform this type belongs to — the warehouse, BI tool or orchestrator it comes from. Pair it with ListPlatformDefs to show that platform’s name.
A type you defined yourself belongs to no external platform, so it reports Coalesce Quality itself. |
| traits | Traits | What Coalesce Quality knows about entities of this type.
For a built-in type this is everything it knows. For a type you defined yourself it is the traits that can be declared on a custom type, each reported whether you set it or not; the traits Coalesce Quality works out on its own for built-in types are not reported for a custom type, so read those with a default. |
| type_id | int32 | The id of a type you defined yourself, and 0 for a built-in type. It is the same type_id that appears on your entities of this type, and the id you pass to synq.entities.custom.v1.TypesService to change the type or fetch its icon.
A non-zero value is how you tell your own types from the built-in ones. |
ExecutionTypeDef
(synq.entities.typedefs.v1.ExecutionTypeDef) ExecutionTypeDef describes one kind of run Coalesce Quality records against an entity — a dbt invocation, a warehouse query job, a detected schema change. Use it to name theexecution_type that execution and run endpoints return.
PlatformDef
(synq.entities.typedefs.v1.PlatformDef) PlatformDef describes one platform Coalesce Quality connects to — a warehouse, a BI tool, an orchestrator, a transformation framework. Use it to show a platform’s name rather than building one out of an enum value.Traits
(synq.entities.typedefs.v1.Traits) Traits are the facts Coalesce Quality knows about a kind of thing, beyond its name — whether it is a transformation model, whether it lives in a warehouse, whether you can put a monitor on it. They come back as maps rather than as named fields so that new traits reach you without regenerating your client. Look up the ones you care about by name and ignore the rest: if (def.traits.flags[“is_model”]) { … } Common flag names areis_model, is_source, is_dwh_table, is_dwh_view,
is_bi_like, is_monitorable and is_searchable. More are added over time, so
treat the map as open-ended.
A name missing from the map has no answer for this type. Read traits with a
default rather than assuming false, so your code keeps working against both an
older and a newer server:
isModel = def.traits.flags.get(“is_model”, false)
Traits.FlagsEntry
(synq.entities.typedefs.v1.Traits.FlagsEntry)Traits.StringsEntry
(synq.entities.typedefs.v1.Traits.StringsEntry)ListEntityTraitDefsRequest
(synq.entities.typedefs.v1.ListEntityTraitDefsRequest)ListEntityTraitDefsResponse
(synq.entities.typedefs.v1.ListEntityTraitDefsResponse)ListEntityTypeDefsRequest
(synq.entities.typedefs.v1.ListEntityTypeDefsRequest)ListEntityTypeDefsResponse
(synq.entities.typedefs.v1.ListEntityTypeDefsResponse)ListExecutionTypeDefsRequest
(synq.entities.typedefs.v1.ListExecutionTypeDefsRequest)ListExecutionTypeDefsResponse
(synq.entities.typedefs.v1.ListExecutionTypeDefsResponse)ListPlatformDefsRequest
(synq.entities.typedefs.v1.ListPlatformDefsRequest)ListPlatformDefsResponse
(synq.entities.typedefs.v1.ListPlatformDefsResponse)BatchGetEntitiesRequest
(synq.entities.entities.v1.BatchGetEntitiesRequest) BatchGetEntitiesRequest is the request message for the BatchGetEntities method.BatchGetEntitiesResponse
(synq.entities.entities.v1.BatchGetEntitiesResponse) BatchGetEntitiesResponse is the response message for the BatchGetEntities method.GetEntityRequest
(synq.entities.entities.v1.GetEntityRequest) GetEntityRequest is the request message for the GetEntity method.GetEntityResponse
(synq.entities.entities.v1.GetEntityResponse) GetEntityResponse is the response message for the GetEntity method.ListEntitiesRequest
(synq.entities.entities.v1.ListEntitiesRequest)ListEntitiesResponse
(synq.entities.entities.v1.ListEntitiesResponse)SearchEntitiesRequest
(synq.entities.entities.v1.SearchEntitiesRequest)SearchEntitiesResponse
(synq.entities.entities.v1.SearchEntitiesResponse)EntityTypeSearchFacet
(synq.entities.entities.v1.EntityTypeSearchFacet)SearchHit
(synq.entities.entities.v1.SearchHit)GetCoverageRequest
(synq.entities.checks.v1.GetCoverageRequest) GetCoverageRequest contains the parameters needed to retrieve check coverage for a specific entity.
A segmented monitor publishes one check entity per distinct value of its segmentation column, so a single monitor can stand behind hundreds of them and they can outnumber an asset’s other checks by an order of magnitude. They are left out by default so a coverage read stays readable, and asked for explicitly when the caller wants the individual segment ids — the same ids alerts, search results and the monitor-predictions read use.
Segment checks are only ever reported on the asset the monitor runs on: they are a slice of one monitor on one asset, and never propagate downstream. The parent monitor’s own check propagates as it always has, so downstream coverage is unchanged by this field. |
GetCoverageResponse
(synq.entities.checks.v1.GetCoverageResponse) GetCoverageResponse contains the check coverage information for the requested entity.GetCoverageResponse.ChecksSummary
(synq.entities.checks.v1.GetCoverageResponse.ChecksSummary) ChecksSummary provides a comprehensive overview of checks and their coverage.GetCoverageResponse.ChecksSummary.ColumnInformation
(synq.entities.checks.v1.GetCoverageResponse.ChecksSummary.ColumnInformation) ColumnInformation contains detailed information about a specific column.GetCoverageResponse.ColumnUpstream
(synq.entities.checks.v1.GetCoverageResponse.ColumnUpstream) ColumnUpstream represents an upstream column that a check is propagated from.GetCoverageResponse.ColumnUsage
(synq.entities.checks.v1.GetCoverageResponse.ColumnUsage) ColumnUsage contains statistics about how a column is used by downstream entities.GetCoverageResponse.PropagatedColumnCheck
(synq.entities.checks.v1.GetCoverageResponse.PropagatedColumnCheck) PropagatedColumnCheck represents a check that is propagated from an upstream column.GetCoverageResponse.PropagatedColumnChecks
(synq.entities.checks.v1.GetCoverageResponse.PropagatedColumnChecks) PropagatedColumnChecks contains a list of checks propagated from upstream columns.GetCoverageResponse.PropagatedTableCheck
(synq.entities.checks.v1.GetCoverageResponse.PropagatedTableCheck) PropagatedTableCheck represents a check that is propagated from an upstream table.CheckCategory
(synq.entities.checks.v1.CheckCategory) CheckCategory is the complete explicit category state for one check, carrying both dimensions. It overrides the categories the categorisation rules would otherwise compute for the check.DeleteCheckCategoriesRequest
(synq.entities.checks.v1.DeleteCheckCategoriesRequest)DeleteCheckCategoriesResponse
(synq.entities.checks.v1.DeleteCheckCategoriesResponse)ListCheckCategoriesRequest
(synq.entities.checks.v1.ListCheckCategoriesRequest)ListCheckCategoriesResponse
(synq.entities.checks.v1.ListCheckCategoriesResponse)UpsertCheckCategoriesRequest
(synq.entities.checks.v1.UpsertCheckCategoriesRequest)UpsertCheckCategoriesResponse
(synq.entities.checks.v1.UpsertCheckCategoriesResponse)CheckEntity
(synq.entities.checks.v1.CheckEntity)BatchGetRulesRequest
(synq.entities.checks.v2.BatchGetRulesRequest)BatchGetRulesResponse
(synq.entities.checks.v2.BatchGetRulesResponse)BatchGetRulesResponse.RulesEntry
(synq.entities.checks.v2.BatchGetRulesResponse.RulesEntry)DeleteRuleRequest
(synq.entities.checks.v2.DeleteRuleRequest)DeleteRuleResponse
(synq.entities.checks.v2.DeleteRuleResponse)GetRecategorisationStatusRequest
(synq.entities.checks.v2.GetRecategorisationStatusRequest)GetRecategorisationStatusResponse
(synq.entities.checks.v2.GetRecategorisationStatusResponse)ListRuleMatchesRequest
(synq.entities.checks.v2.ListRuleMatchesRequest)ListRuleMatchesResponse
(synq.entities.checks.v2.ListRuleMatchesResponse)ListRuleMatchesResponse.MatchesEntry
(synq.entities.checks.v2.ListRuleMatchesResponse.MatchesEntry)ListRulesRequest
(synq.entities.checks.v2.ListRulesRequest)ListRulesResponse
(synq.entities.checks.v2.ListRulesResponse)PreviewRuleRequest
(synq.entities.checks.v2.PreviewRuleRequest)PreviewRuleResponse
(synq.entities.checks.v2.PreviewRuleResponse)UpsertRuleRequest
(synq.entities.checks.v2.UpsertRuleRequest)UpsertRuleResponse
(synq.entities.checks.v2.UpsertRuleResponse)CheckCategories
(synq.entities.checks.v2.CheckCategories) The category state of a single check, on both dimensions.CheckCategoryDeletion
(synq.entities.checks.v2.CheckCategoryDeletion) One check whose explicit categories should be cleared, on both dimensions.CheckCategoryUpdate
(synq.entities.checks.v2.CheckCategoryUpdate) The categories to set explicitly on one check. Each dimension is updated independently, and presence is meaningful: omit a field to leave that dimension as it is, send an empty string to clear it so the check falls back to its producer-declared or rule-computed value, send a non-empty string to set or replace it.ComputedCategory
(synq.entities.checks.v2.ComputedCategory) What the workspace’s categorisation rules compute for a check on one dimension, whatever ends up in effect.ResolvedCategory
(synq.entities.checks.v2.ResolvedCategory) The category a check resolves to on one dimension, together with where that value came from. Readingsource matters as much as reading category: a value that came
from a rule changes when the rules change, while one set explicitly on the
check stays until someone clears it.
When
source is CATEGORY_SOURCE_RULE this is the value in effect and repeats category. When a category set explicitly on the check, or one its producer declared, is standing in front of the rules, this is what the check falls back to once that is cleared — the one part of the resolution a client cannot work out from the fields above. Absent when no rule matches. |
CategorisationRule
(synq.entities.checks.v2.CategorisationRule) A rule that assigns a category to every check it matches. Rules are how a workspace categorises at scale: they apply to the checks that exist today and to every check ingested afterwards, so nobody has to revisit individual checks as tools publish new ones. Rules resolve independently per dimension, and exactly one rule wins a check. Rules are tried in this order, and the first whose matcher matches assigns the category:- Scope first. Every workspace rule is tried before any platform-provided one, whatever their priorities are — so a workspace rule at priority 0 still beats a global rule at priority 1000. This is what makes your own rules an override of the defaults rather than a competitor to them.
- Then priority, highest number first.
priorityis a rank, not a position: 10 is tried before 1. - Then, among rules of equal scope and priority, most recently updated
first, and finally by id.
resolution_orderreports the resulting position, so you never have to reproduce this ordering yourself.
CheckSummary
(synq.entities.checks.v2.CheckSummary) Enough of a check to recognise it and act on it without a second call. Every field is output-only and reflects the check as the tool that produced it described it — a dbt test, a monitor, a reconciliation case. Nothing here is editable through the categorisation API; to change any of it, change it in the tool that publishes the check.
The leading segments are the producer’s own containers — a dbt project, a warehouse database and schema — so how many there are varies by platform. Drop the last element for the path to the check’s parent. |
| package | string | Package the check comes from, e.g. “dbt”, “dbt_utils”. Empty when the producer has no notion of packages. |
| kind | string | General kind of the check, e.g. “not_null”, “unique”, “row_count”. This is the attribute categorisation rules most often match on. |
| entity_type | EntityType | Entity type of the check itself, e.g. ENTITY_TYPE_DBT_TEST. |
| data_platform_type | DataPlatformType | Platform the check runs on, e.g. DATA_PLATFORM_TYPE_DBT. |
| is_platform_native | bool | Whether the check is native to its platform (a dbt test in a dbt project) rather than defined in Coalesce Quality. |
| description | string | Description of the check, where the producer supplied one. |
| checked_entity_ids | repeated string | The entities the check validates. Empty when the check’s targets could not be resolved. |
| annotations | map AnnotationsEntry | Free-form key/value metadata the tool that produced the check attached to it — a dbt test’s
meta entries, a SQLMesh audit’s, a custom label.
This is what a categorisation rule’s annotation_matches predicate is written against, so reading them is how you find out what there is to match on in your own workspace. |
CheckSummary.AnnotationsEntry
(synq.entities.checks.v2.CheckSummary.AnnotationsEntry)BatchGetCheckCategoriesRequest
(synq.entities.checks.v2.BatchGetCheckCategoriesRequest)BatchGetCheckCategoriesResponse
(synq.entities.checks.v2.BatchGetCheckCategoriesResponse)BatchGetCheckCategoriesResponse.CategoriesEntry
(synq.entities.checks.v2.BatchGetCheckCategoriesResponse.CategoriesEntry)DeleteCheckCategoriesRequest
(synq.entities.checks.v2.DeleteCheckCategoriesRequest)DeleteCheckCategoriesResponse
(synq.entities.checks.v2.DeleteCheckCategoriesResponse)ListCategoriesRequest
(synq.entities.checks.v2.ListCategoriesRequest)ListCategoriesResponse
(synq.entities.checks.v2.ListCategoriesResponse)ListCategorisationFiltersRequest
(synq.entities.checks.v2.ListCategorisationFiltersRequest)ListCategorisationFiltersResponse
(synq.entities.checks.v2.ListCategorisationFiltersResponse)ListCheckCategoriesRequest
(synq.entities.checks.v2.ListCheckCategoriesRequest)ListCheckCategoriesResponse
(synq.entities.checks.v2.ListCheckCategoriesResponse)UpsertCheckCategoriesRequest
(synq.entities.checks.v2.UpsertCheckCategoriesRequest)UpsertCheckCategoriesResponse
(synq.entities.checks.v2.UpsertCheckCategoriesResponse)RuleMatches
(synq.entities.checks.v2.RuleMatches) The checks one categorisation rule currently categorises — the state already applied to the workspace, not a projection of what a rule would do. The count is always exact. The sample is a readable excerpt, not the full set: to page through every check a rule categorised, call ListCheckCategories with the rule’s id.AnnotationMatch
(synq.entities.checks.v2.AnnotationMatch) A condition on one annotation of a check. Annotations are the key/value metadata a producer attaches to a check — a dbt test’smeta entries, for example — which makes them the way to
categorise by something only your own team knows, such as a domain or an
owning squad.
AnnotationValues
(synq.entities.checks.v2.AnnotationValues) A list of accepted annotation values.CheckAttributesMatcher
(synq.entities.checks.v2.CheckAttributesMatcher) Selects checks by their attributes. A check matches when every populated field matches it; an empty field places no constraint, so an entirely empty matcher matches every check in the workspace. This is the form to reach for first: it is what the rule editor writes, what reads back legibly, and what ListCategorisationFilters offers values for.CheckMatcher
(synq.entities.checks.v2.CheckMatcher) Which checks a categorisation rule applies to.
Variables available to the expression: platform, asset_type, package, kind, name, description (string) is_platform_native (bool) annotations (map<string, string>)
Platform and entity-type enum value names are available as string constants. For example: platform == PLATFORM_DBT && kind.startsWith(“not_null”) |
RecategorisationStatus
(synq.entities.checks.v2.RecategorisationStatus) Progress of the workspace-wide re-categorisation that follows a rule change. A rule change takes effect on newly ingested checks immediately. Checks that already exist are rewritten by a sweep, scheduled automatically whenever rules are created, updated or deleted; several edits in quick succession coalesce into one sweep. The sweep normally completes in seconds, so reading this is about confirming a change landed rather than waiting on it — until it finishes, some checks still carry the categories the previous rules gave them.CategorisationFacets
(synq.entities.checks.v2.CategorisationFacets) A set of check attributes. The same four dimensions select checks in three places — the predicate of a categorisation rule, the filter on a check listing, and the values a workspace actually has — so one message carries them everywhere and a value read from one can be passed straight to the next. An empty list places no constraint on its dimension. Within a list the values are alternatives; across lists they combine.CategoryInfo
(synq.entities.checks.v2.CategoryInfo) One category name in a workspace’s vocabulary, with how it is produced and how much of the workspace currently carries it. Category names are free-form workspace strings, not a fixed list. Offering this vocabulary in a picker rather than a text box is what keeps a workspace converging on one spelling per concept.DimensionSummary
(synq.entities.checks.v2.DimensionSummary) How much of a workspace one dimension covers.ListCodeRequest
(synq.entities.code.v1.ListCodeRequest) ListCodeRequest is the request message for the ListCode method.ListCodeResponse
(synq.entities.code.v1.ListCodeResponse) ListCodeResponse is the response message for the ListCode method.
Code is composed from several independent sources, so one of them being briefly unavailable degrades the response rather than failing it: the codes that were read are returned, and the source that was not is named here. Retry to pick up what is missing.
An empty
codes always means the entity has no code, never that a source was unavailable — a request that could read nothing at all returns an error rather than an empty response, because the two are otherwise indistinguishable. |
BatchSchemaMismatchesRequest
(synq.entities.schemas.v1.BatchSchemaMismatchesRequest) BatchGetSchemaMismatchesRequest is the request message for the BatchGetSchemaMismatches method.BatchSchemaMismatchesResponse
(synq.entities.schemas.v1.BatchSchemaMismatchesResponse) BatchGetSchemaMismatchesResponse is the response message for the BatchGetSchemaMismatches method.SchemaMismatch
(synq.entities.schemas.v1.SchemaMismatch) SchemaMismatch represents a schema drift between a definer entity (e.g., dbt model) and an origin entity (e.g., BigQuery table) where columns are defined but missing in origin.GetSchemaRequest
(synq.entities.schemas.v1.GetSchemaRequest) GetEntityRequest is the request message for the GetEntity method.GetSchemaResponse
(synq.entities.schemas.v1.GetSchemaResponse) GetEntityResponse is the response message for the GetEntity method.GetTableConstraintsRequest
(synq.entities.constraints.v1.GetTableConstraintsRequest)GetTableConstraintsResponse
(synq.entities.constraints.v1.GetTableConstraintsResponse)Type
(synq.entities.v1.Type) Custom entity type that is used to categorize custom entities.
It is the only name a custom type has, so keep it short enough to read as a caption rather than a description — “Kafka Topic”, not a sentence. |
| svg_icon | bytes | SVG icon of the custom entity type that is displayed to the user. |
| svg_icon_id | string | Coalesce Quality identifier used for CDN purposes, read-only. |
| created_at | Timestamp | Timestamp when the custom entity type was created. |
| updated_at | Timestamp | Timestamp when the custom entity type was last updated. |
| deleted_at | Timestamp | Timestamp when the custom entity type was deleted. If this is set, the custom entity type is considered deleted. |
| traits | TypeTraits | Behavioral traits declared on this type. Every entity of the type inherits them: declaring is_model, for example, makes its entities rank and behave as transformation models (canonical-entity ranking, monitorability, lineage), the same way a dbt model does. Unset means no declared traits (all false). |
AirflowDagIdentifier
(synq.entities.v1.AirflowDagIdentifier)AirflowTaskIdentifier
(synq.entities.v1.AirflowTaskIdentifier)AthenaTableIdentifier
(synq.entities.v1.AthenaTableIdentifier)BigqueryTableIdentifier
(synq.entities.v1.BigqueryTableIdentifier)ClickhouseTableIdentifier
(synq.entities.v1.ClickhouseTableIdentifier)CustomIdentifier
(synq.entities.v1.CustomIdentifier)DatabricksTableIdentifier
(synq.entities.v1.DatabricksTableIdentifier)DataproductIdentifier
(synq.entities.v1.DataproductIdentifier)DbtCloudNodeIdentifier
(synq.entities.v1.DbtCloudNodeIdentifier)DbtCoreNodeIdentifier
(synq.entities.v1.DbtCoreNodeIdentifier)FabricTableIdentifier
(synq.entities.v1.FabricTableIdentifier) Microsoft Fabric warehouse/lakehouse table identifier. Fabric is workspace-scoped with cross-database three-part [database].[schema].[table] T-SQL names.Identifier
(synq.entities.v1.Identifier) Identifier is a unique reference to an entity in Coalesce Quality system. Entity identifiers are designed to closely mimic identifiers used by data platforms and tools. To construct an identifier, you need to know the kind of the entity and the ids that you would normally use to identify it in the data platform or tool. For example, to identify a table in BigQuery, you would need to know the project, dataset, and table names. Every identifier the API RETURNS also carriesentity_id, the entity’s opaque
id. Read it when you just need to name the entity again — it is one string for
every platform, where the structured variants below only cover the platforms
that have one.
OUTPUT ONLY. On a request this field is ignored — the structured variant is what resolves. That is what lets you hand an identifier straight back unchanged, or edit its structured fields, without the two disagreeing about which entity you meant. To name an entity BY opaque id on a request, set the
synq_path variant to that id: it carries exactly this string, and it is also how an entity whose platform has no structured variant is named. |
| oneof id.dbt_core_node | DbtCoreNodeIdentifier | Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Core project |
| oneof id.dbt_cloud_node | DbtCloudNodeIdentifier | Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Cloud project |
| oneof id.bigquery_table | BigqueryTableIdentifier | BigQuery table identifier |
| oneof id.snowflake_table | SnowflakeTableIdentifier | Snowflake table identifier |
| oneof id.redshift_table | RedshiftTableIdentifier | Redshift table identifier |
| oneof id.postgres_table | PostgresTableIdentifier | Postgres table identifier |
| oneof id.mysql_table | MysqlTableIdentifier | Mysql table identifier |
| oneof id.clickhouse_table | ClickhouseTableIdentifier | Clickhouse table identifier |
| oneof id.airflow_dag | AirflowDagIdentifier | Airflow DAG identifier |
| oneof id.airflow_task | AirflowTaskIdentifier | Airflow task identifier within a given DAG |
| oneof id.custom | CustomIdentifier | Custom identifier to be used with all custom created entities |
| oneof id.dataproduct | DataproductIdentifier | Dataproduct identifier |
| oneof id.synq_path | SynqPathIdentifier | SynqPath identifier |
| oneof id.databricks_table | DatabricksTableIdentifier | Databricks table identifier |
| oneof id.trino_table | TrinoTableIdentifier | Trino table identifier |
| oneof id.sql_mesh_model | SqlMeshModelIdentifier | SQLMesh Model identifier |
| oneof id.sql_mesh_audit | SqlMeshAuditIdentifier | SQLMesh Audit identifier |
| oneof id.monitor | MonitorIdentifier | Monitor identifier |
| oneof id.mssql_table | MssqlTableIdentifier | SQL Server table identifier |
| oneof id.oracle_table | OracleTableIdentifier | Oracle table identifier |
| oneof id.athena_table | AthenaTableIdentifier | Amazon Athena (Glue) table identifier |
| oneof id.saved_view | SavedViewIdentifier | Saved view identifier |
| oneof id.fabric_table | FabricTableIdentifier | Microsoft Fabric table identifier |
MonitorIdentifier
(synq.entities.v1.MonitorIdentifier)MssqlTableIdentifier
(synq.entities.v1.MssqlTableIdentifier)MysqlTableIdentifier
(synq.entities.v1.MysqlTableIdentifier)OracleTableIdentifier
(synq.entities.v1.OracleTableIdentifier)OwnerIdentifier
(synq.entities.v1.OwnerIdentifier)PostgresTableIdentifier
(synq.entities.v1.PostgresTableIdentifier)RedshiftTableIdentifier
(synq.entities.v1.RedshiftTableIdentifier)SavedViewIdentifier
(synq.entities.v1.SavedViewIdentifier)SnowflakeTableIdentifier
(synq.entities.v1.SnowflakeTableIdentifier)SqlMeshAuditIdentifier
(synq.entities.v1.SqlMeshAuditIdentifier)SqlMeshModelIdentifier
(synq.entities.v1.SqlMeshModelIdentifier)SynqPathIdentifier
(synq.entities.v1.SynqPathIdentifier)TrinoTableIdentifier
(synq.entities.v1.TrinoTableIdentifier)Code
(synq.entities.v1.Code) Code represents a piece of code or configuration that can be processed by Coalesce Quality. This message is used to store and manage various types of code artifacts, such as SQL queries, Python scripts, dbt models, and other code configurations. Each code piece is associated with a specific entity that defines or owns it, and includes metadata about its type and state.
Use it to order the code an entity has when it has more than one piece: a warehouse table modelled by a transformation framework carries both the framework’s source and the warehouse’s own DDL, and the framework source is what a reader normally wants first. |
| has_execution_error | bool | True when the definer failed to produce this code the last time it ran — a model that did not compile, a routine whose body could not be read. The
content is then the last body that was captured, which may be stale or empty; execution_error says what went wrong. |
| execution_error | string | Message describing the failure has_execution_error reports. Empty when there is no failure, and may also be empty when the producer recorded a failure without a message. |
| is_truncated | bool | True when content holds only the first part of the file. Files above the ingestion size cap are stored as a prefix, and a client showing this code should say so rather than presenting the prefix as the whole body. original_size_bytes gives the untruncated size. |
| original_size_bytes | uint64 | Size in bytes of the code before any truncation. Read it together with is_truncated, which is what makes it meaningful: where content was cut, this is the size of the whole body, and a truncated body always has one. Zero where nothing measured the source, which is the normal case for code that is not read from a file and never happens for a truncated body. |
CodeSourceError
(synq.entities.v1.CodeSourceError) CodeSourceError reports one source that could not be read while the rest of the response was assembled. That source’s code is missing or incomplete incodes; every other source in the response is complete.
Retry the same request to pick the missing source up — these are transient
by nature. A request in which every source failed returns an error instead.
Entity
(synq.entities.v1.Entity) Entity is the base type for all entities in the system. Its always attached to a given client workspace and can be uniquely identified by its id.FolderRef
(synq.entities.v1.FolderRef) FolderRef is the human-friendly, structured address of a folder: the entity it hangs under (root_entity_id) plus the ordered folder names from that root
down to the folder (folders).
It is the stable way to name a folder across responses. Prefer it over the
opaque folder entity id when you want to log, display, or reconstruct a
location — the segments are the same names a user sees in the catalog, and
they survive changes to the underlying id encoding.
A FolderRef with an empty folders list names the root entity itself (a
top-level integration or container the hierarchy hangs from).
This type lives in synq.entities.v1 (rather than a folder-specific package)
so it can be shared by both the folders navigation API and the query API
without an import cycle.
ForeignKeyReference
(synq.entities.v1.ForeignKeyReference) ForeignKeyReference describes the target of a foreign key constraint.TableConstraint
(synq.entities.v1.TableConstraint) TableConstraint represents a single constraint or index on a database table.Schema
(synq.entities.v1.Schema) Schema represents a schema of a table like entitySchemaColumn
(synq.entities.v1.SchemaColumn)SchemaColumnField
(synq.entities.v1.SchemaColumnField)Annotation
(synq.entities.v1.Annotation) Annotations can be used to annotate any entity with a key:value pair. These annotations can be used for filtering and searching entities.
A value is something entities are filtered and searched by, not free-form metadata, so keep it to a label a person would pick out of a list. The limit is set to hold an identifier or a link the annotated system generated — truncating one of those produces a value that no longer resolves, and no longer matches the filter it exists for. Put prose in the entity description instead. |
TypeTraits
(synq.entities.v1.TypeTraits) TypeTraits are the behavioral traits a custom entity Type can declare. Declaring a trait makes every entity of that type behave platform-wide as if it carried the trait natively (e.g. is_model => transformation-model ranking, monitorability and lineage). Every field isoptional so an unset trait means “not declared, fall through
to the trait default” — distinct from an explicit false. An unset/nil message
means no declared traits (every trait at its default).
EntityChange
(synq.entities.v1.EntityChange) EntityChange represents a change detected in an entity within the system. It tracks modifications to entities like Git commits, SQL definitions, and database schemas.GitCommitChange
(synq.entities.v1.GitCommitChange) GitCommitChange represents a change detected in a Git repository.GitCommitChange.ChangeStatistics
(synq.entities.v1.GitCommitChange.ChangeStatistics) ChangeStatistics provides statistical summaries of the entire commit.GitCommitChange.ChangeStats
(synq.entities.v1.GitCommitChange.ChangeStats) ChangeStats contains statistics about changes made to a single file.GitCommitChange.ChangesByFileTypeEntry
(synq.entities.v1.GitCommitChange.ChangesByFileTypeEntry)GitCommitChange.DirectoryChangeSummary
(synq.entities.v1.GitCommitChange.DirectoryChangeSummary) DirectoryChangeSummary provides hierarchical directory-level statistics.GitCommitChange.FileChangeDistribution
(synq.entities.v1.GitCommitChange.FileChangeDistribution) FileChangeDistribution categorizes files by change magnitude.GitCommitChange.FileChangeStatsEntry
(synq.entities.v1.GitCommitChange.FileChangeStatsEntry)GitCommitChange.FileTypeChangeSummary
(synq.entities.v1.GitCommitChange.FileTypeChangeSummary) FileTypeChangeSummary aggregates changes by file type/extension.GitCommitChange.Signature
(synq.entities.v1.GitCommitChange.Signature) Signature contains information about the Git user who made the changes.GitCommitChange.TopChange
(synq.entities.v1.GitCommitChange.TopChange) TopChange represents one of the most significant file changes.GitCommitChange.TopFileChange
(synq.entities.v1.GitCommitChange.TopFileChange) TopFileChange represents a significant file change within a directory.SchemaChange
(synq.entities.v1.SchemaChange) SchemaChange represents a change detected in a database schema.SchemaColumnChange
(synq.entities.v1.SchemaColumnChange) SchemaColumnChange represents a specific change to a column in the schema.SchemaColumnChange.ColumnAdditionChangeType
(synq.entities.v1.SchemaColumnChange.ColumnAdditionChangeType) ColumnAdditionChangeType represents the addition of a new column to the schema.SchemaColumnChange.ColumnNativeTypeChangeType
(synq.entities.v1.SchemaColumnChange.ColumnNativeTypeChangeType) ColumnNativeTypeChangeType represents a change in a column’s data type.SchemaColumnChange.ColumnRemovalChangeType
(synq.entities.v1.SchemaColumnChange.ColumnRemovalChangeType) ColumnRemovalChangeType represents the removal of a column from the schema.SqlDefinitionChange
(synq.entities.v1.SqlDefinitionChange) SqlDefinitionChange represents a change detected in a SQL definition.BatchSqlDetailsRequest
(synq.entities.sql_insights.v1.BatchSqlDetailsRequest) BatchSqlDetailsRequest requests SQL details for a set of entities.BatchSqlDetailsResponse
(synq.entities.sql_insights.v1.BatchSqlDetailsResponse) BatchSqlDetailsResponse maps each requested synq path to its SQL details.BatchSqlDetailsResponse.SqlDetailsEntry
(synq.entities.sql_insights.v1.BatchSqlDetailsResponse.SqlDetailsEntry)ListSqlConstructsRequest
(synq.entities.sql_insights.v1.ListSqlConstructsRequest) ListSqlConstructsRequest has no fields: the result is scoped to the workspace of the authenticated request.ListSqlConstructsResponse
(synq.entities.sql_insights.v1.ListSqlConstructsResponse) ListSqlConstructsResponse reports how many of the workspace’s entities use each SQL construct.ListSqlConstructsResponse.SqlConstructCount
(synq.entities.sql_insights.v1.ListSqlConstructsResponse.SqlConstructCount) SqlConstructCount pairs a SQL construct with the number of entities in the workspace whose SQL uses it.SqlDetails
(synq.entities.sql_insights.v1.SqlDetails) SqlDetails describes the SQL used by a single entity.BatchOrchestrationRequest
(synq.entities.orchestration.v1.BatchOrchestrationRequest)BatchOrchestrationResponse
(synq.entities.orchestration.v1.BatchOrchestrationResponse)Orchestration
(synq.entities.orchestration.v1.Orchestration) Orchestration represents the orchestration relationships for a given entity. It shows both what the entity orchestrates (downstream) and what orchestrates it (upstream).OrchestrationGroup
(synq.entities.orchestration.v1.OrchestrationGroup) OrchestrationGroup represents different identities of the same logical concept. For example, a dbt model and the table it creates are different representations of the same entity, so they appear together in one group. An Airflow task typically has only one identity (the task itself).BatchResolveIdentifiersRequest
(synq.entities.resolve.v1.BatchResolveIdentifiersRequest)BatchResolveIdentifiersResponse
(synq.entities.resolve.v1.BatchResolveIdentifiersResponse)ResolvedIdentifier
(synq.entities.resolve.v1.ResolvedIdentifier) ResolvedIdentifier contains the resolution result for a single input identifier.IdentityRule
(synq.entities.identities.v2.IdentityRule) IdentityRule declares how entities are recognized as the same logical entity. A rule is evaluated against the current set of entities, so it automatically applies to entities that appear after the rule is created. Thekind field
selects the matching strategy and must be set to a supported rule type.
PrefixRewriteIdentityRule
(synq.entities.identities.v2.PrefixRewriteIdentityRule) PrefixRewriteIdentityRule treats two identifier prefixes as the same instance: any entity whose identifier begins with source_prefix is considered identical to the entity with the same identifier under target_prefix. The relationship is bidirectional.BatchGetIssuesStatusRequest
(synq.entities.status.v1.BatchGetIssuesStatusRequest) BatchGetIssuesStatusRequest is the request message for the BatchGetIssues method.BatchGetIssuesStatusResponse
(synq.entities.status.v1.BatchGetIssuesStatusResponse) BatchGetIssuesStatusResponse is the response message for the BatchGetIssues method.GetIssuesStatusRequest
(synq.entities.status.v1.GetIssuesStatusRequest) GetIssuesStatusRequest is the request message for the GetEntity method.GetIssuesStatusResponse
(synq.entities.status.v1.GetIssuesStatusResponse) GetIssuesStatusResponse is the response message for the GetEntity method.GetIssuesStatusResponse.IssuesSummary
(synq.entities.status.v1.GetIssuesStatusResponse.IssuesSummary)EntityIncident
(synq.entities.status.v1.EntityIncident)BatchGetIncidentsRequest
(synq.entities.status.v1.BatchGetIncidentsRequest) BatchGetIncidentsRequest is the request message for the BatchGetIssues method.BatchGetIncidentsResponse
(synq.entities.status.v1.BatchGetIncidentsResponse) BatchGetIncidentsResponse is the response message for the BatchGetIssues method.GetIncidentsRequest
(synq.entities.status.v1.GetIncidentsRequest) GetIncidentsRequest is the request message for the GetEntity method.GetIncidentsResponse
(synq.entities.status.v1.GetIncidentsResponse) GetIncidentsResponse is the response message for the GetEntity method.BatchChangeRequest
(synq.entities.changes.v1.BatchChangeRequest) BatchChangeRequest contains the parameters needed to retrieve multiple changes by their IDs.BatchChangeResponse
(synq.entities.changes.v1.BatchChangeResponse) BatchChangeResponse contains the requested changes mapped by their IDs.BatchChangeResponse.ChangesEntry
(synq.entities.changes.v1.BatchChangeResponse.ChangesEntry)ListRequest
(synq.entities.changes.v1.ListRequest) ListRequest contains the parameters needed to retrieve changes for a specific entity.ListResponse
(synq.entities.changes.v1.ListResponse) ListResponse contains the list of changes made to the requested entity.BatchGetEntityAnnotationsRequest
(synq.entities.annotations.v1.BatchGetEntityAnnotationsRequest) BatchGetEntityAnnotationsRequest is the request message for the BatchGetEntityAnnotations method.BatchGetEntityAnnotationsResponse
(synq.entities.annotations.v1.BatchGetEntityAnnotationsResponse) BatchGetEntityAnnotationsResponse is the response message for the BatchGetEntityAnnotations method.EntityAnnotations
(synq.entities.annotations.v1.EntityAnnotations) EntityAnnotations is the annotations one entity carries.
Read over the entity’s whole identity group rather than the one id asked for: a dbt model, the warehouse table it builds and a catalog entity virtualising the same table are one entity to a reader, and which of them an annotation was published against is a property of the producer, not of the thing being annotated. |
ListAnnotationsRequest
(synq.entities.annotations.v1.ListAnnotationsRequest) ListAnnotationsRequest is the request message for the ListAnnotations method.ListAnnotationsResponse
(synq.entities.annotations.v1.ListAnnotationsResponse) ListAnnotationsResponse is the response message for the ListAnnotations method.AnnotationCount
(synq.entities.annotations.v1.AnnotationCount) AnnotationCount represents the count of entities that have a specific annotation name-value pair. This is used for aggregating and reporting annotation statistics across entities.CllDetails
(synq.entities.lineage.v1.CllDetails)Column
(synq.entities.lineage.v1.Column) Column in a table-like asset (used in CLL mode).ColumnDependency
(synq.entities.lineage.v1.ColumnDependency) Indicates data flow between columns. Source columns are used to compute value of target columns.Lineage
(synq.entities.lineage.v1.Lineage) Lineage defines the lineage of table-like entities.LineageNode
(synq.entities.lineage.v1.LineageNode) Node in a lineage graph representing one or more entities (e.g. database table).NodeDependency
(synq.entities.lineage.v1.NodeDependency) Indicates data flow between nodes. Source nodes are used to compute value of target nodes.EntitiesStartPoint
(synq.entities.lineage.v1.EntitiesStartPoint)EntityColumnsStartPoint
(synq.entities.lineage.v1.EntityColumnsStartPoint)GetLineageRequest
(synq.entities.lineage.v1.GetLineageRequest)GetLineageResponse
(synq.entities.lineage.v1.GetLineageResponse)GetLineageStartPoint
(synq.entities.lineage.v1.GetLineageStartPoint) Possible starting points to get lineage from.Execution
(synq.entities.custom.v1.Execution)ExecutionExtra
(synq.entities.custom.v1.ExecutionExtra)LogEntry
(synq.entities.custom.v1.LogEntry)UpsertExecutionRequest
(synq.entities.custom.v1.UpsertExecutionRequest)UpsertExecutionResponse
(synq.entities.custom.v1.UpsertExecutionResponse)UpsertLogEntryRequest
(synq.entities.custom.v1.UpsertLogEntryRequest)UpsertLogEntryResponse
(synq.entities.custom.v1.UpsertLogEntryResponse)DeleteEntitiesGroupRequest
(synq.entities.custom.v1.DeleteEntitiesGroupRequest)DeleteEntitiesGroupResponse
(synq.entities.custom.v1.DeleteEntitiesGroupResponse)Group
(synq.entities.custom.v1.Group) Group is a collection of entities.ListEntityGroupsRequest
(synq.entities.custom.v1.ListEntityGroupsRequest)ListEntityGroupsResponse
(synq.entities.custom.v1.ListEntityGroupsResponse)UpsertEntitiesGroupRequest
(synq.entities.custom.v1.UpsertEntitiesGroupRequest)UpsertEntitiesGroupResponse
(synq.entities.custom.v1.UpsertEntitiesGroupResponse)DeleteEntityRequest
(synq.entities.custom.v1.DeleteEntityRequest) DeleteEntityRequest is the request message for the DeleteEntity method.DeleteEntityResponse
(synq.entities.custom.v1.DeleteEntityResponse) DeleteEntityResponse is the response message for the DeleteEntity method.ListEntitiesRequest
(synq.entities.custom.v1.ListEntitiesRequest)ListEntitiesResponse
(synq.entities.custom.v1.ListEntitiesResponse)UpsertEntityRequest
(synq.entities.custom.v1.UpsertEntityRequest) UpsertEntityRequest is the request message for the UpsertEntity method.UpsertEntityResponse
(synq.entities.custom.v1.UpsertEntityResponse) UpsertEntityResponse is the response message for the UpsertEntity method.DeleteTypeRequest
(synq.entities.custom.v1.DeleteTypeRequest)DeleteTypeResponse
(synq.entities.custom.v1.DeleteTypeResponse)ListTypesRequest
(synq.entities.custom.v1.ListTypesRequest)ListTypesResponse
(synq.entities.custom.v1.ListTypesResponse)UpsertTypeRequest
(synq.entities.custom.v1.UpsertTypeRequest)UpsertTypeResponse
(synq.entities.custom.v1.UpsertTypeResponse)DeleteRelationshipsRequest
(synq.entities.custom.v1.DeleteRelationshipsRequest)DeleteRelationshipsResponse
(synq.entities.custom.v1.DeleteRelationshipsResponse)ListRelationshipsRequest
(synq.entities.custom.v1.ListRelationshipsRequest)ListRelationshipsResponse
(synq.entities.custom.v1.ListRelationshipsResponse)Relationship
(synq.entities.custom.v1.Relationship)RelationshipWriteResult
(synq.entities.custom.v1.RelationshipWriteResult) RelationshipWriteResult reports what one requested relationship did to the stored graph.
An edge is held between the two entities the endpoints resolve to, not between the identifiers as written, and one entity accepts several spellings — a warehouse name that differs only in case or punctuation usually names the same table. So compare these two ids, rather than the identifiers you sent, to tell whether two relationships are the same edge. |
| outcome | RelationshipWriteOutcome | What the write did to that edge. |
UpsertRelationshipsRequest
(synq.entities.custom.v1.UpsertRelationshipsRequest)UpsertRelationshipsResponse
(synq.entities.custom.v1.UpsertRelationshipsResponse)CheckRelationship
(synq.entities.custom.v1.CheckRelationship)CheckRelationshipWriteResult
(synq.entities.custom.v1.CheckRelationshipWriteResult) CheckRelationshipWriteResult reports what one requested check relationship did to the stored graph.
The pair of entities the endpoints resolve to is what the relationship is held under, so compare these two ids rather than the identifiers you sent to tell whether two of them are the same relationship.
checked_columns is part of the payload, not of that pair: restating the same pair with a different column list replaces the stored one. |
| outcome | RelationshipWriteOutcome | What the write did to that relationship. |
DeleteCheckRelationshipsRequest
(synq.entities.custom.v1.DeleteCheckRelationshipsRequest)DeleteCheckRelationshipsResponse
(synq.entities.custom.v1.DeleteCheckRelationshipsResponse)ListCheckRelationshipsRequest
(synq.entities.custom.v1.ListCheckRelationshipsRequest)ListCheckRelationshipsResponse
(synq.entities.custom.v1.ListCheckRelationshipsResponse)UpsertCheckRelationshipsRequest
(synq.entities.custom.v1.UpsertCheckRelationshipsRequest)UpsertCheckRelationshipsResponse
(synq.entities.custom.v1.UpsertCheckRelationshipsResponse)DeleteEntityFeatureRequest
(synq.entities.custom.v1.DeleteEntityFeatureRequest)DeleteEntityFeatureResponse
(synq.entities.custom.v1.DeleteEntityFeatureResponse)Feature
(synq.entities.custom.v1.Feature)ListEntityFeaturesRequest
(synq.entities.custom.v1.ListEntityFeaturesRequest)ListEntityFeaturesResponse
(synq.entities.custom.v1.ListEntityFeaturesResponse)UpsertEntityFeatureRequest
(synq.entities.custom.v1.UpsertEntityFeatureRequest)UpsertEntityFeatureResponse
(synq.entities.custom.v1.UpsertEntityFeatureResponse)ColumnEdge
(synq.entities.custom.features.v1.ColumnEdge) ColumnEdge is one column of one upstream entity feeding one column of the entity this feature belongs to.ColumnLineage
(synq.entities.custom.features.v1.ColumnLineage) ColumnLineage declares column-level lineage flowing INTO a custom entity, for the cases SQL cannot express: an upstream that is itself a custom entity, or a component whose transformation is not written in SQL at all. Use it whenSqlDefinition does not fit — when there is no SQL to give at
all, or when you would rather state the result than have it derived. A
component whose transformation is written in Python, or a hand-maintained
mapping, has no SQL for a parser to read.
If the component DOES have SQL, prefer SqlDefinition: a name in it that is
not a database object — another custom entity, a queue, a service — is bound
to the entity it stands for with SqlDefinition.references, and the column
lineage is then derived from the SQL and stays correct as the SQL changes.
The declaration is complete and replaces the previous one whole: an edge
missing from a write is withdrawn, and deleting the feature withdraws all of
them. Only one ColumnLineage feature is allowed per entity, so re-writing it
under the same feature_id is how it is edited.
Declaring a column edge also declares the table-level edge it implies, so the
entity appears downstream of each upstream named here whether or not a
Relationship says so too. Column lineage is only ever shown along a
table-level edge, which is why the two travel together.
An entity that has BOTH this feature and a SqlDefinition is served from this
declaration in the SQL-lineage view — an explicit statement takes precedence
over lineage derived from SQL. Declare column lineage here only for what the
SQL cannot say, or state the entity’s whole column lineage here and treat this
as the authority for it.
Code
(synq.entities.custom.features.v1.Code) Code feature represents a code snippet associated with the entity. If support for code parsing and dependency extraction is needed use SqlDefinition.Schema
(synq.entities.custom.features.v1.Schema) Schema represents a schema of a table like entityGitFileReference
(synq.entities.custom.features.v1.GitFileReference) GitFileReference represents a reference to a file in a git repository.CheckCategory
(synq.entities.custom.features.v1.CheckCategory) Checks feature indicates that the entity is testing in some way different entity. To define the kind of the check use thekind field. The package field is optional.
It is used to categorize the entities which check other entities.
Presence is meaningful on update: omit the field to leave the current value untouched, send an empty string to clear it, send a non-empty string to set or replace it. Leaving it unset means the check is uncategorised for this dimension and the workspace’s categorisation rules decide it from package + kind; the
quality.check_category annotation on the entity is read as the lower-precedence fallback. |
| oneof _governance_category.governance_category | optional string | Explicit governance category of the check — what the check is for, the data-quality dimension a governance function tracks coverage against (e.g. “Completeness”, “Accuracy”, “Timeliness”).
Resolves independently of category and follows the same presence semantics: omitted leaves it unchanged, empty clears it, non-empty sets it. Unset means uncategorised for this dimension; the quality.governance_category annotation on the entity is the lower-precedence fallback. |
SqlDefinition
(synq.entities.custom.features.v1.SqlDefinition) SqlDefinition is a feature that allows to define lineage via SQL for a custom entity. Used to generate dependencies and other metadata. If parsed successfully, it will provide a code and column level lineage. Can be used to define simplified transformation of data which component performs using e.g.INSERT INTO foo SELECT * FROM bar.
Use it for the upstreams and downstreams a database cannot address: another custom entity, a queue, a service, an API. A name that IS a database object needs no binding — it resolves on its own.
The bindings are part of the definition and replace with it: a binding dropped from a later write is gone, and the lineage it produced is withdrawn. |
SqlTableReference
(synq.entities.custom.features.v1.SqlTableReference) SqlTableReference binds one name, as the SQL writes it, to the entity that name stands for.ImpactedDataproduct
(synq.entities.impact.v1.ImpactedDataproduct)ImpactedEntityGroup
(synq.entities.impact.v1.ImpactedEntityGroup) Multiple Entities which form logical group, e.g. dbt Model and it’s tableImpactedOwner
(synq.entities.impact.v1.ImpactedOwner)GetImpactRequest
(synq.entities.impact.v1.GetImpactRequest)GetImpactResponse
(synq.entities.impact.v1.GetImpactResponse)Execution
(synq.entities.executions.v1.Execution)ExecutionExtra
(synq.entities.executions.v1.ExecutionExtra)LogEntry
(synq.entities.executions.v1.LogEntry)UpsertExecutionRequest
(synq.entities.executions.v1.UpsertExecutionRequest)UpsertExecutionResponse
(synq.entities.executions.v1.UpsertExecutionResponse)UpsertLogEntryRequest
(synq.entities.executions.v1.UpsertLogEntryRequest)UpsertLogEntryResponse
(synq.entities.executions.v1.UpsertLogEntryResponse)BatchGetExecutionsRequest
(synq.entities.executions.v2.BatchGetExecutionsRequest) BatchGetExecutionsRequest requests specific executions by ID.BatchGetExecutionsResponse
(synq.entities.executions.v2.BatchGetExecutionsResponse) BatchGetExecutionsResponse contains the requested executions.BatchGetExecutionsResponse.ExecutionsEntry
(synq.entities.executions.v2.BatchGetExecutionsResponse.ExecutionsEntry)EntityExecution
(synq.entities.executions.v2.EntityExecution) EntityExecution represents a single execution event on an entity. This is a public representation of internal Run data, excluding sensitive metadata.ExecutionStatusCount
(synq.entities.executions.v2.ExecutionStatusCount) ExecutionStatusCount represents the count of executions by status.ExecutionTypeCount
(synq.entities.executions.v2.ExecutionTypeCount) ExecutionTypeCount represents the count of executions by type.GetExecutionsSummaryRequest
(synq.entities.executions.v2.GetExecutionsSummaryRequest) GetExecutionsSummaryRequest requests summary statistics for entities.GetExecutionsSummaryResponse
(synq.entities.executions.v2.GetExecutionsSummaryResponse) GetExecutionsSummaryResponse contains aggregated execution statistics.GetExecutionsSummaryResponse.LatestByEntityEntry
(synq.entities.executions.v2.GetExecutionsSummaryResponse.LatestByEntityEntry)GetLatestExecutionsRequest
(synq.entities.executions.v2.GetLatestExecutionsRequest) GetLatestExecutionsRequest requests the latest execution for each entity.GetLatestExecutionsResponse
(synq.entities.executions.v2.GetLatestExecutionsResponse) GetLatestExecutionsResponse contains the latest execution for each requested entity.GetLatestExecutionsResponse.LatestExecutionsEntry
(synq.entities.executions.v2.GetLatestExecutionsResponse.LatestExecutionsEntry)ListExecutionsRequest
(synq.entities.executions.v2.ListExecutionsRequest) ListExecutionsRequest specifies filters for listing executions.ListExecutionsResponse
(synq.entities.executions.v2.ListExecutionsResponse) ListExecutionsResponse contains the paginated list of executions.BatchDatabaseCoordinatesRequest
(synq.entities.coordinates.v1.BatchDatabaseCoordinatesRequest) BatchGetEntitiesRequest is the request message for the BatchGetEntities method.BatchDatabaseCoordinatesResponse
(synq.entities.coordinates.v1.BatchDatabaseCoordinatesResponse) BatchGetEntitiesResponse is the response message for the BatchGetEntities method.BatchIdsByCoordinatesRequest
(synq.entities.coordinates.v1.BatchIdsByCoordinatesRequest)BatchIdsByCoordinatesResponse
(synq.entities.coordinates.v1.BatchIdsByCoordinatesResponse)BatchIdsByCoordinatesResponse.MatchedCoordinates
(synq.entities.coordinates.v1.BatchIdsByCoordinatesResponse.MatchedCoordinates)DatabaseCoordinates
(synq.entities.coordinates.v1.DatabaseCoordinates)DatabaseContext
(synq.entities.coordinates.v1.DatabaseContext) DatabaseContext provides the default database execution context for resolving unqualified references (e.g. table names in SQL).BatchGetUsersRequest
(synq.users.v1.BatchGetUsersRequest)BatchGetUsersResponse
(synq.users.v1.BatchGetUsersResponse)DeleteUserAliasesRequest
(synq.users.v1.DeleteUserAliasesRequest)DeleteUserAliasesResponse
(synq.users.v1.DeleteUserAliasesResponse)GetByAliasRequest
(synq.users.v1.GetByAliasRequest)GetByAliasResponse
(synq.users.v1.GetByAliasResponse)GetByEmailRequest
(synq.users.v1.GetByEmailRequest)GetByEmailResponse
(synq.users.v1.GetByEmailResponse)GetUserAliasesRequest
(synq.users.v1.GetUserAliasesRequest)GetUserAliasesResponse
(synq.users.v1.GetUserAliasesResponse)GetUserIdentitiesRequest
(synq.users.v1.GetUserIdentitiesRequest)GetUserIdentitiesResponse
(synq.users.v1.GetUserIdentitiesResponse)ListUsersRequest
(synq.users.v1.ListUsersRequest)ListUsersResponse
(synq.users.v1.ListUsersResponse)UpsertUserAliasesRequest
(synq.users.v1.UpsertUserAliasesRequest)UpsertUserAliasesResponse
(synq.users.v1.UpsertUserAliasesResponse)EmailUser
(synq.users.v1.EmailUser)MsTeamsUser
(synq.users.v1.MsTeamsUser)SlackUser
(synq.users.v1.SlackUser)User
(synq.users.v1.User)UserAlias
(synq.users.v1.UserAlias)BatchGetEntityOverlaysRequest
(synq.overlays.v1.BatchGetEntityOverlaysRequest)
An
entity_id is opaque. Take one from any listing or search response, or from synq.entities.resolve.v1.IdentifierResolveService if what you hold is a warehouse table name or a model name, and pass it back unchanged. Do not build one yourself or parse one apart — the format carries no meaning you can rely on and is not part of this contract. |
BatchGetEntityOverlaysResponse
(synq.overlays.v1.BatchGetEntityOverlaysResponse)BatchGetOverlayMemberCountsRequest
(synq.overlays.v1.BatchGetOverlayMemberCountsRequest)
Opaque ids, as returned by
BatchGetEntityOverlays or by the listing calls of the service that defines the overlay. Data products and owners may be mixed freely in one request. |
BatchGetOverlayMemberCountsResponse
(synq.overlays.v1.BatchGetOverlayMemberCountsResponse)CoverageSelection
(synq.overlays.v1.CoverageSelection) CoverageSelection names the assets a coverage question is asked about. It is a candidate set, not a filter on overlays: nothing outside it is considered, and an asset inside it is reported whether anything claims it or not.with_type("dbt_model") asks about your models, in_folder(...) asks
about one part of the warehouse, and an empty candidate set is a valid
question with the answer zero.
Choose the candidate types deliberately — it is the difference between a
useful answer and an unreadable one. The two dimensions want different sets.
Data products group the things you monitor, so a product-coverage question
usually asks about tables, views and models; left unrestricted the answer is
mostly monitors, tests and recon cases, which belong to no product by design
and bury the assets you were looking for. Owner coverage is the opposite: a
check very often should have someone responsible for it, so include those
types when asking about owners.
So a governance audit is normally several narrow selections rather than one
broad one — which is also what GetCoverageSummary takes, one per bucket.
A selection resolving to more than 100,000 assets is rejected with
INVALID_ARGUMENT naming the limit; narrow it and ask again.
CoverageSummary
(synq.overlays.v1.CoverageSummary) CoverageSummary is one selection’s totals. The counts overlap rather than partition: an asset in a product and with an owner is inwith_dataproduct, in with_owner and in with_both. Only
with_neither is disjoint from the rest. So the uncovered counts are
total - with_dataproduct and total - with_owner, and “in a product but
unowned” is with_dataproduct - with_both.
EntityOverlays
(synq.overlays.v1.EntityOverlays) EntityOverlays is one entity and the overlays claiming it, one list per kind. Kinds are separate lists rather than one tagged list because what you can do with an id depends on its kind: an owner id reads through the owners service, a data-product id through the data-products service.
Empty when no owner claims the entity, and also when your credential may not read owners. Order is not significant and may change between calls; sort if you display them. |
| dataproduct_entity_ids | repeated string | Data products this entity belongs to. Read their names and definitions with
synq.dataproducts.v2.DataproductsService.
Empty when the entity is in no data product, and also when your credential may not read data products. Order is not significant and may change between calls; sort if you display them. |
GetCoverageSummaryRequest
(synq.overlays.v1.GetCoverageSummaryRequest)FRESHNESS_LIVE re-resolves every definition once for the whole request, not once per selection, so several selections cost little more than one. |
GetCoverageSummaryResponse
(synq.overlays.v1.GetCoverageSummaryResponse)
Absent under
FRESHNESS_LIVE, and absent when the workspace has no overlay of a readable kind, or none has been computed yet. |
ListEntityCoverageRequest
(synq.overlays.v1.ListEntityCoverageRequest)
A filter naming a kind your credential may not read is PERMISSION_DENIED rather than an empty list. |
| freshness | Freshness | Where the answer is computed from. Defaults to the recomputed membership. |
| pagination | Pagination | Pagination over the candidates matching
filter. |
ListEntityCoverageResponse
(synq.overlays.v1.ListEntityCoverageResponse)
The same message
BatchGetEntityOverlays returns: a row under COVERAGE_FILTER_WITHOUT_DATAPRODUCT has an empty dataproduct_entity_ids and may still name owners, which is how “owned but in no product” reads without a second call. |
| total_count | int64 | How many candidates match filter across every page. Independent of pagination — the number to show beside a list, not the length of it. |
| page_info | PageInfo | Pagination cursor for the next page. |
| rendered_resolver_ql | string | The candidate selection rendered back to canonical resolver query language, whichever form it was sent in. Useful to log what was actually asked, and to lift a query built with the structured form into one you can hand-edit.
Empty when the selection has no resolver-QL representation; the answer is unaffected. |
| oneof _members_computed_at.members_computed_at | optional Timestamp | When the recomputation behind this answer last ran to completion — the start of the most recent successful pass over the workspace’s overlays. Every overlay is recomputed on each pass, so this is the age of the whole answer rather than of any one overlay in it.
This is the number to alert on: it stops advancing as soon as the recomputation stops succeeding, whether or not any membership has changed.
Absent under FRESHNESS_LIVE (nothing was read from an index), and absent when no overlay of a readable kind exists in the workspace, or none has been computed yet (there is no membership to be stale). |
NamedSelection
(synq.overlays.v1.NamedSelection) NamedSelection is one candidate set and the label you want its row keyed by.OverlayMemberCount
(synq.overlays.v1.OverlayMemberCount)
Zero covers every case where there is nothing to count: an overlay with no members, an id that does not exist, and an id your credential may not read. If you need to tell those apart, read the overlay itself through the service that defines it. |
ScopeFilter
(synq.common.v1.ScopeFilter) ScopeFilter defines include/exclude rules for scoping data warehouse queries. Matching semantics:- If include is non-empty, a (database, schema, table) tuple must match at least one include rule.
- If exclude is non-empty, the tuple must NOT match any exclude rule.
- Exclude takes precedence over include (exclude wins).
- Empty/unset ScopeFilter means accept all.
ScopeRule
(synq.common.v1.ScopeRule) ScopeRule is a multi-level pattern for matching data warehouse objects. All non-empty fields must match for the rule to apply. Empty field means “match anything” at that level (wildcard). Patterns support glob syntax where * matches zero or more characters. Matching is case-insensitive.SqlExpression
(synq.common.v1.SqlExpression) SqlExpression carries a SQL string together with the placeholder tokens the caller must substitute before executing it. Emptyplaceholders means sql is byte-equal to what runs in the warehouse
and is safe to dispatch without further processing. When placeholders is
non-empty, every listed token appears literally in sql and must be replaced
(or otherwise interpreted) by the caller before execution.
SqlPlaceholder
(synq.common.v1.SqlPlaceholder) SqlPlaceholder describes one substitution slot in a SqlExpression.HistoryRequest
(synq.monitors.history.v1.HistoryRequest)HistoryResponse
(synq.monitors.history.v1.HistoryResponse)Prediction
(synq.monitors.history.v1.Prediction)MonitorInfoRequest
(synq.monitors.info.v1.MonitorInfoRequest)MonitorInfoResponse
(synq.monitors.info.v1.MonitorInfoResponse)ColumnSource
(synq.monitors.info.v1.ColumnSource)Condition
(synq.monitors.info.v1.Condition)CountRows
(synq.monitors.info.v1.CountRows)DatabaseFqn
(synq.monitors.info.v1.DatabaseFqn)ExpressionSource
(synq.monitors.info.v1.ExpressionSource)MetadataSource
(synq.monitors.info.v1.MetadataSource)Metric
(synq.monitors.info.v1.Metric)MonitorCategoryDistribution
(synq.monitors.info.v1.MonitorCategoryDistribution)MonitorFailedRows
(synq.monitors.info.v1.MonitorFailedRows)MonitorFieldStats
(synq.monitors.info.v1.MonitorFieldStats)MonitorFreshness
(synq.monitors.info.v1.MonitorFreshness)MonitorInfo
(synq.monitors.info.v1.MonitorInfo)MonitorValue
(synq.monitors.info.v1.MonitorValue)MonitorVolume
(synq.monitors.info.v1.MonitorVolume)Monitored
(synq.monitors.info.v1.Monitored)Partitioning
(synq.monitors.info.v1.Partitioning)Segmentation
(synq.monitors.info.v1.Segmentation)EntityMetricDataPoint
(synq.monitors.predictions.v1.EntityMetricDataPoint) Single observation of table-level metrics collected from the data warehouse.MonitorPrediction
(synq.monitors.predictions.v1.MonitorPrediction) Single prediction data point from the anomaly detection model.BatchGetLatestEntityMetricsRequest
(synq.monitors.predictions.v1.BatchGetLatestEntityMetricsRequest)BatchGetLatestEntityMetricsResponse
(synq.monitors.predictions.v1.BatchGetLatestEntityMetricsResponse)BatchGetLatestEntityMetricsResponse.LatestBySynqPathEntry
(synq.monitors.predictions.v1.BatchGetLatestEntityMetricsResponse.LatestBySynqPathEntry)GetEntityMetricsRequest
(synq.monitors.predictions.v1.GetEntityMetricsRequest)GetEntityMetricsResponse
(synq.monitors.predictions.v1.GetEntityMetricsResponse)GetMonitorPredictionsRequest
(synq.monitors.predictions.v1.GetMonitorPredictionsRequest)GetMonitorPredictionsResponse
(synq.monitors.predictions.v1.GetMonitorPredictionsResponse)BatchDeleteDeploymentRulesRequest
(synq.monitors.automated_monitors.v1.BatchDeleteDeploymentRulesRequest)BatchDeleteDeploymentRulesResponse
(synq.monitors.automated_monitors.v1.BatchDeleteDeploymentRulesResponse)BatchDeployDeploymentRulesRequest
(synq.monitors.automated_monitors.v1.BatchDeployDeploymentRulesRequest)BatchDeployDeploymentRulesResponse
(synq.monitors.automated_monitors.v1.BatchDeployDeploymentRulesResponse)BatchDeployDeploymentRulesResponse.DeployError
(synq.monitors.automated_monitors.v1.BatchDeployDeploymentRulesResponse.DeployError) Details of errors encountered during the deploy operation.BatchGetDeploymentRulesRequest
(synq.monitors.automated_monitors.v1.BatchGetDeploymentRulesRequest)BatchGetDeploymentRulesResponse
(synq.monitors.automated_monitors.v1.BatchGetDeploymentRulesResponse)BatchGetDeploymentRulesResponse.DeploymentRulesEntry
(synq.monitors.automated_monitors.v1.BatchGetDeploymentRulesResponse.DeploymentRulesEntry)BatchUpdateDeploymentRuleTitleRequest
(synq.monitors.automated_monitors.v1.BatchUpdateDeploymentRuleTitleRequest)BatchUpdateDeploymentRuleTitleResponse
(synq.monitors.automated_monitors.v1.BatchUpdateDeploymentRuleTitleResponse)BatchUpsertDeploymentRulesRequest
(synq.monitors.automated_monitors.v1.BatchUpsertDeploymentRulesRequest)BatchUpsertDeploymentRulesResponse
(synq.monitors.automated_monitors.v1.BatchUpsertDeploymentRulesResponse)BatchUpsertDeploymentRulesResponse.UpsertError
(synq.monitors.automated_monitors.v1.BatchUpsertDeploymentRulesResponse.UpsertError) Details of errors encountered during the upsert operation.ConfigsFilter
(synq.monitors.automated_monitors.v1.ConfigsFilter)DeleteDeploymentRuleRequest
(synq.monitors.automated_monitors.v1.DeleteDeploymentRuleRequest)DeleteDeploymentRuleResponse
(synq.monitors.automated_monitors.v1.DeleteDeploymentRuleResponse)DeployDeploymentRuleRequest
(synq.monitors.automated_monitors.v1.DeployDeploymentRuleRequest)DeployDeploymentRuleResponse
(synq.monitors.automated_monitors.v1.DeployDeploymentRuleResponse)
Computed inside this call, before the write, from the same overview the deploy acted on — so unlike an overview a caller fetches for itself, no decision window separates it from what happened. Optional and additive: an older server leaves it unset, and a caller must then answer from what it knew before the call rather than treat the absence as an error. |
GetDeployDeleteOverviewRequest
(synq.monitors.automated_monitors.v1.GetDeployDeleteOverviewRequest)GetDeployDeleteOverviewResponse
(synq.monitors.automated_monitors.v1.GetDeployDeleteOverviewResponse)GetDeployOverviewRequest
(synq.monitors.automated_monitors.v1.GetDeployOverviewRequest)GetDeployOverviewResponse
(synq.monitors.automated_monitors.v1.GetDeployOverviewResponse)ListDeploymentRulesForAssetRequest
(synq.monitors.automated_monitors.v1.ListDeploymentRulesForAssetRequest)ListDeploymentRulesForAssetResponse
(synq.monitors.automated_monitors.v1.ListDeploymentRulesForAssetResponse)ListDeploymentRulesRequest
(synq.monitors.automated_monitors.v1.ListDeploymentRulesRequest)ListDeploymentRulesResponse
(synq.monitors.automated_monitors.v1.ListDeploymentRulesResponse)UpdateDeploymentRuleTitleRequest
(synq.monitors.automated_monitors.v1.UpdateDeploymentRuleTitleRequest)UpsertDeploymentRuleRequest
(synq.monitors.automated_monitors.v1.UpsertDeploymentRuleRequest)UpsertDeploymentRuleResponse
(synq.monitors.automated_monitors.v1.UpsertDeploymentRuleResponse)AutomatedMonitorSettings
(synq.monitors.automated_monitors.v1.AutomatedMonitorSettings)CustomMonitorSettingsChange
(synq.monitors.automated_monitors.v1.CustomMonitorSettingsChange)EntitySelectionQuery
(synq.monitors.automated_monitors.v1.EntitySelectionQuery)EntitySelectionQuery.QueryPart
(synq.monitors.automated_monitors.v1.EntitySelectionQuery.QueryPart)ExclusiveQueryConfig
(synq.monitors.automated_monitors.v1.ExclusiveQueryConfig)ExclusiveStaticConfig
(synq.monitors.automated_monitors.v1.ExclusiveStaticConfig)MetricOption
(synq.monitors.automated_monitors.v1.MetricOption)MonitorSettingsChange
(synq.monitors.automated_monitors.v1.MonitorSettingsChange)MonitorsDeploymentOverview
(synq.monitors.automated_monitors.v1.MonitorsDeploymentOverview)
Ids only. Read their titles, owners and types with ListDeploymentRules(rule_ids). |
MonitorsDeploymentRule
(synq.monitors.automated_monitors.v1.MonitorsDeploymentRule)
On a write this field is only ever set, never unset: omitting it keeps the stored value, so a full-replace update cannot detach the rule from the config that owns it. An empty string is a real config id — the one a deploy that declares no namespace uses — so sending it attaches the rule to that config rather than clearing the field. No value detaches a rule; recreating it is the only way to hand it back to the app. |
MonitorsDeploymentRuleView
(synq.monitors.automated_monitors.v1.MonitorsDeploymentRuleView)ProductConfig
(synq.monitors.automated_monitors.v1.ProductConfig)ProductConfigSelfStrategy
(synq.monitors.automated_monitors.v1.ProductConfigSelfStrategy)ProductConfigSelfStrategyAll
(synq.monitors.automated_monitors.v1.ProductConfigSelfStrategyAll)ProductConfigSelfStrategySelection
(synq.monitors.automated_monitors.v1.ProductConfigSelfStrategySelection)ProductConfigUpstreamStrategy
(synq.monitors.automated_monitors.v1.ProductConfigUpstreamStrategy)ProductConfigUpstreamStrategyAll
(synq.monitors.automated_monitors.v1.ProductConfigUpstreamStrategyAll)ProductConfigUpstreamStrategySources
(synq.monitors.automated_monitors.v1.ProductConfigUpstreamStrategySources)QueryConfig
(synq.monitors.automated_monitors.v1.QueryConfig)SkippedAsset
(synq.monitors.automated_monitors.v1.SkippedAsset)
SKIPPED_HIGHER_PRIORITY_RULE another rule of higher precedence governs the asset, so this rule’s settings never reach it (see rule precedence) SKIPPED_NO_FRESHNESS_COLUMN_MATCH no column matched the freshness field SKIPPED_NO_FRESHNESS_FIELD_PATTERN no freshness field pattern is configured SKIPPED_NO_INTEGRATION the asset’s integration is gone SKIPPED_TEST_PREPARATION_FAILED the test could not be prepared SKIPPED_TEST_OWNED_BY_OTHER_RULE another rule already deploys that test
A string rather than an enum for compatibility: an enum would have to be introduced as a second field, since the producers already write these tokens. |
| reason_code | SkipReason | Machine-checkable form of
reason, so a client can branch on a value the compiler knows instead of string-matching a wire constant. reason remains authoritative and keeps being written unchanged; reason_code is SKIP_REASON_UNSPECIFIED for a reason this field does not yet cover — fall through to “skipped, reason unrecognised” rather than treat that as impossible, since the set of reasons is expected to grow. |
StaticConfig
(synq.monitors.automated_monitors.v1.StaticConfig)ModeAnomalyEngine
(synq.monitors.custom_monitors.v1.ModeAnomalyEngine)ModeFixedThresholds
(synq.monitors.custom_monitors.v1.ModeFixedThresholds)MonitorCategoryDistribution
(synq.monitors.custom_monitors.v1.MonitorCategoryDistribution)MonitorCustomNumeric
(synq.monitors.custom_monitors.v1.MonitorCustomNumeric)MonitorDefinition
(synq.monitors.custom_monitors.v1.MonitorDefinition)
On a write this field is only ever set, never unset: omitting it keeps the stored value, so a full-replace update cannot detach the monitor from the config that owns it. An empty string is a real config id — the one a deploy that declares no namespace uses — so sending it attaches the monitor to that config rather than clearing the field. No value detaches a monitor; recreating it is the only way to hand it back to the app. |
| source | Source | Source of the monitor. |
| timezone | string | none |
| oneof monitor.freshness | MonitorFreshness | none |
| oneof monitor.volume | MonitorVolume | none |
| oneof monitor.custom_numeric | MonitorCustomNumeric | none |
| oneof monitor.field_stats | MonitorFieldStats | none |
| oneof monitor.table_stats | MonitorTableStats | none |
| oneof monitor.category_distribution | MonitorCategoryDistribution | none |
| oneof mode.anomaly_engine | ModeAnomalyEngine | none |
| oneof mode.fixed_thresholds | ModeFixedThresholds | none |
| oneof schedule.daily | ScheduleDaily | none |
| oneof schedule.hourly | ScheduleHourly | none |
| oneof schedule.on_demand | ScheduleOnDemand | none |
| oneof _sql_source.sql_source | optional SqlSource | Optional SQL source. When set, the monitor queries against this SQL (wrapped as a CTE) instead of the table identified by monitored_id directly. Column references in time_partitioning, segmentation, and filter refer to columns in the SQL output. |
| oneof _category.category | optional string | Technical category this monitor declares for itself — what kind of check it is mechanically (e.g. “volume”, “freshness”). It is the monitor’s own declaration, not an administrative override: it is authoritative over any categorisation rule the workspace would otherwise apply, and is itself overridden by an explicit per-check category an admin sets.
The value is free-form and workspace-defined — whatever vocabulary your categorisation rules already use. It is displayed with underscores turned into spaces, so
snake_case reads well.
Send the whole monitor on every upsert: leaving this out is the same as sending it empty, and both mean the monitor declares no technical category. A monitor then falls back to its quality.check_category annotation, which remains accepted and keeps working — this field simply outranks it.
A segmented monitor’s segments take this value too. A segment is the same monitor sliced by a column value, so it cannot declare a category of its own. |
| oneof _governance_category.governance_category | optional string | Governance category this monitor declares for itself — what the check is for, the data quality dimension governance reports on (e.g. “timeliness”). Resolves independently of category — setting one never suppresses the other — and follows the same precedence, the same free-form vocabulary and the same full-state upsert rule described above. Its annotation fallback is quality.governance_category. |
| oneof _deleted_at.deleted_at | optional Timestamp | When the monitor was deleted. Unset while it is live, which is every monitor an ordinary listing reports; a deleted one comes back only from a listing that asked for it. Read-only, and ignored on writes. |
MonitorFieldStats
(synq.monitors.custom_monitors.v1.MonitorFieldStats)MonitorFreshness
(synq.monitors.custom_monitors.v1.MonitorFreshness)MonitorTableStats
(synq.monitors.custom_monitors.v1.MonitorTableStats)MonitorVolume
(synq.monitors.custom_monitors.v1.MonitorVolume)ScheduleDaily
(synq.monitors.custom_monitors.v1.ScheduleDaily)ScheduleHourly
(synq.monitors.custom_monitors.v1.ScheduleHourly)ScheduleOnDemand
(synq.monitors.custom_monitors.v1.ScheduleOnDemand)Segmentation
(synq.monitors.custom_monitors.v1.Segmentation)SqlSource
(synq.monitors.custom_monitors.v1.SqlSource) SQL query to use as the data source for a monitor instead of querying a table directly. The SQL is wrapped as a CTE, and the monitor’s metric query runs against its output. Column references (time partitioning, segmentation, filter) refer to columns in the SQL output.TimePartitioning
(synq.monitors.custom_monitors.v1.TimePartitioning)ValueList
(synq.monitors.custom_monitors.v1.ValueList)BatchCreateMonitorRequest
(synq.monitors.custom_monitors.v1.BatchCreateMonitorRequest)BatchCreateMonitorResponse
(synq.monitors.custom_monitors.v1.BatchCreateMonitorResponse)BatchCreateMonitorResponse.CreateError
(synq.monitors.custom_monitors.v1.BatchCreateMonitorResponse.CreateError) Details of a requested monitor that was not created.BatchDeleteMonitorRequest
(synq.monitors.custom_monitors.v1.BatchDeleteMonitorRequest)BatchDeleteMonitorResponse
(synq.monitors.custom_monitors.v1.BatchDeleteMonitorResponse)BatchUpdateMonitorModeRequest
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorModeRequest)BatchUpdateMonitorModeResponse
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorModeResponse)BatchUpdateMonitorRequest
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorRequest)BatchUpdateMonitorResponse
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorResponse)BatchUpdateMonitorResponse.UpdateError
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorResponse.UpdateError) Details of a requested monitor that was not updated.BatchUpdateMonitorSeverityRequest
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorSeverityRequest)BatchUpdateMonitorSeverityResponse
(synq.monitors.custom_monitors.v1.BatchUpdateMonitorSeverityResponse)ChangeOverview
(synq.monitors.custom_monitors.v1.ChangeOverview)ConfigChangesOverviewRequest
(synq.monitors.custom_monitors.v1.ConfigChangesOverviewRequest)ConfigChangesOverviewResponse
(synq.monitors.custom_monitors.v1.ConfigChangesOverviewResponse)ConfigsFilter
(synq.monitors.custom_monitors.v1.ConfigsFilter)ListConfigsMonitorsRequest
(synq.monitors.custom_monitors.v1.ListConfigsMonitorsRequest)ListConfigsMonitorsResponse
(synq.monitors.custom_monitors.v1.ListConfigsMonitorsResponse)ListMonitorsRequest
(synq.monitors.custom_monitors.v1.ListMonitorsRequest)
Turn it on to resolve a
monitor_ids entry that may name a deleted monitor. The id this endpoint returns is the only reference a caller holds after creating or listing a monitor, and the monitored asset needed to address the same monitor as an entity is on the stored row and nowhere else, so a listing that excluded it left the id unresolvable.
One entry per monitor either way: a monitor keeps a row per version, and the listing reports the latest one. deleted_at on each returned monitor is what tells a deleted monitor from a live one. |
| oneof _pagination.pagination | optional Pagination | Pagination |
ListMonitorsResponse
(synq.monitors.custom_monitors.v1.ListMonitorsResponse)BatchUpdateMonitorSegmentLabelsRequest
(synq.monitors.segments.v1.BatchUpdateMonitorSegmentLabelsRequest)BatchUpdateMonitorSegmentLabelsRequest.SegmentLabel
(synq.monitors.segments.v1.BatchUpdateMonitorSegmentLabelsRequest.SegmentLabel)BatchUpdateMonitorSegmentLabelsResponse
(synq.monitors.segments.v1.BatchUpdateMonitorSegmentLabelsResponse)BatchUpdateMonitorSegmentLabelsResponse.UpdateError
(synq.monitors.segments.v1.BatchUpdateMonitorSegmentLabelsResponse.UpdateError) Details of a requested segment that was not updated.ListMonitorSegmentsRequest
(synq.monitors.segments.v1.ListMonitorSegmentsRequest)ListMonitorSegmentsResponse
(synq.monitors.segments.v1.ListMonitorSegmentsResponse)MonitorSegment
(synq.monitors.segments.v1.MonitorSegment)ResolverQlArg
(synq.queries.v1.ResolverQlArg) One argument of a function, positional or keyword.ResolverQlEnumDomain
(synq.queries.v1.ResolverQlEnumDomain) The values one enum-typed argument accepts.
It exists because one domain is not fully enumerated: the entity types a workspace defines itself are a reserved band of the asset-type vocabulary rather than members of it, spelled
custom_type_<id>, and values today holds only the built-in half. A client that validates against values alone rejects a query this server compiles.
Keep honouring the pattern even once a domain enumerates more than it does today: it is what makes a value the list has not caught up with still acceptable. |
ResolverQlFunction
(synq.queries.v1.ResolverQlFunction) One function of the ResolverQL language, as this deployment compiles it.FolderOf
(synq.queries.v1.FolderOf) Resolves the folder(s) containing a set of assets, for use as the folder source ofInFolder — i.e. “everything in the same folder as these assets”.
Name the assets either the simple way (entity_ids, opaque asset ids) or with
a full input_query when they need to be computed (e.g. by name or type). Set
exactly one.
IdentitiesOf
(synq.queries.v1.IdentitiesOf) Resolves to the identities of whatever the inner query matches. The same real-world table is often described by several assets — a transformation model and the warehouse table it materialises into are one asset with several representations. Those representations form an identity group. IdentitiesOf takes the assets matched byinput_query and returns
their identity groups, so a selection made in one platform’s terms also
covers the equivalent assets in every other platform.
The typical use is subtraction: “this warehouse database, except whatever my
transformation tool already owns” is an EXCEPT whose removal clause is an
IdentitiesOf over the transformation models. Without it the two selections
overlap on every materialised table.
InFolder
(synq.queries.v1.InFolder) Resolves to entities located in one or more folders. Give the folders exactly one way (they are mutually exclusive; if more than one is set,folders wins, then folder_of, then path):
folders— the preferred, human-authorable form: name each folder by its root entity plus its ordered folder-name segments. No opaque ids required.folder_of— “the same folder(s) as these assets”: resolves the folder(s) containing the assets matched by an inner query, then matches everything in them. Lets you select siblings without naming a folder.path— legacy opaque folder identifiers. Kept for back-compat; preferfolders. Discover a folder’s structured address with the folders navigation API instead of hand-writing an id.
deep controls recursion (see its field comment).
InFolder lives here rather than in query_parts.proto because FolderOf nests a
full Query, which would make query_parts.proto import query.proto and form a
proto file import cycle.
Exception: when only the legacy
path source is set and deep is unset, it defaults to true (preserves the behaviour of queries authored before this flag existed). With folders or folder_of, unset means false (shallow). |
Query
(synq.queries.v1.Query) Query is a structured query that can be used to find entities in the system. It consists of multiple parts, each representing a different filter or sub-query. The parts are combined using the operand to form the final result:- AND (default): returns only entities matching ALL parts (intersection).
- OR: returns entities matching ANY part (union).
- EXCEPT: requires exactly 2 parts — returns entities from part[0] that are NOT in part[1].
- UPSTREAM: returns entities that are upstream (dependencies) of the entities matched by the parts.
- DOWNSTREAM: returns entities that are downstream (dependents) of the entities matched by the parts.
Query.QueryPart
(synq.queries.v1.Query.QueryPart)GenerateQueryRequest
(synq.queries.v1.GenerateQueryRequest)GenerateQueryResponse
(synq.queries.v1.GenerateQueryResponse)EntityIds
(synq.queries.v1.EntityIds) Selects exactly the entities you list, by theentity_id the API returned for
each of them.
This is the pin-these-specific-entities part of a query: the assets a user
ticked in a list, the results of a search you just ran, the entities another
API call handed you. Because you pass the ids back as they were given, you do
not need to know what kind of entity each one is, or how its address in the
source system is spelled.
identifier_list is the alternative, and the choice between them is about
what you have in hand:
entity_ids— you are holding ids the API gave you. Pass them through unchanged.identifier_list— you are naming entities by their address in the source system (a BigQuery project/dataset/table, a dbt model, a Looker explore), for example because a person or a config file wrote it down rather than an API call.
entity_ids. Selections are always
returned as identifier_list, whichever of the two you sent — one uniform
shape, so integrations built before entity_ids existed keep reading stored
queries unchanged. Your ids are not lost in the process: every returned
identifier carries its entity_id, so you can match each one back to what you
sent, and compare a saved selection against the one you are about to save. The
returned id is the entity’s canonical form, which can differ from an equivalent
spelling you sent for the same entity.
An id that matches nothing selects nothing, and is not an error — so a
saved query keeps working after one of the entities it names is deleted or
renamed, rather than failing every time it is read or resolved.
An empty list selects no entities, exactly as an empty
identifier_list does. Be deliberate about it, because it is not the same as leaving the part out: a part that selects nothing still counts, so it empties an AND, adds nothing to an OR, and removes nothing from an EXCEPT. If what you mean is “do not restrict on specific entities”, omit the part instead of sending it empty.
Ids may be up to 1024 characters — the same limit as Identifier.entity_id, where you read them from, so any id the API returned is accepted here. |
IdentifierList
(synq.queries.v1.IdentifierList) Resolves to entities matching any of the given identifiers.InDataPlatform
(synq.queries.v1.InDataPlatform) Resolves to all entities that belong to the given data platform.InDataproduct
(synq.queries.v1.InDataproduct) Resolves to all the assets that belong to the given data product.InDomain
(synq.queries.v1.InDomain) Resolves to all entities in the given data domain.Unsupported
(synq.queries.v1.Unsupported) Collects all the parts of the query that are currently unsupported in translation. These represent an internal structure that are not yet completely available on the API.WithAnnotation
(synq.queries.v1.WithAnnotation) Resolves to all entities that contain the annotation with at least one of the provided accepted values. In case of no given accepted values, all entities that carry the given annotation are returned.WithDataPlatformType
(synq.queries.v1.WithDataPlatformType)WithDefaultVisibleTypes
(synq.queries.v1.WithDefaultVisibleTypes) Resolves to every asset of a type the catalog shows by default — the “everything” starting set. Use it as the base of a subtraction, e.g. an EXCEPT query whose first part is WithDefaultVisibleTypes and whose second part is what to leave out. On its own it selects the whole catalog, so it is rarely useful as the only part of a query. “Default visible” excludes the supporting asset types the catalog hides unless asked for (columns, tests, and similar), so this is not literally every entity.WithNameSearch
(synq.queries.v1.WithNameSearch) Resolves to all entities matching the given name search.WithType
(synq.queries.v1.WithType) Resolves to all the entities that have the provided type, or carry one of the provided traits.
A trait is a property a type has, so
is_monitorable means “everything a monitor can run on” without listing the forty-odd types that satisfy it today. The list it stands for is worked out each time the selection runs, so a selection saved this way covers a new platform’s tables as soon as we support them, and you never have to revisit it.
Entities carrying any of the traits match. When types is also set the two narrow each other: the entity must be one of the named types AND carry one of the traits.
Accepted values, and what each one means, come from the selection-query grammar the API publishes (describe_resolver_ql, or the query editor’s reference). A name that is not in it selects nothing rather than being ignored, so a typo narrows the result to empty instead of widening it — check a trait against the grammar before storing a selection. In a query written as text this is with_type(traits="is_monitorable"), and there a name outside the grammar is rejected outright. |
WithType.Type
(synq.queries.v1.WithType.Type)DescribeResolverQlRequest
(synq.queries.v1.DescribeResolverQlRequest)DescribeResolverQlResponse
(synq.queries.v1.DescribeResolverQlResponse)DescribeResolverQlResponse.EnumDomainsEntry
(synq.queries.v1.DescribeResolverQlResponse.EnumDomainsEntry)ResolveQueryRequest
(synq.queries.v1.ResolveQueryRequest)ResolveQueryResponse
(synq.queries.v1.ResolveQueryResponse)TranslateResolverQlRequest
(synq.queries.v1.TranslateResolverQlRequest)TranslateResolverQlResponse
(synq.queries.v1.TranslateResolverQlResponse)PageInfo
(synq.v1.PageInfo)Pagination
(synq.v1.Pagination)ScopeAuthorization
(synq.v1.ScopeAuthorization)DatacheckResult
(synq.datachecks.v1.DatacheckResult) Result from a single datacheck execution.MonitorPrediction
(synq.datachecks.v1.MonitorPrediction)MonitorResult
(synq.datachecks.v1.MonitorResult) Result of a monitor execution.SqlTestResult
(synq.datachecks.v1.SqlTestResult) Result of a SQL test execution.TriggerDatachecksRequest
(synq.datachecks.v1.TriggerDatachecksRequest)TriggerDatachecksResponse
(synq.datachecks.v1.TriggerDatachecksResponse)BatchDeleteSqlTestDeploymentRulesRequest
(synq.datachecks.sqltests.v1.BatchDeleteSqlTestDeploymentRulesRequest)BatchDeleteSqlTestDeploymentRulesResponse
(synq.datachecks.sqltests.v1.BatchDeleteSqlTestDeploymentRulesResponse)BatchDeploySqlTestDeploymentRulesRequest
(synq.datachecks.sqltests.v1.BatchDeploySqlTestDeploymentRulesRequest)BatchDeploySqlTestDeploymentRulesResponse
(synq.datachecks.sqltests.v1.BatchDeploySqlTestDeploymentRulesResponse)BatchDeploySqlTestDeploymentRulesResponse.DeployError
(synq.datachecks.sqltests.v1.BatchDeploySqlTestDeploymentRulesResponse.DeployError)BatchGetSqlTestDeploymentRulesRequest
(synq.datachecks.sqltests.v1.BatchGetSqlTestDeploymentRulesRequest)BatchGetSqlTestDeploymentRulesResponse
(synq.datachecks.sqltests.v1.BatchGetSqlTestDeploymentRulesResponse)BatchGetSqlTestDeploymentRulesResponse.DeploymentRulesEntry
(synq.datachecks.sqltests.v1.BatchGetSqlTestDeploymentRulesResponse.DeploymentRulesEntry)DeleteSqlTestDeploymentRuleRequest
(synq.datachecks.sqltests.v1.DeleteSqlTestDeploymentRuleRequest)DeleteSqlTestDeploymentRuleResponse
(synq.datachecks.sqltests.v1.DeleteSqlTestDeploymentRuleResponse)DeploySqlTestDeploymentRuleRequest
(synq.datachecks.sqltests.v1.DeploySqlTestDeploymentRuleRequest)DeploySqlTestDeploymentRuleResponse
(synq.datachecks.sqltests.v1.DeploySqlTestDeploymentRuleResponse)GetSqlTestDeployDeleteOverviewRequest
(synq.datachecks.sqltests.v1.GetSqlTestDeployDeleteOverviewRequest)GetSqlTestDeployDeleteOverviewResponse
(synq.datachecks.sqltests.v1.GetSqlTestDeployDeleteOverviewResponse)GetSqlTestDeployOverviewRequest
(synq.datachecks.sqltests.v1.GetSqlTestDeployOverviewRequest)GetSqlTestDeployOverviewResponse
(synq.datachecks.sqltests.v1.GetSqlTestDeployOverviewResponse)ListSqlTestDeploymentRulesRequest
(synq.datachecks.sqltests.v1.ListSqlTestDeploymentRulesRequest)ListSqlTestDeploymentRulesResponse
(synq.datachecks.sqltests.v1.ListSqlTestDeploymentRulesResponse)AcceptedValuesTest
(synq.datachecks.sqltests.v1.AcceptedValuesTest)BusinessQueryTest
(synq.datachecks.sqltests.v1.BusinessQueryTest)
Format: a single SELECT (CTEs allowed); no semicolon. May read any tables the integration has access to. The engine wraps it as
WITH raw_query AS (<sql_query>) SELECT * FROM raw_query.
Use this when the failure set requires GROUP BY, JOINs, window functions, or other shape that a per-row predicate (BusinessRuleTest) cannot express.
Example: SELECT customer_id, SUM(amount) AS total FROM orders WHERE status = ‘paid’ GROUP BY customer_id HAVING SUM(amount) < 0
Template.identifier still anchors the test to a primary table for ownership, alerts, and UI grouping.
Placeholder: {{ table }} is substituted with the anchor table’s fully qualified name, quoted for the warehouse — the matched table when the test is deployed by a deployment rule, which is how one query covers every table the rule matches instead of being copied onto each of them. It is the only supported placeholder; any other {{ name }} token is rejected.
Note: this test does not expose a select_columns option. The author controls the SELECT shape directly in sql_query. |
BusinessRuleTest
(synq.datachecks.sqltests.v1.BusinessRuleTest)
Format: a single boolean expression — no SELECT, WITH, or semicolons. References columns on the anchor table. The engine executes it as
SELECT * FROM <anchor_table> WHERE <sql_expression>.
Example: “total_amount != subtotal + tax” reports rows where totals disagree. Use BusinessQueryTest for SELECT / GROUP BY / multi-table logic.
Placeholder: {{ table }} is substituted with the anchor table’s fully qualified name, quoted for the warehouse — the matched table when the test is deployed by a deployment rule. It is the only supported placeholder; any other {{ name }} token is rejected. It renders a table name, so it belongs where a table name goes — the FROM clause of a subquery of your own: “total > (SELECT max(total) FROM {{ table }})”.
It is not a column qualifier. The generated FROM clause carries no alias, and on BigQuery the fully qualified name is a single quoted identifier, so ”{{ table }}.id” does not resolve. To name the anchor’s columns, use BusinessQueryTest, where you write the FROM clause and can alias it. |
| select_columns | repeated string | Optional list of columns to include in the SELECT clause of the generated SQL. When empty (default), SELECT * is used — all columns are returned. |
CountDistinctTest
(synq.datachecks.sqltests.v1.CountDistinctTest) Note: this test does not expose aselect_columns option. The result is
an aggregate count, not a set of failure rows.
CountDuplicatesTest
(synq.datachecks.sqltests.v1.CountDuplicatesTest) Note: this test does not expose aselect_columns option. The result is
an aggregate count, not a set of failure rows.
EmptyTest
(synq.datachecks.sqltests.v1.EmptyTest)Evaluator
(synq.datachecks.sqltests.v1.Evaluator) Evaluator is a named condition attached to a SqlTest that produces an independent pass/fail signal. A single SqlTest may carry multiple evaluators, each targeting a different concern (nullability, value ranges, row counts, etc.).EvaluatorResult
(synq.datachecks.sqltests.v1.EvaluatorResult) EvaluatorResult is the execution outcome of a single Evaluator within a SqlTest run. Fields id/name/sql_expression/severity are a snapshot of the evaluator definition at execution time so historical results survive later edits to the test.FreshnessTest
(synq.datachecks.sqltests.v1.FreshnessTest)InputTable
(synq.datachecks.sqltests.v1.InputTable) InputTable is a table reference resolved from the SQL expression of a SqlTest.MaxValueTest
(synq.datachecks.sqltests.v1.MaxValueTest)MinMaxTest
(synq.datachecks.sqltests.v1.MinMaxTest)MinValueTest
(synq.datachecks.sqltests.v1.MinValueTest)NotNullTest
(synq.datachecks.sqltests.v1.NotNullTest)RejectedValuesTest
(synq.datachecks.sqltests.v1.RejectedValuesTest)RelationshipColumn
(synq.datachecks.sqltests.v1.RelationshipColumn)RelationshipReference
(synq.datachecks.sqltests.v1.RelationshipReference)RelationshipsTest
(synq.datachecks.sqltests.v1.RelationshipsTest)RelativeTimeTest
(synq.datachecks.sqltests.v1.RelativeTimeTest)SqlTest
(synq.datachecks.sqltests.v1.SqlTest) The SqlTest is a SQL test that is executed on a Coalesce Quality entity.
On a write this field is only ever set, never unset: omitting it keeps the stored value, so a full-replace update cannot detach the test from the config that owns it. An empty string is a real config id — the one a deploy that declares no namespace uses — so sending it attaches the test to that config rather than clearing the field. No value detaches a test; recreating it is the only way to hand it back to the app. |
| source | Source | none |
| timezone | string | IANA timezone name (e.g., “Europe/Prague”, “America/New_York”). Used to interpret the recurrence_rule in the given timezone. If empty, defaults to UTC. |
| evaluators | repeated Evaluator | Named evaluators attached to this test. Each evaluator has its own SQL boolean expression and severity. When present, the test outcome is determined by the worst severity among failing evaluators; tests with no evaluators fall back to the single-expression pass/fail rule. |
| input_tables | repeated InputTable | Tables referenced by the SQL expression, resolved at upsert time. |
| oneof _category.category | optional string | Technical category this test declares for itself — what kind of check it is mechanically (e.g. “nullness”, “uniqueness”). It is the test’s own declaration, not an administrative override: it is authoritative over any categorisation rule the workspace would otherwise apply, and is itself overridden by an explicit per-check category an admin sets.
The value is free-form and workspace-defined — whatever vocabulary your categorisation rules already use. It is displayed with underscores turned into spaces, so
snake_case reads well.
Send the whole test on every upsert: leaving this out is the same as sending it empty, and both mean the test declares no technical category. A test then falls back to its quality.check_category annotation, which remains accepted and keeps working — this field simply outranks it. |
| oneof _governance_category.governance_category | optional string | Governance category this test declares for itself — what the check is for, the data quality dimension governance reports on (e.g. “completeness”). Resolves independently of category — setting one never suppresses the other — and follows the same precedence, the same free-form vocabulary and the same full-state upsert rule described above. Its annotation fallback is quality.governance_category. |
| oneof _deployment_rule_id.deployment_rule_id | optional string | ID of the SqlTestDeploymentRule that deployed this test, when it was created by a deployment rule rather than authored directly. OUTPUT ONLY. A test with this set is rule-managed: direct edits through this API are rejected. |
SqlTestAudit
(synq.datachecks.sqltests.v1.SqlTestAudit)SqlValue
(synq.datachecks.sqltests.v1.SqlValue) Represents a value that can be either a literal (to be quoted in SQL) or a SQL expression (to be used as plain text).Template
(synq.datachecks.sqltests.v1.Template)UniqueTest
(synq.datachecks.sqltests.v1.UniqueTest) Note: this test does not expose aselect_columns option. The SELECT shape
is fixed by the aggregation (DISTINCT columns + duplicate count); failure
rows are the duplicate keys, not raw table rows.
RuleTest
(synq.datachecks.sqltests.v1.RuleTest) RuleTest is a SQL test template deployed by a SqlTestDeploymentRule onto every table or view the rule’s selection matches. It carries the same test kinds as SqlTest.template, but — unlike Template — has no anchor entity: the anchor is whichever table or view the rule matched, filled in separately for each deployed test.SqlTestDeploymentChange
(synq.datachecks.sqltests.v1.SqlTestDeploymentChange) SqlTestDeploymentChange describes one test’s planned or applied change for a single table or view within a SqlTestsDeploymentOverview.SqlTestDeploymentRule
(synq.datachecks.sqltests.v1.SqlTestDeploymentRule) SqlTestDeploymentRule dynamically deploys SQL test templates onto every table or view its selection matches, keeping them in sync as tables and columns change. Use it instead of authoring one SqlTest per table when the same set of checks should apply to many tables (e.g. “not_null(email) on every table that has an email column”).
On a write this field is only ever set, never unset: omitting it keeps the stored value, so a full-replace update cannot detach the rule from the config that owns it. An empty string is a real config id — the one a deploy that declares no namespace uses — so sending it attaches the rule to that config rather than clearing the field. No value detaches a rule; recreating it is the only way to hand it back to the app. |
SqlTestDeploymentRuleView
(synq.datachecks.sqltests.v1.SqlTestDeploymentRuleView) SqlTestDeploymentRuleView is a SqlTestDeploymentRule together with a summary of how many tests it currently has deployed.SqlTestsDeploymentOverview
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverview) SqlTestsDeploymentOverview previews or reports the effect of deploying a SqlTestDeploymentRule, per test rather than per table — a table with three tests deployed appears as three entries, one for each test.SqlTestsDeploymentOverview.SkippedTable
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverview.SkippedTable) SkippedTable names a table or view the rule’s selection matched, but that this deploy could not deploy tests onto.
SKIPPED_HIGHER_PRIORITY_RULE an exclusive rule has carved the table out SKIPPED_NO_INTEGRATION the table has no integration to run a test against SKIPPED_TEST_PREPARATION_FAILED the integration’s configuration is unavailable, or the table’s dialect cannot render the test
Clients branch on these, so treat the spellings as part of this API: adding a value is safe, renaming one is a breaking change. A value not listed here may appear — fall through to “skipped, reason unrecognised” rather than assume the set is closed.
reason_code is the checkable form. |
| reason_code | SqlTestSkipReason | Machine-checkable form of reason, so a client can branch on a value the compiler knows instead of string-matching a wire constant. reason remains authoritative and keeps being written unchanged; reason_code is SQL_TEST_SKIP_REASON_UNSPECIFIED for a reason this enum does not yet cover. |
SqlTestsDeploymentOverview.SkippedTest
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverview.SkippedTest) SkippedTest names one test the rule declares that this deploy left in place rather than deploying, because another rule already deployed it on that table. Rules covering the same table merge additively: each deploys the tests that are not there yet, and never touches a test another rule owns.
SKIPPED_TEST_OWNED_BY_OTHER_RULE another rule already deploys that test SKIPPED_MISSING_COLUMNS the table lacks a column the test reads SKIPPED_SCHEMA_UNAVAILABLE no schema is known for the table yet
Clients branch on these, so treat the spellings as part of this API: adding a value is safe, renaming one is a breaking change. A value not listed here may appear — fall through to “skipped, reason unrecognised” rather than assume the set is closed.
reason_code is the checkable form. |
| owner_rule_id | string | Id of the deployment rule that owns the test. Set only for SKIPPED_TEST_OWNED_BY_OTHER_RULE. |
| owner_rule_title | string | Title the owning rule carried when this plan was made. A title can be renamed — use owner_rule_id to look the rule up. |
| reason_code | SqlTestSkipReason | Machine-checkable form of reason. Same contract as SkippedTable.reason_code: reason stays authoritative, and this is SQL_TEST_SKIP_REASON_UNSPECIFIED for a reason this enum does not yet cover. |
| missing_columns | repeated string | Columns the test reads that the table does not have, spelled as the test declares them. Set for SKIPPED_MISSING_COLUMNS; empty for every other reason. A test is skipped whole — not_null[a, b] with only b missing lists just b but deploys neither column — so this names the gap, not the test’s column list. |
| referenced_table_path | string | Synq path of the referenced table, for a relationships test skipped because that table (rather than the table under test) lacks the column. Empty otherwise. |
SqlTestsDeploymentOverviewSummary
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverviewSummary) SqlTestsDeploymentOverviewSummary counts a SqlTestsDeploymentOverview, so a caller can render “40 tables, 78 tests, 2 skipped for a missing column” without walking lists that run to thousands of entries for a warehouse-wide rule. Every count is derived from the lists in the same message — it adds no information a reader of those lists could not compute, only the ability to skip reading them.SqlTestsDeploymentOverviewSummary.MissingColumnsHistogramEntry
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverviewSummary.MissingColumnsHistogramEntry)SqlTestsDeploymentOverviewSummary.SkippedByReasonEntry
(synq.datachecks.sqltests.v1.SqlTestsDeploymentOverviewSummary.SkippedByReasonEntry)SqlTestsExclusiveQueryConfig
(synq.datachecks.sqltests.v1.SqlTestsExclusiveQueryConfig) SqlTestsExclusiveQueryConfig selects tables and views by query and takes exclusive ownership of the match set: any table or view previously managed by this rule that no longer matches has its deployed tests removed on the next sync, with nokeep_removed_tests opt-out (a rule managing an exclusive set
never “keeps” a table that stopped matching).
SqlTestsExclusiveStaticConfig
(synq.datachecks.sqltests.v1.SqlTestsExclusiveStaticConfig) SqlTestsExclusiveStaticConfig marks a single fixed path as exclusively owned by this rule — used to carve out a per-table override from a broader query rule (see SqlTestDeploymentRule precedence).SqlTestsQueryConfig
(synq.datachecks.sqltests.v1.SqlTestsQueryConfig) SqlTestsQueryConfig selects tables and views by query, deploying every test intests onto each match. As the matched set changes over time (new tables,
dropped columns, …), a periodic sync keeps deployed tests in step.
SqlTestsStaticConfig
(synq.datachecks.sqltests.v1.SqlTestsStaticConfig) SqlTestsStaticConfig deploys tests onto a single, fixed table or view. Unlike the query-based configs, a static rule never resyncs against a changing match set — it pins one path.BatchDeleteSqlTestsRequest
(synq.datachecks.sqltests.v1.BatchDeleteSqlTestsRequest)BatchDeleteSqlTestsResponse
(synq.datachecks.sqltests.v1.BatchDeleteSqlTestsResponse)BatchDeleteSqlTestsResponse.DeleteError
(synq.datachecks.sqltests.v1.BatchDeleteSqlTestsResponse.DeleteError) Details of a single ID that could not be deleted.BatchGetSqlTestsRequest
(synq.datachecks.sqltests.v1.BatchGetSqlTestsRequest)BatchGetSqlTestsResponse
(synq.datachecks.sqltests.v1.BatchGetSqlTestsResponse)BatchGetSqlTestsResponse.SqlTestsEntry
(synq.datachecks.sqltests.v1.BatchGetSqlTestsResponse.SqlTestsEntry)BatchUpsertSqlTestsRequest
(synq.datachecks.sqltests.v1.BatchUpsertSqlTestsRequest)BatchUpsertSqlTestsResponse
(synq.datachecks.sqltests.v1.BatchUpsertSqlTestsResponse)BatchUpsertSqlTestsResponse.UpsertError
(synq.datachecks.sqltests.v1.BatchUpsertSqlTestsResponse.UpsertError) Details of errors encountered during the upsert operation.ConfigsFilter
(synq.datachecks.sqltests.v1.ConfigsFilter)GetSqlTestAuditRequest
(synq.datachecks.sqltests.v1.GetSqlTestAuditRequest)GetSqlTestAuditResponse
(synq.datachecks.sqltests.v1.GetSqlTestAuditResponse)ListSqlTestsRequest
(synq.datachecks.sqltests.v1.ListSqlTestsRequest)ListSqlTestsResponse
(synq.datachecks.sqltests.v1.ListSqlTestsResponse)AcceptedValuesTest
(synq.datachecks.testsuggestions.v1.AcceptedValuesTest)BusinessRuleTest
(synq.datachecks.testsuggestions.v1.BusinessRuleTest)CountDistinctTest
(synq.datachecks.testsuggestions.v1.CountDistinctTest)CountDuplicatesTest
(synq.datachecks.testsuggestions.v1.CountDuplicatesTest)EmptyTest
(synq.datachecks.testsuggestions.v1.EmptyTest)FreshnessTest
(synq.datachecks.testsuggestions.v1.FreshnessTest)MaxValueTest
(synq.datachecks.testsuggestions.v1.MaxValueTest)MinMaxTest
(synq.datachecks.testsuggestions.v1.MinMaxTest)MinValueTest
(synq.datachecks.testsuggestions.v1.MinValueTest)NotNullTest
(synq.datachecks.testsuggestions.v1.NotNullTest)RejectedValuesTest
(synq.datachecks.testsuggestions.v1.RejectedValuesTest)RelativeTimeTest
(synq.datachecks.testsuggestions.v1.RelativeTimeTest)RowCountTest
(synq.datachecks.testsuggestions.v1.RowCountTest)TestSuggestion
(synq.datachecks.testsuggestions.v1.TestSuggestion) Test types that can be suggestedUniqueTest
(synq.datachecks.testsuggestions.v1.UniqueTest)BatchAcceptTestSuggestionsRequest
(synq.datachecks.testsuggestions.v1.BatchAcceptTestSuggestionsRequest)BatchAcceptTestSuggestionsResponse
(synq.datachecks.testsuggestions.v1.BatchAcceptTestSuggestionsResponse)BatchCreateTestSuggestionsRequest
(synq.datachecks.testsuggestions.v1.BatchCreateTestSuggestionsRequest)BatchCreateTestSuggestionsResponse
(synq.datachecks.testsuggestions.v1.BatchCreateTestSuggestionsResponse)BatchGetTestSuggestionsForEntitiesRequest
(synq.datachecks.testsuggestions.v1.BatchGetTestSuggestionsForEntitiesRequest)BatchGetTestSuggestionsForEntitiesResponse
(synq.datachecks.testsuggestions.v1.BatchGetTestSuggestionsForEntitiesResponse)BatchRejectTestSuggestionsRequest
(synq.datachecks.testsuggestions.v1.BatchRejectTestSuggestionsRequest)BatchRejectTestSuggestionsResponse
(synq.datachecks.testsuggestions.v1.BatchRejectTestSuggestionsResponse)MSSQLCloudConf
(synq.integrations.v1.MSSQLCloudConf) Microsoft SQL Server / Azure SQL Database cloud-managed connection. SQL Server connections are scoped to a single database; create one integration per database. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.TrinoBasicAuth
(synq.integrations.v1.TrinoBasicAuth) Trino basic (username / password) authentication.TrinoCloudConf
(synq.integrations.v1.TrinoCloudConf) Trino / Presto cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.BatchGetIntegrationsRequest
(synq.integrations.v1.BatchGetIntegrationsRequest) Request to fetch multiple integrations by id.BatchGetIntegrationsResponse
(synq.integrations.v1.BatchGetIntegrationsResponse) Response with the requested integrations.BatchGetIntegrationsResponse.IntegrationsEntry
(synq.integrations.v1.BatchGetIntegrationsResponse.IntegrationsEntry)CreateIntegrationRequest
(synq.integrations.v1.CreateIntegrationRequest) Request to create an integration.CreateIntegrationResponse
(synq.integrations.v1.CreateIntegrationResponse) Response from creating an integration.DeleteIntegrationRequest
(synq.integrations.v1.DeleteIntegrationRequest) Request to delete an integration.DeleteIntegrationResponse
(synq.integrations.v1.DeleteIntegrationResponse) Response from deleting an integration.DisableIntegrationRequest
(synq.integrations.v1.DisableIntegrationRequest) Request to disable an integration.DisableIntegrationResponse
(synq.integrations.v1.DisableIntegrationResponse) Response from disabling an integration.EnableIntegrationRequest
(synq.integrations.v1.EnableIntegrationRequest) Request to enable an integration.EnableIntegrationResponse
(synq.integrations.v1.EnableIntegrationResponse) Response from enabling an integration.GetIntegrationHealthRequest
(synq.integrations.v1.GetIntegrationHealthRequest) Request for an integration’s health and run history.GetIntegrationHealthResponse
(synq.integrations.v1.GetIntegrationHealthResponse) Response with current health plus a page of recent runs.GetIntegrationRequest
(synq.integrations.v1.GetIntegrationRequest) Request to fetch a single integration.GetIntegrationResponse
(synq.integrations.v1.GetIntegrationResponse) Response with a single integration.IntegrationHealth
(synq.integrations.v1.IntegrationHealth) Current health summary for an integration.IntegrationRun
(synq.integrations.v1.IntegrationRun) A single observed run (refresh / sync) of an integration.ListIntegrationsRequest
(synq.integrations.v1.ListIntegrationsRequest) Request to list integrations.ListIntegrationsResponse
(synq.integrations.v1.ListIntegrationsResponse) Response with the workspace’s integrations.RefreshIntegrationRequest
(synq.integrations.v1.RefreshIntegrationRequest) Request to trigger an ad-hoc refresh.RefreshIntegrationResponse
(synq.integrations.v1.RefreshIntegrationResponse) Response from triggering a refresh.UpdateIntegrationRequest
(synq.integrations.v1.UpdateIntegrationRequest) Request to update an integration. Theconfig is replaced wholesale; title
is patch-style (omit to leave unchanged).
UpdateIntegrationResponse
(synq.integrations.v1.UpdateIntegrationResponse) Response from updating an integration.RedshiftCloudConf
(synq.integrations.v1.RedshiftCloudConf) Amazon Redshift cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.PostgresCloudConf
(synq.integrations.v1.PostgresCloudConf) PostgreSQL cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.BigQueryCloudConf
(synq.integrations.v1.BigQueryCloudConf) Google BigQuery cloud-managed connection. All fields are optional so an update can carry only what changes: omit a field to leave it unchanged, or send a new value to set it. Secret fields are write-only (masked, returned empty, on reads); omit to keep the stored value or send a new value to rotate it.DuckDBCloudConf
(synq.integrations.v1.DuckDBCloudConf) DuckDB (via MotherDuck) cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.OracleCloudConf
(synq.integrations.v1.OracleCloudConf) Oracle Database cloud-managed connection. Oracle connections are scoped to a Pluggable Database (PDB) via the service name. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.FabricCloudConf
(synq.integrations.v1.FabricCloudConf) Microsoft Fabric cloud-managed connection. Fabric is workspace-scoped with cross-database queries (like Snowflake or Databricks, not a single database): the workspace SQL analytics endpoint exposes every warehouse / lakehouse in the workspace as a database, queryable via three-part [database].[schema].[table] T-SQL names. Authentication is Microsoft Entra ID only — Fabric rejects SQL logins, so the headless identity is an Entra service principal (application id + secret), or a pre-acquired Entra access token. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.FabricServicePrincipalAuth
(synq.integrations.v1.FabricServicePrincipalAuth) Microsoft Fabric Entra service-principal credentials.SnowflakeCloudConf
(synq.integrations.v1.SnowflakeCloudConf) Snowflake cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.SnowflakeKeyPairAuth
(synq.integrations.v1.SnowflakeKeyPairAuth) Snowflake key-pair authentication.DbtCloudConf
(synq.integrations.v1.DbtCloudConf) dbt Cloud transformation orchestration cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.ClickhouseCloudConf
(synq.integrations.v1.ClickhouseCloudConf) ClickHouse cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.ClickhouseCloudConf.AdditionalParametersEntry
(synq.integrations.v1.ClickhouseCloudConf.AdditionalParametersEntry)ClickhouseClusterConf
(synq.integrations.v1.ClickhouseClusterConf) How metadata reads address ClickHouse system tables. System tables are per-node, so on a service with more than one replica a plain read reflects whichever replica answered rather than the whole warehouse.MySQLCloudConf
(synq.integrations.v1.MySQLCloudConf) MySQL cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.AthenaAccessKeyAuth
(synq.integrations.v1.AthenaAccessKeyAuth) Amazon Athena access-key authentication (long-lived IAM user credentials).AthenaCloudConf
(synq.integrations.v1.AthenaCloudConf) Amazon Athena cloud-managed connection. Athena is serverless — there is no host/port; the endpoint is implied by the AWS region. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.AthenaOutputs
(synq.integrations.v1.AthenaOutputs) Athena generated outputs.BigQueryOutputs
(synq.integrations.v1.BigQueryOutputs) BigQuery generated outputs.Capabilities
(synq.integrations.v1.Capabilities) Capabilities advertise which actions are valid for an integration in its current state, so a client can decide what to offer before calling. Capabilities are a hint computed from the integration’s type and current state; the server still enforces every action. Afalse flag means the
action would be rejected right now (unsupported for this type, or not
applicable in the current state — for example can_enable is false for an
already-enabled integration).
Integration
(synq.integrations.v1.Integration) Integration is a connection from Coalesce Quality to one of your data systems (a warehouse, database, or transformation tool).IntegrationConfig
(synq.integrations.v1.IntegrationConfig) IntegrationConfig is the connection configuration for an integration. Exactly one variant of theconfig oneof is set; the populated variant
determines the integration’s type. The config holds the connection details
(host, credentials, scope) for the connected system.
Secret fields (passwords, tokens, keys) follow write-only semantics: they are
masked (returned empty) on reads. See each *Conf message and
IntegrationsService.UpdateIntegration for preserve / rotate / clear rules.
IntegrationOutputs
(synq.integrations.v1.IntegrationOutputs) Generated, non-secret values produced by the server when an integration is created (for example a service-account email to grant access to, or a public key to install). Outputs are read-only and are never accepted on writes. At most one variant is set, matching the integration’s type. Types that produce no outputs leave this message empty.SnowflakeOutputs
(synq.integrations.v1.SnowflakeOutputs) Snowflake generated outputs.DatabricksCloudConf
(synq.integrations.v1.DatabricksCloudConf) Databricks cloud-managed connection. Fields are optional so an update can carry only what changes (omit = leave unchanged). Secret fields are write-only (masked on reads); omit to keep or send a new value to rotate.DatabricksOAuthM2M
(synq.integrations.v1.DatabricksOAuthM2M) Databricks OAuth 2.0 machine-to-machine (service principal) credentials.BatchGetIssuesRequest
(synq.issues.issues.v1.BatchGetIssuesRequest)BatchGetIssuesResponse
(synq.issues.issues.v1.BatchGetIssuesResponse)BatchGetIssuesResponse.IssuesEntry
(synq.issues.issues.v1.BatchGetIssuesResponse.IssuesEntry)Limit
(synq.issues.issues.v1.Limit)ListIssuesRequest
(synq.issues.issues.v1.ListIssuesRequest)ListIssuesResponse
(synq.issues.issues.v1.ListIssuesResponse)MarkExpectedRequest
(synq.issues.issues.v1.MarkExpectedRequest)MarkExpectedResponse
(synq.issues.issues.v1.MarkExpectedResponse)MarkFixedRequest
(synq.issues.issues.v1.MarkFixedRequest)MarkFixedResponse
(synq.issues.issues.v1.MarkFixedResponse)MarkInvestigatingRequest
(synq.issues.issues.v1.MarkInvestigatingRequest)MarkInvestigatingResponse
(synq.issues.issues.v1.MarkInvestigatingResponse)MarkNoActionNeededRequest
(synq.issues.issues.v1.MarkNoActionNeededRequest)MarkNoActionNeededResponse
(synq.issues.issues.v1.MarkNoActionNeededResponse)PostCommentRequest
(synq.issues.issues.v1.PostCommentRequest)PostCommentResponse
(synq.issues.issues.v1.PostCommentResponse)Issue
(synq.issues.issues.v1.Issue)IssueComment
(synq.issues.issues.v1.IssueComment)MonitorTriggerDetails
(synq.issues.issues.v1.MonitorTriggerDetails)Actor
(synq.issues.actor.v1.Actor) Actor identifies who performed a write — set by the calling client and carried end-to-end through the public API into stored audit trails (issue status changes, comments, incident assignments) and rendered downstream (e.g. Slack/MSTeams/email alerts). Producers should populate:name— human-readable display label, derived fromsynq.auth.iam.v1.IamResponse.user_namewhen available, falling back touser_email. Avoid generic placeholders (“MCP”, “API”); readers treat those as “no identity resolved” and fall back to impersonal copy.user— the strongest identifier the caller can prove. For human callers, setemailfromIamResponse.user_emailso the server can resolve the caller back to a workspace user.via— entry-point label for the channel through which the request arrived (e.g. VIA_MCP for the MCP server), regardless of who the caller is.
EmailUser
(synq.issues.actor.v1.EmailUser)PagerdutyUser
(synq.issues.actor.v1.PagerdutyUser)SlackUser
(synq.issues.actor.v1.SlackUser)BatchGetIssuesRequest
(synq.issues.v2.BatchGetIssuesRequest)BatchGetIssuesResponse
(synq.issues.v2.BatchGetIssuesResponse)BatchGetIssuesResponse.IssuesEntry
(synq.issues.v2.BatchGetIssuesResponse.IssuesEntry)ClearStatusRequest
(synq.issues.v2.ClearStatusRequest)ClearStatusResponse
(synq.issues.v2.ClearStatusResponse)DeleteCommentRequest
(synq.issues.v2.DeleteCommentRequest)DeleteCommentResponse
(synq.issues.v2.DeleteCommentResponse)InteractionFilter
(synq.issues.v2.InteractionFilter) Filter for matching issues where an actor interacted with them. If none of status_changes/comments/activities is set, all interaction types are matched.ListIssuesRequest
(synq.issues.v2.ListIssuesRequest)ListIssuesRequest.Sort
(synq.issues.v2.ListIssuesRequest.Sort)ListIssuesRequest.Time
(synq.issues.v2.ListIssuesRequest.Time)ListIssuesResponse
(synq.issues.v2.ListIssuesResponse)MarkExpectedRequest
(synq.issues.v2.MarkExpectedRequest)MarkExpectedResponse
(synq.issues.v2.MarkExpectedResponse)MarkFixedRequest
(synq.issues.v2.MarkFixedRequest)MarkFixedResponse
(synq.issues.v2.MarkFixedResponse)MarkInvestigatingRequest
(synq.issues.v2.MarkInvestigatingRequest)MarkInvestigatingResponse
(synq.issues.v2.MarkInvestigatingResponse)MarkNoActionNeededRequest
(synq.issues.v2.MarkNoActionNeededRequest)MarkNoActionNeededResponse
(synq.issues.v2.MarkNoActionNeededResponse)PostCommentRequest
(synq.issues.v2.PostCommentRequest)PostCommentResponse
(synq.issues.v2.PostCommentResponse)IssuesCommand
(synq.issues.commands.v1.IssuesCommand) Not to be used directly. Use the IssuesService instead when calling via API.Callback
(synq.webhooks.v1.Callback)Event
(synq.webhooks.v1.Event) A webhook event delivered to a customer-configured endpoint. Payload signing: every outgoing request is signed so the receiver can verify it originated from Coalesce Quality and was not tampered with or replayed. Two headers are sent on every delivery: X-Coalesce-Timestamp: <unix seconds when the delivery was signed> X-Coalesce-Signature: v1=<hex-encoded HMAC-SHA256> The signature is computed as: signed_payload = “{X-Coalesce-Timestamp}.” + <raw request body bytes> signature = hex( HMAC_SHA256(key = signing_secret, msg = signed_payload) ) where signing_secret is the per-integration secret shown (read-only) in the webhook integration settings. To verify:- Read X-Coalesce-Timestamp and the raw request body.
- Recompute the signature with your copy of the signing secret and compare it against the v1=… value in X-Coalesce-Signature using a constant-time comparison.
- Optionally reject deliveries whose timestamp is outside your tolerance window (retries reuse the original signing timestamp, so allow for the retry backoff window — up to ~30 minutes).
IncidentCancelled
(synq.webhooks.v1.IncidentCancelled)IncidentClosed
(synq.webhooks.v1.IncidentClosed)IncidentOpen
(synq.webhooks.v1.IncidentOpen)IncidentSummary
(synq.webhooks.v1.IncidentSummary)IssueClosed
(synq.webhooks.v1.IssueClosed)IssueCreated
(synq.webhooks.v1.IssueCreated)IssueStatusUpdated
(synq.webhooks.v1.IssueStatusUpdated)IssueSummary
(synq.webhooks.v1.IssueSummary)
Set only when an actor is known: it is populated on
issue_status_updated events and left unset for system-driven transitions with no human actor (e.g. a status implied by a monitor run). Consumers must treat it as optional and tolerate its absence.
Carries the strongest identity the caller proved — a Coalesce Quality email, Slack user id, or PagerDuty user id — alongside a display name. |
| owners | repeated Owner | Owners of the entities this issue is about.
Covers only the direct owners of the affected entities, not the owners of downstream entities. Empty when the affected entities have no owner assigned. Ordered as shown in the app. |
IssueSummary.IssueEntity
(synq.webhooks.v1.IssueSummary.IssueEntity)IssueSummary.Owner
(synq.webhooks.v1.IssueSummary.Owner) An owner (person or team) responsible for an entity, as assigned in Coalesce Quality (natively or synced from a catalog).IssueUpdated
(synq.webhooks.v1.IssueUpdated)Ping
(synq.webhooks.v1.Ping) Test event sent during a webhook setup.FlatEvent
(synq.webhooks.v1.FlatEvent) A webhook event in the flat format — an experimental, opt-in alternative toEvent that carries the same information in a flatter shape.
Instead of nesting the payload under a per-event-type field (issue_created,
issue_updated, incident_open, …), the payload is carried by a single
top-level field — issue, incident, or ping — and event_type says
which one is set and why. A receiver can then read a value the same way on
every event, e.g. issue.owners[0].title on any issue event, instead of a
different path per event type.
Exactly one of issue, incident, or ping is set, matching event_type.
Select this format per webhook integration; the default is the nested Event.
Payload signing is identical — see Event for the signature scheme.
Experimental: this shape may change while we gather feedback.
AssetSelectionQuery
(synq.dataproducts.v1.AssetSelectionQuery)AssetSelectionQuery.QueryPart
(synq.dataproducts.v1.AssetSelectionQuery.QueryPart)DataproductDefinition
(synq.dataproducts.v1.DataproductDefinition)DataproductDefinition.Part
(synq.dataproducts.v1.DataproductDefinition.Part)DeleteRequest
(synq.dataproducts.v1.DeleteRequest)DeleteResponse
(synq.dataproducts.v1.DeleteResponse)GetRequest
(synq.dataproducts.v1.GetRequest)GetResponse
(synq.dataproducts.v1.GetResponse)ListRequest
(synq.dataproducts.v1.ListRequest)ListResponse
(synq.dataproducts.v1.ListResponse)RemoveDefinitionPartRequest
(synq.dataproducts.v1.RemoveDefinitionPartRequest)RemoveDefinitionPartResponse
(synq.dataproducts.v1.RemoveDefinitionPartResponse)SetDefinitionRequest
(synq.dataproducts.v1.SetDefinitionRequest)SetDefinitionResponse
(synq.dataproducts.v1.SetDefinitionResponse)UpsertDefinitionPartRequest
(synq.dataproducts.v1.UpsertDefinitionPartRequest)UpsertDefinitionPartResponse
(synq.dataproducts.v1.UpsertDefinitionPartResponse)UpsertRequest
(synq.dataproducts.v1.UpsertRequest)UpsertResponse
(synq.dataproducts.v1.UpsertResponse)Dataproduct
(synq.dataproducts.v1.Dataproduct)DataproductDefinition
(synq.dataproducts.v2.DataproductDefinition) The membership of a data product: which assets belong to it. A definition is an ordered list of parts; an asset is a member if it matches ANY part (the parts are OR’d together). A data product is a LEAF in the reference graph: its membership is defined only by asset-level predicates, static asset ids and lineage of those — never by referencing another data product or domain. Thein_dataproduct /
in_domain query operands are therefore rejected anywhere in a data product
definition (see DataproductQuery). This keeps membership resolution finite:
data products can never take part in a reference cycle.
DataproductDefinition.Part
(synq.dataproducts.v2.DataproductDefinition.Part) A single piece of a data product definition: either a pinned asset or a selection query.DataproductQuery
(synq.dataproducts.v2.DataproductQuery) The selection query behind a data product part, expressed for the public API. On write, provide the query in ONE of two forms:public_query— a structured query (the same shape used elsewhere for asset selection), convenient to build from a filter UI; orresolver_ql— the resolver query language, a compact text form that is the canonical way to author selections as code. When both are set,resolver_qlwins. The server compiles the query and stores it canonically; the raw text is not preserved verbatim.
rendered_resolver_ql (the stored query rendered
back to canonical resolver query language) and, best-effort, public_query
(the structured representation). resolver_ql is not echoed back — read
rendered_resolver_ql.
Leaf rule: a data product may not reference another data product or domain.
The in_dataproduct, in_domain and unsupported operands are rejected at
the top level here (CEL) and, for nested sub-queries, by a server-side walk.
BatchGetRequest
(synq.dataproducts.v2.BatchGetRequest)BatchGetResponse
(synq.dataproducts.v2.BatchGetResponse)BatchGetResponse.DataproductsEntry
(synq.dataproducts.v2.BatchGetResponse.DataproductsEntry)DeleteRequest
(synq.dataproducts.v2.DeleteRequest)DeleteResponse
(synq.dataproducts.v2.DeleteResponse)ListMembersRequest
(synq.dataproducts.v2.ListMembersRequest)ListMembersResponse
(synq.dataproducts.v2.ListMembersResponse)ListRequest
(synq.dataproducts.v2.ListRequest)ListResponse
(synq.dataproducts.v2.ListResponse)RemoveDefinitionPartRequest
(synq.dataproducts.v2.RemoveDefinitionPartRequest)RemoveDefinitionPartResponse
(synq.dataproducts.v2.RemoveDefinitionPartResponse)SetDefinitionRequest
(synq.dataproducts.v2.SetDefinitionRequest)SetDefinitionResponse
(synq.dataproducts.v2.SetDefinitionResponse)UpsertDefinitionPartRequest
(synq.dataproducts.v2.UpsertDefinitionPartRequest)UpsertDefinitionPartResponse
(synq.dataproducts.v2.UpsertDefinitionPartResponse)UpsertRequest
(synq.dataproducts.v2.UpsertRequest)UpsertResponse
(synq.dataproducts.v2.UpsertResponse)Dataproduct
(synq.dataproducts.v2.Dataproduct) A data product: a named, owned grouping of data assets that share a purpose, with a membership definition, a priority and an optional folder.FixedQuantumGrid
(synq.schedule.v1.FixedQuantumGrid) FixedQuantumGrid snaps onto a fixed-size grid anchored at the Unix epoch (1970-01-01T00:00:00Z): [epoch, epoch+quantum, epoch+2*quantum, …].IntegrationAnchorGrid
(synq.schedule.v1.IntegrationAnchorGrid) IntegrationAnchorGrid snaps onto the shared, stable grid an integration’s periodic warehouse scrape already fires on. Aligning to it lets a run reuse the same warehouse wake as the scrape. The integration is resolved in the caller’s own workspace (taken from the authenticated identity, never from the request), and the caller must be authorized to read it — a token without integration read access is rejected.PreviewScheduleParams
(synq.schedule.v1.PreviewScheduleParams) Parameters for evaluating a single schedule.PreviewScheduleResult
(synq.schedule.v1.PreviewScheduleResult) Result for a single schedule evaluation.PreviewSchedulesRequest
(synq.schedule.v1.PreviewSchedulesRequest)PreviewSchedulesResponse
(synq.schedule.v1.PreviewSchedulesResponse)ScheduleSnap
(synq.schedule.v1.ScheduleSnap) ScheduleSnap maps each schedule occurrence onto a grid so runs line up with activity that is already happening, avoiding a separate warehouse resume. Pick one grid source and, optionally, how far an occurrence may move.SnapInfo
(synq.schedule.v1.SnapInfo) SnapInfo records, for one occurrence, whether snapping moved it onto the grid.CronSchedule
(synq.schedule.v1.CronSchedule) CronSchedule uses standard cron expression syntax.ICalSchedule
(synq.schedule.v1.ICalSchedule) ICalSchedule uses RFC 5545 RRULE recurrence rules.Schedule
(synq.schedule.v1.Schedule) Schedule defines a recurring schedule with timezone context.Owner
(synq.owners.v1.Owner) An owner: a named responsible party (a team or a person) that data assets can be assigned to, together with the notification channels alerts about those assets are delivered to. Assets are attached to an owner through Ownerships (see OwnershipsService), so an owner on its own routes nothing until at least one ownership assigns it some assets.AlertConfig
(synq.owners.v1.AlertConfig) How alerts fire for the assets an ownership covers. Deliberately mirrors the settings on the public alerts API (synq.alerts.v1) so alerting behaviour
reads the same across SYNQ.
Ownership
(synq.owners.v1.Ownership) An ownership assigns a set of data assets to an owner and configures the alerts routed to that owner about those assets. In the app this is the owner’s “Owned assets”. One owner can hold many ownerships; deleting the owner deletes all of its ownerships.OwnershipQuery
(synq.owners.v1.OwnershipQuery) A named asset selection behind an ownership, expressed for the public API. Uses the same write/read bridge as saved views and data products. On write, provide the query in ONE of two forms:public_query— a structured query (the same shape used elsewhere for asset selection), convenient to build from a filter UI; orresolver_ql— the resolver query language, a compact text form that is the canonical way to author selections as code. When both are set,resolver_qlwins. The server compiles and stores the query canonically; the raw text is not preserved verbatim.
rendered_resolver_ql (the stored query rendered
back to canonical resolver query language) and, best-effort, public_query
(the structured representation). resolver_ql is not echoed back — read
rendered_resolver_ql.
OwnershipSelection
(synq.owners.v1.OwnershipSelection) The set of assets an ownership covers.BatchGetOwnersRequest
(synq.owners.v1.BatchGetOwnersRequest)BatchGetOwnersResponse
(synq.owners.v1.BatchGetOwnersResponse)BatchGetOwnersResponse.OwnersEntry
(synq.owners.v1.BatchGetOwnersResponse.OwnersEntry)BatchGetOwnershipsRequest
(synq.owners.v1.BatchGetOwnershipsRequest)BatchGetOwnershipsResponse
(synq.owners.v1.BatchGetOwnershipsResponse)BatchGetOwnershipsResponse.OwnershipsEntry
(synq.owners.v1.BatchGetOwnershipsResponse.OwnershipsEntry)ContactList
(synq.owners.v1.ContactList) A wrapper giving the contact set explicit presence on write, so a partial update can distinguish “replace the contacts” (present, possibly empty) from “leave contacts unchanged” (absent).DeleteOwnerRequest
(synq.owners.v1.DeleteOwnerRequest)DeleteOwnerResponse
(synq.owners.v1.DeleteOwnerResponse)DeleteOwnershipRequest
(synq.owners.v1.DeleteOwnershipRequest)DeleteOwnershipResponse
(synq.owners.v1.DeleteOwnershipResponse)ListOwnersRequest
(synq.owners.v1.ListOwnersRequest)ListOwnersResponse
(synq.owners.v1.ListOwnersResponse)ListOwnershipsRequest
(synq.owners.v1.ListOwnershipsRequest)ListOwnershipsResponse
(synq.owners.v1.ListOwnershipsResponse)UpsertOwnerRequest
(synq.owners.v1.UpsertOwnerRequest)UpsertOwnerResponse
(synq.owners.v1.UpsertOwnerResponse)UpsertOwnershipRequest
(synq.owners.v1.UpsertOwnershipRequest)UpsertOwnershipResponse
(synq.owners.v1.UpsertOwnershipResponse)Contact
(synq.owners.v1.Contact) A notification channel attached to an owner. An owner can hold several contacts of different kinds; when an owner’s ownership fires an alert, the notification is delivered to every one of the owner’s contacts.EmailContact
(synq.owners.v1.EmailContact) Deliver notifications by email to a fixed list of recipients.MsTeamsContact
(synq.owners.v1.MsTeamsContact) Deliver notifications to a Microsoft Teams channel, optionally @-mentioning members.MsTeamsMemberMention
(synq.owners.v1.MsTeamsMemberMention) An @-mention of an individual Microsoft Teams member.MsTeamsMention
(synq.owners.v1.MsTeamsMention) A single @-mention in a Microsoft Teams notification.SlackChannelContact
(synq.owners.v1.SlackChannelContact) Deliver notifications to a Slack channel, optionally @-mentioning users or user groups in the message.SlackGroupMention
(synq.owners.v1.SlackGroupMention) An @-mention of a Slack user group.SlackMention
(synq.owners.v1.SlackMention) A single @-mention in a Slack notification.SlackUserMention
(synq.owners.v1.SlackUserMention) An @-mention of an individual Slack user.UserContact
(synq.owners.v1.UserContact) Deliver notifications to Coalesce Quality users, identified by email. Each email should match a user in the workspace; the notification reaches them through their own configured notification preferences. Enumerate the valid users (and their emails) withsynq.users.v1.UsersService
— ListUsers for the full set, or GetByEmail to validate a single address.
AthenaConf
(synq.agent.dwh.v1.AthenaConf) Amazon Athena specific configuration. Athena is serverless: there is no host/port — the endpoint is implied by the AWS region. Queries run inside a workgroup that owns the per-query data-scan cap and the S3 query result location. The configured workgroup MUST have ResultConfiguration.OutputLocation set, otherwise every Athena query fails. Setting EnforceWorkGroupConfiguration=true on the workgroup is strongly recommended so per-query overrides cannot escape the cap. Authentication AthenaConf carries an AWS credential source in one of three ways:- Static IAM access key — set access_key_id and secret_access_key (and optionally session_token if those keys are short-lived STS credentials).
- Shared-config profile — set aws_profile to a named profile from ~/.aws/credentials or ~/.aws/config. Useful when the agent host already has AWS CLI configured.
- AWS default credential chain — leave all of the above empty. The AWS SDK then uses environment variables (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_PROFILE), shared config, or the EC2 / ECS / EKS instance role attached to the agent host.
BigQueryConf
(synq.agent.dwh.v1.BigQueryConf) BigQuery specific configurationClickhouseClusterConf
(synq.agent.dwh.v1.ClickhouseClusterConf) How metadata reads address ClickHouse system tables. System tables are per-node, so on a service with more than one replica a plain read reflects whichever replica answered rather than the whole warehouse.ClickhouseConf
(synq.agent.dwh.v1.ClickhouseConf)
ClickHouse has no container above a database, so something has to name the service itself. Left empty, that is the connection host, which is correct but unreadable for a ClickHouse Cloud endpoint; a name given here replaces it.
Two connections to the same service must give the same name, and a name is the identity of everything scraped through it: changing it republishes those tables under new paths, and the old ones are no longer produced. Pick one per service and keep it. |
ClickhouseConf.SettingsEntry
(synq.agent.dwh.v1.ClickhouseConf.SettingsEntry)DatabricksConf
(synq.agent.dwh.v1.DatabricksConf)DuckDBConf
(synq.agent.dwh.v1.DuckDBConf) DuckDB / MotherDuck specific configuration. Supports two modes:- Local/embedded: set database to a file path (e.g. “/tmp/my.duckdb”) or “:memory:”
- MotherDuck (cloud): set motherduck_account and motherduck_token
FabricConf
(synq.agent.dwh.v1.FabricConf) Microsoft Fabric Warehouse / Lakehouse SQL analytics endpoint configuration. Fabric speaks T-SQL over TDS (like SQL Server) but is deliberately its own integration with a minimal, opinionated surface: the connection always uses TLS on port 1433 and authenticates with a Microsoft Entra ID service principal (Fabric rejects SQL logins entirely). Callers therefore only supply the endpoint, the warehouse name, and the service-principal credentials — the azuread ActiveDirectoryServicePrincipal workflow and encryption settings are fixed internally so there is nothing to guess. For hosted deployments that mint their own Entra token (managed identity / workload-identity federation), set access_token instead of client_id + client_secret.MSSQLConf
(synq.agent.dwh.v1.MSSQLConf) Microsoft SQL Server / Azure SQL Database specific configuration. SQL Server is database-scoped — each connection targets a single database. Authentication methods (in priority order):- access_token: pre-acquired Azure AD OAuth token
- fed_auth: Azure AD federated authentication (with optional username/password)
- username + password: standard SQL Server Authentication
MySQLConf
(synq.agent.dwh.v1.MySQLConf) MySQL specific configurationMySQLConf.ParamsEntry
(synq.agent.dwh.v1.MySQLConf.ParamsEntry)OracleConf
(synq.agent.dwh.v1.OracleConf) Oracle Database specific configuration. Oracle connections are scoped to a Pluggable Database (PDB) via the service name. Authentication methods:- wallet_path: Oracle Wallet (mTLS) for OCI Autonomous Database
- username + password: standard Oracle database authentication Both can be combined (wallet for TLS + explicit credentials).
PostgresConf
(synq.agent.dwh.v1.PostgresConf) Postgres specific configurationRedshiftConf
(synq.agent.dwh.v1.RedshiftConf) Redshift specific configurationSnowflakeConf
(synq.agent.dwh.v1.SnowflakeConf) Snowflake specific configurationTrinoConf
(synq.agent.dwh.v1.TrinoConf) Trino specific configurationConfig
(synq.agent.dwh.v1.Config) Config represents the main configuration for the DWH agentConfig.Agent
(synq.agent.dwh.v1.Config.Agent) Agent contains metadata about this agent instanceConfig.ConnectionsEntry
(synq.agent.dwh.v1.Config.ConnectionsEntry)AgentTaskResponse
(synq.agent.dwh.v1.AgentTaskResponse)ConnectRequest
(synq.agent.dwh.v1.ConnectRequest)ConnectResponse
(synq.agent.dwh.v1.ConnectResponse)Hello
(synq.agent.dwh.v1.Hello)Hello.AvailableConnection
(synq.agent.dwh.v1.Hello.AvailableConnection)Log
(synq.agent.dwh.v1.Log)AgentTask
(synq.agent.dwh.v1.AgentTask)AgentTaskData
(synq.agent.dwh.v1.AgentTaskData)FetchFullCatalogCommand
(synq.agent.dwh.v1.FetchFullCatalogCommand)FetchFullMetricsCommand
(synq.agent.dwh.v1.FetchFullMetricsCommand)FetchMetricsCommand
(synq.agent.dwh.v1.FetchMetricsCommand)FetchMetricsResult
(synq.agent.dwh.v1.FetchMetricsResult)FetchMetricsResult.ColumnValue
(synq.agent.dwh.v1.FetchMetricsResult.ColumnValue)FetchMetricsResult.MetricsRow
(synq.agent.dwh.v1.FetchMetricsResult.MetricsRow)FetchMetricsResult.QueryRows
(synq.agent.dwh.v1.FetchMetricsResult.QueryRows)FetchSegmentsCommand
(synq.agent.dwh.v1.FetchSegmentsCommand)FetchSegmentsResult
(synq.agent.dwh.v1.FetchSegmentsResult)FetchSegmentsResult.SegmentRow
(synq.agent.dwh.v1.FetchSegmentsResult.SegmentRow)FetchTableStatsCommand
(synq.agent.dwh.v1.FetchTableStatsCommand)SqlQuery
(synq.agent.dwh.v1.SqlQuery)Connection
(synq.agent.dwh.v1.Connection) Connection represents a database connection configurationGenerateConnectionsYamlRequest
(synq.agent.dwh.v1.GenerateConnectionsYamlRequest) Request to generate YAML configuration from data warehouse connections.GenerateConnectionsYamlRequest.ConnectionsEntry
(synq.agent.dwh.v1.GenerateConnectionsYamlRequest.ConnectionsEntry)GenerateConnectionsYamlResponse
(synq.agent.dwh.v1.GenerateConnectionsYamlResponse) Response containing the generated YAML configuration.ListConnectionsRequest
(synq.agent.dwh.v1.ListConnectionsRequest)ListConnectionsResponse
(synq.agent.dwh.v1.ListConnectionsResponse)ListConnectionsResponse.ConnectionsEntry
(synq.agent.dwh.v1.ListConnectionsResponse.ConnectionsEntry)SYNQ
(synq.agent.v1.SYNQ) SYNQ contains authentication and connection details for the Coalesce Quality platformAcceptPromptSuggestionRequest
(synq.agent.sre.v1.AcceptPromptSuggestionRequest)AcceptPromptSuggestionResponse
(synq.agent.sre.v1.AcceptPromptSuggestionResponse)AgentTask
(synq.agent.sre.v1.AgentTask)AgentTaskResponse
(synq.agent.sre.v1.AgentTaskResponse)ConnectRequest
(synq.agent.sre.v1.ConnectRequest)ConnectResponse
(synq.agent.sre.v1.ConnectResponse)DismissPromptSuggestionRequest
(synq.agent.sre.v1.DismissPromptSuggestionRequest)DismissPromptSuggestionResponse
(synq.agent.sre.v1.DismissPromptSuggestionResponse)DwhConnection
(synq.agent.sre.v1.DwhConnection)DwhConnection.ParametersEntry
(synq.agent.sre.v1.DwhConnection.ParametersEntry)EvaluateTask
(synq.agent.sre.v1.EvaluateTask) Task to evaluate an LLM request on the agent side (for self-hosted agents).GetConfigRequest
(synq.agent.sre.v1.GetConfigRequest)GetConfigResponse
(synq.agent.sre.v1.GetConfigResponse)Hello
(synq.agent.sre.v1.Hello)ListPromptSuggestionsRequest
(synq.agent.sre.v1.ListPromptSuggestionsRequest)ListPromptSuggestionsResponse
(synq.agent.sre.v1.ListPromptSuggestionsResponse)PromptSuggestion
(synq.agent.sre.v1.PromptSuggestion)RecordPromptSuggestionRequest
(synq.agent.sre.v1.RecordPromptSuggestionRequest)
Explicit-presence (
optional) so the field can carry an empty string with meaning. An empty value is a deliberate proposal to REMOVE the prompt entirely (clear the override back to the built-in default), distinct from omitting the field. Use this when a customised prompt is judged counter-productive and the workspace is better off with no override at all.
required is intentionally NOT set: that rule rejects the empty string, which would make a removal proposal un-expressible. Presence (the field must be set at all) is enforced by the handler via a nil check, so an omitted field is still rejected while an explicit "" is accepted.
Producer guidance — propose the smallest change that achieves the goal. Start from the current prompt value and append, delete, or rewrite only the relevant section; do not regenerate the whole prompt from scratch. The reviewer is shown a Current-vs-Suggested diff, so a surgical edit is far easier to approve than a wholesale rewrite that rewords every line.
Keep individual lines short and break content into paragraphs separated by newlines instead of collapsing everything onto one long line. The review UI diffs line by line, so well-broken text produces a readable, minimal diff; a single monster line shows up as one giant replaced block. |
| rationale | string | Short markdown explanation of why the change is proposed, capped at 2048 bytes. Shown to the reviewer as a “why” callout above the diff, so keep it to a few tight sentences or bullet points — it justifies the change, it does not restate the prompt. As with suggested_value, prefer short lines / paragraphs over one long line. |
| evidence_json | bytes | Opaque JSON: structured pointers the analyser used to produce the suggestion (top entities, sample issues, etc.). Stored verbatim for traceability. |
| source | string | Producer identifier + version, e.g. "offline_audit_v1". A short slug, not free text — capped at 128 bytes. |
RecordPromptSuggestionResponse
(synq.agent.sre.v1.RecordPromptSuggestionResponse)SuggestTestsTask
(synq.agent.sre.v1.SuggestTestsTask)TriageTask
(synq.agent.sre.v1.TriageTask)EvaluateRequest
(synq.agent.sre.v1.EvaluateRequest) Request to evaluate an LLM request with structured output.EvaluateResponse
(synq.agent.sre.v1.EvaluateResponse) Response from the LLM evaluation.LlmResponseMetrics
(synq.agent.sre.v1.LlmResponseMetrics) Metrics about the LLM response.Message
(synq.agent.sre.v1.Message) A single message in the conversation history.AnalysisEvidence
(synq.agent.sre.v1.AnalysisEvidence) AnalysisEvidence contains detailed analysis of the issue based on collected data. This should only be used as a last resort when no other more specialized evidence types (history, root cause, related issues, or changes) could be collected. It provides a comprehensive understanding of the problem and its implications.ChangeEvidence
(synq.agent.sre.v1.ChangeEvidence) ChangeEvidence documents recent changes that may have contributed to the issue. This helps in understanding if the issue is related to recent modifications.CodeChange
(synq.agent.sre.v1.CodeChange) CodeChange represents a specific change in a file within a commit.CommitEvidence
(synq.agent.sre.v1.CommitEvidence) CommitEvidence documents code changes that may have contributed to the issue. This helps in understanding if the issue is related to recent code modifications.DataQueryEvidenceItem
(synq.agent.sre.v1.DataQueryEvidenceItem) DataQueryEvidenceItem represents a single SQL query and its analysis.DataQueryEvidenceV2
(synq.agent.sre.v1.DataQueryEvidenceV2) DataQueryEvidenceV2 contains SQL queries and their analysis results with query IDs. This helps in understanding the issue through data analysis with query tracking.EvidenceItem
(synq.agent.sre.v1.EvidenceItem) EvidenceItem represents a single piece of evidence collected during the triage investigation. Each evidence item must have a title and one of the specific evidence types.HistoryEvidence
(synq.agent.sre.v1.HistoryEvidence) HistoryEvidence represents historical context from similar past issues. This helps in understanding if the current issue is recurring or has known patterns.ImpactedDataproductEvidence
(synq.agent.sre.v1.ImpactedDataproductEvidence) ImpactedDataproduct documents Data Products that are significantly affected by the issue. This helps in understanding the business impact and prioritizing resolution efforts.ImpactedOwnerEvidence
(synq.agent.sre.v1.ImpactedOwnerEvidence) ImpactedOwner documents business owners or teams that are seriously affected by the issue. This helps in understanding stakeholder impact and communication requirements.OtherEvidence
(synq.agent.sre.v1.OtherEvidence) OtherEvidence contains general analysis that doesn’t fit into other specialized evidence types. This should be used when the analysis doesn’t involve SQL queries, code changes, or other specialized evidence types.RelatedIssueEvidence
(synq.agent.sre.v1.RelatedIssueEvidence) RelatedIssueEvidence identifies other issues that may be connected to the current investigation. This helps in understanding broader context and potential dependencies.RootCauseEvidence
(synq.agent.sre.v1.RootCauseEvidence) RootCauseEvidence identifies the likely root cause of the issue being investigated. This helps in understanding the fundamental reason behind the problem.AcceptFeedback
(synq.agent.sre.v1.AcceptFeedback)ConclusionFeedback
(synq.agent.sre.v1.ConclusionFeedback)DismissFeedback
(synq.agent.sre.v1.DismissFeedback)ReTriageFeedback
(synq.agent.sre.v1.ReTriageFeedback)Config
(synq.agent.sre.v1.Config) Config represents the main configuration for the SRE agentConfig.ConnectionsEntry
(synq.agent.sre.v1.Config.ConnectionsEntry)BatchLatestConclusionsRequest
(synq.agent.sre.v1.BatchLatestConclusionsRequest)BatchLatestConclusionsResponse
(synq.agent.sre.v1.BatchLatestConclusionsResponse)BatchTriageStateRequest
(synq.agent.sre.v1.BatchTriageStateRequest)BatchTriageStateResponse
(synq.agent.sre.v1.BatchTriageStateResponse)BatchTriageStateResponse.StatesEntry
(synq.agent.sre.v1.BatchTriageStateResponse.StatesEntry)ConcludeRequest
(synq.agent.sre.v1.ConcludeRequest) Request to conclude the triage investigation for one or more issues.ConcludeResponse
(synq.agent.sre.v1.ConcludeResponse) Response for the Conclude operation. Empty as the operation is fire-and-forget.ListTriageStateRequest
(synq.agent.sre.v1.ListTriageStateRequest)ListTriageStateResponse
(synq.agent.sre.v1.ListTriageStateResponse)MarkAsInProgressRequest
(synq.agent.sre.v1.MarkAsInProgressRequest)MarkAsInProgressResponse
(synq.agent.sre.v1.MarkAsInProgressResponse)MarkFailedRequest
(synq.agent.sre.v1.MarkFailedRequest)MarkFailedResponse
(synq.agent.sre.v1.MarkFailedResponse)RecordEvidenceRequest
(synq.agent.sre.v1.RecordEvidenceRequest) Request to record evidence collected during the triage investigation.RecordEvidenceResponse
(synq.agent.sre.v1.RecordEvidenceResponse) Response for the RecordEvidence operation. Empty as the operation is fire-and-forget.LlmConfig
(synq.agent.sre.v1.LlmConfig)OpenAIApi
(synq.agent.sre.v1.OpenAIApi)
Free-form rather than an enum because the levels belong to whichever provider serves the model, and they keep being added. The value reaches the provider as given, so a level this build has never heard of works; one the model refuses is dropped for that request and logged. |
BatchSuggestionStatesRequest
(synq.agent.sre.v1.BatchSuggestionStatesRequest)BatchSuggestionStatesResponse
(synq.agent.sre.v1.BatchSuggestionStatesResponse)GetActiveSuggestionStatesForRequest
(synq.agent.sre.v1.GetActiveSuggestionStatesForRequest)GetActiveSuggestionStatesForResponse
(synq.agent.sre.v1.GetActiveSuggestionStatesForResponse)ListSuggestionStatesRequest
(synq.agent.sre.v1.ListSuggestionStatesRequest)ListSuggestionStatesResponse
(synq.agent.sre.v1.ListSuggestionStatesResponse)MarkAsCancelledRequest
(synq.agent.sre.v1.MarkAsCancelledRequest)MarkAsCancelledResponse
(synq.agent.sre.v1.MarkAsCancelledResponse)MarkAsCompletedRequest
(synq.agent.sre.v1.MarkAsCompletedRequest)MarkAsCompletedResponse
(synq.agent.sre.v1.MarkAsCompletedResponse)MarkAsFailedRequest
(synq.agent.sre.v1.MarkAsFailedRequest)MarkAsFailedResponse
(synq.agent.sre.v1.MarkAsFailedResponse)MarkAsRunningRequest
(synq.agent.sre.v1.MarkAsRunningRequest)MarkAsRunningResponse
(synq.agent.sre.v1.MarkAsRunningResponse)SuggestForRequest
(synq.agent.sre.v1.SuggestForRequest)SuggestForResponse
(synq.agent.sre.v1.SuggestForResponse)AddToIncidentConclusion
(synq.agent.sre.v1.AddToIncidentConclusion) AddToIncidentConclusion indicates that the issue should be added to an existing incident. This conclusion should be supported by evidence showing the connection to the existing incident.DeclareIncidentConclusion
(synq.agent.sre.v1.DeclareIncidentConclusion) DeclareIncidentConclusion indicates that the issue requires immediate attention as an incident. This conclusion should be supported by evidence showing significant impact or risk.IssueConclusion
(synq.agent.sre.v1.IssueConclusion) IssueConclusion represents the final determination made by the LLM agent about an issue. Each conclusion type must be supported by appropriate evidence collected during investigation.IssueConclusionWithEvidence
(synq.agent.sre.v1.IssueConclusionWithEvidence)RequestForHumanReviewConclusion
(synq.agent.sre.v1.RequestForHumanReviewConclusion) RequestForHumanReviewConclusion indicates that the issue needs human review. This conclusion should be used when:- The agent has collected some evidence but cannot make a definitive conclusion
- The issue requires human judgment or expertise
- The impact is unclear or needs human assessment
SetExpectedConclusion
(synq.agent.sre.v1.SetExpectedConclusion) SetExpectedConclusion indicates that the issue is expected behavior and no action is needed. This conclusion should be supported by evidence showing this is normal operation.SetFixedConclusion
(synq.agent.sre.v1.SetFixedConclusion) SetFixedConclusion indicates that the issue has already been resolved and can be closed. This conclusion should be supported by evidence showing the fix has been applied and verified.SetNoActionNeededConclusion
(synq.agent.sre.v1.SetNoActionNeededConclusion) SetNoActionNeededConclusion indicates that the issue will resolve itself without intervention. This conclusion should be supported by evidence showing the issue is temporary or self-healing.UnexplainedConclusion
(synq.agent.sre.v1.UnexplainedConclusion) UnexplainedConclusion indicates that the agent was unable to collect sufficient evidence to understand or explain the issue. This conclusion requires high-priority human review as it may indicate a serious or complex problem that needs immediate attention.IssueTriageState
(synq.agent.sre.v1.IssueTriageState) IssueTriageState represents the current state of an issue in the SRE agent’s investigation workflow. This state is used to track the progress of automated triage and coordinate between different parts of the system.SubmitFeatureRequestRequest
(synq.agent.sre.v1.SubmitFeatureRequestRequest) Request to submit a feature request. Should only be used as a last resort when no existing tool can handle the user’s request.SubmitFeatureRequestResponse
(synq.agent.sre.v1.SubmitFeatureRequestResponse) Response for the SubmitFeatureRequest operation.TestSuggestionState
(synq.agent.sre.v1.TestSuggestionState)AggregateDrillTarget
(synq.agent.recon.v1.AggregateDrillTarget) AggregateDrillTarget specifies how to extend or drill deeper into aggregate results.BisectionDrillTarget
(synq.agent.recon.v1.BisectionDrillTarget) BisectionDrillTarget specifies which mismatch leaves to drill deeper into.GroupTarget
(synq.agent.recon.v1.GroupTarget) GroupTarget identifies a specific group to drill into by its key values.ReconciliationFilter
(synq.agent.recon.v1.ReconciliationFilter) ReconciliationFilter controls which reconciliations are included or excluded.ReconciliationOverride
(synq.agent.recon.v1.ReconciliationOverride) ReconciliationOverride provides per-reconciliation instructions for a run. Used to drill into specific mismatches, adjust config, or extend comparisons.ReconciliationRunRequest
(synq.agent.recon.v1.ReconciliationRunRequest) ReconciliationRunRequest describes what to execute in a reconciliation run. It can start a fresh run, continue from a previous audit, or drill deeper into specific mismatches found in a prior run.ReconciliationRunRequest.VariableOverridesEntry
(synq.agent.recon.v1.ReconciliationRunRequest.VariableOverridesEntry)RerunAction
(synq.agent.recon.v1.RerunAction) RerunAction re-runs a reconciliation from scratch with optional config overrides.SegmentTarget
(synq.agent.recon.v1.SegmentTarget) SegmentTarget identifies a specific segment to drill into.
The encoding matches SegmentInfo in the audit log, and is deliberately not self-describing: a numeric key appears as a JSON number when it fits the exact double range and as a JSON string above it, while a textual key always appears as a JSON string. A composite key is a JSON list, one element per key column. Only the key column’s own type distinguishes the cases, so the runner types these bounds after resolving the query shape. |
| oneof _max_key.max_key | optional Value | Maximum key (exclusive). Unset means unbounded. |
| oneof _time_bucket.time_bucket | optional string | Time bucket (for time-based segmentation). |
| oneof _seed_depth.seed_depth | optional int32 | Depth this segment sat at in the run being resumed.
Carried so a resumed drill reports true absolute depth and can budget its own depth limit as “this many further levels” rather than re-spending a budget the previous run already consumed. |
AuditLogEntry
(synq.agent.recon.v1.AuditLogEntry) AuditLogEntry is a summary of an audit log for listing purposes. Use GetAuditLog to retrieve the full audit log data.GetAuditLogRequest
(synq.agent.recon.v1.GetAuditLogRequest)GetAuditLogResponse
(synq.agent.recon.v1.GetAuditLogResponse)IngestAuditLogRequest
(synq.agent.recon.v1.IngestAuditLogRequest)IngestAuditLogResponse
(synq.agent.recon.v1.IngestAuditLogResponse)ListAuditLogsRequest
(synq.agent.recon.v1.ListAuditLogsRequest)ListAuditLogsResponse
(synq.agent.recon.v1.ListAuditLogsResponse)ReconciliationSummary
(synq.agent.recon.v1.ReconciliationSummary) ReconciliationSummary is a compact summary of a single reconciliation within an audit log entry.CutoffApplyConfig
(synq.agent.recon.v1.CutoffApplyConfig) CutoffApplyConfig controls how the resolved cutoff value is applied as a WHERE filter.CutoffConfig
(synq.agent.recon.v1.CutoffConfig) CutoffConfig defines a dynamic cutoff filter for sync reconciliation. It derives a watermark value from the actual data (e.g., MAX(created_at)) to automatically exclude rows that haven’t been synced yet. The cutoff is resolved at runtime before comparison queries run:- Derive watermark(s) from source and/or target via aggregate queries.
- Combine them (default: MIN of both sides).
- Optionally truncate to a time boundary and apply an offset.
- Apply as WHERE filter to both source and target queries.
CutoffSideConfig
(synq.agent.recon.v1.CutoffSideConfig) CutoffSideConfig configures watermark derivation for one side (source or target). There are two modes:- Column + aggregate (default): auto-generates a watermark query from the dataset. For table-based datasets, queries the table directly (the column does NOT need to be in the reconciliation column list). For query-based datasets, wraps the query as a subquery (the column MUST be in the query’s SELECT list).
- Custom query: provide a SQL query that returns a single row with a “watermark” column. Use this when the auto-generated query doesn’t work (e.g., complex joins, custom logic).
query field is always populated with the actual SQL
that was executed, regardless of which mode was used. This ensures the audit log captures
the exact query for reproducibility.
BatchReconciliationRunStateRequest
(synq.agent.recon.v1.BatchReconciliationRunStateRequest)BatchReconciliationRunStateResponse
(synq.agent.recon.v1.BatchReconciliationRunStateResponse)BatchReconciliationRunStateResponse.StatesEntry
(synq.agent.recon.v1.BatchReconciliationRunStateResponse.StatesEntry)CancelReconciliationRunRequest
(synq.agent.recon.v1.CancelReconciliationRunRequest)CancelReconciliationRunResponse
(synq.agent.recon.v1.CancelReconciliationRunResponse)ListReconciliationRunStateRequest
(synq.agent.recon.v1.ListReconciliationRunStateRequest)ListReconciliationRunStateResponse
(synq.agent.recon.v1.ListReconciliationRunStateResponse)SuiteRunStates
(synq.agent.recon.v1.SuiteRunStates) SuiteRunStates groups the most relevant run rows for a single suite.DeleteSuiteConfigRequest
(synq.agent.recon.v1.DeleteSuiteConfigRequest)DeleteSuiteConfigResponse
(synq.agent.recon.v1.DeleteSuiteConfigResponse)GetSuiteConfigRequest
(synq.agent.recon.v1.GetSuiteConfigRequest)GetSuiteConfigResponse
(synq.agent.recon.v1.GetSuiteConfigResponse)GetSuiteConfigVersionRequest
(synq.agent.recon.v1.GetSuiteConfigVersionRequest)GetSuiteConfigVersionResponse
(synq.agent.recon.v1.GetSuiteConfigVersionResponse)ListSuiteConfigVersionsRequest
(synq.agent.recon.v1.ListSuiteConfigVersionsRequest)ListSuiteConfigVersionsResponse
(synq.agent.recon.v1.ListSuiteConfigVersionsResponse)ListSuiteConfigsRequest
(synq.agent.recon.v1.ListSuiteConfigsRequest)ListSuiteConfigsResponse
(synq.agent.recon.v1.ListSuiteConfigsResponse)ResumeFromRun
(synq.agent.recon.v1.ResumeFromRun) ResumeFromRun turns an ad-hoc submission into a replay of a previous run: either a re-validation (“do the differences it found still exist”) or a deeper drill of the mismatches it stopped at. The suite comes from the parent run’s audit log, not from a config load, so the replay compares the same data the parent compared — template variables keep the values they resolved to and a cutoff keeps the watermark it derived. Credentials never come from an audit log: it records connection names only, and those are bound to integrations exactly as for any other ad-hoc run (connection_mappings, else a workspace integration of the same name).SubmitAdhocSuiteRequest
(synq.agent.recon.v1.SubmitAdhocSuiteRequest)
When omitted, the server attempts to resolve each connection name against a workspace integration of the same name (legacy behaviour). When the suite references connection names that the server cannot resolve, the call fails with FAILED_PRECONDITION + a ConnectionResolutionFailure detail listing every unresolved name and candidate integrations, so the caller can prompt the user to bind them.
Both workspace-level (integration_id) and user-level (user_integration_id) credentials are accepted here: - integration_id requires SCOPE_INTEGRATION_EDIT on the caller. - user_integration_id requires a user identity in the calling context and the integration’s allow_reconciliation_adhoc gate enabled. |
| oneof _run_bisection.run_bisection | optional bool | When true (default), the runner drills into each mismatched reconciliation via bisection after the quick check fails. Set to false to stop after the quick check — useful for cheap smoke runs, or when the caller plans to trigger a manual drill later.
Per-reconciliation
bisection.enabled still gates whether a given recon is eligible for drill, so this flag is the run-level off switch layered on top. |
| oneof _execution_timeout.execution_timeout | optional Duration | Maximum wall-clock time for this ad-hoc run (quick check plus any bisection drill). A run that exceeds it is cancelled and marked failed. Absent uses the server default; the server clamps the effective value to a supported range. |
| oneof _resume_from_run.resume_from_run | optional ResumeFromRun | Continue a previous run instead of executing a suite from its config. Mutually compatible with neither suite nor suite_id being set: the suite is rebuilt from the parent run’s audit log. |
| actor | Actor | Actor submitting the run. Required. |
SubmitAdhocSuiteResponse
(synq.agent.recon.v1.SubmitAdhocSuiteResponse)SuiteConfig
(synq.agent.recon.v1.SuiteConfig) SuiteConfig represents the latest version of a reconciliation suite configuration.SuiteConfigVersion
(synq.agent.recon.v1.SuiteConfigVersion) SuiteConfigVersion represents a historical version of a suite config.UpsertSuiteConfigRequest
(synq.agent.recon.v1.UpsertSuiteConfigRequest)UpsertSuiteConfigResponse
(synq.agent.recon.v1.UpsertSuiteConfigResponse)CronSchedule
(synq.agent.recon.v1.CronSchedule)ICalSchedule
(synq.agent.recon.v1.ICalSchedule)ReconciliationConfigSummary
(synq.agent.recon.v1.ReconciliationConfigSummary) Summary of a single reconciliation within a suite config (for listing without parsing full config).SuiteSchedule
(synq.agent.recon.v1.SuiteSchedule) Schedule configuration for managed suites.AggregateDrillChild
(synq.agent.recon.v1.AggregateDrillChild) AggregateDrillChild represents a single divergent group within a drill-down level.AggregateDrillChild.SourceValuesEntry
(synq.agent.recon.v1.AggregateDrillChild.SourceValuesEntry)AggregateDrillChild.TargetValuesEntry
(synq.agent.recon.v1.AggregateDrillChild.TargetValuesEntry)AggregateDrillNode
(synq.agent.recon.v1.AggregateDrillNode) AggregateDrillNode represents a node in the hierarchical aggregate drill-down tree.AggregateStageResult
(synq.agent.recon.v1.AggregateStageResult) AggregateStageResult is the result for an aggregate_check stage.AuditLog
(synq.agent.recon.v1.AuditLog) AuditLog is the root structure for a reconciliation run audit. It captures all operations performed during a synq-recon reconciliation run.AuditLog.ResolvedTableReferencesEntry
(synq.agent.recon.v1.AuditLog.ResolvedTableReferencesEntry)AuditLog.ResolvedVariablesEntry
(synq.agent.recon.v1.AuditLog.ResolvedVariablesEntry)AuditMeta
(synq.agent.recon.v1.AuditMeta) AuditMeta holds build and environment metadata for the synq-recon binary.AuditSummary
(synq.agent.recon.v1.AuditSummary) AuditSummary holds aggregated counts derived from individual reconciliation results.BisectionStageResult
(synq.agent.recon.v1.BisectionStageResult) BisectionStageResult is the result for a bisection_drill stage.BisectionStatistics
(synq.agent.recon.v1.BisectionStatistics) BisectionStatistics holds statistics about the bisection segment tree.BisectionStatistics.DepthDistributionEntry
(synq.agent.recon.v1.BisectionStatistics.DepthDistributionEntry)BisectionStatistics.MismatchByDepthEntry
(synq.agent.recon.v1.BisectionStatistics.MismatchByDepthEntry)BisectionStatistics.PerDepthEntry
(synq.agent.recon.v1.BisectionStatistics.PerDepthEntry)CutoffResult
(synq.agent.recon.v1.CutoffResult) CutoffResult captures the runtime resolution of a cutoff filter. Stored in the audit log to provide full transparency into how the cutoff was derived and applied.DatasetInfo
(synq.agent.recon.v1.DatasetInfo) DatasetInfo captures runtime information about a source or target dataset.DepthStats
(synq.agent.recon.v1.DepthStats) DepthStats holds per-depth-level statistics for the bisection tree.DiffQueries
(synq.agent.recon.v1.DiffQueries) DiffQueries holds investigation queries for a mismatch leaf.InvestigationQuery
(synq.agent.recon.v1.InvestigationQuery) InvestigationQuery represents a merged diff query covering one or more adjacent mismatch leaves.MeasureDifferences
(synq.agent.recon.v1.MeasureDifferences) MeasureDifferences holds all difference variants for measure comparisons.MeasureDifferences.AbsoluteEntry
(synq.agent.recon.v1.MeasureDifferences.AbsoluteEntry)MeasureDifferences.PctSymmetricEntry
(synq.agent.recon.v1.MeasureDifferences.PctSymmetricEntry)MeasureDifferences.PctVsSourceEntry
(synq.agent.recon.v1.MeasureDifferences.PctVsSourceEntry)MeasureDifferences.PctVsTargetEntry
(synq.agent.recon.v1.MeasureDifferences.PctVsTargetEntry)MeasureDifferences.RelativeEntry
(synq.agent.recon.v1.MeasureDifferences.RelativeEntry)MeasureVerdict
(synq.agent.recon.v1.MeasureVerdict) MeasureVerdict captures the threshold evaluation result for a single measure.MismatchLeafDetail
(synq.agent.recon.v1.MismatchLeafDetail) MismatchLeafDetail holds detailed information about a single mismatch leaf.Normalization
(synq.agent.recon.v1.Normalization) Normalization records the column expressions used after cross-DB type alignment.QueryRecord
(synq.agent.recon.v1.QueryRecord) QueryRecord captures a single SQL query execution.QueryStats
(synq.agent.recon.v1.QueryStats) QueryStats holds execution statistics collected from the database driver. Fields are optional — absent means the metric is not available for the driver.QuickCheckStageResult
(synq.agent.recon.v1.QuickCheckStageResult) QuickCheckStageResult is the result for a quick_check stage.ReconciliationAudit
(synq.agent.recon.v1.ReconciliationAudit) ReconciliationAudit captures the configuration and runtime execution data for a single reconciliation.RowMismatchAudit
(synq.agent.recon.v1.RowMismatchAudit) RowMismatchAudit captures a single row-level mismatch in the segment tree.RowMismatchAudit.SourceValuesEntry
(synq.agent.recon.v1.RowMismatchAudit.SourceValuesEntry)RowMismatchAudit.TargetValuesEntry
(synq.agent.recon.v1.RowMismatchAudit.TargetValuesEntry)RowMismatchDetail
(synq.agent.recon.v1.RowMismatchDetail) RowMismatchDetail holds per-row mismatch detail.SegmentAuditNode
(synq.agent.recon.v1.SegmentAuditNode) SegmentAuditNode represents a node in the bisection segment tree.SegmentInfo
(synq.agent.recon.v1.SegmentInfo) SegmentInfo identifies a key range segment.StageAudit
(synq.agent.recon.v1.StageAudit) StageAudit captures one reconciliation stage execution.ThresholdEvaluation
(synq.agent.recon.v1.ThresholdEvaluation) ThresholdEvaluation captures the effective thresholds applied and per-measure verdicts.ThresholdEvaluation.MeasuresEntry
(synq.agent.recon.v1.ThresholdEvaluation.MeasuresEntry)ColumnMapping
(synq.agent.recon.v1.ColumnMapping) ColumnMapping maps a source column name to a target column name. Used when source and target use different naming conventions for the same data (e.g., snake_case vs SCREAMING_SNAKE_CASE, or completely different names). Only columns with different names need explicit mapping — columns with identical names (or case-insensitive matches when case_insensitive is true) are matched automatically.Dataset
(synq.agent.recon.v1.Dataset) Dataset defines a source or target dataset for reconciliation. A dataset specifies which connection to use and how to select data — either via a raw SQL query or by referencing a table with optional column filtering.TableReference
(synq.agent.recon.v1.TableReference) TableReference specifies a table and optional column filtering. Use this instead of a raw query when you want to compare all (or most) columns of a table without writing SQL.name is the table or view name (e.g., “orders”, “fact_sales”).
database and schema are optional namespace qualifiers.
The actual SQL FQN is generated at runtime using the appropriate dialect quoting.
ConnectionEnvironmentOverride
(synq.agent.recon.v1.ConnectionEnvironmentOverride) ConnectionEnvironmentOverride applies to all datasets using a given connection. Provides a default table path override for all datasets on that connection.DatasetEnvironmentOverride
(synq.agent.recon.v1.DatasetEnvironmentOverride) DatasetEnvironmentOverride applies to a specific dataset in a specific reconciliation. Takes precedence over connection-level overrides.ReconEnvironment
(synq.agent.recon.v1.ReconEnvironment) ReconEnvironment defines overrides applied to a suite before execution. Environments allow the same suite definition to run against different database locations (e.g., dev vs production schemas) without modifying the suite itself. Used both in synq-recon CLI (loaded from .env.yaml files) and in kernel-recon cloud (managed as workspace-level configurations).ReconEnvironment.ConnectionsEntry
(synq.agent.recon.v1.ReconEnvironment.ConnectionsEntry)ReconEnvironment.DatasetsEntry
(synq.agent.recon.v1.ReconEnvironment.DatasetsEntry)ReconEnvironment.VariablesEntry
(synq.agent.recon.v1.ReconEnvironment.VariablesEntry)TablePathOverride
(synq.agent.recon.v1.TablePathOverride) TablePathOverride remaps components of a fully-qualified table name. Only set fields are overridden — unset fields keep the suite’s original value. Applied to TableReference fields in datasets when an environment is active.ColumnThresholdOverride
(synq.agent.recon.v1.ColumnThresholdOverride) ColumnThresholdOverride associates threshold overrides with a specific group_column level in the aggregate drill-down hierarchy.MeasureThresholdOverride
(synq.agent.recon.v1.MeasureThresholdOverride) MeasureThresholdOverride associates threshold overrides with a specific measure (aggregate function + column combination).ThresholdConfig
(synq.agent.recon.v1.ThresholdConfig) ThresholdConfig defines tolerance thresholds for aggregate comparisons. A difference is reported as a mismatch only when it exceeds ALL configured thresholds (AND logic: both absolute AND percentage must be exceeded). Thresholds can be overridden at finer granularity:- per_column: override thresholds for a specific group_column drill-down level.
- per_measure: override thresholds for a specific measure (e.g., “SUM(amount)”).
- Nesting: per_column entries may contain per_measure overrides (most specific wins).
ParseYamlRequest
(synq.agent.recon.v1.ParseYamlRequest)ParseYamlResponse
(synq.agent.recon.v1.ParseYamlResponse)RenderYamlRequest
(synq.agent.recon.v1.RenderYamlRequest)RenderYamlResponse
(synq.agent.recon.v1.RenderYamlResponse)ReconciliationRunState
(synq.agent.recon.v1.ReconciliationRunState) ReconciliationRunState describes the lifecycle of a single reconciliation run. Returned by RunStateService.CaseCategories
(synq.agent.recon.v1.CaseCategories) CaseCategories declares the categories for a single reconciliation case, overriding what the deployment declares. The two dimensions are independent, so a case can override one and inherit the other. Per field:- absent : inherit the deployment’s declaration
- present, empty string : declare nothing for this case, even when the deployment declares a value — the category then falls to the reserved annotation or the workspace’s categorisation rules
- present, non-empty : set this case’s category
ConnectionMapping
(synq.agent.recon.v1.ConnectionMapping) Maps a reconciliation-connection name (as referenced in the suite config) to a concrete SYNQ integration. Used at execution time to resolve DWH credentials. Two credential planes are defined on the wire:- integration_id: workspace-level integration. Required for deployment paths and acceptable for adhoc submission when the caller has SCOPE_INTEGRATION_EDIT.
- user_integration_id: per-user OAuth-backed integration. Accepted only on adhoc submission, and only when a user identity is present in the calling context. Deployment paths reject this branch unconditionally — scheduled runs must be able to fire without any particular user being available, so they always run with workspace credentials.
integration_id
(field 2) is preserved as one branch of the oneof so existing serialized
rows decode unchanged.
ConnectionResolutionFailure
(synq.agent.recon.v1.ConnectionResolutionFailure) Error-details payload attached to FAILED_PRECONDITION when a recon request cannot be honoured because one or more suite connection names have no usable mapping. The caller should prompt the user to bind every listed connection and retry.GetSuiteDeploymentRequest
(synq.agent.recon.v1.GetSuiteDeploymentRequest)GetSuiteDeploymentResponse
(synq.agent.recon.v1.GetSuiteDeploymentResponse)ListSuiteDeploymentHistoryRequest
(synq.agent.recon.v1.ListSuiteDeploymentHistoryRequest)ListSuiteDeploymentHistoryResponse
(synq.agent.recon.v1.ListSuiteDeploymentHistoryResponse)ListSuiteDeploymentsRequest
(synq.agent.recon.v1.ListSuiteDeploymentsRequest)ListSuiteDeploymentsResponse
(synq.agent.recon.v1.ListSuiteDeploymentsResponse)PauseDeploymentRequest
(synq.agent.recon.v1.PauseDeploymentRequest)PauseDeploymentResponse
(synq.agent.recon.v1.PauseDeploymentResponse)PromoteSuiteRequest
(synq.agent.recon.v1.PromoteSuiteRequest)
Server semantics: - absent : reuse the existing deployment for this suite_id, or generate a fresh UUIDv7 - present, no row exists for (workspace, deployment_id) : adopt as-is - present, row exists with same suite_id : idempotent retry - present, row exists with different suite_id : ALREADY_EXISTS |
| actor | Actor | Actor performing the promotion. Required. |
| deployment_annotations | repeated Annotation | Initial deployment-level annotation overlay. Merged with suite-level and case-level annotations from the frozen suite snapshot. Use UpdateDeploymentAnnotations to mutate later without re-promoting. |
| reconciliation_failure_impacts | map ReconciliationFailureImpactsEntry | Per-case override controlling how the tables referenced by each reconciliation case propagate onto runs. Keyed by case
name from the suite config. When a key is omitted on re-promote, the prior deployment’s value is retained — operators only set keys they want to change, and the FE can offer an “apply to all” action by sending the same value under every case name. New cases (not present in any previous deployment of this suite_id) default to RAISE_ISSUE_ON_TABLES when unset.
Sending RECONCILIATION_FAILURE_IMPACT_UNSPECIFIED for a known case is treated as “no opinion, keep current”; to actively reset to the default, either omit the case or send RAISE_ISSUE_ON_TABLES. |
| oneof _category.category | optional string | Categories to declare for the reconciliation checks this promotion publishes. See SuiteDeployment.category / .governance_category for what they mean and how they interact with annotations and categorisation rules.
On a re-promote these behave as a patch of the previous deployment’s values, per field: - absent : keep whatever the previous deployment declared - present, empty string : clear the declaration, falling back to the reserved annotation or the workspace rules - present, non-empty : set or replace the declaration
So a re-promote that says nothing about categories never silently drops one. Use UpdateDeploymentCategories to change them without re-promoting. |
| oneof _governance_category.governance_category | optional string | none |
| case_categories | map CaseCategoriesEntry | Initial per-case category overrides, keyed by case name. Keys omitted on a re-promote keep the previous deployment’s override; see CaseCategories for how a single dimension is inherited or cleared. Overrides for cases the promoted snapshot doesn’t contain are rejected with INVALID_ARGUMENT, so a renamed or deleted case surfaces as an error rather than a silently dead override. |
PromoteSuiteRequest.CaseCategoriesEntry
(synq.agent.recon.v1.PromoteSuiteRequest.CaseCategoriesEntry)PromoteSuiteRequest.ReconciliationFailureImpactsEntry
(synq.agent.recon.v1.PromoteSuiteRequest.ReconciliationFailureImpactsEntry)PromoteSuiteResponse
(synq.agent.recon.v1.PromoteSuiteResponse)ResumeDeploymentRequest
(synq.agent.recon.v1.ResumeDeploymentRequest)ResumeDeploymentResponse
(synq.agent.recon.v1.ResumeDeploymentResponse)SuiteDeployment
(synq.agent.recon.v1.SuiteDeployment) SuiteDeployment is the latest state of a deployment (current row).
“managed” or “adhoc” |
| source_config_state_at | Timestamp | none |
| state_at | Timestamp | Most recent event timestamp. |
| last_action | DeploymentAction | none |
| oneof _last_actor.last_actor | optional Actor | none |
| oneof _last_change_summary.last_change_summary | optional string | none |
| oneof _promoted_at.promoted_at | optional Timestamp | When this deployment reached production, and who put it there — taken from the most recent promotion in its history, not from whatever happened last.
Read these rather than state_at / last_actor whenever the question is “when did this go live and on whose authority”. Pausing, rescheduling, editing annotations or changing categories all restamp state_at / last_actor and leave these two untouched, so a surface that renders the promotion from state_at reports the wrong time and often the wrong person.
A re-promote is a promotion, so it restamps both. Unpromoting does not clear them: an inactive deployment still reports when it was last live. Both are absent only for a deployment whose history holds no promotion event. |
| oneof _promoted_by.promoted_by | optional Actor | none |
| oneof _next_run_at.next_run_at | optional Timestamp | Next cron occurrence computed live from
schedule at response time. Absent when there’s no schedule, when the deployment is inactive/paused, or when the schedule expression no longer yields an upcoming occurrence (e.g. an iCal RRULE that has finished). Use this for “Next run: …” UI hints — it’s the authoritative upcoming-tick source, independent of any pre-materialised execution_jobs / run_state rows. |
| deployment_annotations | repeated Annotation | Deployment-level annotation overlay. Applied on top of the suite-level and case-level annotations baked into the frozen suite snapshot. The merged, deduplicated list lives on PromotedReconSuiteMetadata / PromotedReconCaseMetadata — this field exposes only the deployment’s own overlay so callers can render and edit it independently. |
| reconciliation_failure_impacts | map ReconciliationFailureImpactsEntry | Effective per-case ReconciliationFailureImpact map currently in force for this deployment. Keyed by case name. Cases without an entry behave as RAISE_ISSUE_ON_TABLES. Drives whether the runner attaches each case’s referenced tables to Run.target (issue-raising) or Run.extra_references (visibility only) — see PromotedReconCaseMetadata.error_tables / shown_tables for the resolved table lists. |
| oneof _category.category | optional string | Technical category declared for every reconciliation check this deployment publishes — the “what kind of check is this, mechanically” dimension the catalog groups and filters checks by (for example “nullness”, “uniqueness”, “freshness”), which is what lets one category cover the same check written as a dbt test, a SQLMesh audit or a reconciliation.
Declared on the promotion rather than in the suite file, because a reconciliation only becomes a check once it is promoted: the suite file says what to reconcile, the promotion says how it behaves in production — the same reason schedule lives here and not in the file.
Absent means this deployment declares no category. The category is then taken from a reserved quality.check_category annotation on the suite, the case or the deployment overlay (see deployment_annotations), and failing that from the workspace’s own categorisation rules. Setting this field outranks both.
Free-form: the vocabulary is whatever the workspace already uses, not a fixed enum. Always read and write it together with governance_category — the two dimensions resolve independently and a surface that exposes one must expose both. |
| oneof _governance_category.governance_category | optional string | Governance category declared for every reconciliation check this deployment publishes — the “what is this check for” dimension, orthogonal to category (for example “completeness”, “accuracy”, “timeliness”). It is the dimension a data-governance function tracks coverage against.
Same declaration point, same precedence and same free-form vocabulary as category; resolved independently of it, so declaring one never suppresses the other’s annotation. |
| case_categories | map CaseCategoriesEntry | Per-case overrides of the two fields above, keyed by case name from the suite config. Cases without an entry use the deployment-wide declaration.
Worth overriding when the cases of one suite are the same kind of check but serve different governance purposes — a case comparing row counts is about completeness while a case comparing values is about accuracy, and they can carry different governance categories while sharing the deployment’s technical one. |
SuiteDeployment.CaseCategoriesEntry
(synq.agent.recon.v1.SuiteDeployment.CaseCategoriesEntry)SuiteDeployment.ReconciliationFailureImpactsEntry
(synq.agent.recon.v1.SuiteDeployment.ReconciliationFailureImpactsEntry)SuiteDeploymentHistoryEntry
(synq.agent.recon.v1.SuiteDeploymentHistoryEntry) SuiteDeploymentHistoryEntry is a single event in the deployment’s history.SuiteDeploymentHistoryEntry.CaseCategoriesEntry
(synq.agent.recon.v1.SuiteDeploymentHistoryEntry.CaseCategoriesEntry)SuiteDeploymentHistoryEntry.ReconciliationFailureImpactsEntry
(synq.agent.recon.v1.SuiteDeploymentHistoryEntry.ReconciliationFailureImpactsEntry)TriggerDeploymentRequest
(synq.agent.recon.v1.TriggerDeploymentRequest)TriggerDeploymentResponse
(synq.agent.recon.v1.TriggerDeploymentResponse)UnpromoteSuiteRequest
(synq.agent.recon.v1.UnpromoteSuiteRequest)UnpromoteSuiteResponse
(synq.agent.recon.v1.UnpromoteSuiteResponse)UnresolvedConnection
(synq.agent.recon.v1.UnresolvedConnection) One entry per connection name the server failed to resolve. Returned inside ConnectionResolutionFailure as the structured error detail of a FAILED_PRECONDITION on adhoc submission or deployment promote/update.UpdateDeploymentAnnotationsRequest
(synq.agent.recon.v1.UpdateDeploymentAnnotationsRequest)UpdateDeploymentAnnotationsResponse
(synq.agent.recon.v1.UpdateDeploymentAnnotationsResponse)UpdateDeploymentCaseImpactsRequest
(synq.agent.recon.v1.UpdateDeploymentCaseImpactsRequest)UpdateDeploymentCaseImpactsRequest.ReconciliationFailureImpactsEntry
(synq.agent.recon.v1.UpdateDeploymentCaseImpactsRequest.ReconciliationFailureImpactsEntry)UpdateDeploymentCaseImpactsResponse
(synq.agent.recon.v1.UpdateDeploymentCaseImpactsResponse)UpdateDeploymentCategoriesRequest
(synq.agent.recon.v1.UpdateDeploymentCategoriesRequest)
A request that sets nothing at all is accepted and changes nothing. |
| oneof _governance_category.governance_category | optional string | none |
| case_categories | map CaseCategoriesEntry | Patch of the per-case overrides, keyed by case
name. Keys present in the request replace that case’s override; keys absent are left untouched, so this never resets overrides the caller didn’t mention. Send an entry with both fields absent to drop a case’s override and go back to inheriting the deployment’s declaration. Unknown case names are rejected with INVALID_ARGUMENT. |
| oneof _change_summary.change_summary | optional string | none |
| actor | Actor | Actor performing the category update. Required. |
UpdateDeploymentCategoriesRequest.CaseCategoriesEntry
(synq.agent.recon.v1.UpdateDeploymentCategoriesRequest.CaseCategoriesEntry)UpdateDeploymentCategoriesResponse
(synq.agent.recon.v1.UpdateDeploymentCategoriesResponse)UpdateDeploymentMappingsRequest
(synq.agent.recon.v1.UpdateDeploymentMappingsRequest)UpdateDeploymentMappingsResponse
(synq.agent.recon.v1.UpdateDeploymentMappingsResponse)UpdateDeploymentScheduleRequest
(synq.agent.recon.v1.UpdateDeploymentScheduleRequest)UpdateDeploymentScheduleResponse
(synq.agent.recon.v1.UpdateDeploymentScheduleResponse)AggregateConfig
(synq.agent.recon.v1.AggregateConfig) AggregateConfig defines aggregate comparison settings. Used when mode is AGGREGATE to compare grouped measures between source and target.
Single column: flat GROUP BY comparison. group_columns: [“region”] → GROUP BY region
Multiple columns: cumulative GROUP BY drill-down, pruning matched groups at each level to focus on divergent branches. group_columns: [“region”, “city”, “store”] → Level 0: GROUP BY region → Level 1: GROUP BY region, city (only for mismatched regions) → Level 2: GROUP BY region, city, store (only for mismatched cities) |
BisectionConfig
(synq.agent.recon.v1.BisectionConfig) BisectionConfig controls the bisection drill-down algorithm that recursively splits the key range to locate individual mismatched rows. Only used in ROW_CHECKSUM mode.ConnectionQueries
(synq.agent.recon.v1.ConnectionQueries) ConnectionQueries associates SQL queries with a specific connection. Used for setup and teardown blocks at both suite and reconciliation level.ErrorHandlingConfig
(synq.agent.recon.v1.ErrorHandlingConfig) ErrorHandlingConfig controls retry and timeout behavior for database queries. Applies to all queries within a reconciliation (setup, comparison, teardown).Measure
(synq.agent.recon.v1.Measure) Measure defines a column and aggregate function(s) to compare between source and target datasets. A single measure with multiple functions expands into multiple comparisons (e.g., column=“amount” functions=[SUM, AVG] produces “SUM(amount)” and “AVG(amount)”).Reconciliation
(synq.agent.recon.v1.Reconciliation) Reconciliation defines a single reconciliation scenario comparing data between a source and target dataset. Each reconciliation runs independently and produces its own pass/mismatch/fail result.ReconciliationSuite
(synq.agent.recon.v1.ReconciliationSuite) ReconciliationSuite is the root configuration for a reconciliation suite. It defines template variables and one or more reconciliation scenarios that compare data between source and target databases. Database connections are configured separately and referenced by name.ReconciliationSuite.VariablesEntry
(synq.agent.recon.v1.ReconciliationSuite.VariablesEntry)ReportingConfig
(synq.agent.recon.v1.ReportingConfig) ReportingConfig controls the level of detail included in reconciliation output for mismatched rows. Higher detail levels reveal more data but may have privacy implications.WindowConfig
(synq.agent.recon.v1.WindowConfig) WindowConfig defines a time window for incremental comparison. When configured, automatically provides a {{window_start}} template variable that resolves to (current_time - lookback). Use this in query WHERE clauses to limit comparison to recent data.Grant
(synq.savedviews.v1.Grant) A single access grant on a saved view.GrantList
(synq.savedviews.v1.GrantList) A wrapper giving the grant set explicit presence on write, so a partial update can distinguish “replace the grants” (present, possibly empty) from “leave grants unchanged” (absent).SavedView
(synq.savedviews.v1.SavedView) A saved view: a named, reusable selection over entities (or another context) with display configuration, sharing and per-user pinning.SavedViewConfig
(synq.savedviews.v1.SavedViewConfig) How a saved view is displayed once opened. This message is intentionally permissive and forward-compatible: new presentation options are added as new fields, never as a breaking change, so older clients keep working.SavedViewPermissions
(synq.savedviews.v1.SavedViewPermissions) What the calling user is allowed to do with a saved view. Output-only: computed per request from ownership, the caller’s grant (if any) and their workspace permissions. Viewing and pinning are always allowed for any view the caller can see, so they are not represented here.SavedViewQuery
(synq.savedviews.v1.SavedViewQuery) The query behind a saved view, expressed for the public API. On write, provide the query in ONE of two forms:public_query— a structured query (the same shape used elsewhere for asset selection), convenient to build from a filter UI; orresolver_ql— the SYNQ resolver query language, a compact text form that additionally expresses severity/status and time-window filters (e.g.with_severity(statuses=["error"], since="24h")). When both are set,resolver_qlwins. The server compiles the query and stores it canonically; the raw text is not preserved verbatim.
rendered_resolver_ql (the stored query rendered
back to canonical resolver query language) and, best-effort, public_query
(the structured representation; parts with no structured equivalent are marked
unsupported). resolver_ql is not echoed back — read rendered_resolver_ql.
SavedViewSelection
(synq.savedviews.v1.SavedViewSelection) The selection that a saved view captures. Modelled as a oneof so future contexts (e.g. an issues filter) can add their own selection shape without reshaping the view.BatchGetRequest
(synq.savedviews.v1.BatchGetRequest)BatchGetResponse
(synq.savedviews.v1.BatchGetResponse)BatchGetResponse.ViewsEntry
(synq.savedviews.v1.BatchGetResponse.ViewsEntry)DeleteRequest
(synq.savedviews.v1.DeleteRequest)DeleteResponse
(synq.savedviews.v1.DeleteResponse)ListRequest
(synq.savedviews.v1.ListRequest)ListResponse
(synq.savedviews.v1.ListResponse)SetPinRequest
(synq.savedviews.v1.SetPinRequest)SetPinResponse
(synq.savedviews.v1.SetPinResponse)UpsertRequest
(synq.savedviews.v1.UpsertRequest)UpsertResponse
(synq.savedviews.v1.UpsertResponse)IamRequest
(synq.auth.iam.v1.IamRequest)IamResponse
(synq.auth.iam.v1.IamResponse)SetPlatformAuthenticationRequest
(synq.platforms.v1.SetPlatformAuthenticationRequest)SetPlatformAuthenticationResponse
(synq.platforms.v1.SetPlatformAuthenticationResponse)OAuthAuthentication
(synq.platforms.v1.OAuthAuthentication) Authentication using OAuth credentialsPasswordAuthentication
(synq.platforms.v1.PasswordAuthentication) Authentication using a username and passwordPlatformAuthentication
(synq.platforms.v1.PlatformAuthentication)SynqManagedKeyPairAuthentication
(synq.platforms.v1.SynqManagedKeyPairAuthentication) Authentication using a managed key pair. The public key will be set and returned by the server after the authentication is created.TokenAuthentication
(synq.platforms.v1.TokenAuthentication) Authentication using a token (API key, PAT, etc)UserManagedKeyPairAuthentication
(synq.platforms.v1.UserManagedKeyPairAuthentication) Authentication using a user-managed key pair. The private key is stored safely as a secret. The response does not include the private key for security.AthenaIdentifier
(synq.platforms.v1.AthenaIdentifier)BigqueryIdentifier
(synq.platforms.v1.BigqueryIdentifier)ClickhouseIdentifier
(synq.platforms.v1.ClickhouseIdentifier)DataPlatformIdentifier
(synq.platforms.v1.DataPlatformIdentifier) DataPlatformIdentifier is a unique reference to a data platform integrated with Coalesce Quality.DatabricksIdentifier
(synq.platforms.v1.DatabricksIdentifier)DbtCloudIdentifier
(synq.platforms.v1.DbtCloudIdentifier)DuckDbIdentifier
(synq.platforms.v1.DuckDbIdentifier)FabricIdentifier
(synq.platforms.v1.FabricIdentifier)MssqlIdentifier
(synq.platforms.v1.MssqlIdentifier)MysqlIdentifier
(synq.platforms.v1.MysqlIdentifier)OracleIdentifier
(synq.platforms.v1.OracleIdentifier)PostgresIdentifier
(synq.platforms.v1.PostgresIdentifier)RedshiftIdentifier
(synq.platforms.v1.RedshiftIdentifier)SnowflakeIdentifier
(synq.platforms.v1.SnowflakeIdentifier)SqlMeshIdentifier
(synq.platforms.v1.SqlMeshIdentifier)TrinoIdentifier
(synq.platforms.v1.TrinoIdentifier)UnknownDataPlatform
(synq.platforms.v1.UnknownDataPlatform)AddIssuesToIncidentRequest
(synq.incidents.v1.AddIssuesToIncidentRequest)AddIssuesToIncidentResponse
(synq.incidents.v1.AddIssuesToIncidentResponse)AssignIncidentOwnerRequest
(synq.incidents.v1.AssignIncidentOwnerRequest)AssignIncidentOwnerResponse
(synq.incidents.v1.AssignIncidentOwnerResponse)BatchGetIncidentsRequest
(synq.incidents.v1.BatchGetIncidentsRequest)BatchGetIncidentsResponse
(synq.incidents.v1.BatchGetIncidentsResponse)BatchGetIncidentsResponse.IncidentsEntry
(synq.incidents.v1.BatchGetIncidentsResponse.IncidentsEntry)CancelIncidentRequest
(synq.incidents.v1.CancelIncidentRequest)CancelIncidentResponse
(synq.incidents.v1.CancelIncidentResponse)CloseIncidentRequest
(synq.incidents.v1.CloseIncidentRequest)CloseIncidentResponse
(synq.incidents.v1.CloseIncidentResponse)CreateIncidentRequest
(synq.incidents.v1.CreateIncidentRequest)CreateIncidentResponse
(synq.incidents.v1.CreateIncidentResponse)DeleteCommentRequest
(synq.incidents.v1.DeleteCommentRequest)DeleteCommentResponse
(synq.incidents.v1.DeleteCommentResponse)ListIncidentsRequest
(synq.incidents.v1.ListIncidentsRequest)ListIncidentsRequest.Sort
(synq.incidents.v1.ListIncidentsRequest.Sort)ListIncidentsRequest.Time
(synq.incidents.v1.ListIncidentsRequest.Time)ListIncidentsResponse
(synq.incidents.v1.ListIncidentsResponse)MergeIncidentsRequest
(synq.incidents.v1.MergeIncidentsRequest)MergeIncidentsResponse
(synq.incidents.v1.MergeIncidentsResponse)PostCommentRequest
(synq.incidents.v1.PostCommentRequest)PostCommentResponse
(synq.incidents.v1.PostCommentResponse)RemoveIssuesFromIncidentRequest
(synq.incidents.v1.RemoveIssuesFromIncidentRequest)RemoveIssuesFromIncidentResponse
(synq.incidents.v1.RemoveIssuesFromIncidentResponse)RenameIncidentRequest
(synq.incidents.v1.RenameIncidentRequest)RenameIncidentResponse
(synq.incidents.v1.RenameIncidentResponse)SplitIncidentRequest
(synq.incidents.v1.SplitIncidentRequest)SplitIncidentResponse
(synq.incidents.v1.SplitIncidentResponse)UpdateIncidentStateRequest
(synq.incidents.v1.UpdateIncidentStateRequest)UpdateIncidentStateResponse
(synq.incidents.v1.UpdateIncidentStateResponse)Incident
(synq.incidents.v1.Incident)IncidentComment
(synq.incidents.v1.IncidentComment)GetDiffByChangeIdRequest
(synq.git.commits.v1.GetDiffByChangeIdRequest)GetDiffByChangeIdResponse
(synq.git.commits.v1.GetDiffByChangeIdResponse)GetDiffByCommitRequest
(synq.git.commits.v1.GetDiffByCommitRequest)GetDiffByCommitResponse
(synq.git.commits.v1.GetDiffByCommitResponse)CommitDiff
(synq.git.commits.v1.CommitDiff)FileDiff
(synq.git.commits.v1.FileDiff)AssetSelectionQuery
(synq.domains.v1.AssetSelectionQuery)AssetSelectionQuery.QueryPart
(synq.domains.v1.AssetSelectionQuery.QueryPart)DomainDefinition
(synq.domains.v1.DomainDefinition)DomainDefinition.Part
(synq.domains.v1.DomainDefinition.Part)Domain
(synq.domains.v1.Domain)BatchGetRequest
(synq.domains.v1.BatchGetRequest)BatchGetResponse
(synq.domains.v1.BatchGetResponse)BatchGetResponse.DomainsEntry
(synq.domains.v1.BatchGetResponse.DomainsEntry)DeleteRequest
(synq.domains.v1.DeleteRequest)DeleteResponse
(synq.domains.v1.DeleteResponse)FetchDomainWithSubDomainsRequest
(synq.domains.v1.FetchDomainWithSubDomainsRequest)FetchDomainWithSubDomainsResponse
(synq.domains.v1.FetchDomainWithSubDomainsResponse)FetchDomainWithSubDomainsResponse.DomainsEntry
(synq.domains.v1.FetchDomainWithSubDomainsResponse.DomainsEntry)GetUsageRequest
(synq.domains.v1.GetUsageRequest)GetUsageResponse
(synq.domains.v1.GetUsageResponse)ListRequest
(synq.domains.v1.ListRequest)ListResponse
(synq.domains.v1.ListResponse)RemoveDefinitionPartRequest
(synq.domains.v1.RemoveDefinitionPartRequest)RemoveDefinitionPartResponse
(synq.domains.v1.RemoveDefinitionPartResponse)SetDefinitionRequest
(synq.domains.v1.SetDefinitionRequest)SetDefinitionResponse
(synq.domains.v1.SetDefinitionResponse)UpsertDefinitionPartRequest
(synq.domains.v1.UpsertDefinitionPartRequest)UpsertDefinitionPartResponse
(synq.domains.v1.UpsertDefinitionPartResponse)UpsertRequest
(synq.domains.v1.UpsertRequest)UpsertResponse
(synq.domains.v1.UpsertResponse)DomainDefinition
(synq.domains.v2.DomainDefinition) The membership of a domain: which assets belong to it. A definition is an ordered list of parts; an asset is a member if it matches ANY part (the parts are OR’d together). Unlike a data product, a domain is NOT a leaf: a part may pull in a whole data product or another domain, and membership is then resolved recursively. The server maintains the reference graph across domains and data products and rejects any write that would close a loop, naming the offending path — so a definition can always be resolved in finite time. The domain hierarchy counts as a reference too: a parent domain aggregates its sub-domains.DomainDefinition.Part
(synq.domains.v2.DomainDefinition.Part) A single piece of a domain definition: a pinned asset, a whole data product, a whole other domain, or a selection query.
A query whose whole content is a single domain reference is equivalent to
domain_id and is returned in that form on read, since both describe the same membership. |
DomainQuery
(synq.domains.v2.DomainQuery) The selection query behind a domain definition part, expressed for the public API. On write, provide the query in ONE of three forms:resolver_ql— the resolver query language, a compact text form that is the canonical way to author selections as code;public_query— a structured query (the same shape used elsewhere for asset selection), convenient to build from a filter UI; orasset_selection_query— the structured form domains have always accepted, kept so an existing definition can be moved across unchanged. When more than one is set the first of that list wins. The server compiles the query and stores it canonically; the raw text is not preserved verbatim.
rendered_resolver_ql (the stored query rendered
back to canonical resolver query language) plus, best-effort, both structured
forms. resolver_ql is not echoed back — read rendered_resolver_ql.
A domain query may reference another domain or a data product (via the
in_domain / in_dataproduct operands, or their resolver-query-language
equivalents). Such a reference is resolved recursively and is rejected only
when it would close a reference loop.
BatchGetRequest
(synq.domains.v2.BatchGetRequest)BatchGetResponse
(synq.domains.v2.BatchGetResponse)BatchGetResponse.DomainsEntry
(synq.domains.v2.BatchGetResponse.DomainsEntry)DeleteRequest
(synq.domains.v2.DeleteRequest)DeleteResponse
(synq.domains.v2.DeleteResponse)FetchDomainWithSubDomainsRequest
(synq.domains.v2.FetchDomainWithSubDomainsRequest)FetchDomainWithSubDomainsResponse
(synq.domains.v2.FetchDomainWithSubDomainsResponse)FetchDomainWithSubDomainsResponse.DomainsEntry
(synq.domains.v2.FetchDomainWithSubDomainsResponse.DomainsEntry)GetUsageRequest
(synq.domains.v2.GetUsageRequest)GetUsageResponse
(synq.domains.v2.GetUsageResponse)ListMembersRequest
(synq.domains.v2.ListMembersRequest)ListMembersResponse
(synq.domains.v2.ListMembersResponse)ListRequest
(synq.domains.v2.ListRequest)ListResponse
(synq.domains.v2.ListResponse)RemoveDefinitionPartRequest
(synq.domains.v2.RemoveDefinitionPartRequest)RemoveDefinitionPartResponse
(synq.domains.v2.RemoveDefinitionPartResponse)SetDefinitionRequest
(synq.domains.v2.SetDefinitionRequest)SetDefinitionResponse
(synq.domains.v2.SetDefinitionResponse)UpsertDefinitionPartRequest
(synq.domains.v2.UpsertDefinitionPartRequest)UpsertDefinitionPartResponse
(synq.domains.v2.UpsertDefinitionPartResponse)UpsertRequest
(synq.domains.v2.UpsertRequest)UpsertResponse
(synq.domains.v2.UpsertResponse)Domain
(synq.domains.v2.Domain) A data domain: a named area of ownership that groups the assets, data products and sub-domains belonging to one part of the business. Domains form a hierarchy throughparent_id, and a parent’s membership
includes everything its sub-domains contain.
DomainMembership
(synq.domains.members.v1.DomainMembership)AddDomainMembersRequest
(synq.domains.members.v1.AddDomainMembersRequest)AddDomainMembersResponse
(synq.domains.members.v1.AddDomainMembersResponse)ListDomainMembersRequest
(synq.domains.members.v1.ListDomainMembersRequest)ListDomainMembersResponse
(synq.domains.members.v1.ListDomainMembersResponse)ListUserDomainsRequest
(synq.domains.members.v1.ListUserDomainsRequest)ListUserDomainsResponse
(synq.domains.members.v1.ListUserDomainsResponse)RemoveDomainMembersRequest
(synq.domains.members.v1.RemoveDomainMembersRequest)RemoveDomainMembersResponse
(synq.domains.members.v1.RemoveDomainMembersResponse)SetDefaultUserDomainRequest
(synq.domains.members.v1.SetDefaultUserDomainRequest)SetDefaultUserDomainResponse
(synq.domains.members.v1.SetDefaultUserDomainResponse)ActivateRequest
(synq.extensions.atlan.integrations.v1.ActivateRequest)ActivateResponse
(synq.extensions.atlan.integrations.v1.ActivateResponse)GetRequest
(synq.extensions.atlan.integrations.v1.GetRequest)GetResponse
(synq.extensions.atlan.integrations.v1.GetResponse)PingRequest
(synq.extensions.atlan.integrations.v1.PingRequest)PingResponse
(synq.extensions.atlan.integrations.v1.PingResponse)RemoveRequest
(synq.extensions.atlan.integrations.v1.RemoveRequest)RemoveResponse
(synq.extensions.atlan.integrations.v1.RemoveResponse)UpsertRequest
(synq.extensions.atlan.integrations.v1.UpsertRequest)UpsertResponse
(synq.extensions.atlan.integrations.v1.UpsertResponse)Integration
(synq.extensions.atlan.integrations.v1.Integration)DomainMappingToggle
(synq.extensions.atlan.workflows.v1.DomainMappingToggle)MappingToggle
(synq.extensions.atlan.workflows.v1.MappingToggle)ProductMappingToggle
(synq.extensions.atlan.workflows.v1.ProductMappingToggle)ProductOwnerMappingToggle
(synq.extensions.atlan.workflows.v1.ProductOwnerMappingToggle)CommandResult
(synq.extensions.atlan.workflows.v1.CommandResult)Log
(synq.extensions.atlan.workflows.v1.Log)Log.MetadataEntry
(synq.extensions.atlan.workflows.v1.Log.MetadataEntry)WorkflowRun
(synq.extensions.atlan.workflows.v1.WorkflowRun)ConnectionMapping
(synq.extensions.atlan.workflows.v1.ConnectionMapping)DomainMapping
(synq.extensions.atlan.workflows.v1.DomainMapping)ProductMapping
(synq.extensions.atlan.workflows.v1.ProductMapping)FetchRunsRequest
(synq.extensions.atlan.workflows.v1.FetchRunsRequest)FetchRunsResponse
(synq.extensions.atlan.workflows.v1.FetchRunsResponse)GetConnectionMappingsRequest
(synq.extensions.atlan.workflows.v1.GetConnectionMappingsRequest)GetConnectionMappingsResponse
(synq.extensions.atlan.workflows.v1.GetConnectionMappingsResponse)GetDomainMappingsRequest
(synq.extensions.atlan.workflows.v1.GetDomainMappingsRequest)GetDomainMappingsResponse
(synq.extensions.atlan.workflows.v1.GetDomainMappingsResponse)GetMappingTogglesRequest
(synq.extensions.atlan.workflows.v1.GetMappingTogglesRequest)GetMappingTogglesResponse
(synq.extensions.atlan.workflows.v1.GetMappingTogglesResponse)GetProductMappingsRequest
(synq.extensions.atlan.workflows.v1.GetProductMappingsRequest)GetProductMappingsResponse
(synq.extensions.atlan.workflows.v1.GetProductMappingsResponse)RemoveConnectionMappingsRequest
(synq.extensions.atlan.workflows.v1.RemoveConnectionMappingsRequest)RemoveConnectionMappingsResponse
(synq.extensions.atlan.workflows.v1.RemoveConnectionMappingsResponse)SetConnectionMappingsRequest
(synq.extensions.atlan.workflows.v1.SetConnectionMappingsRequest)SetConnectionMappingsResponse
(synq.extensions.atlan.workflows.v1.SetConnectionMappingsResponse)SetMappingTogglesRequest
(synq.extensions.atlan.workflows.v1.SetMappingTogglesRequest)SetMappingTogglesResponse
(synq.extensions.atlan.workflows.v1.SetMappingTogglesResponse)SynchronizeRequest
(synq.extensions.atlan.workflows.v1.SynchronizeRequest)SynchronizeResponse
(synq.extensions.atlan.workflows.v1.SynchronizeResponse)AtlanConnection
(synq.extensions.atlan.provider.v1.AtlanConnection)AtlanDataDomain
(synq.extensions.atlan.provider.v1.AtlanDataDomain)AtlanDataProduct
(synq.extensions.atlan.provider.v1.AtlanDataProduct)AtlanDataProduct.Emails
(synq.extensions.atlan.provider.v1.AtlanDataProduct.Emails)AtlanDataProduct.OwnerGroupsEntry
(synq.extensions.atlan.provider.v1.AtlanDataProduct.OwnerGroupsEntry)GetAtlanConnectionsRequest
(synq.extensions.atlan.provider.v1.GetAtlanConnectionsRequest)GetAtlanConnectionsResponse
(synq.extensions.atlan.provider.v1.GetAtlanConnectionsResponse)GetAtlanDataProductsRequest
(synq.extensions.atlan.provider.v1.GetAtlanDataProductsRequest)GetAtlanDataProductsResponse
(synq.extensions.atlan.provider.v1.GetAtlanDataProductsResponse)GetAtlanDomainsRequest
(synq.extensions.atlan.provider.v1.GetAtlanDomainsRequest)GetAtlanDomainsResponse
(synq.extensions.atlan.provider.v1.GetAtlanDomainsResponse)Enums
Outcome
(synq.deliveries.v1.Outcome) Outcome is what became of a delivery. It is a state the service maintains, not something to recompute from status codes: a 500 that will be retried and a 500 that exhausted the retries are the same status and different outcomes.SubjectType
(synq.deliveries.v1.SubjectType)StatusClass
(synq.deliveries.v1.StatusClass) StatusClass groups HTTP statuses the way a delivery report reads them.SkipReason
(synq.deliveries.v1.SkipReason) SkipReason says why a delivery sent nothing. Every code path that declines to send names one, so an integration that appears silent can be explained rather than guessed at. It is an enum rather than a message we wrote once, so a caller can act on the reason: a not-subscribed event is fixed in the integration’s settings, a disabled integration is fixed by enabling it, and an unsupported event type is not fixable at all.LineageObjectDomain
(synq.ingest.dwh.v1.LineageObjectDomain) LineageObjectDomain classifies what KIND of warehouse object sits at one end of a lineage edge. It lets the platform tell real table-to-table lineage apart from edges that touch warehouse-internal or non-tabular objects (load stages, streams, semantic views, …), which are rendered differently (or hidden) in the lineage graph. The values mirror the object domains a warehouse’s native lineage feature reports (for example the domains returned by Snowflake’s GET_LINEAGE) plus the common equivalents on other warehouses. Set UNSPECIFIED when the producer cannot determine the domain — the edge is still stored, just without the table-vs-builtin distinction.LineageSource
(synq.ingest.dwh.v1.LineageSource) LineageSource records HOW the lineage was derived. The platform uses it both to set the precedence of the resulting edges and to keep lineage of different origins from silently overwriting one another: declared lineage is additive to observed lineage, it never replaces it. Pick the single value that best describes the whole batch.LineageReplaceMode
(synq.ingest.dwh.v1.LineageReplaceMode) LineageReplaceMode controls how an ingested batch interacts with lineage that was ingested earlier, and therefore when previously-ingested edges become outdated and stop contributing to dependencies.SqlObfuscationMode
(synq.ingest.dwh.v1.SqlObfuscationMode) SqlObfuscationMode represents the level of SQL obfuscation applied to query logs. This is critical for on-premise deployments where customers want to prevent sensitive data in SQL queries from being sent to Coalesce Quality backend.TestAlertKind
(synq.alerts.services.v2.TestAlertKind) The alert kind a test message stands in for. It only selects the wording of the message; the targets receive the same static test regardless.FolderRole
(synq.entities.folders.v1.FolderRole) FolderRole describes how a folder placement participates in browsing. It mirrors the placement roles carried by the catalog.PropagationFilter
(synq.entities.checks.v1.PropagationFilter) PropagationFilter controls which types of checks are included in the coverage response.CategoryDimension
(synq.entities.checks.v2.CategoryDimension) The dimension a category classifies a check along. A check carries at most one category per dimension, and the two resolve independently of each other.CategorySource
(synq.entities.checks.v2.CategorySource) Where a check’s effective category came from. The three sources are a strict precedence: an admin override beats a producer-explicit category, which beats a computed one.RuleScope
(synq.entities.checks.v2.RuleScope) Whether a categorisation rule belongs to the workspace or is one of the platform-provided defaults.CategorisationFilter
(synq.entities.checks.v2.CategorisationFilter) Narrows a listing to checks that do — or do not — have an effective category on a dimension.OverrideFilter
(synq.entities.checks.v2.OverrideFilter) Narrows a listing to checks that do — or do not — carry a category set explicitly on them on a dimension.RecategorisationStatus.State
(synq.entities.checks.v2.RecategorisationStatus.State)EntityType
(synq.entities.v1.EntityType)ExecutionType
(synq.entities.v1.ExecutionType)SqlDialect
(synq.entities.v1.SqlDialect)CodeSource
(synq.entities.v1.CodeSource) CodeSource names one of the places an entity’s code is read from. An entity usually has code in more than one of them — a dbt model has its own source and the warehouse table’s DDL — and each is read independently, so one being unavailable does not hide the others.TableConstraintType
(synq.entities.v1.TableConstraintType) TableConstraintType represents the type of a database table constraint or index.EntityChangeType
(synq.entities.v1.EntityChangeType)SqlConstruct
(synq.entities.v1.SqlConstruct) SqlConstruct enumerates the SQL features detected in an entity’s query. Multiple values can be set on a single statement (e.g. a query with both a CTE and an INNER JOIN carries HAS_CTE, HAS_ANY_JOIN and INNER_JOIN).CodeType
(synq.entities.v1.CodeType) CodeType describes how to read the body of a Code — which language or format itscontent is written in, so a client can highlight, parse or
hand it to the right tool.
A producer that cannot tell leaves CODE_TYPE_UNSPECIFIED rather than
guessing; treat that as plain text.
IssueStatus
(synq.entities.status.v1.IssueStatus)CllState
(synq.entities.lineage.v1.CllState)NodePosition
(synq.entities.lineage.v1.NodePosition)LineageDirection
(synq.entities.lineage.v1.LineageDirection) Direction of the lineage to query.ExecutionStatus
(synq.entities.custom.v1.ExecutionStatus)RelationshipWriteOutcome
(synq.entities.custom.v1.RelationshipWriteOutcome) RelationshipWriteOutcome is the effect one requested write had.ExecutionStatus
(synq.entities.executions.v1.ExecutionStatus)ExecutionStatus
(synq.entities.executions.v2.ExecutionStatus) ExecutionStatus represents the outcome of an execution.CoverageFilter
(synq.overlays.v1.CoverageFilter) CoverageFilter narrows the candidates to those in a particular coverage state. It never widens them: everything it can return was in the selection.Freshness
(synq.overlays.v1.Freshness) Freshness chooses what a coverage answer is computed from.
One limit worth knowing before you rely on it. This settles whether an asset is covered as of now; naming which overlays claim it still needs the recomputed membership, and that half can lag. So a row is never inconsistent with the filter that selected it — an asset this call finds uncovered comes back with empty lists whatever the index still says — but an asset that has only just started matching a rule can come back covered with nothing named yet. Counts and filters are exact either way; it is the id lists that catch up on the next recomputation. |
DelayModel
(synq.monitors.v1.DelayModel) How the expected arrival time of new data is modelled, for the delay and volume change delay metrics. Only table stats monitors produce those metrics, so the choice has no effect on any other monitor type.DeploymentRuleType
(synq.monitors.automated_monitors.v1.DeploymentRuleType) DeploymentRuleType identifies which kind of selection a deployment rule uses. The value corresponds to the populatedconfig oneof arm on
MonitorsDeploymentRule / MonitorsDeploymentRuleView. Use it with
ListDeploymentRulesRequest.rule_types to return only rules of selected kinds.
MetricId
(synq.monitors.automated_monitors.v1.MetricId)Sensitivity
(synq.monitors.automated_monitors.v1.Sensitivity)Severity
(synq.monitors.automated_monitors.v1.Severity)SkipReason
(synq.monitors.automated_monitors.v1.SkipReason) SkipReason is the checkable form of SkippedAsset.reason. Values mirror the SCREAMING_SNAKE tokens documented on that field one-for-one. The set is open by design — a producer may report a reason before this enum has a matching value for it — so a client must treat SKIP_REASON_UNSPECIFIED (and any value this client predates) as “skipped, reason unrecognised” rather than as proof nothing applies.MonitorDefinition.Source
(synq.monitors.custom_monitors.v1.MonitorDefinition.Source)Sensitivity
(synq.monitors.custom_monitors.v1.Sensitivity)Severity
(synq.monitors.custom_monitors.v1.Severity)QueryOperand
(synq.queries.v1.QueryOperand) QueryOperand defines how multiple QueryParts within a Query are combined.Scope
(synq.v1.Scope)Source
(synq.v1.Source)Severity
(synq.v1.Severity)DatacheckStatus
(synq.datachecks.v1.DatacheckStatus) Result of a datacheck executionSeverity
(synq.datachecks.sqltests.v1.Severity)SqlTestDeploymentRuleType
(synq.datachecks.sqltests.v1.SqlTestDeploymentRuleType) SqlTestDeploymentRuleType identifies which kind of selection a deployment rule uses. The value corresponds to the populatedconfig oneof arm on
SqlTestDeploymentRule / SqlTestDeploymentRuleView. Use it with
ListSqlTestDeploymentRulesRequest.rule_types to return only rules of selected
kinds.
SqlTestSkipReason
(synq.datachecks.sqltests.v1.SqlTestSkipReason) SqlTestSkipReason is the checkable form of thereason string carried by
SqlTestsDeploymentOverview.SkippedTable and .SkippedTest, mirroring the
SCREAMING_SNAKE tokens documented on those fields one-for-one. It also carries
the reason a SqlTestDeploymentChange deletes a test, which has no string form.
The set is open by design — a producer may report a reason before this enum has
a matching value for it — so a client must treat SQL_TEST_SKIP_REASON_UNSPECIFIED
(and any value this client predates) as “skipped, reason unrecognised” rather
than as proof nothing applies.
HealthStatus
(synq.integrations.v1.HealthStatus) Health status of an integration, derived from its most recent runs.ClickhouseClusterMode
(synq.integrations.v1.ClickhouseClusterMode)LifecycleState
(synq.issues.issues.v1.LifecycleState) Issue LifecycleState represents the current state of the issue in its life-cycle. The state is exclusively determined as per the priority which is in the order of the fields below.Severity
(synq.issues.issues.v1.Severity)State
(synq.issues.issues.v1.State) Whether the issue is open / close.Status
(synq.issues.issues.v1.Status) Progress status of the issue.Actor.Via
(synq.issues.actor.v1.Actor.Via)ListIssuesRequest.Field
(synq.issues.v2.ListIssuesRequest.Field)ListIssuesRequest.Sort.Order
(synq.issues.v2.ListIssuesRequest.Sort.Order)Event.EventType
(synq.webhooks.v1.Event.EventType)IssueSummary.IssueStatus
(synq.webhooks.v1.IssueSummary.IssueStatus)Dataproduct.Priority
(synq.dataproducts.v1.Dataproduct.Priority)Dataproduct.Source
(synq.dataproducts.v1.Dataproduct.Source)Dataproduct.Priority
(synq.dataproducts.v2.Dataproduct.Priority) Priority. P1 is the highest.Dataproduct.Source
(synq.dataproducts.v2.Dataproduct.Source) Where this data product is managed. Products from an external source (e.g. Atlan) are read-only in the app.SnapDirection
(synq.schedule.v1.SnapDirection) SnapDirection constrains which way an occurrence may move to reach the grid.Owner.Source
(synq.owners.v1.Owner.Source) Where the owner is managed. Owners from an external source (e.g. Atlan) are read-only.ClickhouseClusterMode
(synq.agent.dwh.v1.ClickhouseClusterMode)Config.Agent.LogLevel
(synq.agent.dwh.v1.Config.Agent.LogLevel)LogLevel
(synq.agent.dwh.v1.LogLevel)PromptField
(synq.agent.sre.v1.PromptField) PromptField identifies which SRE agent system-prompt a suggestion targets. Mirrors the four*_system_prompt fields returned by GetConfig.
PromptSuggestionStatus
(synq.agent.sre.v1.PromptSuggestionStatus) PromptSuggestionStatus is the review lifecycle of a single prompt suggestion.SUPERSEDED indicates a newer pending suggestion for the same field replaced
this one before it was reviewed.