Skip to content

Data Model

All application data is stored in Snowflake Hybrid Tables within FORTY_TWO_FORMS_DB.APP_DATA. All tables inherit created_at, updated_at, created_by, updated_by, and archived from TimestampMixin.

Table: accesslog

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
submission_idint (optional)FK → submission.idNone-
project_idint (optional)FK → project.idNone-
account_idintFK → account.id--
actionstr # "view", "edit", "create_submission", etc.---
detailsstr (optional)-None-
ip_addressstr (optional)-None-

Table: account

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
namestr---
emailstrIDX--
hashed_passwordstr (optional)-None-
auth_providerstr (optional)-None-
localestr-”en-US”-
currency_codestr-”USD”-
snowflake_usernamestr (optional)IDXNone-
last_login_atdatetime (optional)-None-

Table: apikey

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
account_idintFK → account.id, IDX--
namestr # e.g. "Claude Code", "CI/CD"---
key_prefixstr # First 8 chars for identification (e.g. "ftf_Ab3x")---
key_hashstr # bcrypt hash of the full key---
last_used_atdatetime (optional)-null-
expires_atdatetime (optional)-null-

Table: field

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id--
titlestr---
descriptionstr (optional)-None-
codestr (optional)-None-
field_typestr---
requiredbool-False-
round_precisionint (optional)-None-
range_minfloat (optional)-None-
range_maxfloat (optional)-None-
default_valuestr (optional)-None-
field_group_idint (optional)-None-
parent_field_idint (optional)FK → field.idNone-
multilinebool-False-
include_timebool-False-
allow_multiplebool-False-
sourcestr (optional)-null-

Table: formversion

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id--
version_numberint-1-
structure_jsonstr---
statusstr---
published_atdatetime (optional)-None-
parent_version_idint (optional)-null-

Table: importlog

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id, IDX--
partition_idintFK → partition.id, IDX--
filenamestr---
statusstr---
total_rowsint-0-
rows_succeededint-0-
rows_failedint-0-
column_mappingsstr---
error_detailsstr (optional)-null-

Table: organization

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
namestr---
slugstr---
is_personalbool---

Table: organizationmember

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
organization_idintFK → organization.id--
account_idint (optional)-null-
rolestr---
statusstr---
seat_typestr---
is_adminbool---
snowflake_usernamestr (optional)-None-
invite_emailstr (optional)-None-

Table: partition

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id--
titlestr---
descriptionstr (optional)-None-

Relationships: submissions → Submission

Table: partitionaccount

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
partition_idintFK → partition.id--
account_idintFK → account.id--
can_submitbool-False-
can_readbool-False-
can_read_allbool-False-
can_editbool-False-
can_edit_allbool-False-
can_deletebool-False-
can_delete_allbool-False-
can_managebool-False-

Table: partitionaccountfieldgroup

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
partition_account_idintFK → partitionaccount.id--
field_group_idint---
permissionstr---

Table: project

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
org_idintFK → organization.id, IDX--
titlestr---
descriptionstr (optional)-None-
workflow_enabledbool-False-
auto_save_enabledbool-True-
multi_step_enabledbool-False-
notify_on_submissionbool-False-
notify_on_reviewbool-False-
export_databasestr (optional)-None-
export_schemastr (optional)-None-
export_enabledbool-False-
export_cronstr (optional)-None-

Relationships: fields → FormField, partitions → Partition

Table: projectchangelog

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id--
actionstr---
entity_typestr---
entity_namestr (optional)-None-
old_valuestr (optional)-None-
new_valuestr (optional)-None-
changed_byintFK → account.id--

Table: projectfavorite

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
account_idintFK → account.id, IDX--
project_idintFK → project.id, IDX--

Table: projectrelationship

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
parent_project_idintFK → project.id, IDX--
child_project_idintFK → project.id, IDX--
parent_field_idintFK → field.id--
child_field_idintFK → field.id--
labelstr (optional)-None-
sort_orderint-0-

Table: semanticviewlink

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
org_idintFK → organization.id, IDX--
connection_idintFK → snowflakeconnection.id--
view_fqnstr # "DATABASE.SCHEMA.VIEW_NAME"---
root_project_idintFK → project.id--
logical_table_mapstr # JSON: {"TABLE_NAME": project_id, ...}---
relationship_mapstr (optional)-null-

Cached Snowflake policy metadata for a sync config’s source table.

Table: snowflakecolumnpolicy

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
sync_config_idintFK → snowflakesyncconfig.id, IDX--
column_namestr---
policy_kindstr # "MASKING_POLICY" or "ROW_ACCESS_POLICY"---
policy_fqnstr # Fully qualified policy name in Snowflake---
policy_ddlstr # Raw DDL from GET_DDL()---
masked_valuesstr (optional)-null-
last_refreshed_atdatetime---

Table: snowflakeconnection

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
org_idintFK → organization.id, IDX--
namestr---
account_identifierstr---
warehousestr---
databasestr---
schema_namestr---
usernamestr---
encrypted_passwordstr (optional)-None-
rolestr (optional)-None-
authenticatorstr---
is_nativebool-False-

Table: snowflakesyncconfig

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
project_idintFK → project.id--
connection_idint (optional)FK → snowflakeconnection.idNone-
directionstr # "import" (Snowflake -> 42Forms) or "export" (42Forms -> Snowflake)---
partition_idintFK → partition.id--
source_tablestr # Fully qualified or unqualified table/view name in Snowflake---
source_typestr---
column_mappingsstr # JSON string: maps Snowflake columns to 42Forms field IDs---
schedule_cronstr (optional)-null-
enabledbool-True-
last_sync_atdatetime (optional)-None-
last_sync_statusstr (optional)-null-
last_sync_messagestr (optional)-None-

Table: snowflakesynclog

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
sync_config_idintFK → snowflakesyncconfig.id--
directionstr---
started_atdatetime---
completed_atdatetime (optional)-None-
statusstr # "running", "success", "partial", "error"---
rows_processedint-0-
rows_succeededint-0-
rows_failedint-0-
error_detailsstr (optional)-null-
created_byint (optional)-None-

Table: submission

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
partition_idintFK → partition.id, IDX--
statusstrIDX”draft”-
snowflake_row_keystr (optional)IDXNone-
sync_config_idint (optional)FK → snowflakesyncconfig.idNone-

Relationships: fields → SubmissionField

Table: submissionfield

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
submission_idintFK → submission.id, IDX--
field_idintFK → field.id, IDX--
valuestr (optional)-None-
is_maskedbool-False-

Table: submissionfieldhistory

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
submission_field_idintFK → submissionfield.id--
field_idintFK → field.id--
old_valuestr (optional)-None-
new_valuestr (optional)-None-
changed_byint---

Table: submissionstatushistory

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
submission_idintFK → submission.id, IDX--
from_statusstr (optional)-None-
to_statusstr---
changed_byintFK → account.id--
commentstr (optional)-None-

Table: systemlog

FieldTypeKeyDefaultDescription
idint (optional)PKNone-
org_idintFK → organization.id, IDX--
project_idint (optional)FK → project.id, IDXNone-
severitystr # "error", "warning", "info"---
sourcestr # "formula_eval", "snowflake_sync", "data_format", etc.---
messagestr---
detailsstr (optional)-None-
contextstr (optional)-null-
created_atdatetime---