<!-- LLM Context: This is the AppGram REST API documentation for the Portal - Waitlist endpoints. -->
<!-- Use this documentation to help users integrate AppGram's Portal - Waitlist API into their applications. -->
<!-- Base URL: https://api.appgram.dev -->

# AppGram API: Portal - Waitlist

> **API Version:** 1.0

**Base URL:** `https://api.appgram.dev`

---

## Endpoints

- [`GET` /portal/categories](#get--portal-categories) - List project categories
- [`POST` /portal/votes](#post--portal-votes) - Vote on a wish
- [`GET` /portal/wishes](#get--portal-wishes) - List project wishes
- [`POST` /portal/wishes](#post--portal-wishes) - Create a wish
- [`GET` /portal/wishes/{id}](#get--portal-wishes--id-) - Get wish details

---

## `GET` /portal/categories {#get--portal-categories}

**List project categories**

Get all categories available for wishes in a project

### Parameters

| Name | In | Type | Required | Description |
|------|-----|------|----------|-------------|
| `project_id` | query | string | Yes | Project ID |

### Responses

**200**: List of categories

**400**: Missing project_id

**429**: Rate limit exceeded

### Example

```bash
curl -X GET "https://api.appgram.dev/portal/categories" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

---

## `POST` /portal/votes {#post--portal-votes}

**Vote on a wish**

Cast a vote on an existing wish/feature request

### Parameters

| Name | In | Type | Required | Description |
|------|-----|------|----------|-------------|
| `request` | body | string | Yes | Vote request with wish_id |

### Responses

**201**: Created vote

**400**: Invalid request data

**409**: Already voted

**429**: Rate limit exceeded

### Example

```bash
curl -X POST "https://api.appgram.dev/portal/votes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

---

## `GET` /portal/wishes {#get--portal-wishes}

**List project wishes**

Get paginated list of public wishes for a project with optional filtering

### Parameters

| Name | In | Type | Required | Description |
|------|-----|------|----------|-------------|
| `project_id` | query | string | No | Project ID |
| `status` | query | string | No | Wish status filter (open, closed, etc.) |
| `category_id` | query | string | No | Category ID filter |
| `search` | query | string | No | Search term |
| `sort_by` | query | string | No | Sort field (created_at, updated_at, votes) |
| `sort_order` | query | string | No | Sort order (asc, desc) |
| `page` | query | string | No | Page number |
| `per_page` | query | string | No | Items per page |

### Responses

**200**: Paginated list of wishes

**400**: Missing project_id

**429**: Rate limit exceeded

### Example

```bash
curl -X GET "https://api.appgram.dev/portal/wishes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

---

## `POST` /portal/wishes {#post--portal-wishes}

**Create a wish**

Create a new wish/feature request from the public portal

### Parameters

| Name | In | Type | Required | Description |
|------|-----|------|----------|-------------|
| `request` | body | string | Yes | Wish creation request |

### Responses

**201**: Created wish

**400**: Invalid request data

**429**: Rate limit exceeded

### Example

```bash
curl -X POST "https://api.appgram.dev/portal/wishes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

---

## `GET` /portal/wishes/{id} {#get--portal-wishes--id-}

**Get wish details**

Get detailed information about a specific wish

### Parameters

| Name | In | Type | Required | Description |
|------|-----|------|----------|-------------|
| `id` | path | string | Yes | Wish ID |

### Responses

**200**: Wish details

**404**: Wish not found

**429**: Rate limit exceeded

### Example

```bash
curl -X GET "https://api.appgram.dev/portal/wishes/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
```

---


*This documentation was auto-generated from the OpenAPI specification.*
