Xano Metadata Files API
Upload, list, and delete files in a workspace file library, including batch deletion, via the Metadata API files endpoints.
Upload, list, and delete files in a workspace file library, including batch deletion, via the Metadata API files endpoints.
openapi: 3.0.1
info:
title: Xano Metadata API
description: >-
The Xano Metadata API lets you programmatically manage the contents of a Xano
workspace - database tables, column schema, indexes, table records (content),
files, branches, API groups and their endpoints. It is served from each Xano
instance at the templated host below, appended with the `/api:meta` path, and
is authenticated with scoped Bearer access tokens generated from instance
settings. Separately, each user-built API group in a workspace auto-generates
its own OpenAPI/Swagger document served at that group's `/api:{token}` path;
those generated, per-workspace specifications are not enumerated here.
termsOfService: https://www.xano.com/legal/
contact:
name: Xano Support
url: https://docs.xano.com/xano-features/metadata-api
version: '1.0'
servers:
- url: https://{instance}.xano.io/api:meta
description: >-
Per-instance Metadata API base URL. Replace {instance} with your Xano
instance subdomain (for example, x1a2-b3c4-d5e6). The host varies per
account and region; copy the exact instance domain from your Xano
instance settings.
variables:
instance:
default: your-instance
description: Your Xano instance subdomain.
security:
- bearerAuth: []
tags:
- name: Auth
description: Authenticated user and accessible workspaces.
- name: Workspace
description: Workspace details, branches, import/export.
- name: Tables
description: Database tables, schema, and indexes.
- name: Content
description: Table records (database content) CRUD and search.
- name: Files
description: Workspace file library.
- name: API Groups
description: API groups, their endpoints, and generated OpenAPI.
paths:
/auth/me:
get:
operationId: getAuthenticatedUser
tags:
- Auth
summary: Retrieve the authenticated user.
responses:
'200':
description: The user associated with the supplied access token.
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'401':
$ref: '#/components/responses/Unauthorized'
/workspace:
get:
operationId: listWorkspaces
tags:
- Workspace
summary: List workspaces accessible to the token.
responses:
'200':
description: An array of workspaces.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Workspace'
'401':
$ref: '#/components/responses/Unauthorized'
/workspace/{workspace_id}:
get:
operationId: getWorkspace
tags:
- Workspace
summary: Retrieve workspace details.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
description: Workspace details.
content:
application/json:
schema:
$ref: '#/components/schemas/Workspace'
'404':
$ref: '#/components/responses/NotFound'
/workspace/{workspace_id}/branch:
get:
operationId: listBranches
tags:
- Workspace
summary: List branches in the workspace.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
description: An array of branches.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Branch'
/workspace/{workspace_id}/branch/{branch_id}:
delete:
operationId: deleteBranch
tags:
- Workspace
summary: Delete a branch.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/BranchId'
responses:
'200':
$ref: '#/components/responses/Success'
'404':
$ref: '#/components/responses/NotFound'
/workspace/{workspace_id}/export-schema:
post:
operationId: exportWorkspaceSchema
tags:
- Workspace
summary: Export the workspace schema.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/export:
post:
operationId: exportWorkspace
tags:
- Workspace
summary: Export the workspace schema and data as an archive.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/files:
get:
operationId: listFiles
tags:
- Files
summary: List files in the workspace file library.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- name: page
in: query
schema:
type: integer
- name: per_page
in: query
schema:
type: integer
responses:
'200':
description: A paginated list of files.
content:
application/json:
schema:
$ref: '#/components/schemas/FileList'
/workspace/{workspace_id}/files/upload:
post:
operationId: uploadFile
tags:
- Files
summary: Upload a file to the workspace file library.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
content:
type: string
format: binary
responses:
'200':
description: The uploaded file resource.
content:
application/json:
schema:
$ref: '#/components/schemas/File'
/workspace/{workspace_id}/files/{file_id}:
delete:
operationId: deleteFile
tags:
- Files
summary: Delete a file.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- name: file_id
in: path
required: true
schema:
type: integer
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/files/delete-batch:
post:
operationId: deleteFilesBatch
tags:
- Files
summary: Delete multiple files.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
file_ids:
type: array
items:
type: integer
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table:
get:
operationId: listTables
tags:
- Tables
summary: List database tables in the workspace.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
description: An array of tables.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Table'
post:
operationId: createTable
tags:
- Tables
summary: Create a database table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TableCreate'
responses:
'200':
description: The created table.
content:
application/json:
schema:
$ref: '#/components/schemas/Table'
'400':
$ref: '#/components/responses/BadRequest'
/workspace/{workspace_id}/table/{table_id}:
get:
operationId: getTable
tags:
- Tables
summary: Retrieve table details.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
responses:
'200':
description: Table details.
content:
application/json:
schema:
$ref: '#/components/schemas/Table'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateTable
tags:
- Tables
summary: Update table properties.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TableCreate'
responses:
'200':
description: The updated table.
content:
application/json:
schema:
$ref: '#/components/schemas/Table'
delete:
operationId: deleteTable
tags:
- Tables
summary: Delete a table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/schema:
get:
operationId: getTableSchema
tags:
- Tables
summary: Retrieve the full schema of a table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
responses:
'200':
description: The table schema (array of columns).
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Column'
put:
operationId: replaceTableSchema
tags:
- Tables
summary: Replace the entire schema of a table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
schema:
type: array
items:
$ref: '#/components/schemas/Column'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/schema/{column_id}:
get:
operationId: getColumn
tags:
- Tables
summary: Retrieve a single column.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/ColumnId'
responses:
'200':
description: The column.
content:
application/json:
schema:
$ref: '#/components/schemas/Column'
patch:
operationId: renameColumn
tags:
- Tables
summary: Rename or update a column.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/ColumnId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Column'
responses:
'200':
$ref: '#/components/responses/Success'
delete:
operationId: deleteColumn
tags:
- Tables
summary: Delete a column.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/ColumnId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/index:
get:
operationId: listIndexes
tags:
- Tables
summary: List the indexes of a table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
responses:
'200':
description: An array of indexes.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Index'
put:
operationId: replaceIndexes
tags:
- Tables
summary: Replace the indexes of a table.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Index'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/content:
get:
operationId: listRecords
tags:
- Content
summary: Browse table records (paginated).
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- name: page
in: query
schema:
type: integer
- name: per_page
in: query
schema:
type: integer
responses:
'200':
description: A paginated list of records.
content:
application/json:
schema:
$ref: '#/components/schemas/RecordList'
post:
operationId: createRecord
tags:
- Content
summary: Create a table record.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Record'
responses:
'200':
description: The created record.
content:
application/json:
schema:
$ref: '#/components/schemas/Record'
/workspace/{workspace_id}/table/{table_id}/content/bulk:
post:
operationId: createRecordsBulk
tags:
- Content
summary: Create multiple records in one call.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Record'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/content/{record_id}:
get:
operationId: getRecord
tags:
- Content
summary: Retrieve a single record.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/RecordId'
responses:
'200':
description: The record.
content:
application/json:
schema:
$ref: '#/components/schemas/Record'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateRecord
tags:
- Content
summary: Update a single record.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/RecordId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/Record'
responses:
'200':
description: The updated record.
content:
application/json:
schema:
$ref: '#/components/schemas/Record'
delete:
operationId: deleteRecord
tags:
- Content
summary: Delete a single record.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
- $ref: '#/components/parameters/RecordId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/table/{table_id}/content/search:
post:
operationId: searchRecords
tags:
- Content
summary: Search records with filtering, sorting, and pagination.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/TableId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SearchRequest'
responses:
'200':
description: Matching records.
content:
application/json:
schema:
$ref: '#/components/schemas/RecordList'
/workspace/{workspace_id}/apigroup:
get:
operationId: listApiGroups
tags:
- API Groups
summary: List API groups in the workspace.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
responses:
'200':
description: An array of API groups.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiGroup'
post:
operationId: createApiGroup
tags:
- API Groups
summary: Create an API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ApiGroup'
responses:
'200':
description: The created API group.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiGroup'
/workspace/{workspace_id}/apigroup/{apigroup_id}:
get:
operationId: getApiGroup
tags:
- API Groups
summary: Retrieve an API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/ApiGroupId'
responses:
'200':
description: The API group.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiGroup'
delete:
operationId: deleteApiGroup
tags:
- API Groups
summary: Delete an API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/ApiGroupId'
responses:
'200':
$ref: '#/components/responses/Success'
/workspace/{workspace_id}/apigroup/{apigroup_id}/openapi:
get:
operationId: getApiGroupOpenApi
tags:
- API Groups
summary: Retrieve the auto-generated OpenAPI document for an API group.
description: >-
Returns the OpenAPI/Swagger specification that Xano generates for the
user-built endpoints in this API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/ApiGroupId'
responses:
'200':
description: The generated OpenAPI document.
content:
application/json:
schema:
type: object
additionalProperties: true
/workspace/{workspace_id}/apigroup/{apigroup_id}/api:
get:
operationId: listApiEndpoints
tags:
- API Groups
summary: List endpoints in an API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/ApiGroupId'
responses:
'200':
description: An array of endpoints.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/ApiEndpoint'
post:
operationId: createApiEndpoint
tags:
- API Groups
summary: Create an endpoint in an API group.
parameters:
- $ref: '#/components/parameters/WorkspaceId'
- $ref: '#/components/parameters/ApiGroupId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ApiEndpoint'
responses:
'200':
description: The created endpoint.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiEndpoint'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
Scoped Metadata API access token generated from your Xano instance
settings (Instances > Metadata API > Manage Access Tokens). Sent as
`Authorization: Bearer <token>`.
parameters:
WorkspaceId:
name: workspace_id
in: path
required: true
schema:
type: integer
BranchId:
name: branch_id
in: path
required: true
schema:
type: string
TableId:
name: table_id
in: path
required: true
schema:
type: integer
ColumnId:
name: column_id
in: path
required: true
schema:
type: string
RecordId:
name: record_id
in: path
required: true
schema:
type: integer
ApiGroupId:
name: apigroup_id
in: path
required: true
schema:
type: integer
responses:
Success:
description: The operation succeeded.
content:
application/json:
schema:
type: object
additionalProperties: true
BadRequest:
description: Input error.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Missing or invalid access token.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
User:
type: object
properties:
id:
type: integer
name:
type: string
email:
type: string
Workspace:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
Branch:
type: object
properties:
id:
type: string
label:
type: string
live:
type: boolean
Table:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
auth:
type: boolean
created_at:
type: string
TableCreate:
type: object
required:
- name
properties:
name:
type: string
description:
type: string
auth:
type: boolean
Column:
type: object
properties:
id:
type: string
name:
type: string
type:
type: string
description: Xano column type (text, int, decimal, bool, timestamp, email, json, etc.).
nullable:
type: boolean
required:
type: boolean
default:
nullable: true
Index:
type: object
properties:
type:
type: string
description: Index type (btree, gin, unique, primary, search, etc.).
fields:
type: array
items:
type: object
properties:
name:
type: string
op:
type: string
Record:
type: object
additionalProperties: true
description: A table record; properties correspond to the table's columns.
RecordList:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/Record'
itemsReceived:
type: integer
itemsTotal:
type: integer
pageTotal:
type: integer
curPage:
type: integer
nextPage:
type: integer
nullable: true
prevPage:
type: integer
nullable: true
SearchRequest:
type: object
properties:
page:
type: integer
per_page:
type: integer
sort:
type: object
additionalProperties:
type: string
search:
type: array
items:
type: object
FileList:
type: object
properties:
items:
type: array
items:
$ref: '#/components/schemas/File'
itemsTotal:
type: integer
File:
type: object
properties:
id:
type: integer
name:
type: string
path:
type: string
type:
type: string
size:
type: integer
mime:
type: string
ApiGroup:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
canonical:
type: string
description: "The /api: path token under which this group's endpoints are served."
swagger:
type: boolean
ApiEndpoint:
type: object
properties:
id:
type: integer
name:
type: string
verb:
type: string
description: HTTP method (GET, POST, PUT, PATCH, DELETE).
path:
type: string
Error:
type: object
properties:
code:
type: string
message:
type: string
payload:
nullable: true