# Datasets: schemas and identity A dataset schema defines the columns, types, nullability, and identity of a project table. The schema is fixed when the dataset is created; rows are validated against it on every push. ## Column kinds
| Kind | Stored as | Accepted values |
|---|---|---|
COLUMN_KIND_TEXT
|
TEXT
|
Any UTF-8 string. |
COLUMN_KIND_INTEGER
|
BIGINT
|
64-bit signed integer. |
COLUMN_KIND_NUMBER
|
DOUBLE
|
Double-precision number. |
COLUMN_KIND_BOOLEAN
|
BOOLEAN
|
true
or
false
.
|
COLUMN_KIND_TIMESTAMP
|
TIMESTAMP
|
Timestamp with microsecond precision. |
| Rule | Detail |
|---|---|
| Column names | ASCII letters, digits, and underscores, starting with a letter or underscore. Quote names that are not lowercase in SQL. |
| Uniqueness | Column names are unique case-insensitively. |
| Reserved names |
__ingested_at
and
__deleted
are reserved.
|
| Column order | Significant: ingest and result mapping use schema order. |
| Nullable |
A
NULL
written to a non-nullable column fails the push.
|
| Column types | Fixed after creation; the Hub dialog states this explicitly. |
| Dataset names |
Start with a letter; use letters, digits, and dashes (for example
live-hosts
). Dataset tables and saved views share one namespace per project, so names must be unique case-insensitively across both.
|
| Name length | Up to 255 characters. |
| Description | Up to 1024 characters. |
| Dataset | Identity |
|---|---|
| Subdomains |
host
(optionally
program
if the same host appears in several programs)
|
| Live hosts |
url
|
| Findings |
fingerprint
|
| DNS history | usually no identity — every observation is meaningful |
| Column | Meaning |
|---|---|
__ingested_at
|
When the observation was recorded. |
__deleted
|
Whether the record is stale. Current-state queries exclude stale rows. |
| Limit | Value |
|---|---|
| Datasets per project | 100 |
| Columns per dataset | No fixed server limit; keep schemas narrow for query speed |
| Column name length | 255 characters in the Hub UI |
| Description length | 1024 characters |