{"$schema":"https://json-schema.org/draft/2020-12/schema","title":"FasTrak Trip Explorer canonical JSON import structure","description":"Documents a lightweight structure for canonical JSON field names in transaction arrays or transactions envelopes. Passing this schema does not guarantee a successful import: semantic validation, bridge lookup, and additional heading aliases are handled by the runtime parser. See each transaction's description for endpoint and time requirements.","oneOf":[{"type":"array","items":{"type":"object","description":"Lightweight canonical-field structure, not a complete semantic validator or every accepted heading alias. The runtime parser validates dates, times, monetary precision, and row requirements. Ordinary express-lane rows need entryPlaza, exitPlaza, and entryTime. A single facility record or a bridge charge can omit separate endpoints and time; bridge recognition uses kind=bridge or a known bridge name/alias. Unused fields may remain blank in normalized records.","required":["transactionDate","tag","amount"],"properties":{"transactionDate":{"type":"string","description":"YYYY-MM-DD, MM/DD/YY, or MM/DD/YYYY; the runtime parser requires a real calendar date."},"postingDate":{"type":"string"},"tag":{"type":"string","description":"Preserve leading zeros."},"agency":{"type":"string"},"entryTime":{"type":"string","description":"HH:mm or a time such as 7:49 AM; may be absent or blank for a single bridge/toll-location record."},"entryPlaza":{"type":"string"},"exitPlaza":{"type":"string"},"entryLane":{"type":"string"},"exitLane":{"type":"string"},"facility":{"type":"string","description":"Single toll location or bridge name; no entrance/exit is invented."},"kind":{"enum":["bridge","express-lane"]},"amount":{"type":["number","string"],"description":"USD, at most two decimal places."}},"anyOf":[{"required":["entryPlaza"],"properties":{"entryPlaza":{"type":"string","pattern":"\\S"}}},{"required":["exitPlaza"],"properties":{"exitPlaza":{"type":"string","pattern":"\\S"}}},{"required":["facility"],"properties":{"facility":{"type":"string","pattern":"\\S"}}}],"additionalProperties":true}},{"type":"object","required":["transactions"],"properties":{"transactions":{"type":"array","items":{"type":"object","description":"Lightweight canonical-field structure, not a complete semantic validator or every accepted heading alias. The runtime parser validates dates, times, monetary precision, and row requirements. Ordinary express-lane rows need entryPlaza, exitPlaza, and entryTime. A single facility record or a bridge charge can omit separate endpoints and time; bridge recognition uses kind=bridge or a known bridge name/alias. Unused fields may remain blank in normalized records.","required":["transactionDate","tag","amount"],"properties":{"transactionDate":{"type":"string","description":"YYYY-MM-DD, MM/DD/YY, or MM/DD/YYYY; the runtime parser requires a real calendar date."},"postingDate":{"type":"string"},"tag":{"type":"string","description":"Preserve leading zeros."},"agency":{"type":"string"},"entryTime":{"type":"string","description":"HH:mm or a time such as 7:49 AM; may be absent or blank for a single bridge/toll-location record."},"entryPlaza":{"type":"string"},"exitPlaza":{"type":"string"},"entryLane":{"type":"string"},"exitLane":{"type":"string"},"facility":{"type":"string","description":"Single toll location or bridge name; no entrance/exit is invented."},"kind":{"enum":["bridge","express-lane"]},"amount":{"type":["number","string"],"description":"USD, at most two decimal places."}},"anyOf":[{"required":["entryPlaza"],"properties":{"entryPlaza":{"type":"string","pattern":"\\S"}}},{"required":["exitPlaza"],"properties":{"exitPlaza":{"type":"string","pattern":"\\S"}}},{"required":["facility"],"properties":{"facility":{"type":"string","pattern":"\\S"}}}],"additionalProperties":true}}},"additionalProperties":true}]}