Tables

List tables (cursor-paginated)

Lists the tables of the branch the token can read, one page at a time. default as the branch ID lists production. A development branch is listed over production: its own tables, and each production table the branch has no table of the same ID for in a bucket the token can read. branchId of an item is the branch the table belongs to: an inherited table carries the ID of the default branch, and its detail is read through that branch.

Returns a cursor-paginated collection: data holds the tables on the page, meta the total matching the filters regardless of pagination, the applied limit and the structure of the cursor, and links absolute URLs of this endpoint (self, first, next) that keep every active filter. next is null on the last page.

An item is deliberately lighter than the table detail: it carries the fields needed to list and pick tables. include adds detail fields on request; fetch the table detail (GET /v2/storage/tables/{tableId}) for column metadata and everything else.

Include

include - comma-separated, each value at most once; a field not requested is missing from the item:

  • columns - columns, the column names in the order of the table detail.
  • metadata - metadata, the table-level metadata as GET /v2/storage/tables/{tableId}/metadata returns it; on an alias that syncs its columns also sourceTable.metadata, the table-level metadata of its root source table (in another project too), and null there for an alias that does not sync its columns.
  • definition - definition, the table definition equal to the definition of the table detail, built from the native column and table fields only. An alias that syncs its columns (a linked-bucket table too) takes its column types from its root source table and resolves descriptions along its chain, as the detail does. null for a typed table whose column types are not all on the native fields yet, and for an alias of such a table; the detail reads the legacy metadata for them. The table description comes from the native field only: the detail falls back to the legacy KBC.description table metadata when the native field is empty, the list does not.

Filtering

