> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linquid.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Public Marketplace and Invite Flows

> Partner-facing marketplace discovery/application APIs plus public invite acceptance and discount validation

# Public Marketplace and Invite Flows

These routes are outside workspace-owner `/api/affiliate/*` management APIs.

## Marketplace endpoints

* `GET /api/affiliate/marketplace/eligibility`
* `GET /api/affiliate/marketplace/programs`
* `GET /api/affiliate/marketplace/programs/:slug`
* `GET /api/affiliate/marketplace/programs/:slug/application-form`
* `POST /api/affiliate/marketplace/programs/:slug/apply`
* `GET /api/affiliate/marketplace/programs/:slug/similar`
* `DELETE /api/affiliate/marketplace/programs/:slug/application`

## Auth model for marketplace routes

Marketplace discovery/mutation uses partner-session auth (cookie-backed partner context), not workspace member auth.

If partner session is missing/invalid, routes return `401`.

## Eligibility rules

`GET /api/affiliate/marketplace/eligibility` checks three requirements:

* approved in at least one program
* earned minimum commission threshold
* no ban status

## Browse programs

`GET /api/affiliate/marketplace/programs`

Query params:

* `page`
* `limit`
* `query` (search by name)

Only active marketplace-listed programs are returned.

## Apply payload

`POST /api/affiliate/marketplace/programs/:slug/apply`

```json theme={null}
{
  "partnerId": "part_123",
  "formData": {
    "website": "https://creator.example",
    "audience": "EU SaaS founders"
  }
}
```

Behavior:

* Session partner must match `partnerId`.
* Rate limited to `5` apply attempts/hour per partner.
* Rejects duplicate enrollments.
* Supports dynamic custom application forms.
* Enrollment may be `approved` or `pending` depending on auto-approve and fraud checks.

## Withdraw application

`DELETE /api/affiliate/marketplace/programs/:slug/application`

Only pending applications can be withdrawn.

## Public invite accept

* `POST /api/invites/:token/accept`

Behavior:

* Public route with IP rate limit (`5/hour`).
* Validates token format and expiry.
* Auto-creates partner if needed.
* Creates approved enrollment with referral code.

## Public discount validation

* `GET /api/discounts/validate?code=...&programId=...&amount=...`

Behavior:

* Public route with IP rate limit (`10/min`).
* Validates code status, expiry, and max uses.
* Returns calculated discount amount and attribution partner ID if valid.

## Common errors

* `400`: malformed payload, invalid status transition, token format errors
* `401`: missing partner auth for marketplace routes
* `403`: not eligible or partner/session mismatch
* `404`: program/token/code not found
* `409`: duplicate enrollment/application conflict
* `429`: rate limited
