{"schemaVersion":"2026-10-21","application":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","minLength":2,"maxLength":100},"email":{"type":"string","format":"email","maxLength":254},"city":{"type":"string","enum":["New York","San Francisco","Los Angeles","Boston","Austin","Another city","Still deciding"]},"stage":{"type":"string","enum":["Planning my move","Recently arrived","Already settled"]},"profession":{"type":"string","minLength":2,"maxLength":120},"profileUrl":{"type":"string","maxLength":500,"default":"","description":"Optional full http:// or https:// professional profile URL with a valid hostname, or an empty string. Server validation is authoritative.","pattern":"^$|^[hH][tT][tT][pP][sS]?://"},"interests":{"type":"array","items":{"type":"string","enum":["Community meetups","Member introductions","Collaborations & opportunities","Member benefits","Expert connections","Hosting & contributing"]},"minItems":1,"maxItems":6},"introduction":{"type":"string","minLength":15,"maxLength":1500},"consent":{"type":"boolean","const":true,"description":"Set true only after the applicant has agreed to the privacy notice and application-related updates."},"immigrationCategory":{"type":"string","enum":["o1a","o1b","eb1a","eb1b","eb1c"]},"helpNeeded":{"type":"string","maxLength":1000,"default":""},"canOffer":{"type":"string","maxLength":1000,"default":""}},"required":["name","email","city","stage","profession","interests","introduction","consent","immigrationCategory"]},"categories":["o1a","o1b","eb1a","eb1b","eb1c"],"interests":["Community meetups","Member introductions","Collaborations & opportunities","Member benefits","Expert connections","Hosting & contributing"],"proof":{"requiredAtSubmission":false,"requestRequired":true,"requestField":"application.verificationRequestedAt","allowedApplicationStatus":"pending","uploadGate":"Wait until verificationRequestedAt is non-null and status is pending. Uploads are blocked before a request, while waitlisted, and after evidence has been verified. A proof request is not final membership approval.","maxBytes":4194304,"contentTypes":["application/pdf","image/png","image/jpeg"],"evidenceTypes":["o1_approval","o1_i94","o1_visa","eb1_approval","eb1_residence"],"redactionConfirmationRequired":true,"fieldNames":["file","evidenceType","hasRedacted","immigrationCategory"],"categoryRule":"O-1 categories require an o1_ evidence type; EB-1 categories require an eb1_ evidence type.","immigrationCategoryField":"Only needed when completing a legacy application without a selected category."},"workflow":["Obtain the applicant’s permission and confirm accurate application details and their self-declared category. Explain that private redacted proof will be requested if their introduction is selected.","POST /api/applications with application JSON only. No proof upload at submission. Save the returned private accessCode securely.","WAIT for the owner to review the introduction and request proof. GET /api/membership with private access; proceed only when application.verificationRequestedAt is non-null and application.status is pending. A request or conditional acceptance is not final membership approval.","After the request, POST /api/membership/proof with a user-provided redacted document and their explicit redaction confirmation. Uploads before a request or while waitlisted return HTTP 409.","GET /api/membership to read the manual evidence review result. Final membership approval and an invitation follow only after the owner’s decision."],"access":{"accountRequired":false,"header":"Authorization: Bearer <private access code>","browser":"Secure HttpOnly SameSite cookie","expires":"See accessExpiresAt returned when the application is created.","secrecy":"Never put access codes in URLs, public logs, indexes, or shared transcripts. They grant control of the application."},"requests":{"jsonContentType":"application/json","uploadContentType":"multipart/form-data with a generated boundary","transport":"Server-side HTTPS clients may use the API directly. Cross-origin browser requests are not supported.","retry":"Read error.code and any field errors. Respect Retry-After on HTTP 429. Do not retry a destructive action or a submission with an uncertain outcome without checking the application first."},"consent":{"submit":"The applicant must authorize submission and privacy consent.","upload":"Wait for the owner’s proof request. The applicant must supply and approve the redacted file. Do not invent proof or assume redaction.","removeOrWithdraw":"Require the applicant’s explicit confirmation before removing proof or withdrawing.","invitation":"Accept a membership invitation only after the applicant explicitly chooses to join."},"privacy":"Private application data and files must not be crawled, indexed, used as public examples, or shared with other applicants. Only the club owner may download uploaded proof."}