Skip to content

Instantly share code, notes, and snippets.

@mrcrilly
Last active March 19, 2026 06:54
Show Gist options
  • Select an option

  • Save mrcrilly/d560736b174572f851bb33fb1cf01d32 to your computer and use it in GitHub Desktop.

Select an option

Save mrcrilly/d560736b174572f851bb33fb1cf01d32 to your computer and use it in GitHub Desktop.
iu8y7t6frtcdfgvbhjuiy7t6r5e4dtcfghvbju8y7t6r5dtcfghvbju89y7t6r5fcghvbj

Yes — with Lambda in front of S3, I’d change the design.

I would do the _label_data → submission.data matching in Lambda, not in Athena. In your sample, the matching rule is: container keys become path prefixes like part-a-your-details.*, the concession select stores its answer under .submission.data["part-d-which-concession-did-you-and-any-person"].value, and Part E stores radio codes like e6-1 that must be translated through the matching component’s values[].value -> values[].label list. The sample also has repeated labels like “First name”, so keeping section_label and field_label_path is useful. 

That means the best lake layout is: 1. Keep the original payload in a raw/ prefix for audit/replay. 2. Write a second normalized answers dataset where each row is one answered field: • submission_id • form_id, form_machine_name, form_title • field_path, field_key, field_type • section_label, field_label, field_label_path • raw_value • display_value 3. Query that normalized dataset in Athena, and only build wide reporting views on top if you need them.

Because Athena performs best with columnar formats like Parquet and with partitioning, and because AWS notes that many small files hurt performance, I would aim for a Parquet-backed answer dataset partitioned by something like dt and optionally a sanitized form slug. If you want AWS to batch and convert for you, Amazon Data Firehose can invoke Lambda for transformation and convert JSON to Parquet before writing to S3. 

I would not keep _label_data in the analytics dataset itself. It is only needed at ingest time to build the field dictionary and decode option labels; after that, storing just the normalized rows is simpler and cheaper to query. Also, Athena’s docs note that complex-type column names are constrained, which is another reason not to mirror the raw Form.io structure directly when keys contain characters like hyphens. 

I generated the pieces for that approach:

Lambda normalizer (Python) Athena DDL for normalized answers Sample normalized output from your uploaded payload

The Lambda code does the hard part once: • walks _label_data.components • resolves container nesting • strips HTML from labels • decodes radio/select option labels • handles Form.io select answers stored as {"value": ...} • emits one answer row per field

A representative normalized row from your sample becomes:

{
  "submission_id": "69b8c71eda953185af8f68ce",
  "field_path": "part-e-your-circumstances-first-home-new-home-concession",
  "field_label": "Select one of the following that best matches your situation.",
  "raw_value": "e6-1",
  "display_value": "Before moving in, you sold or transferred all or part of the property."
}
SELECT submission_id, display_value
FROM analytics.formio_answers_v
WHERE field_path = 'part-e-your-circumstances-first-home-new-home-concession';

If you stay with direct Lambda → S3 writes for now, start with the JSON Lines table in the SQL file. If volume grows, the next upgrade is Lambda → Firehose → Parquet in S3, which AWS supports directly for JSON-to-Parquet conversion. 

The strongest production shape here is: raw JSON for audit, normalized answer rows for Athena, Parquet once volume justifies it.

Assuming your NDJSON is in S3 and each line is one complete JSON object, create the Athena table with a JSON SerDe and point it at the prefix that contains the files. Athena supports JSON via Hive JSON SerDe or OpenX JSON SerDe; for line-delimited JSON, OpenX is commonly used, and Athena’s docs note that each JSON record must be on a separate line. 

Use a table like this and replace the S3 path:

CREATE DATABASE IF NOT EXISTS analytics;

