Every resource has two names.

Identifiers

An id is a typed, opaque string that never changes: The resource endpoints of the API (GET /datasets/{dataset_id}, client.files.list(dataset_id), …) take ids.

Slugs and handles

Each project and each resource also has a slug (the API also returns it as alias, its former name, and still accepts alias in a request): lowercase letters, digits, hyphens and underscores, unique among the resources of the same kind in a project, derived from the name when none is given. The handle of a resource is "<project_slug>.<slug>". This is the name you use in code:
  • in SQL: SELECT * FROM 'flights.flight-data';
  • in a transform binding: Input("flights.flight-data"), Output("flights.delayed"), Model("crm.churn"), Connection("ops.drop-folder").
A binding also accepts a bare id when you have one. The library resolves a handle to an id through the projects and datasets listings, once per call.

Branches

A dataset can carry data branches: a named view where writes land without touching the trunk, until they are promoted. Most file and dataset calls take a branch= argument, and a build run on a branch writes there automatically. See Lineage, builds and branches.

List envelopes

Catalog listing endpoints return {"object": "list", "data": [...]}. The Python resources unwrap data for you; over HTTP, read it yourself. Single objects are returned as-is.