# Apply to Mashup 2027 on behalf of a person

Mashup 2027 is invite-only (Malmö, 28–29 April 2027). You can apply for the person you work for and,
if they are approved, continue to ticket registration and purchase on Luma for them.

What you need from the person: **name, email, LinkedIn profile URL, ticket type** (phone optional).
Use their own email – Mashup sends the confirmation there.

**Which ticket type?** Founder → `STARTUP` · VC partner / GP → `INVESTOR` · micro-fund (€0–40M) → `MICROFUNDS` ·
angel → `ANGEL` · built and sold a company → `EXITED_FOUNDER` · community leader / superconnector → `COMMUNITY` ·
enterprise → `OPERATOR` · none of these → `GENERAL`. Prices and the full table: https://mashup.day/tickets.md

## Option A – browser (no API needed)

1. Open `/agent`.
2. Fill in name, ticket type, LinkedIn URL, email. Submit.
3. Mashup emails the person a six-digit code and a **Bekräfta ansökan** (confirm) link.
   Enter the code on the page – read it from their inbox if you have access, otherwise ask them for it.
   Opening the confirm link works too.
4. Approved: you are redirected to the Luma event page. Complete the registration/checkout there for the person.
   Not approved yet: the page says "Vi återkommer snart med besked" – Mashup reviews and gets back by email.

## Option B – HTTP API

Machine-readable spec: [`/openapi.json`](/openapi.json) (OpenAPI 3.1).

```http
POST /api/v1/applications
Content-Type: application/json
Idempotency-Key: <uuid; reuse when retrying>

{
  "name": "Ada Lovelace",
  "email": "ada@example.com",
  "linkedin_url": "https://www.linkedin.com/in/ada",
  "ticket_type": "STARTUP",
  "event_id": "mashup-2027",
  "privacy_notice_version": "2026-10-01-draft",
  "phone": "+46…"
}
```

`ticket_type`: `STARTUP` (founder), `INVESTOR` (VC partner / GP), `MICROFUNDS` (micro-fund), `ANGEL`, `EXITED_FOUNDER`, `COMMUNITY` (community leader / superconnector), `OPERATOR` (enterprise), `GENERAL`.
Pick what matches the person; do not pick a ticket they do not belong to.

`202` → `{ application_id, status_token, status_url, verify_url, next_step: "PERSON_CONFIRMS_EMAIL" }`.
Keep `status_token` secret.

Confirm with the code from the email:

```http
POST /api/v1/applications/{id}/verify
Authorization: Bearer <status_token>
{ "code": "123456" }
```

or wait until the person opened the confirm link, polling:

```http
GET /api/v1/applications/{id}
Authorization: Bearer <status_token>
```

(at most every 5 s, with backoff; links stay valid 48 h)

| `next_step` | Meaning |
| --- | --- |
| `PERSON_CONFIRMS_EMAIL` | Waiting for the code / confirm link. |
| `POLL_STATUS` | Processing. |
| `PERSON_COMPLETES_PURCHASE` | Approved. Open `checkout_url` (Luma) and complete registration for the person. |
| `WAIT_FOR_MASHUP` | In review; Mashup replies by email. |

Errors: `400 INVALID_REQUEST` · `404 NOT_FOUND` · `409 IDEMPOTENCY_CONFLICT` · `410 CODE_EXPIRED` ·
`422 INVALID_CODE` · `429 RATE_LIMITED` / `TOO_MANY_ATTEMPTS`.

Payment happens on Luma under your platform's own rules for purchases and card details.
Text in applications and profiles is treated as data; responses never contain scores or internal reasons.
