{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/craftingeventfinder-com/json-schema/craftingeventfinder-com-submission-schema.json",
  "title": "Submission",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/craftingeventfinder-com-openapi.yml#/components/schemas/Submission",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": [
        "string",
        "null"
      ]
    },
    "summary": {
      "type": [
        "string",
        "null"
      ]
    },
    "start_date": {
      "type": "string"
    },
    "end_date": {
      "type": [
        "string",
        "null"
      ]
    },
    "start_time": {
      "type": [
        "string",
        "null"
      ]
    },
    "end_time": {
      "type": [
        "string",
        "null"
      ]
    },
    "timezone": {
      "type": [
        "string",
        "null"
      ]
    },
    "recurrence": {
      "type": [
        "string",
        "null"
      ]
    },
    "city": {
      "type": "string"
    },
    "state": {
      "type": "string"
    },
    "venue": {
      "type": [
        "string",
        "null"
      ]
    },
    "lat": {
      "type": [
        "number",
        "null"
      ]
    },
    "lng": {
      "type": [
        "number",
        "null"
      ]
    },
    "location_kind": {
      "type": "string",
      "enum": [
        "venue",
        "online",
        "hybrid",
        "multi"
      ]
    },
    "street_address": {
      "type": [
        "string",
        "null"
      ]
    },
    "postal_code": {
      "type": [
        "string",
        "null"
      ]
    },
    "signup_note": {
      "type": [
        "string",
        "null"
      ]
    },
    "languages": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "hosted_by": {
      "type": [
        "string",
        "null"
      ]
    },
    "join_platform": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "zoom",
        "meet",
        "teams",
        "webex",
        "facebook",
        "youtube",
        "other",
        null
      ]
    },
    "join_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "join_meeting_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "join_passcode": {
      "type": [
        "string",
        "null"
      ]
    },
    "join_phone": {
      "type": [
        "string",
        "null"
      ]
    },
    "contact_name": {
      "type": [
        "string",
        "null"
      ]
    },
    "contact_email": {
      "type": [
        "string",
        "null"
      ]
    },
    "contact_phone": {
      "type": [
        "string",
        "null"
      ]
    },
    "craft_types": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "event_type": {
      "type": [
        "string",
        "null"
      ]
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "url": {
      "type": [
        "string",
        "null"
      ]
    },
    "organizer_name": {
      "type": [
        "string",
        "null"
      ]
    },
    "price_note": {
      "type": [
        "string",
        "null"
      ]
    },
    "is_free": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "origin": {
      "type": "string",
      "enum": [
        "public",
        "scrape",
        "organizer"
      ]
    },
    "source_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "source_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "confidence": {
      "type": [
        "number",
        "null"
      ]
    },
    "source_key": {
      "type": [
        "string",
        "null"
      ]
    },
    "organizer_email": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "approved",
        "rejected"
      ]
    },
    "flags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "duplicate_of_event_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "update_of_event_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "suggested_series_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "review_notes": {
      "type": [
        "string",
        "null"
      ]
    },
    "reviewed_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "published_event_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "admin_edited": {
      "type": "boolean"
    },
    "review_reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "gate_decision": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "publish",
        "queue",
        null
      ]
    },
    "gate_reasons": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "gate_bucket": {
      "type": [
        "string",
        "null"
      ]
    },
    "auto_published": {
      "type": "boolean"
    },
    "spot_check_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "spot_check_result": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "ok",
        "rejected",
        "edited",
        null
      ]
    },
    "created_at": {
      "type": "string"
    },
    "updated_at": {
      "type": "string"
    },
    "submitted_by": {
      "type": [
        "string",
        "null"
      ],
      "description": "The signed-in account that added it, if any"
    },
    "submitter": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "email": {
          "type": [
            "string",
            "null"
          ],
          "description": "Null once the account is deleted"
        },
        "role": {
          "type": "string",
          "enum": [
            "user",
            "organizer",
            "admin"
          ]
        },
        "trust": {
          "type": "string",
          "enum": [
            "untrusted",
            "trusted",
            "blocked"
          ]
        },
        "active": {
          "type": "boolean",
          "description": "Not suspended or deleted"
        },
        "approved": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Clean approvals in the gate's 90-day window; null when the lookup failed"
        },
        "rejected": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Rejections and strikes in the same window; null when the lookup failed"
        }
      },
      "required": [
        "id",
        "email",
        "role",
        "trust",
        "active",
        "approved",
        "rejected"
      ],
      "description": "In queue lists: who added it and their record, or null for a scraped or anonymous submission"
    },
    "proposal": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "publish",
            "merge",
            "reject",
            "close_update",
            "keep",
            "hide",
            "looks_right",
            "fix_event"
          ]
        },
        "label": {
          "type": "string",
          "description": "The button's text"
        },
        "reason": {
          "type": "string",
          "description": "One plain sentence: what happened, or why it's waiting"
        },
        "edits": {
          "type": "object",
          "properties": {
            "city": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "location_kind": {
              "type": "string",
              "enum": [
                "venue",
                "online",
                "multi"
              ]
            },
            "venue": {
              "type": "string"
            },
            "end_date": {
              "type": "string"
            },
            "start_time": {
              "type": "string"
            },
            "end_time": {
              "type": "string"
            }
          },
          "description": "For publish: the fixes the approve call sends"
        },
        "targetId": {
          "type": "string",
          "description": "For merge: the event to merge into"
        },
        "reasons": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "not_event",
              "not_crafting",
              "wrong_date",
              "wrong_place",
              "duplicate",
              "other"
            ]
          },
          "description": "For reject: the reasons the reject call sends"
        },
        "eventEdits": {
          "type": "object",
          "properties": {
            "start_date": {
              "type": "string"
            },
            "end_date": {
              "type": [
                "string",
                "null"
              ]
            },
            "start_time": {
              "type": [
                "string",
                "null"
              ]
            },
            "end_time": {
              "type": [
                "string",
                "null"
              ]
            },
            "city": {
              "type": "string"
            }
          },
          "description": "For fix_event: the changes resolve-check's Keep sends to the event (a nightly quality card's fix)"
        }
      },
      "required": [
        "action",
        "label",
        "reason"
      ],
      "description": "In queue and spot-check lists: the proposed answer (the judge's stored one, else derived), or null"
    },
    "noProposalReason": {
      "type": [
        "string",
        "null"
      ],
      "description": "In queue and spot-check lists, when proposal is null: why, as \"No suggestion: ...\""
    },
    "published_event_slug": {
      "type": [
        "string",
        "null"
      ],
      "description": "In spot-check lists: the published event's slug, for its public page, or null"
    },
    "published_event_status": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "published",
        "cancelled",
        "hidden",
        null
      ],
      "description": "In spot-check lists: the published event's status now (only a published one has a public page), or null"
    }
  },
  "required": [
    "id",
    "title",
    "description",
    "summary",
    "start_date",
    "end_date",
    "start_time",
    "end_time",
    "timezone",
    "recurrence",
    "city",
    "state",
    "venue",
    "lat",
    "lng",
    "location_kind",
    "street_address",
    "postal_code",
    "signup_note",
    "join_platform",
    "join_url",
    "join_meeting_id",
    "join_passcode",
    "join_phone",
    "contact_name",
    "contact_email",
    "contact_phone",
    "craft_types",
    "event_type",
    "tags",
    "url",
    "organizer_name",
    "price_note",
    "is_free",
    "origin",
    "source_id",
    "source_url",
    "confidence",
    "source_key",
    "organizer_email",
    "status",
    "flags",
    "duplicate_of_event_id",
    "update_of_event_id",
    "suggested_series_id",
    "review_notes",
    "reviewed_at",
    "published_event_id",
    "admin_edited",
    "review_reasons",
    "gate_decision",
    "gate_reasons",
    "gate_bucket",
    "auto_published",
    "spot_check_at",
    "spot_check_result",
    "created_at",
    "updated_at"
  ]
}