Field semantic inventory
Purpose and status
This document records the Baserow-specific knowledge currently encoded by
baserowapi, the package’s settled semantic decisions, and evidence gaps
that still require hosted verification. It does not expand the public API or
promise support that the implementation does not currently provide.
The package is a schema-aware client for Baserow’s database-token data API. It provides behavior that callers would otherwise have to rediscover from Baserow, including field metadata, read and write representations, read-only rules, filtering, pagination, linked rows, file upload, and Baserow error responses. General Python collection helpers, permissive argument coercion, logging setup, and HTTP implementation details do not belong in the public contract unless they support one of those behaviors.
Evidence for this inventory was collected from:
package implementation and integration tests prepared for release
0.2.0b1;a read-only schema request to the configured hosted
baserow.iotest table on 2026-09-01;disposable hosted write probes on 2026-09-01 for boolean and rating nulls, number precision beyond the configured decimal places, and a datetime with a non-UTC ISO offset;
disposable hosted write probes on 2026-09-01 for select, link-row, and file IDs, labels, returned objects, comma-separated forms, empty forms, and nulls;
hosted upload and explicit row-assignment tests on 2026-09-01, including the distinct user-file
original_nameand attached-filevisible_namepayloads;a disposable hosted row probe on 2026-09-02 confirming a raw Formula button object, Count decimal string, empty text Lookup list, UUID string, and Autonumber integer;
disposable hosted password probes on 2026-09-02 confirming that string, literal
true, andnullwrites are accepted and that reads expose onlytrueornull;a read-only hosted table-discovery probe on 2026-09-02 confirming that the database-token
all-tablesendpoint returns a list containing integer table and database IDs, string names, and numeric order values;the generated API documentation captured on 2026-09-01, visually checked on 2026-09-02 for configured filter lists, plus hosted equality and empty-result filter probes;
the maintainer’s generated API documentation for that database, captured on 2026-09-01 and kept as an ignored local test reference; and
Baserow’s current Database API documentation, field overview, and database token documentation.
Hosted Baserow is not version-pinned. Observations dated 2026-09-01 are compatibility evidence, not a claim about a particular Baserow release.
Support levels
StrongThe package encodes material Baserow behavior and integration tests exercise its important read and write forms.
PartialThe package has a dedicated type or behavior, but one or more important representations, settings, operations, or tests are missing or inconsistent.
Pass-throughThe package mostly preserves the server value. The class name adds little or no semantic guarantee.
FallbackAn unknown type is preserved through
GenericField. This supports reading but deliberately provides no validation or type-specific filtering.AbsentCurrent Baserow documentation identifies the field category, but the package has no dedicated support and the configured test table does not exercise it.
Cross-cutting value pipeline
The current row model applies Field-owned semantics uniformly. The table below records the value pipeline.
Path |
Current behavior |
Guarantee |
Required direction |
|---|---|---|---|
Read row |
|
Fields decode scalar and structured values in one place. Unknown fields and values remain raw and lossless. |
Preserve Field ownership and explicit raw access. |
Create rows |
|
Singular create returns |
Keep one internal row encoder authoritative. |
Update one |
|
The same Field encoder owns singular and plural update values. |
Keep Row convenience behavior thin. |
Batch update mappings |
Mapping inputs with explicit row IDs use the same Field encoder. All local validation completes before the first request chunk. |
Batch failures report the failed chunk and completed response row IDs; writes are not retried or rolled back. |
Preserve this explicit non-atomic contract. |
Filter rows |
|
Supported, unsupported, and locally unknown operators are distinguished; no compatibility result blocks a normal query. |
Keep structural Filter validation and allow unknown operators to reach the unpinned hosted service. |
Unknown type |
The Field mapping falls back to |
Raw values remain readable; writable unknown fields can be sent without semantic validation. |
The fallback preserves the original type, metadata, and raw value as expected forward compatibility. |
Table.FIELD_TYPE_CLASS_MAP is the sole semantic dispatch table. Fields own
scalar and structured decoding, validation, and encoding;
format_for_api remains a compatibility alias.
Field-by-field inventory
The read and write columns below describe current package behavior, not every shape the Baserow server may accept. All create and update paths use the field encoders described in the write column.
API type |
Baserow knowledge |
Current read value |
Current accepted or encoded write |
Level |
Finding |
|---|---|---|---|---|---|
|
Text default, primary-field metadata, text filters. |
|
|
Partial |
The field provides schema metadata and scalar validation without wrapping
the returned value. Local filters omit |
|
Text default and rich-text flag. |
|
|
Partial |
The field owns its metadata and scalar behavior. Local filters omit
|
|
Boolean filter and API scalar shape. |
|
Exactly |
Partial |
Hosted |
|
Decimal-place and negative-number settings; numeric filters. |
Hosted tests currently receive a decimal string such as |
|
Partial |
Reads remain lossless strings. Validation uses |
|
Maximum value, color, style, and bounded integer validation. |
Numeric value. |
Integer from zero through |
Partial |
Hosted |
|
Date-only versus datetime, display format, 12/24-hour display, timezone display, and forced timezone metadata. |
ISO date or datetime |
Strict ISO strings, the corresponding Python |
Partial |
The current encoder rejects two-digit-year guessing, slash normalization,
implicit midnight, local-machine display timezone, and unjustified |
|
Computed timestamp and date display metadata. |
ISO date or datetime |
Read-only; setter raises. |
Partial |
Read-only handling is valuable. Tests only check presence, not timestamp shape or field settings. |
|
Computed timestamp and date display metadata. |
ISO date or datetime |
Read-only; setter raises. |
Partial |
Same semantic family as |
|
URL field identity and Baserow filters. |
|
Any |
Partial |
Baserow validates URL form, while the package only guarantees a string.
Local filters omit |
|
Email field identity and Baserow filters. |
|
Any |
Partial |
Baserow validates email form, while the package only guarantees a string.
Local filters omit |
|
Baserow’s 100-character limit and permitted character set. |
|
Empty, |
Partial |
The validator encodes real server knowledge. Local filters omit
|
|
Option IDs, labels, colors, read object shape, write-by-ID-or-label, and first-match label behavior. |
|
Option record, ID, label, returned option dictionary, or |
Strong |
The canonical option record preserves identity. |
|
Option metadata, read object list, and write-by-ID-or-label semantics. |
List of |
List of option records, IDs, labels, or returned dictionaries; comma-separated labels and empty lists follow hosted behavior. |
Strong |
Returned records round-trip by ID. Ordinary label writes retain hosted resolution behavior; the strict resolver rejects ambiguity on request. |
|
Related table ID, reverse field ID, selection-view metadata, complete-set replacement semantics, empty-list clearing, and ID-or-primary-label writes. |
List of |
Linked-row records, returned dictionaries, single IDs/labels, lists, or comma-separated labels. Every update replaces the complete set. |
Strong |
|
|
File object shape, upload endpoints, assignment after upload, public file URL, visible name, and size verification. |
List of |
File records, returned dictionaries, stored filename forms, empty lists,
or |
Strong |
Client-level upload and explicit assignment separate the two Baserow
operations. Generic downloading is outside the semantic core. Local
filters omit |
|
Formula text, result type, array result type, error, and read-only status. |
Raw server value; the configured button is a |
Read-only. |
Partial |
The configured |
|
Link-through metadata, numeric formula result, and read-only status. |
Baserow decimal string, using the same decoding as a number field. |
Read-only. |
Partial |
It reuses |
|
Link field, target field, array result metadata, row IDs, values, and read-only status. |
List of |
Read-only. |
Partial |
|
|
Notification metadata, collaborator object shape, and collaborator filters. |
List of |
List of collaborator records or returned dictionaries; both encode to
|
Partial |
Identity is preserved offline, but a non-empty hosted collaborator read and the complete documented write surface still need verification. |
|
Write-only secret behavior: server reads are |
Raw |
|
Partial |
Hosted |
|
Read-only unique persistent identifier. |
UUID string, with an explicit |
Unconditionally read-only. |
Strong |
Dedicated metadata, equality-filter knowledge, and lossless string reads match the hosted field observed on 2026-09-02. |
|
Read-only monotonically assigned row number. |
Hosted integer value without conversion. |
Unconditionally read-only. |
Strong |
Dedicated metadata and configured comparison-filter knowledge preserve the hosted integer representation observed on 2026-09-02. |
Other unknown API type |
Original type string and arbitrary metadata are retained. |
Raw server value. |
Passed through if Baserow metadata does not mark the field read-only. |
Fallback |
This behavior is necessary because hosted Baserow changes independently of the package. Unknown writes should be explicitly documented as unvalidated rather than appearing fully supported. |
Known field-category gaps
Baserow’s current field overview lists these categories in addition to those above. Their exact API type strings and wire representations have not been verified against the configured database, so display names must not be used as implementation keys without further evidence.
Baserow category |
Expected character |
Current handling |
Evidence needed before implementation |
|---|---|---|---|
Duration |
Writable scalar with display-unit settings. |
Generic fallback if encountered. |
API type string, raw and write units, precision, metadata, and filters. |
Rollup |
Read-only computed scalar whose type depends on aggregation and target. |
Generic fallback if encountered. |
API type string, aggregation metadata, result types, null/error forms, and result-dependent filters. |
Created by |
Read-only collaborator-like value. |
Generic fallback if encountered. |
API type string, returned user object, visibility rules, and filters. |
Last modified by |
Read-only collaborator-like value. |
Generic fallback if encountered. |
API type string, returned user object, visibility rules, and filters. |
AI prompt |
Computed or asynchronously populated value. |
Generic fallback if encountered. |
Availability, API type, result and error states, mutability, and whether database-token use has additional restrictions. |
Edit row link |
Generated action/link value. |
Generic fallback if encountered. |
API type, returned representation, token/access behavior, and whether it belongs in a data client rather than an administrative client. |
Test coverage inventory
The suite now combines credential-free characterization tests with hosted
baserow.io integration tests. Offline payload assertions prove that every
create and update route uses the Field encoder; hosted tests separately prove
that representative encoded values remain compatible with the unpinned service.
Singular and batch row writes were verified against hosted baserow.io on
2026-09-02.
Coverage |
Fields |
Missing assurance |
|---|---|---|
Create and returned value |
Text, long text, boolean, number, rating, three date configurations, URL, email, empty file, selects, phone, empty links, empty collaborators, and password. |
Singular and batch encoder parity is covered. Non-empty collaborators and hosted duplicate-label configurations remain unverified. |
Specialized operation |
Date conversion/display, client file upload and upload-by-URL with explicit assignment, and linked-row discovery/update by ID. |
Forced-timezone display, duplicate hosted primary labels, selection-view limits, and concurrent complete-set replacement remain unverified. |
Presence only |
Created on and last modified. |
Their hosted shapes and filter behavior still need focused assertions. |
Direct scalar field semantics |
Text-like pass-through, boolean, rating, number, date/datetime, generic fallback, structured values with retained IDs, Count, UUID, Autonumber, and the evidenced Formula/Lookup results. |
Unobserved computed result families remain raw pending hosted evidence; create/update encoding parity is covered. |
What should remain central
The inventory supports retaining and strengthening these responsibilities:
database-token authentication, Baserow endpoints, pagination, and structured error interpretation;
table discovery and lazy schema retrieval, with a new Table instance used when callers need a fresh snapshot after an external schema change;
one field semantic authority for decoding, validation, encoding, read-only status, and result-dependent behavior;
row reads, singular and batch writes, movement, deletion, and uniform value encoding;
query construction for Baserow filters, ordering, search, views, includes, excludes, and pagination;
select-option and linked-row identity, including Baserow’s ambiguous label-resolution rules;
file upload and assignment; and
forward-compatible raw access for field types the package does not yet know.
These responsibilities do not require a public custom field list, a public
custom row-value list, one RowValue subclass per Baserow type, global logging
configuration, or multiple public request-parsing helpers. Row convenience
methods can remain if they delegate to the same singular or batch primitives
and therefore preserve one semantic implementation.
Settled design decisions
These decisions describe the current contract prepared for release
0.2.0b1.
Scalar representations
Ordinary reads preserve Baserow scalar representations:
Number values remain Baserow decimal strings, including significant trailing zeroes such as
"42.00". Validation may useDecimalinternally but will not exposeDecimalas the row value.Date-only values remain ISO date strings and datetime values remain ISO timestamp strings.
Explicit date helpers may parse date-only values to
dateand datetime values to timezone-awaredatetime. Display formatting is also explicit and may apply field metadata such asdate_force_timezone.Date writes accept
None, the appropriate Pythondateor timezone-awaredatetime, and strict ISO strings. The core path does not guess two-digit years, accept locale-dependent slash formats, assume midnight, append an unjustifiedZ, or silently use the executing machine’s timezone.
Documented inputs and validation
The core client accepts every input representation documented by Baserow. This includes IDs, labels, lists, comma-separated strings, and empty forms where the relevant field documentation permits them. The package documents Baserow’s first-match behavior for ambiguous option labels and linked-row primary values instead of imposing a narrower contract.
Optional strict helpers may resolve stable IDs and reject absent or ambiguous labels. Local validation enforces stable structural rules but does not use a stale local compatibility matrix to block behavior accepted by the unpinned hosted service. Convenience coercions not documented by Baserow must be explicit, deterministic helpers rather than implicit core behavior.
Structured values with retained IDs
Reads use small, lossless domain objects when Baserow identity or structure would otherwise be discarded. Initial concepts include:
a select option retaining ID, value, color, and raw metadata;
a linked-row reference retaining row ID, display value, and raw metadata;
a Baserow file retaining its server name, visible name, URL, size, MIME type when present, and raw metadata;
a collaborator retaining user ID, available display information, and raw metadata; and
a lookup entry retaining related row ID, decoded value, and raw metadata.
These are independent value records, not a shared hierarchy or capability framework. They use ordinary Python collections, contain no HTTP behavior, and remain suitable as write inputs. Scalar values are not wrapped merely for symmetry.
Selects, links, files, and collaborators
Select and link writes accept both the lossless domain objects and every documented Baserow representation. IDs or returned objects are the recommended deterministic forms; labels and comma-separated strings retain Baserow’s documented resolution behavior. Strict lookup helpers live on the relevant Field and reject ambiguity when requested.
Linked-row updates replace the complete relationship set. Empty lists clear the relationship. Any add/remove convenience must make the resulting complete-set write explicit and document that it cannot provide an atomic concurrent update when the Baserow endpoint itself only replaces the set.
File upload is a Client operation that returns an unattached Baserow file object. Assignment to a row is explicit, for example by passing the returned object in a file-field update. Append and replace behavior is expressed by the list supplied to the row update rather than hidden RowValue state. Generic downloading of public file URLs and recursive directory upload do not belong in the semantic core; they may be separate utilities if retained.
Collaborator values preserve identity and raw returned metadata. The data client assigns documented collaborator values but does not take on user invitations, permissions, or workspace administration.
Computed fields
Formula, lookup, count, rollup, and other computed fields decode according
to result metadata such as formula_type and array_formula_type as well
as their declared field type. They reuse the corresponding scalar or structured
representation. Count uses number-field decoding; computed dates
use date semantics; computed select or linked values preserve identity.
Computed fields remain read-only when their hosted metadata says so. Unknown
result types, including unverified button, AI, and error states, remain raw
until their representations are observed. The package does not collapse a
formula error or unfamiliar result into None.
Unknown fields
Unknown hosted field types are expected compatibility cases. Their original API
type and raw metadata remain inspectable. Reads return the raw value unchanged;
writes pass values through unchanged only when hosted metadata marks the field
writable. The package does not claim validation, formatting, or filter knowledge
for an unknown type. Unknown types do not produce a warning for every field
and row. GenericField is the public fallback for unknown hosted types.
GenericField.TYPE == "generic" is an internal sentinel; current repository
evidence does not establish generic as a hosted Baserow field type. The
explicit registry entry remains for compatibility with callers that inspect
Table.FIELD_TYPE_CLASS_MAP. Registry lookup also falls back to the same
class for every unknown type.
Filters
Normal filter validation covers stable query structure and does not enforce the
compatibility lists. Operator names and values pass through to Baserow.
FilterCompatibility reports supported, unsupported, or unknown
as advisory package knowledge. Field.compatible_filters is an immutable
tuple, with identical family knowledge defined once on the nearest common Field
base.
The JSON filter-tree representation used by row queries is authoritative. The
detached FilterValidator and unused legacy Filter.query_string have been
removed. Recursive groups are supported only to the extent verified in
current Baserow documentation and hosted behavior.
Rows, containers, and transport
Table.fields and Table.writable_fields are ordered read-only mappings
from field name to Field. Row.values is an ordered read-only mapping of
Field-decoded values, and Row.raw_values exposes the original Baserow
values. The custom FieldList and RowValue containers and all per-type RowValue
classes have been removed.
row.update({...}) is the Row update operation. Row item assignment
and no-argument staged updates have been removed so raw, decoded, and pending
state cannot diverge. Row operation conveniences remain thin delegates to the
same Table primitives used for singular requests; batch updates require
explicit mappings with row IDs.
Table.get_rows eagerly returns list[Row] and Table.iter_rows lazily
returns an iterator. There is no return-type flag or arbitrary query-keyword
escape hatch. Each hosted page must contain a results list and an explicit next
URL or None before any rows from that page are exposed.
Table.delete_row and Table.move_row own their singular endpoints;
Row.delete and Row.move delegate to them. A moved Row is synchronized
from the response and returned as the same instance. Table.delete_rows
accepts a non-empty list of row IDs, validates all of them before its first
request, and reports completed IDs if a later non-atomic chunk fails.
Each Table lazily loads and caches one field-schema snapshot. get_table
remains uncached, so callers can construct a new Table after a schema change
made through the Baserow UI or a separate administrative client. Database
tokens cannot mutate schema, and no current application requires in-place
refresh semantics for existing Table and Row objects. The package does not add
a schema-refresh method until that need and its Row behavior are demonstrated.
Baserow.make_api_request is the single request boundary for authentication,
same-origin URL enforcement, timeouts, safe-read retries, connectivity and HTTP
failures, JSON parsing, and Baserow error extraction. Header combination,
request execution, session state, and response parsing are private. The method
remains a documented low-level escape hatch for hosted database-token endpoints
not yet modeled by the package; it provides transport and error handling, not
schema semantics or endpoint stability. GET and HEAD requests retry configured
transient failures with backoff, while mutating requests are never retried.
Baserow.get_tables uses the database-token discovery endpoint and returns
Tables retaining name, database ID, order, and the complete returned metadata.
The package emits ordinary logging records without configuring application
logging or recording request payloads and file values.
Evidence still required
The design direction is settled, but implementation still requires evidence for several hosted representations:
non-empty collaborator reads and every documented collaborator write form;
exact API types, metadata, read values, write values, and filters for Duration, Rollup, Created by, Last modified by, AI prompt, and Edit row link;
formula and rollup values for each result family, including per-field and per-cell error states;
lookup entries whose target is not text;
current nested filter-group limits and serialization; and
duplicate select labels and linked primary values, selection-view limits, and complete-set replacement behavior.
Do not invent an API type string, result shape, or validation rule to fill these gaps. Add a live field to the disposable test database, inspect the generated documentation and response, record sanitized fixtures, and describe hosted compatibility by verification date.
The implementation sequence and phase exit criteria are recorded in Semantic refactoring plan.