Filters use the JSON:API filter family and combine with AND:

  • filter[bucketId] - ID of one bucket, e.g. in.c-main. In a development branch it lists the branch's tables of that bucket and the ones it inherits from production. A bucket outside the list or one the token cannot read answers 404.
  • filter[ids] - comma-separated table IDs, at most page[limit] of them.
  • filter[name] - words separated by whitespace; a table matches when every word is contained in its ID (in.c-main.orders), its display name or its bucket's display name, ignoring case and accents, in any order. % and _ match themselves. A blank value is no filter; the length and the number of words are limited by the server. It narrows the listing and keeps its order, cursor and meta.total; it does not rank, match fuzzily or search columns or metadata.
  • filter[lastUpdatedBy] - comma-separated componentId:configurationId pairs, e.g. keboola.ex-db-snowflake:123,keboola.snowflake-transformation:456; unlike filter[name], a blank value is rejected. The length of each ID, the number of pairs and the number of distinct components among them are limited by the server. A table matches when its own lastUpdatedBy has the component ID and the configuration ID of one of the pairs, whatever its configuration row and branch. An alias that syncs its columns (a linked-bucket table too) never matches: it shows its root table's lastUpdatedBy, and the configuration wrote that root, which matches in its own project. An alias that does not sync its columns matches on its own values.
  • filter[sourceTableId] - ID of a table of the project, e.g. in.c-main.users: only the aliases whose direct source it is (an alias of an alias names its own source). In a development branch the branch's table of that ID and the production one (only the branch's own when filter[inheritProduction] is false). An ID of no table of the project lists nothing; a value that is no table ID is rejected.
  • filter[changedSince] - a unix timestamp or anything strtotime() reads, the rule the changedSince of the table export validates with: e.g. 2026-10-28T10:15:00+01:00, 1761642900 or -1 day. Unlike the export, 0 is the epoch and a date before 1970 written as a string is accepted. A value without an offset is read in the server's zone (currently Europe/Prague). Times after the year 9999 are rejected. A relative value resolves on each request: links.next carries the resolved time (ISO 8601 with offset), so every page reached through it shares one cutoff, while links.self and links.first keep the value sent; a client that builds page[after] itself sends that resolved time on later pages. It keeps only the tables whose own record changed at or after it (an import, a rename, the description, the primary key, an added or deleted column, the statistics). Send the previous poll's time minus a small overlap and deduplicate by id. Deleted tables are not returned: compare meta.total of the unfiltered listing with the tables you hold. Changes kept only outside the table record (metadata, a column's type or description) do not count.
  • filter[inheritProduction] - true (default) or false. false lists only the development branch's own tables; the default branch ignores it.

Pagination

Tables are ordered bucket.stage ASC, bucket.name ASC, name ASC, the order of their IDs.

  • page[limit] - number of returned tables; the default and the maximum are configured on the server. A larger value is rejected, never clamped.
  • page[after] - cursor of the last table already read; omit it for the first page. It is the base64url (padding optional) of the JSON object {"bucket.stage": <string>, "bucket.name": <string>, "name": <string>} holding that table's bucket.stage, bucket.name and name as the list prints them, e.g. {"bucket.stage":"in","bucket.name":"c-main","name":"users"} → eyJidWNrZXQuc3RhZ2UiOiJpbiIsImJ1Y2tldC5uYW1lIjoiYy1tYWluIiwibmFtZSI6InVzZXJzIn0. links.next already carries the cursor of the page's last table; meta.cursor repeats this structure.

An undecodable cursor, bare limit / offset, page[offset], an unknown page[...] or filter[...] member, an unknown or repeated include value and any other query parameter are rejected with a validation error.

get/v2/storage/branch/{branchId}/table-list

Request

Path parameters

branchIdstring required

ID of the branch, or default for production.

Query parameters

afterstring

base64url(json) of {"bucket.stage": string, "bucket.name": string, "name": string}.

limitinteger

Pagination: page[limit] (default and maximum are configured on the server) and page[after], the cursor of the last row read — base64url(json) of {"bucket.stage": string, "bucket.name": string, "name": string}, rows ordered bucket.stage ASC, bucket.name ASC, name ASC. Omit page[after] for the first page; links.next carries the next one.

includestring[]

Comma-separated item fields to add: columns, metadata, definition.

bucketIdstring

ID of one bucket, e.g. in.c-main.

idsstring

Comma-separated table IDs, at most page[limit] of them.

sourceTableIdstring

ID of a table of the project: only its direct aliases.

changedSincestring

Only the tables whose record changed at or after this time: a unix timestamp or anything strtotime() reads, e.g. -1 day; links.next carries the resolved absolute time. Deleted tables are not returned.

namestring

Words that must all be contained in the table ID, the table display name or the bucket display name, ignoring case and accents.

lastUpdatedBystring

Comma-separated componentId:configurationId pairs; a blank value is rejected. A table matches one of them with its own lastUpdatedBy. An alias that syncs its columns never matches.

inheritProductionboolean

List a development branch over production; false lists only its own tables. Ignored in the default branch.

Filters, JSON:API style: filter[<name>]=<value>. Filters combine with AND.

{
  "sourceTableId": "in.c-main.users",
  "changedSince": "2026-10-28T10:15:00+01:00",
  "name": "main daily",
  "lastUpdatedBy": "keboola.ex-db-snowflake:123"
}

Response

Tables on the requested page.

Example response

{
  "data": [
    {
      "id": "in.c-main.users",
      "bucketId": "in.c-main",
      "name": "users",
      "displayName": "users",
      "branchId": 1234,
      "bucket": {
        "id": "in.c-main",
        "name": "c-main",
        "displayName": "main",
        "stage": "in",
        "backend": "snowflake",
        "idBranch": 1234
      },
      "primaryKey": [
        "id"
      ],
      "isAliasable": true,
      "isTyped": true,
      "tableType": "table",
      "rowsCount": 1000,
      "dataSizeBytes": 65536,
      "created": "2026-10-22T10:00:00+0200",
      "lastImportDate": "2026-10-22T10:05:00+0200",
      "lastChangeDate": "2026-10-22T10:05:00+0200",
      "description": "Registered users",
      "isDescriptionSystemManaged": true,
      "createdBy": {
        "componentId": "keboola.snowflake-transformation",
        "configurationId": "12345",
        "configurationRowId": "67890",
        "branchId": "1234"
      },
      "lastUpdatedBy": {
        "componentId": "keboola.snowflake-transformation",
        "configurationId": "12345",
        "configurationRowId": "67890",
        "branchId": "1234"
      },
      "sourceTable": {
        "id": "in.c-main.users",
        "project": {
          "id": 123,
          "name": "Sales"
        },
        "metadata": [
          {
            "id": "19509",
            "key": "KBC.createdBy.component.id",
            "value": "keboola.ex-db-snowflake",
            "provider": "system",
            "timestamp": "2017-02-13T23:36:10+0100"
          }
        ]
      },
      "aliasFilter": {
        "column": "city",
        "operator": "eq",
        "values": [
          "PRG"
        ]
      },
      "columns": [
        "id",
        "name"
      ],
      "metadata": [
        {
          "id": "19509",
          "key": "KBC.createdBy.component.id",
          "value": "keboola.ex-db-snowflake",
          "provider": "system",
          "timestamp": "2017-02-13T23:36:10+0100"
        }
      ]
    }
  ],
  "meta": {
    "cursor": {
      "param": "page[after]",
      "encoding": "base64url(json)",
      "order": "deletedTime DESC NULLS LAST, id DESC"
    }
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.