CREATE EXTERNAL TABLE IF NOT EXISTS analytics.formio_answers_ndjson (
  submission_id string,
  form_id string,
  form_machine_name string,
  form_title string,
  ingestion_ts string,
  source_bucket string,
  source_key string,
  field_path string,
  field_key string,
  field_type string,
  section_label string,
  field_label string,
  field_label_path string,
  raw_value string,
  display_value string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://your-bucket/path/to/normalized-ndjson/';

That works because your normalizer emits flat JSON objects with scalar string values, which is the easiest shape for Athena to read as NDJSON. Athena’s general table syntax and SerDe usage are documented in the CREATE TABLE and SerDe docs. 

Then query it like any normal table. For example, to inspect the data:

SELECT *
FROM analytics.formio_answers_ndjson
LIMIT 25;

To find all answers for one submission:

SELECT
  submission_id,
  section_label,
  field_label,
  raw_value,
  display_value
FROM analytics.formio_answers_ndjson
WHERE submission_id = '69b8c71eda953185af8f68ce'
ORDER BY field_path;

To get a human-readable report for a specific field across submissions:

SELECT
  submission_id,
  display_value
FROM analytics.formio_answers_ndjson
WHERE field_path = 'part-e-your-circumstances-first-home-new-home-concession';

To pivot a few known fields into one row per submission:

SELECT
  submission_id,
  max(CASE WHEN field_path = 'part-a-your-details-first-name' THEN display_value END) AS first_name,
  max(CASE WHEN field_path = 'part-a-your-details-last-name' THEN display_value END) AS last_name,
  max(CASE WHEN field_path = 'part-d-which-concession-did-you-and-any-person' THEN display_value END) AS concession_type,
  max(CASE WHEN field_path = 'part-e-your-circumstances-first-home-new-home-concession' THEN display_value END) AS circumstance
FROM analytics.formio_answers_ndjson
GROUP BY submission_id;

A few gotchas matter here. OpenX JSON SerDe expects newline-delimited records, so pretty-printed multi-line JSON will not read correctly. Also, Athena tables point at an S3 prefix, so every file under that prefix should match the same schema, or queries can fail or return nulls. 

For production, I’d keep this NDJSON table as the landing table, then create a Parquet table from it with CTAS for cheaper and faster queries, since Athena recommends columnar formats like Parquet for performance. 

Example:

CREATE TABLE analytics.formio_answers_parquet
WITH (
  format = 'PARQUET',
  external_location = 's3://your-bucket/path/to/parquet/',
  write_compression = 'SNAPPY'
) AS
SELECT *
FROM analytics.formio_answers_ndjson;

Then query the Parquet table instead:

SELECT submission_id, field_label, display_value
FROM analytics.formio_answers_parquet
WHERE field_path = 'part-e-your-circumstances-first-home-new-home-concession';

If you want, I’ll give you a version of the CREATE TABLE statement with partitions like dt and form_machine_name baked in.

-- Athena DDL for the normalized answer-row dataset produced by formio_lambda_normalizer.py
--
-- S3 layout expected by the example Lambda:
-- s3://YOUR-BUCKET/formio/answers/dt=YYYY-MM-DD/form_slug=YOUR_FORM_SLUG/submission_id=...ndjson
--
-- Recommendation:
-- Start with the JSON table below for quick validation.
-- For long-term analytics, batch or convert the same schema to Parquet.
--
-- After new partitions land, run:
-- MSCK REPAIR TABLE analytics.formio_answers_json;
--
-- If you later write Parquet instead of JSON Lines (for example via Firehose or compaction),
-- use the second table definition.
CREATE EXTERNAL TABLE IF NOT EXISTS analytics.formio_answers_json (
source_system string,
received_at string,
form_id string,
form_machine_name string,
form_title string,
submission_id string,
submission_created_at string,
submission_modified_at string,
field_path string,
field_key string,
field_type string,
section_label string,
field_label string,
field_label_path string,
raw_value string,
display_value string,
is_answered boolean
)
PARTITIONED BY (
dt string,
form_slug string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://YOUR-BUCKET/formio/answers/';
-- Helpful typed view over the JSON table
CREATE OR REPLACE VIEW analytics.formio_answers_v AS
SELECT
source_system,
from_iso8601_timestamp(received_at) AS received_at_ts,
form_id,
form_machine_name,
form_title,
submission_id,
from_iso8601_timestamp(submission_created_at) AS submission_created_at_ts,
from_iso8601_timestamp(submission_modified_at) AS submission_modified_at_ts,
field_path,
field_key,
field_type,
section_label,
field_label,
field_label_path,
raw_value,
display_value,
is_answered,
dt,
form_slug
FROM analytics.formio_answers_json;
-- If the normalized rows are written to Parquet instead, use this table instead of the JSON table.
-- Keep the same partition folder structure.
CREATE EXTERNAL TABLE IF NOT EXISTS analytics.formio_answers_parquet (
source_system string,
received_at string,
form_id string,
form_machine_name string,
form_title string,
submission_id string,
submission_created_at string,
submission_modified_at string,
field_path string,
field_key string,
field_type string,
section_label string,
field_label string,
field_label_path string,
raw_value string,
display_value string,
is_answered boolean
)
PARTITIONED BY (
dt string,
form_slug string
)
STORED AS PARQUET
LOCATION 's3://YOUR-BUCKET/formio/answers/';
-- Example queries
-- 1) All answers for one submission
-- SELECT *
-- FROM analytics.formio_answers_v
-- WHERE submission_id = '69b8c71eda953185af8f68ce'
-- ORDER BY section_label, field_label;
-- 2) Match by human-readable label
-- SELECT submission_id, display_value
-- FROM analytics.formio_answers_v
-- WHERE field_label = 'Plan number';
-- 3) Match the decoded Part E answer
-- SELECT submission_id, display_value
-- FROM analytics.formio_answers_v
-- WHERE field_path = 'part-e-your-circumstances-first-home-new-home-concession';
"""
Normalize Form.io submission payloads into Athena-friendly answer rows.
Recommended pattern:
1) Keep the original payload in a raw/ prefix for audit/replay.
2) Write normalized answer rows to answers/ as JSON Lines or send them to Firehose.
3) Convert/batch to Parquet for Athena if query volume grows.
This module is generic across Form.io-style payloads that use:
- _label_data.components for field metadata
- submission.data for answer values
Upstream label-data enrichment:
- Read x-original-url from the incoming event headers
- Remove the trailing /submission segment
- Prefix the remaining path with API_FORMS_TLD
- GET that URL and assign the returned JSON to payload["_label_data"]
- Only then perform normalization
"""
from __future__ import annotations
import base64
import datetime as dt
import html
import json
import logging
import os
import re
import uuid
from typing import Any, Dict, Iterable, List, Optional
from urllib.parse import urljoin, urlparse
from urllib.request import Request, urlopen
import boto3
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3 = boto3.client("s3")
def is_truthy_env(value: Optional[str]) -> bool:
if value is None:
return False
return str(value).strip().lower() in {"true", "1", "yes"}
DEBUG = is_truthy_env(os.getenv("DEBUGGING", "false"))
def debug_log(message: str, data: Any = None) -> None:
if not DEBUG:
return
if data is None:
logger.info("[DEBUG] %s", message)
return
try:
rendered = json.dumps(data, ensure_ascii=False, default=str)
except Exception:
rendered = str(data)
logger.info("[DEBUG] %s | %s", message, rendered)
def get_header(headers: Optional[Dict[str, Any]], name: str) -> Optional[str]:
if not isinstance(headers, dict):
return None
target = name.lower()
for key, value in headers.items():
if str(key).lower() == target:
return str(value) if value is not None else None
return None
def strip_html(text: Optional[str]) -> str:
if text is None:
return ""
return html.unescape(re.sub(r"<[^>]+>", "", str(text))).strip()
def build_label_data_url(event: Dict[str, Any]) -> str:
"""
Build the upstream form-definition URL from the incoming x-original-url header.
Rules:
- Read x-original-url from the API Gateway event headers
- Remove the trailing /submission segment
- Prefix the remaining path with API_FORMS_TLD
"""
headers = event.get("headers")
debug_log("Incoming request headers", headers)
original_url = get_header(headers, "x-original-url")
debug_log("Extracted x-original-url header", original_url)
if not original_url:
raise ValueError("Missing required x-original-url header")
parsed = urlparse(original_url)
path = parsed.path or original_url
debug_log("Parsed path from x-original-url", path)
if path.endswith("/submission"):
path = path[: -len("/submission")]
elif "/submission/" in path:
path = path.rsplit("/submission", 1)[0]
else:
path = path.rstrip("/")
debug_log("Path after stripping /submission", path)
forms_tld = os.getenv("API_FORMS_TLD", "").strip()
debug_log("Loaded API_FORMS_TLD", forms_tld)
if not forms_tld:
raise ValueError("Missing required API_FORMS_TLD environment variable")
final_url = urljoin(forms_tld.rstrip("/") + "/", path.lstrip("/"))
debug_log("Constructed label data URL", final_url)
return final_url
def fetch_label_data(event: Dict[str, Any]) -> Dict[str, Any]:
"""Fetch the form definition JSON and return it for payload['_label_data']."""
url = build_label_data_url(event)
request = Request(url, method="GET", headers={"Accept": "application/json"})
debug_log("Issuing GET request for label data", {"url": url, "method": "GET"})
with urlopen(request, timeout=15) as response:
status_code = getattr(response, "status", None)
debug_log("Received HTTP response from label data endpoint", {"status": status_code})
body = response.read().decode("utf-8")
debug_log("Raw label data response body", body)
parsed = json.loads(body)
debug_log("Parsed label data JSON", parsed)
return parsed
def parse_component_options(component: Dict[str, Any]) -> Dict[str, str]:
"""
Build a value->label lookup for radio/select components that use a values[] array.
"""
values = component.get("values")
if not isinstance(values, list):
return {}
lookup: Dict[str, str] = {}
for item in values:
value = item.get("value")
if value is None:
continue
lookup[str(value)] = strip_html(item.get("label"))
debug_log(
"Parsed component options",
{
"component_key": component.get("key"),
"component_type": component.get("type"),
"option_count": len(lookup),
},
)
return lookup
def walk_components(
components: List[Dict[str, Any]],
parent_path: Optional[List[str]] = None,
section_label: Optional[str] = None,
label_path: Optional[List[str]] = None,
) -> List[Dict[str, Any]]:
"""
Flatten Form.io component metadata into leaf field definitions.
Matching rule:
- top-level leaf input: submission.data[key]
- leaf under container X: submission.data[X][child_key]
- radio/select label lookup: component.values[].value -> component.values[].label
"""
parent_path = parent_path or []
label_path = label_path or []
out: List[Dict[str, Any]] = []
for comp in components or []:
ctype = comp.get("type")
key = comp.get("key")
label = strip_html(comp.get("label"))
legend = strip_html(comp.get("legend"))
debug_log(
"Walking component",
{
"type": ctype,
"key": key,
"label": label,
"legend": legend,
"parent_path": parent_path,
"label_path": label_path,
},
)
current_section = section_label
current_label_path = list(label_path)
if legend:
current_section = legend
current_label_path.append(legend)
elif label and ctype not in {"columns", "fieldset", "htmlelement"}:
if not current_label_path or current_label_path[-1] != label:
current_label_path.append(label)
if ctype == "columns":
for col in comp.get("columns", []):
out.extend(
walk_components(
col.get("components", []),
parent_path=parent_path,
section_label=current_section,
label_path=current_label_path,
)
)
continue
if ctype in {"fieldset", "container"}:
child_parent = list(parent_path)
if ctype == "container" and comp.get("input") and key:
child_parent.append(key)
out.extend(
walk_components(
comp.get("components", []),
parent_path=child_parent,
section_label=current_section,
label_path=current_label_path,
)
)
continue
if comp.get("input") and key and ctype != "button":
full_path = ".".join(parent_path + [key])
field_def = {
"field_path": full_path,
"field_key": key,
"field_type": ctype,
"section_label": current_section or "",
"field_label": label,
"field_label_path": " > ".join(current_label_path) if current_label_path else label,
"options": parse_component_options(comp),
}
out.append(field_def)
debug_log("Emitted leaf field definition", field_def)
return out
def get_nested(data: Any, path: List[str]) -> Any:
current = data
for segment in path:
if not isinstance(current, dict):
debug_log("Nested lookup aborted because current node is not a dict", {"path": path, "segment": segment})
return None
current = current.get(segment)
if current is None:
debug_log("Nested lookup returned None", {"path": path, "segment": segment})
return None
return current
def stringify(value: Any) -> Optional[str]:
if value is None:
return None
if isinstance(value, bool):
return "true" if value else "false"
if isinstance(value, (str, int, float)):
return str(value)
return json.dumps(value, ensure_ascii=False, separators=(",", ":"))
def sanitize_form_slug(value: str) -> str:
slug = re.sub(r"[^A-Za-z0-9_-]+", "_", value or "").strip("_")
return slug or "unknown_form"
def parse_apigw_payload(event: Dict[str, Any]) -> Dict[str, Any]:
"""
Supports common API Gateway/Lambda proxy shapes and direct invocation with a dict payload.
"""
debug_log("Parsing incoming Lambda event", event)
if "body" not in event:
debug_log("Event has no body; assuming direct invocation payload")
if not isinstance(event, dict):
raise ValueError("Direct invocation payload must be a dictionary")
return event
body = event["body"]
debug_log("Raw event body before base64 handling", body)
if event.get("isBase64Encoded"):
debug_log("Event body is base64 encoded")
body = base64.b64decode(body).decode("utf-8")
debug_log("Decoded base64 event body", body)
if isinstance(body, str):
parsed = json.loads(body)
debug_log("Parsed JSON body", parsed)
return parsed
if isinstance(body, dict):
debug_log("Event body is already a dict")
return body
raise ValueError("Unsupported event body type")
def enrich_payload_with_label_data(event: Dict[str, Any], payload: Dict[str, Any]) -> Dict[str, Any]:
"""
Fetch _label_data from the upstream forms API and inject it into the payload
before any normalization work occurs.
"""
if not isinstance(payload, dict):
raise ValueError("Payload must be a dictionary")
debug_log("Payload before _label_data enrichment", payload)
label_data = fetch_label_data(event)
payload["_label_data"] = label_data
debug_log("Payload after _label_data enrichment", payload)
return payload
def normalize_payload(payload: Dict[str, Any]) -> Dict[str, Any]:
debug_log("Starting payload normalization")
field_defs = walk_components(payload.get("_label_data", {}).get("components", []))
debug_log("Completed component walk", {"field_definition_count": len(field_defs)})
submission_data = payload.get("submission", {}).get("data", {})
debug_log("Submission data extracted", submission_data)
form_machine_name = payload.get("_label_data", {}).get("machineName") or ""
form_slug = sanitize_form_slug(form_machine_name)
received_at = payload.get("receivedAt")
ingest_date = received_at[:10] if isinstance(received_at, str) and len(received_at) >= 10 else dt.date.today().isoformat()
submission_record = {
"ingest_date": ingest_date,
"form_machine_name_partition": form_slug,
"source_system": payload.get("source"),
"received_at": payload.get("receivedAt"),
"form_id": payload.get("form", {}).get("_id") or payload.get("_label_data", {}).get("_id"),
"form_machine_name": form_machine_name,
"form_title": payload.get("_label_data", {}).get("title"),
"submission_id": payload.get("submission", {}).get("_id"),
"submission_created_at": payload.get("submission", {}).get("created"),
"submission_modified_at": payload.get("submission", {}).get("modified"),
}
debug_log("Built submission record", submission_record)
answer_records: List[Dict[str, Any]] = []
for field_def in field_defs:
raw = get_nested(submission_data, field_def["field_path"].split("."))
if field_def["field_type"] == "select" and isinstance(raw, dict) and "value" in raw:
debug_log(
"Select component stored as object; extracting .value",
{"field_path": field_def["field_path"], "raw_before": raw},
)
raw = raw.get("value")
raw_value = stringify(raw)
display_value = field_def["options"].get(raw_value, raw_value) if raw_value is not None else None
answer_record = {
**submission_record,
"field_path": field_def["field_path"],
"field_key": field_def["field_key"],
"field_type": field_def["field_type"],
"section_label": field_def["section_label"],
"field_label": field_def["field_label"],
"field_label_path": field_def["field_label_path"],
"raw_value": raw_value,
"display_value": display_value,
"is_answered": raw is not None,
}
answer_records.append(answer_record)
debug_log("Resolved field into answer record", answer_record)
answered_only = [row for row in answer_records if row["is_answered"]]
submission_record["answer_count"] = len(answered_only)
debug_log(
"Finished normalization",
{
"total_fields": len(answer_records),
"answered_fields": len(answered_only),
"submission_id": submission_record.get("submission_id"),
},
)
return {
"submission_record": submission_record,
"answer_records": answered_only,
"raw_payload": payload,
}
def put_json(bucket: str, key: str, obj: Dict[str, Any]) -> None:
debug_log("Writing JSON object to S3", {"bucket": bucket, "key": key})
s3.put_object(
Bucket=bucket,
Key=key,
Body=json.dumps(obj, ensure_ascii=False).encode("utf-8"),
ContentType="application/json",
)
def put_ndjson(bucket: str, key: str, rows: Iterable[Dict[str, Any]]) -> None:
rows_list = list(rows)
debug_log("Writing NDJSON to S3", {"bucket": bucket, "key": key, "row_count": len(rows_list)})
payload = "\n".join(json.dumps(row, ensure_ascii=False, separators=(",", ":")) for row in rows_list)
s3.put_object(
Bucket=bucket,
Key=key,
Body=payload.encode("utf-8"),
ContentType="application/x-ndjson",
)
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
"""
Example handler.
Environment variables:
API_FORMS_TLD required for upstream form-definition lookup
DEBUGGING true/false, yes/no, 1/0 (default false)
RAW_BUCKET optional
NORMALIZED_BUCKET optional
RAW_PREFIX defaults to 'formio/raw'
ANSWERS_PREFIX defaults to 'formio/answers'
STORE_RAW true/false (default true)
STORE_ANSWERS_JSONL true/false (default true)
Note:
Writing one S3 object per request is fine at low volume, but if volume grows,
send answer_records to Amazon Data Firehose (or batch/compact later) so Athena
reads fewer, larger Parquet files.
"""
debug_log(
"Lambda invoked",
{
"aws_request_id": getattr(context, "aws_request_id", None),
"debug_enabled": DEBUG,
},
)
payload = parse_apigw_payload(event)
payload = enrich_payload_with_label_data(event, payload)
normalized = normalize_payload(payload)
submission = normalized["submission_record"]
answers = normalized["answer_records"]
raw_bucket = os.getenv("RAW_BUCKET")
normalized_bucket = os.getenv("NORMALIZED_BUCKET") or raw_bucket
raw_prefix = os.getenv("RAW_PREFIX", "formio/raw").strip("/")
answers_prefix = os.getenv("ANSWERS_PREFIX", "formio/answers").strip("/")
store_raw = is_truthy_env(os.getenv("STORE_RAW", "true"))
store_answers = is_truthy_env(os.getenv("STORE_ANSWERS_JSONL", "true"))
debug_log(
"Resolved storage configuration",
{
"raw_bucket": raw_bucket,
"normalized_bucket": normalized_bucket,
"raw_prefix": raw_prefix,
"answers_prefix": answers_prefix,
"store_raw": store_raw,
"store_answers": store_answers,
},
)
object_id = submission["submission_id"] or str(uuid.uuid4())
dt_part = submission["ingest_date"]
form_part = submission["form_machine_name_partition"]
debug_log(
"Computed storage object metadata",
{"object_id": object_id, "dt_part": dt_part, "form_part": form_part},
)
if store_raw and raw_bucket:
raw_key = (
f"{raw_prefix}/dt={dt_part}/form_slug={form_part}/"
f"submission_id={object_id}.json"
)
put_json(raw_bucket, raw_key, normalized["raw_payload"])
else:
debug_log("Skipping raw payload write", {"store_raw": store_raw, "raw_bucket": raw_bucket})
if store_answers and normalized_bucket:
answers_key = (
f"{answers_prefix}/dt={dt_part}/form_slug={form_part}/"
f"submission_id={object_id}.ndjson"
)
put_ndjson(normalized_bucket, answers_key, answers)
else:
debug_log(
"Skipping normalized answers write",
{"store_answers": store_answers, "normalized_bucket": normalized_bucket},
)
response = {
"statusCode": 202,
"headers": {"Content-Type": "application/json"},
"body": json.dumps(
{
"ok": True,
"submission_id": submission["submission_id"],
"answer_count": submission["answer_count"],
"form_machine_name_partition": submission["form_machine_name_partition"],
}
),
}
debug_log("Returning Lambda response", response)
return response
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "iAmProvidingTrueInformation", "field_key": "iAmProvidingTrueInformation", "field_type": "checkbox", "section_label": "Disclaimer", "field_label": "I confirm that I will provide true and correct information in this form.", "field_label_path": "Disclaimer > I confirm that I will provide true and correct information in this form.", "raw_value": "true", "display_value": "true", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "iAmProvidingAcknowledgeTaxImplications", "field_key": "iAmProvidingAcknowledgeTaxImplications", "field_type": "checkbox", "section_label": "Disclaimer", "field_label": "I understand that providing false and misleading information is an offence under the Taxation Administration Act 2001.", "field_label_path": "Disclaimer > I understand that providing false and misleading information is an offence under the Taxation Administration Act 2001.", "raw_value": "true", "display_value": "true", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "iAmProvidingAcknowledgeTaxImplications1", "field_key": "iAmProvidingAcknowledgeTaxImplications1", "field_type": "checkbox", "section_label": "Disclaimer", "field_label": "An email and copy of the form will be sent to all email addresses included in the form.", "field_label_path": "Disclaimer > An email and copy of the form will be sent to all email addresses included in the form.", "raw_value": "true", "display_value": "true", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-first-name", "field_key": "part-a-your-details-first-name", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "First name", "field_label_path": "Part A—Your details > Part a your details > First name", "raw_value": "Ada", "display_value": "Ada", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-middle-name", "field_key": "part-a-your-details-middle-name", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Middle name", "field_label_path": "Part A—Your details > Part a your details > Middle name", "raw_value": "", "display_value": "", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-surname", "field_key": "part-a-your-details-surname", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Surname", "field_label_path": "Part A—Your details > Part a your details > Surname", "raw_value": "Liang", "display_value": "Liang", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-date-of-birth", "field_key": "part-a-your-details-date-of-birth", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Date of birth", "field_label_path": "Part A—Your details > Part a your details > Date of birth", "raw_value": "01/03/2026", "display_value": "01/03/2026", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-current-postal-address", "field_key": "part-a-your-details-current-postal-address", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Current postal address", "field_label_path": "Part A—Your details > Part a your details > Current postal address", "raw_value": "150 Mary St", "display_value": "150 Mary St", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-suburb", "field_key": "part-a-your-details-suburb", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Suburb", "field_label_path": "Part A—Your details > Part a your details > Suburb", "raw_value": "BNE", "display_value": "BNE", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-state", "field_key": "part-a-your-details-state", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "State", "field_label_path": "Part A—Your details > Part a your details > State", "raw_value": "QLD", "display_value": "QLD", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-postcode", "field_key": "part-a-your-details-postcode", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Postcode", "field_label_path": "Part A—Your details > Part a your details > Postcode", "raw_value": "4000", "display_value": "4000", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-phone", "field_key": "part-a-your-details-phone", "field_type": "textfield", "section_label": "Part A—Your details", "field_label": "Phone number", "field_label_path": "Part A—Your details > Part a your details > Phone number", "raw_value": "0412345678", "display_value": "0412345678", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-a-your-details.part-a-your-details-email-address", "field_key": "part-a-your-details-email-address", "field_type": "email", "section_label": "Part A—Your details", "field_label": "Email address", "field_label_path": "Part A—Your details > Part a your details > Email address", "raw_value": "ada.liang@treasury.qld.gov.au", "display_value": "ada.liang@treasury.qld.gov.au", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "didYouClaimTheConcessionWithAnotherPerson", "field_key": "didYouClaimTheConcessionWithAnotherPerson", "field_type": "radio", "section_label": "Part B—Other party to the transaction", "field_label": "Did you claim the concession with another person?", "field_label_path": "Part B—Other party to the transaction > Did you claim the concession with another person?", "raw_value": "No", "display_value": "No", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-address-of-property", "field_key": "part-c-property-details-address-of-property", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Address of property", "field_label_path": "Part C—Property details > Part c property details > Address of property", "raw_value": "150 Mary St", "display_value": "150 Mary St", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-suburb", "field_key": "part-c-property-details-suburb", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Suburb", "field_label_path": "Part C—Property details > Part c property details > Suburb", "raw_value": "BNE", "display_value": "BNE", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-state", "field_key": "part-c-property-details-state", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "State", "field_label_path": "Part C—Property details > Part c property details > State", "raw_value": "QLD", "display_value": "QLD", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-postcode", "field_key": "part-c-property-details-postcode", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Postcode", "field_label_path": "Part C—Property details > Part c property details > Postcode", "raw_value": "4000", "display_value": "4000", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-lot-number", "field_key": "part-c-property-details-lot-number", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Lot number", "field_label_path": "Part C—Property details > Part c property details > Lot number", "raw_value": "12", "display_value": "12", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-plan-type-e-g-rp-sp", "field_key": "part-c-property-details-plan-type-e-g-rp-sp", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Plan type (e.g. RP, SP)", "field_label_path": "Part C—Property details > Part c property details > Plan type (e.g. RP, SP)", "raw_value": "RP", "display_value": "RP", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-plan-number", "field_key": "part-c-property-details-plan-number", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "Plan number", "field_label_path": "Part C—Property details > Part c property details > Plan number", "raw_value": "12345", "display_value": "12345", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partCPropertyDetails.part-c-property-details-when-was-the-transfer-date", "field_key": "part-c-property-details-when-was-the-transfer-date", "field_type": "textfield", "section_label": "Part C—Property details", "field_label": "When was the transfer date", "field_label_path": "Part C—Property details > Part c property details > When was the transfer date", "raw_value": "03/03/2026", "display_value": "03/03/2026", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-d-which-concession-did-you-and-any-person", "field_key": "part-d-which-concession-did-you-and-any-person", "field_type": "select", "section_label": "Part D—Concession type claimed", "field_label": "Which concession did you and any person listed in Part B claim?", "field_label_path": "Part D—Concession type claimed > Which concession did you and any person listed in Part B claim?", "raw_value": "First home (new home) concession", "display_value": "First home (new home) concession", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-e-your-circumstances-first-home-new-home-concession", "field_key": "part-e-your-circumstances-first-home-new-home-concession", "field_type": "radio", "section_label": "", "field_label": "Select one of the following that best matches your situation.", "field_label_path": "Select one of the following that best matches your situation.", "raw_value": "e6-1", "display_value": "Before moving in, you sold or transferred all or part of the property.", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "part-f-special-circumstances", "field_key": "part-f-special-circumstances", "field_type": "textarea", "section_label": "Part F—Special circumstances", "field_label": "Explain your circumstances if they are not covered in Part E, or you wish to tell us why you could not meet the concession requirements.", "field_label_path": "Part F—Special circumstances > Explain your circumstances if they are not covered in Part E, or you wish to tell us why you could not meet the concession requirements.", "raw_value": "", "display_value": "", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partGVerification.part-g-verification-first-name1", "field_key": "part-g-verification-first-name1", "field_type": "textfield", "section_label": "Part G—Verification", "field_label": "First name", "field_label_path": "Part G—Verification > Part g verification > First name", "raw_value": "Ada", "display_value": "Ada", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partGVerification.part-g-verification-surname1", "field_key": "part-g-verification-surname1", "field_type": "textfield", "section_label": "Part G—Verification", "field_label": "Surname", "field_label_path": "Part G—Verification > Part g verification > Surname", "raw_value": "Liang", "display_value": "Liang", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "partGVerification.part-g-verification-date1", "field_key": "part-g-verification-date1", "field_type": "textfield", "section_label": "Part G—Verification", "field_label": "Date", "field_label_path": "Part G—Verification > Part g verification > Date", "raw_value": "17/03/2026", "display_value": "17/03/2026", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "emailRecipients", "field_key": "emailRecipients", "field_type": "hidden", "section_label": "", "field_label": "email recipients", "field_label_path": "email recipients", "raw_value": "dg.deskaudit@treasury.qld.gov.au", "display_value": "dg.deskaudit@treasury.qld.gov.au", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "formEnvironment", "field_key": "formEnvironment", "field_type": "hidden", "section_label": "", "field_label": "Form environment", "field_label_path": "Form environment", "raw_value": "", "display_value": "", "is_answered": true}
{"ingest_date": "2026-03-17", "form_machine_name_partition": "dev-nlpewxrdpntlxzh_dbStorageTestForm1", "source_system": "formio-DB-storage-test-1", "received_at": "2026-03-17T03:14:38.874Z", "form_id": "696862489da3e54ea6c5abb0", "form_machine_name": "dev-nlpewxrdpntlxzh:dbStorageTestForm1", "form_title": "DB storage test 1", "submission_id": "69b8c71eda953185af8f68ce", "submission_created_at": "2026-03-17T03:14:38.832Z", "submission_modified_at": "2026-03-17T03:14:38.832Z", "field_path": "submissionEnvironment", "field_key": "submissionEnvironment", "field_type": "hidden", "section_label": "", "field_label": "Submission environment", "field_label_path": "Submission environment", "raw_value": "", "display_value": "", "is_answered": true}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment