{"openapi":"3.1.0","info":{"title":"Mashup 2027 applications","version":"1.0.0","description":"Apply to Mashup 2027 (invite-only, Malmö, 28–29 April 2027) on behalf of a person. The person confirms by email (six-digit code or confirm link). Approved applications get a Luma checkout_url. Guide: /agent.md. Which ticket_type to choose: https://mashup.day/tickets.md"},"servers":[{"url":"https://mashup-apply.vercel.app"}],"components":{"securitySchemes":{"statusToken":{"type":"http","scheme":"bearer","description":"status_token returned when the application is created"}},"schemas":{"ApplicationRequest":{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":200},"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"phone":{"type":"string","maxLength":40},"linkedin_url":{"type":"string","maxLength":500},"ticket_type":{"type":"string","enum":["STARTUP","ANGEL","MICROFUNDS","INVESTOR","OPERATOR","EXITED_FOUNDER","GENERAL","COMMUNITY"]},"event_id":{"type":"string","minLength":1,"maxLength":100},"privacy_notice_version":{"type":"string","minLength":1,"maxLength":50}},"required":["name","email","linkedin_url","ticket_type","event_id","privacy_notice_version"]},"ApplicationStatus":{"type":"object","properties":{"application_id":{"type":"string"},"processing_state":{"type":"string"},"outcome":{"type":["string","null"],"enum":["DIRECT","REVIEW",null],"description":"DIRECT = approved, go to checkout. REVIEW = Mashup reviews and replies by email. Never an automatic rejection."},"message":{"type":"string"},"checkout_url":{"type":["string","null"],"description":"Luma registration/checkout page. Only set when approved."},"next_step":{"type":"string","enum":["PERSON_CONFIRMS_EMAIL","POLL_STATUS","PERSON_COMPLETES_PURCHASE","WAIT_FOR_MASHUP"]}},"required":["application_id","outcome","checkout_url","next_step"]},"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}},"paths":{"/api/v1/applications":{"post":{"operationId":"createApplication","summary":"Apply for a person","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"UUID; reuse the same key when retrying"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationRequest"},"example":{"name":"Ada Lovelace","email":"ada@example.com","linkedin_url":"https://www.linkedin.com/in/ada","ticket_type":"ANGEL","event_id":"mashup-2027","privacy_notice_version":"2026-10-01-draft"}}}},"responses":{"202":{"description":"Created. The person gets an email with a code and a confirm link.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/ApplicationStatus"},{"type":"object","properties":{"status_token":{"type":"string"},"status_url":{"type":"string"},"verify_url":{"type":"string"}},"required":["status_token","status_url","verify_url"]}]}}}},"400":{"description":"INVALID_REQUEST – `fields` lists the invalid fields","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"409":{"description":"IDEMPOTENCY_CONFLICT","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"RATE_LIMITED","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/applications/{id}":{"get":{"operationId":"getApplicationStatus","summary":"Read status (poll at most every 5 s, with backoff)","security":[{"statusToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current status","content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string"},"processing_state":{"type":"string"},"outcome":{"type":["string","null"],"enum":["DIRECT","REVIEW",null],"description":"DIRECT = approved, go to checkout. REVIEW = Mashup reviews and replies by email. Never an automatic rejection."},"message":{"type":"string"},"checkout_url":{"type":["string","null"],"description":"Luma registration/checkout page. Only set when approved."},"next_step":{"type":"string","enum":["PERSON_CONFIRMS_EMAIL","POLL_STATUS","PERSON_COMPLETES_PURCHASE","WAIT_FOR_MASHUP"]}},"required":["application_id","outcome","checkout_url","next_step"]}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/v1/applications/{id}/verify":{"post":{"operationId":"verifyEmailCode","summary":"Confirm with the six-digit code from the person's email","security":[{"statusToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string","pattern":"^[0-9]{6}$"}},"required":["code"]}}}},"responses":{"200":{"description":"Verified; outcome decided","content":{"application/json":{"schema":{"type":"object","properties":{"application_id":{"type":"string"},"processing_state":{"type":"string"},"outcome":{"type":["string","null"],"enum":["DIRECT","REVIEW",null],"description":"DIRECT = approved, go to checkout. REVIEW = Mashup reviews and replies by email. Never an automatic rejection."},"message":{"type":"string"},"checkout_url":{"type":["string","null"],"description":"Luma registration/checkout page. Only set when approved."},"next_step":{"type":"string","enum":["PERSON_CONFIRMS_EMAIL","POLL_STATUS","PERSON_COMPLETES_PURCHASE","WAIT_FOR_MASHUP"]}},"required":["application_id","outcome","checkout_url","next_step"]}}}},"404":{"description":"NOT_FOUND","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"410":{"description":"CODE_EXPIRED","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"422":{"description":"INVALID_CODE","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"TOO_MANY_ATTEMPTS / RATE_LIMITED","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}}}