openapi: 3.0.1
info:
title: OpenMetadata APIs Agent Executions Columns API
description: Common types and API definition for OpenMetadata
contact:
name: OpenMetadata
url: https://open-metadata.org
email: openmetadata-dev@googlegroups.com
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0
version: '1.13'
servers:
- url: /api
description: Current Host
- url: http://localhost:8585/api
description: Endpoint URL
security:
- BearerAuth: []
tags:
- name: Columns
description: Columns represent individual data fields within tables and dashboard data models. This API provides operations to update column metadata such as tags, glossary terms, descriptions, and other properties using the column's fully qualified name.
paths:
/v1/columns/bulk-update-async:
post:
tags:
- Columns
summary: Bulk update columns asynchronously
description: Update multiple columns across different entities asynchronously. This endpoint accepts a list of column updates and processes them in the background. Returns a job ID that can be used to track progress via WebSocket notifications. Updates are applied to column metadata including description, display name, tags, and glossary terms.
operationId: bulkUpdateColumnsAsync
requestBody:
description: Bulk column update request
content:
application/json:
schema:
$ref: '#/components/schemas/BulkColumnUpdateRequest'
responses:
'200':
description: Bulk update job initiated
content:
application/json:
schema:
$ref: '#/components/schemas/CSVImportResponse'
'400':
description: Bad request
/v1/columns/bulk-update-preview:
post:
tags:
- Columns
summary: Preview bulk column updates (dry-run)
description: Preview what columns will be updated without making actual changes. Returns a detailed diff showing current vs new values for each matching column. Use this to review changes before executing the actual bulk update. Supports both search-based (columnName + filters) and explicit (columnUpdates list) modes.
operationId: bulkUpdateColumnsPreview
requestBody:
description: Bulk column update request
content:
application/json:
schema:
$ref: '#/components/schemas/BulkColumnUpdateRequest'
responses:
'200':
description: Preview of column updates
content:
application/json:
schema:
$ref: '#/components/schemas/BulkColumnUpdatePreview'
'400':
description: Bad request
/v1/columns/export:
get:
tags:
- Columns
summary: Export unique column names to CSV
description: Export all unique column names across entity types to CSV format. The CSV includes column metadata (name, displayName, description, tags, glossaryTerms) for bulk editing. Supports filtering by entity types, service, database, schema, and domain.
operationId: exportUniqueColumns
parameters:
- name: columnName
in: query
description: Column name to filter by
schema:
type: string
example: order_id
- name: entityTypes
in: query
description: Filter by entity types (comma-separated)
schema:
type: string
example: table,dashboardDataModel
- name: serviceName
in: query
description: Filter by service name
schema:
type: string
example: sample_data
- name: databaseName
in: query
description: Filter by database name
schema:
type: string
example: ecommerce_db
- name: schemaName
in: query
description: Filter by schema name
schema:
type: string
example: shopify
- name: domainId
in: query
description: Filter by domain ID
schema:
type: string
responses:
'200':
description: CSV export of unique columns
content:
text/plain:
schema:
type: string
'400':
description: Bad request
/v1/columns/name/{fqn}:
get:
tags:
- Columns
summary: Get a column by fully qualified name
description: Retrieve a single column by its fully qualified name. The parent entity type must be specified. Supports field projection via the 'fields' parameter (e.g. tags, customMetrics, extension, profile).
operationId: getColumnByFQN
parameters:
- name: fqn
in: path
description: Fully qualified name of the column
required: true
schema:
type: string
example: sample_data.ecommerce_db.shopify.dim_address.address_id
- name: entityType
in: query
description: Entity type of the parent entity (table or dashboardDataModel)
required: true
schema:
type: string
enum:
- table
- dashboardDataModel
example: table
- name: fields
in: query
description: 'Fields to include in the response (comma-separated). Supported: tags, customMetrics, extension, profile'
schema:
type: string
example: tags,customMetrics,extension,profile
- name: include
in: query
description: Include all, deleted, or non-deleted entities.
schema:
type: string
default: non-deleted
enum:
- all
- deleted
- non-deleted
responses:
'200':
description: The column
content:
application/json:
schema:
$ref: '#/components/schemas/Column'
'400':
description: Bad request
'404':
description: Column not found
put:
tags:
- Columns
summary: Update a column by fully qualified name
description: "Update column metadata such as display name, description, tags, glossary terms, and other properties. This API works for columns in both tables and dashboard data models. The column is identified by its fully qualified name and the parent entity type is specified. \n\nTag Management Examples:\n• Add tags: {\"tags\": [{\"tagFQN\": \"PersonalData.PII\", \"source\": \"Classification\"}]}\n• Remove specific tag: {\"tags\": []} (specify only tags you want to keep)\n• Remove all tags: {\"tags\": []}\n• Mix classifications and glossary terms: {\"tags\": [{\"tagFQN\": \"PII.Sensitive\", \"source\": \"Classification\"}, {\"tagFQN\": \"Glossary.CustomerData\", \"source\": \"Glossary\"}]}\n• Don't change tags: omit the 'tags' field entirely\n\nValidation Rules:\n• Invalid or non-existent tags/glossary terms will result in a 404 error\n• All tags and glossary terms must exist and be valid before the request succeeds"
operationId: updateColumnByFQN
parameters:
- name: fqn
in: path
description: Fully qualified name of the column
required: true
schema:
type: string
example: sample_data.ecommerce_db.shopify.dim_address.address_id
- name: entityType
in: query
description: Entity type of the parent entity (table or dashboardDataModel)
required: true
schema:
type: string
enum:
- table
- dashboardDataModel
example: table
requestBody:
description: Column update payload
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateColumn'
responses:
'200':
description: The updated column
content:
application/json:
schema:
$ref: '#/components/schemas/Column'
'400':
description: Bad request
'404':
description: Column not found
/v1/columns/grid:
get:
tags:
- Columns
summary: Get column grid with metadata grouping
description: Returns unique columns with metadata variations grouped for grid-based editing. Uses scalable Elasticsearch/OpenSearch aggregations with cursor-based pagination. Columns with the same name but different metadata (description, tags, etc.) are grouped by metadata hash, allowing efficient bulk editing of similar columns.
operationId: getColumnGrid
parameters:
- name: size
in: query
description: Number of columns per batch (max 10000)
schema:
type: integer
format: int32
default: 1000
example: 1000
- name: cursor
in: query
description: Cursor for pagination
schema:
type: string
- name: columnNamePattern
in: query
description: Column name pattern (wildcard search)
schema:
type: string
example: order
- name: entityTypes
in: query
description: Filter by entity types (comma-separated)
schema:
type: string
example: table,dashboardDataModel
- name: serviceName
in: query
description: Filter by service name
schema:
type: string
example: sample_data
- name: serviceTypes
in: query
description: Filter by service types (comma-separated)
schema:
type: string
example: BigQuery,Mysql,Postgres
- name: databaseName
in: query
description: Filter by database name
schema:
type: string
example: ecommerce_db
- name: schemaName
in: query
description: Filter by schema name
schema:
type: string
example: shopify
- name: domainId
in: query
description: Filter by domain ID
schema:
type: string
- name: hasConflicts
in: query
description: Show only columns with conflicting metadata
schema:
type: boolean
default: false
- name: hasMissingMetadata
in: query
description: Show only columns with missing metadata
schema:
type: boolean
default: false
- name: metadataStatus
in: query
description: 'Filter by metadata status: MISSING (no description AND no tags), INCOMPLETE (has description OR tags, but not both), COMPLETE (has both description AND tags)'
schema:
type: string
enum:
- MISSING
- INCOMPLETE
- COMPLETE
- name: tags
in: query
description: Filter by classification tags at column level (comma-separated tag FQNs)
schema:
type: string
example: PII.Sensitive,PersonalData.Email
- name: glossaryTerms
in: query
description: Filter by glossary terms at column level (comma-separated glossary term FQNs)
schema:
type: string
example: Business.CustomerData,Business.Revenue
responses:
'200':
description: Column grid response with grouped metadata
content:
application/json:
schema:
$ref: '#/components/schemas/ColumnGridResponse'
'400':
description: Bad request
/v1/columns/import:
post:
tags:
- Columns
summary: Import column metadata from CSV (with dry-run)
description: Import column metadata updates from CSV. Each row should contain column name and metadata fields. The system will search for all occurrences of each column name and apply the updates. Supports dry-run mode to preview changes before applying.
operationId: importUniqueColumns
parameters:
- name: dryRun
in: query
description: Dry-run mode for validation without applying changes
schema:
type: boolean
default: true
- name: entityTypes
in: query
description: Filter by entity types (comma-separated)
schema:
type: string
example: table,dashboardDataModel
- name: serviceName
in: query
description: Filter by service name
schema:
type: string
- name: databaseName
in: query
description: Filter by database name
schema:
type: string
- name: schemaName
in: query
description: Filter by schema name
schema:
type: string
- name: domainId
in: query
description: Filter by domain ID
schema:
type: string
requestBody:
content:
text/plain:
schema:
type: string
responses:
'200':
description: CSV import result
content:
application/json:
schema:
$ref: '#/components/schemas/CsvImportResult'
'400':
description: Bad request
/v1/columns/import-async:
post:
tags:
- Columns
summary: Import column metadata from CSV asynchronously
description: Import column metadata updates from CSV asynchronously. Returns a job ID for tracking progress via WebSocket notifications.
operationId: importUniqueColumnsAsync
parameters:
- name: entityTypes
in: query
description: Filter by entity types (comma-separated)
schema:
type: string
example: table,dashboardDataModel
- name: serviceName
in: query
description: Filter by service name
schema:
type: string
- name: databaseName
in: query
description: Filter by database name
schema:
type: string
- name: schemaName
in: query
description: Filter by schema name
schema:
type: string
- name: domainId
in: query
description: Filter by domain ID
schema:
type: string
requestBody:
content:
text/plain:
schema:
type: string
responses:
'200':
description: Async import job initiated
content:
application/json:
schema:
$ref: '#/components/schemas/CSVImportResponse'
'400':
description: Bad request
/v1/columns/search:
get:
tags:
- Columns
summary: Search and group columns by name
description: Search for columns across different entity types and group them by exact column name match. This endpoint helps identify unique column names and their occurrences across tables, dashboard data models, containers, and search indexes. Supports filtering by entity type, service, database, schema, and domain.
operationId: searchColumns
parameters:
- name: columnName
in: query
description: Column name to search for
schema:
type: string
example: order_id
- name: entityTypes
in: query
description: Filter by entity types (comma-separated)
schema:
type: string
example: table,dashboardDataModel
- name: serviceName
in: query
description: Filter by service name
schema:
type: string
example: sample_data
- name: databaseName
in: query
description: Filter by database name
schema:
type: string
example: ecommerce_db
- name: schemaName
in: query
description: Filter by schema name
schema:
type: string
example: shopify
- name: domainId
in: query
description: Filter by domain ID
schema:
type: string
responses:
'200':
description: List of grouped columns
content:
application/json:
schema:
$ref: '#/components/schemas/GroupedColumnsResponse'
'400':
description: Bad request
components:
schemas:
TagLabelRecognizerMetadata:
required:
- recognizerId
- recognizerName
- score
type: object
properties:
recognizerId:
type: string
format: uuid
recognizerName:
type: string
score:
type: number
format: double
target:
type: string
enum:
- content
- column_name
patterns:
type: array
items:
$ref: '#/components/schemas/PatternMatch'
ColumnChild:
required:
- name
type: object
properties:
name:
type: string
fullyQualifiedName:
type: string
displayName:
type: string
description:
type: string
dataType:
type: string
tags:
type: array
items:
$ref: '#/components/schemas/TagLabel'
children:
type: array
items:
$ref: '#/components/schemas/ColumnChild'
BulkColumnUpdateRequest:
type: object
properties:
columnName:
type: string
entityTypes:
type: array
items:
type: string
serviceName:
type: string
databaseName:
type: string
schemaName:
type: string
domainId:
type: string
format: uuid
displayName:
type: string
description:
type: string
tags:
type: array
items:
$ref: '#/components/schemas/TagLabel'
columnUpdates:
type: array
items:
$ref: '#/components/schemas/ColumnUpdate'
dryRun:
type: boolean
ColumnProfile:
required:
- name
- timestamp
type: object
properties:
name:
type: string
timestamp:
type: integer
format: int64
valuesCount:
type: number
format: double
valuesPercentage:
type: number
format: double
validCount:
type: number
format: double
duplicateCount:
type: number
format: double
nullCount:
type: number
format: double
nullProportion:
type: number
format: double
missingPercentage:
type: number
format: double
missingCount:
type: number
format: double
uniqueCount:
type: number
format: double
uniqueProportion:
type: number
format: double
distinctCount:
type: number
format: double
distinctProportion:
type: number
format: double
min:
type: object
max:
type: object
minLength:
type: number
format: double
maxLength:
type: number
format: double
mean:
type: number
format: double
sum:
type: number
format: double
stddev:
type: number
format: double
variance:
type: number
format: double
median:
type: number
format: double
firstQuartile:
type: number
format: double
thirdQuartile:
type: number
format: double
interQuartileRange:
type: number
format: double
nonParametricSkew:
type: number
format: double
histogram:
$ref: '#/components/schemas/Histogram'
customMetrics:
type: array
items:
$ref: '#/components/schemas/CustomMetricProfile'
cardinalityDistribution:
$ref: '#/components/schemas/CardinalityDistribution'
BulkColumnUpdatePreview:
required:
- columnPreviews
- totalColumns
type: object
properties:
totalColumns:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
columnPreviews:
type: array
items:
$ref: '#/components/schemas/ColumnUpdatePreview'
ColumnMetadataGroup:
required:
- groupId
- occurrenceCount
- occurrences
type: object
properties:
groupId:
type: string
displayName:
type: string
description:
type: string
tags:
type: array
items:
$ref: '#/components/schemas/TagLabel'
dataType:
type: string
metadataStatus:
type: string
enum:
- MISSING
- INCOMPLETE
- INCONSISTENT
- COMPLETE
occurrenceCount:
minimum: 1
exclusiveMinimum: false
type: integer
format: int32
occurrences:
type: array
items:
$ref: '#/components/schemas/ColumnOccurrenceRef'
children:
type: array
items:
$ref: '#/components/schemas/ColumnChild'
CoverImage:
type: object
properties:
url:
type: string
position:
type: string
ColumnOccurrenceRef:
required:
- columnFQN
- entityFQN
- entityType
type: object
properties:
columnFQN:
type: string
entityType:
type: string
entityFQN:
type: string
entityDisplayName:
type: string
serviceName:
type: string
databaseName:
type: string
schemaName:
type: string
ColumnGridResponse:
required:
- columns
- totalOccurrences
- totalUniqueColumns
type: object
properties:
columns:
type: array
items:
$ref: '#/components/schemas/ColumnGridItem'
totalUniqueColumns:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
totalOccurrences:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
cursor:
type: string
ColumnUpdate:
required:
- columnFQN
- entityType
type: object
properties:
columnFQN:
type: string
entityType:
type: string
displayName:
type: string
description:
type: string
tags:
type: array
items:
$ref: '#/components/schemas/TagLabel'
CustomMetricProfile:
type: object
properties:
name:
type: string
value:
type: number
format: double
CardinalityDistribution:
type: object
properties:
categories:
type: array
items:
type: string
counts:
type: array
items:
type: integer
format: int32
percentages:
type: array
items:
type: number
format: double
allValuesUnique:
type: boolean
CustomMetric:
required:
- expression
- name
type: object
properties:
id:
type: string
format: uuid
name:
maxLength: 256
minLength: 1
pattern: ^((?!::).)*$
type: string
description:
type: string
columnName:
type: string
expression:
type: string
owners:
type: array
items:
$ref: '#/components/schemas/EntityReference'
updatedAt:
type: integer
format: int64
updatedBy:
type: string
ColumnGridItem:
required:
- columnName
- groups
- hasVariations
- totalOccurrences
type: object
properties:
columnName:
type: string
totalOccurrences:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
hasVariations:
type: boolean
metadataStatus:
type: string
enum:
- MISSING
- INCOMPLETE
- INCONSISTENT
- COMPLETE
groups:
type: array
items:
$ref: '#/components/schemas/ColumnMetadataGroup'
ColumnUpdatePreview:
required:
- columnFQN
- currentValues
- entityFQN
- entityType
- hasChanges
- newValues
type: object
properties:
columnFQN:
type: string
entityType:
type: string
entityFQN:
type: string
entityDisplayName:
type: string
serviceName:
type: string
databaseName:
type: string
schemaName:
type: string
currentValues:
$ref: '#/components/schemas/ColumnMetadata'
newValues:
$ref: '#/components/schemas/ColumnMetadata'
hasChanges:
type: boolean
CSVImportResponse:
type: object
properties:
jobId:
type: string
message:
type: string
Column:
required:
- dataType
- name
type: object
properties:
name:
maxLength: 2147483647
minLength: 1
pattern: ^((?!::).)*$
type: string
displayName:
type: string
dataType:
type: string
enum:
- NUMBER
- TINYINT
- SMALLINT
- INT
- BIGINT
- BYTEINT
- BYTES
- FLOAT
- DOUBLE
- DECIMAL
- NUMERIC
- TIMESTAMP
- TIMESTAMPZ
- TIME
- DATE
- DATETIME
- INTERVAL
- STRING
- MEDIUMTEXT
- TEXT
- CHAR
- LONG
- VARCHAR
- BOOLEAN
- BINARY
- VARBINARY
- ARRAY
- BLOB
- LONGBLOB
- MEDIUMBLOB
- MAP
- STRUCT
- UNION
- SET
- GEOGRAPHY
- ENUM
- JSON
- UUID
- VARIANT
- GEOMETRY
- BYTEA
- AGGREGATEFUNCTION
- ERROR
- FIXED
- RECORD
- 'NULL'
- SUPER
- HLLSKETCH
- PG_LSN
- PG_SNAPSHOT
- TSQUERY
- TXID_SNAPSHOT
- XML
- MACADDR
- TSVECTOR
- UNKNOWN
- CIDR
- INET
- CLOB
- ROWID
- LOWCARDINALITY
- YEAR
- POINT
- POLYGON
- TUPLE
- SPATIAL
- TABLE
- NTEXT
- IMAGE
- IPV4
- IPV6
- DATETIMERANGE
- HLL
- LARGEINT
- QUANTILE_STATE
- AGG_STATE
- BITMAP
- UINT
- BIT
- MONEY
- MEASURE HIDDEN
- MEASURE VISIBLE
- MEASURE
- KPI
- HEIRARCHY
- HIERARCHYID
arrayDataType:
type: string
enum:
- NUMBER
- TINYINT
- SMALLINT
- INT
- BIGINT
- BYTEINT
- BYTES
- FLOAT
- DOUBLE
- DECIMAL
- NUMERIC
- TIMESTAMP
- TIMESTAMPZ
- TIME
- DATE
- DATETIME
- INTERVAL
- STRING
- MEDIUMTEXT
- TEXT
- CHAR
- LONG
- VARCHAR
- BOOLEAN
- BINARY
- VARBINARY
- ARRAY
- BLOB
- LONGBLOB
- MEDIUMBLOB
- MAP
- STRUCT
- UNION
- SET
- GEOGRAPHY
- ENUM
- JSON
- UUID
- VARIANT
- GEOMETRY
- BYTEA
- AGGREGATEFUNCTION
- ERROR
- FIXED
- RECORD
- 'NULL'
- SUPER
- HLLSKETCH
- PG_LSN
- PG_SNAPSHOT
- TSQUERY
- TXID_SNAPSHOT
- XML
- MACADDR
- TSVECTOR
- UNKNOWN
- CIDR
- INET
- CLOB
- ROWID
- LOWCARDINALITY
- YEAR
- POINT
- POLYGON
- TUPLE
- SPATIAL
- TABLE
- NTEXT
- IMAGE
- IPV4
- IPV6
- DATETIMERANGE
- HLL
- LARGEINT
- QUANTILE_STATE
- AGG_STATE
- BITMAP
- UINT
- BIT
- MONEY
- MEASURE HIDDEN
- MEASURE VISIBLE
- MEASURE
- KPI
- HEIRARCHY
- HIERARCHYID
dataLength:
type: integer
format: int32
precision:
type: integer
format: int32
scale:
type: integer
format: int32
dataTypeDisplay:
type: string
description:
type: string
fullyQualifiedName:
maxLength: 3072
minLength: 1
type: string
tags:
type: array
items:
$ref: '#/components/schemas/TagLabel'
constraint:
type: string
enum:
- 'NULL'
- NOT_NULL
- UNIQUE
- PRIMARY_KEY
ordinalPosition:
type: integer
format: int32
jsonSchema:
type: string
children:
type: array
items:
$ref: '#/components/schemas/Column'
profile:
$ref: '#/components/schemas/ColumnProfile'
customMetrics:
type: array
items:
$ref: '#/components/schemas/CustomMetric'
extension:
type: object
Style:
type: object
properties:
color:
type: string
iconURL:
type: string
coverImage:
$ref: '#/components/schemas/CoverImage'
CsvImportResult:
type: object
properties:
dryRun:
type: boolean
status:
type: string
enum:
- success
- failure
- aborted
- partialSuccess
- running
abortReason:
type: string
numberOfRowsProcessed:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
numberOfRowsPassed:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
numberOfRowsFailed:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
importResultsCsv:
type: string
GroupedColumnsResponse:
required:
- columnName
- occurrences
- totalCount
type: object
properties:
columnName:
type: string
occurrences:
type: array
items:
$ref: '#/components/schemas/ColumnOccurrence'
totalCount:
minimum: 0
exclusiveMinimum: false
type: integer
format: int32
Histogram:
type: object
properties:
boundaries:
type: array
items:
type: object
frequencies:
type: array
items:
type: object
TagLabel:
required:
- labelType
- source
- state
- tagFQN
type: object
properties:
tagFQN:
type: string
name:
type: string
displayName:
type: string
description:
type: string
style:
$ref: '#/components/schemas/Style'
source:
type: string
enum:
- Classification
- Glossary
labelType:
type: string
enum:
- Manual
- Propagated
- Automated
- Derived
- Generated
st
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/openmetadata/refs/heads/main/openapi/openmetadata-columns-api-openapi.yml