{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://goodgo.vn/schemas/events/listing.submitted.schema.json", "title": "listing.submitted", "description": "Emitted when a Listing is submitted by its owner. Fan-out consumed by AI workers (moderation, AVM, NLP) on the async backbone — see RFC-004 Phase 2 (GOO-174).", "type": "object", "additionalProperties": false, "required": [ "listingId", "ownerId", "propertyType", "priceVnd", "locationRef", "descriptionHash", "submittedAt" ], "properties": { "listingId": { "type": "string", "minLength": 1 }, "ownerId": { "type": "string", "minLength": 1 }, "propertyType": { "type": "string", "description": "Domain property type enum (e.g. apartment, house, land, commercial, industrial)." }, "priceVnd": { "type": "string", "pattern": "^[0-9]+$", "description": "Asking price in VND as stringified integer — avoids JS number precision loss on large values." }, "locationRef": { "type": "object", "additionalProperties": false, "required": ["districtCode", "wardCode"], "properties": { "districtCode": { "type": "string", "minLength": 1 }, "wardCode": { "type": "string", "minLength": 1 }, "lat": { "type": "number", "minimum": -90, "maximum": 90 }, "lng": { "type": "number", "minimum": -180, "maximum": 180 } } }, "descriptionHash": { "type": "string", "pattern": "^[0-9a-f]{64}$", "description": "SHA-256 of the raw description text — lets AI workers detect duplicates without carrying the full body." }, "submittedAt": { "type": "string", "format": "date-time" } } }