# Community · Client

Part of AppEngine API Documentation. Full index: https://appengine.appmint.io/documentation.md
## GET /client/community/pages

**List community pages**

`operationId: CommunitySocialClientController_getPages`

The community pages (spaces) in the org, optionally filtered by type. Public — a page list is discoverable by anyone.

#### Signature

```http
GET /client/community/pages (category?: string, q?: string, limit?: integer, page?: integer, type?: string) -> Pages
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/pages/{pageId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `type` | query | string | — |  |
| `category` | query | string | — | Filter by category. |
| `q` | query | string | — | Search text. |
| `limit` | query | integer | — | Maximum rows. |
| `page` | query | integer | — | Page number (1-based). |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Pages |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/pages

**Create a community page**

`operationId: CommunitySocialClientController_createPage`

Creates a page (a group or space) with the caller as its owner.

#### Signature

```http
POST /client/community/pages (body) -> The page
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `PUT /client/community/pages/{pageId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The page.

```json
{
  "name": "Photography",
  "type": "group",
  "description": "Share your shots."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The page |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/pages/mine

**List my pages**

`operationId: CommunitySocialClientController_getMyPages`

Pages the caller owns or belongs to.

#### Signature

```http
GET /client/community/pages/mine (page?: integer, limit?: integer) -> Pages
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/pages/{pageId}/join`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — | Page number (1-based). |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Pages |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/pages/{pageId}

**Get a community page**

`operationId: CommunitySocialClientController_getPage`

One page with its description and settings.

#### Signature

```http
GET /client/community/pages/{pageId} (pageId: string) -> The page
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/pages/{pageId}/join`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The page |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## PUT /client/community/pages/{pageId}

**Update a community page**

`operationId: CommunitySocialClientController_updatePage`

Changes a page's details. Restricted to the page owner or an admin of it.

#### Signature

```http
PUT /client/community/pages/{pageId} (pageId: string, body) -> The updated page
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |
| `403` | NOT_AUTHORIZED | Not authorized | The caller does not own or administer the page. | Ask a page admin. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/pages/mine`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Request body

Fields to change.

```json
{
  "description": "Share your shots — beginners welcome."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The updated page |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | Not authorized — The caller does not own or administer the page. |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/pages/{pageId}/join

**Join a page**

`operationId: CommunitySocialClientController_joinPage`

Adds the caller as a member. Membership determines what appears in their feed.

#### Signature

```http
POST /client/community/pages/{pageId}/join (pageId: string) -> The membership
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/pages/{pageId}/leave`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The membership |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/pages/{pageId}/leave

**Leave a page**

`operationId: CommunitySocialClientController_leavePage`

Removes the caller's membership. Their existing posts on the page stay — leaving is not a deletion.

#### Signature

```http
POST /client/community/pages/{pageId}/leave (pageId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Posts already made remain visible.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/pages/{pageId}/join`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/pages/{pageId}/invite

**Invite someone to a page**

`operationId: CommunitySocialClientController_invitePage`

Invites a member to join a page. This reaches the invitee as a notification, so it is outward-facing.

#### Signature

```http
POST /client/community/pages/{pageId}/invite (pageId: string, body) -> The invitation
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/pages/{pageId}/members`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Request body

Who to invite.

```json
{
  "email": "ada@example.com"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The invitation |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/pages/{pageId}/members

**List page members**

`operationId: CommunitySocialClientController_getPageMembers`

Who belongs to a page. **Public** — member lists are readable without authentication, which means membership of a page is not private.

#### Signature

```http
GET /client/community/pages/{pageId}/members (pageId: string, role?: string, limit?: integer, page?: integer) -> Members
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.
- Page membership is not private.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/people`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |
| `role` | query | string | — | Only members with this role. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Members |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/feed

**Get the community feed**

`operationId: CommunitySocialClientController_getFeed`

The main feed, filterable by page, author, content type and hashtag. `sort` defaults to `latest`.

Public, but **viewer-aware**: when a token is present the caller's own reactions and visibility are reflected, and without one the feed is the anonymous view. Note it takes both `limit`/`pageNum` and a separate `page` parameter — `page` filters to a community page, it is not pagination.

#### Signature

```http
GET /client/community/feed (page?: string, author?: string, type?: string, hashtag?: string, sort?: string, limit?: integer, pageNum?: integer) -> Feed posts
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.
- `page` filters by community page; `pageNum` paginates.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/posts/{postId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `page` | query | string | — | Community **page id** to filter by — not a pagination cursor. |
| `author` | query | string | — |  |
| `type` | query | string | — | Content type. |
| `hashtag` | query | string | — |  |
| `sort` | query | string | — | Defaults to `latest`. |
| `limit` | query | integer | — |  |
| `pageNum` | query | integer | — | The actual pagination parameter. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Feed posts |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/posts

**Create a post**

`operationId: CommunitySocialClientController_createPost`

Publishes a post as the caller. Posts on a public page are readable without authentication, so treat anything posted as public unless the page is restricted.

#### Signature

```http
POST /client/community/posts (body) -> The post
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Content may be world-readable.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `PUT /client/community/posts/{postId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The post.

```json
{
  "page": "PG-4821",
  "content": "First shot with the new lens.",
  "contentType": "text",
  "attachments": []
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The post |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/posts/{postId}

**Get a post**

`operationId: CommunitySocialClientController_getPost`

One post with its content and engagement counts.

#### Signature

```http
GET /client/community/posts/{postId} (postId: string) -> The post
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/posts/{postId}/comments`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The post |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## PUT /client/community/posts/{postId}

**Update a post**

`operationId: CommunitySocialClientController_updatePost`

Edits the caller's own post. Someone else's post cannot be edited.

#### Signature

```http
PUT /client/community/posts/{postId} (postId: string, body) -> The updated post
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |
| `403` | NOT_YOUR_POST | Not your post | The post belongs to another member. | Only the author can edit or delete it. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `DELETE /client/community/posts/{postId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post id. |

### Request body

Fields to change.

```json
{
  "content": "First shot with the new lens (corrected)."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The updated post |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | Not your post — The post belongs to another member. |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/posts/{postId}

**Delete a post**

`operationId: CommunitySocialClientController_deletePost`

Deletes the caller's own post, along with its comments and reactions.

#### Signature

```http
DELETE /client/community/posts/{postId} (postId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Comments and reactions go with it.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |
| `403` | NOT_YOUR_POST | Not your post | The post belongs to another member. | Only the author can edit or delete it. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/reports`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | Not your post — The post belongs to another member. |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/posts/{postId}/share

**Share a post**

`operationId: CommunitySocialClientController_sharePost`

Reposts someone's post to the caller's own feed, optionally with a comment. The original stays where it is — this creates a new post referencing it.

#### Signature

```http
POST /client/community/posts/{postId}/share (postId: string, body) -> The share
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/posts`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post to share. |

### Request body

Optional commentary.

```json
{
  "comment": "Worth a look."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The share |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/posts/{postId}/vote

**Vote in a poll**

`operationId: CommunitySocialClientController_votePoll`

Casts the caller's vote on a poll post. One vote per member — a second attempt is refused rather than replacing the first, so votes cannot be changed.

#### Signature

```http
POST /client/community/posts/{postId}/vote (postId: string, body) -> The vote result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Votes are final.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |
| `400` | NOT_A_POLL | Not a poll | The post is not a poll. | Check the post type. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/posts/{postId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Poll post id. |

### Request body

The chosen option.

```json
{
  "optionId": "opt-2"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The vote result |
| `400` | Not a poll — The post is not a poll. |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/posts/{postId}/comments

**Get post comments**

`operationId: CommunitySocialClientController_getComments`

Comments on a post. Pass `parentComment` to fetch replies to a specific comment rather than the top level.

#### Signature

```http
GET /client/community/posts/{postId}/comments (postId: string, parentComment?: string, limit?: integer, page?: integer) -> Comments
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/posts/{postId}/comments`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post id. |
| `parentComment` | query | string | — | Fetch replies to this comment. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Comments |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/posts/{postId}/comments

**Add a comment**

`operationId: CommunitySocialClientController_addComment`

Comments on a post as the caller. Set `parentComment` in the body to reply to another comment instead of the post.

#### Signature

```http
POST /client/community/posts/{postId}/comments (postId: string, body) -> The comment
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | POST_NOT_FOUND | Post not found | No post has that id. | Check the id from the feed. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `DELETE /client/community/comments/{commentId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `postId` | path | string | yes | Post id. |

### Request body

The comment.

```json
{
  "content": "Great shot.",
  "parentComment": null
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The comment |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Post not found — No post has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/comments/{commentId}

**Delete a comment**

`operationId: CommunitySocialClientController_deleteComment`

Deletes the caller's own comment. Someone else's comment cannot be deleted — report it instead.

#### Signature

```http
DELETE /client/community/comments/{commentId} (commentId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | COMMENT_NOT_FOUND | Comment not found | No comment has that id. | Check the id. |
| `403` | NOT_YOUR_COMMENT | Not your comment | The comment belongs to someone else. | Report it instead. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/reports`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `commentId` | path | string | yes | Comment id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | Not your comment — The comment belongs to someone else. |
| `404` | Comment not found — No comment has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/react

**React to something**

`operationId: CommunitySocialClientController_react`

Adds a reaction to a post, comment, story or message. One endpoint for all four — `targetType` says which, `type` is the reaction itself.

#### Signature

```http
POST /client/community/react (body) -> The reaction
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/reactions`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The reaction.

```json
{
  "target": "PST-4821",
  "targetType": "post",
  "type": "like"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The reaction |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/reactions

**Get reactions on a target**

`operationId: CommunitySocialClientController_getReactions`

Who reacted to something, and how.

#### Signature

```http
GET /client/community/reactions (target?: string, targetType?: string, limit?: integer, page?: integer) -> Reactions
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/react`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `target` | query | string | yes | Id of the thing reacted to. |
| `targetType` | query | string | — |  |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Reactions |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/hashtags/trending

**Get trending hashtags**

`operationId: CommunitySocialClientController_getTrendingHashtags`

The hashtags with the most recent activity.

#### Signature

```http
GET /client/community/hashtags/trending (limit?: integer) -> Trending hashtags
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/feed`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Trending hashtags |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/stories

**Get stories**

`operationId: CommunitySocialClientController_getStories`

Active stories, optionally for one page. Stories are short-lived by design — expired ones are not returned.

#### Signature

```http
GET /client/community/stories (page?: string) -> Stories
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/stories`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `page` | query | string | — | Community page id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Stories |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/stories

**Create a story**

`operationId: CommunitySocialClientController_createStory`

Publishes a story as the caller. Stories expire on their own; there is no need to delete them at the end of their life.

#### Signature

```http
POST /client/community/stories (body) -> The story
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/stories/{storyId}/view`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The story.

```json
{
  "media": "https://cdn.example.com/s/abc.jpg",
  "caption": "On location today"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The story |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/stories/{storyId}/view

**Mark a story viewed**

`operationId: CommunitySocialClientController_viewStory`

Records that the caller viewed a story — what populates the author's viewer list. The author can see who viewed, so this is not an anonymous action.

#### Signature

```http
POST /client/community/stories/{storyId}/view (storyId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- The story author sees who viewed.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/stories`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `storyId` | path | string | yes | Story id. |

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/stories/{storyId}

**Delete a story**

`operationId: CommunitySocialClientController_deleteStory`

Removes the caller's own story before it expires.

#### Signature

```http
DELETE /client/community/stories/{storyId} (storyId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `403` | NOT_YOUR_STORY | Not your story | The story belongs to someone else. | Only the author can delete it. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/stories`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `storyId` | path | string | yes | Story id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | Not your story — The story belongs to someone else. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/follow

**Follow someone or something**

`operationId: CommunitySocialClientController_follow`

Follows a member, page or hashtag — `followingType` says which. Unlike a connection, following is one-way and needs no approval.

#### Signature

```http
POST /client/community/follow (body) -> The follow
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `DELETE /client/community/follow/{followingId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

What to follow.

```json
{
  "following": "ada@example.com",
  "followingType": "member"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The follow |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/follow/{followingId}

**Unfollow**

`operationId: CommunitySocialClientController_unfollow`

Stops following a member, page or hashtag.

#### Signature

```http
DELETE /client/community/follow/{followingId} (followingId: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/following`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `followingId` | path | string | yes | What is being unfollowed. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/followers

**List my followers**

`operationId: CommunitySocialClientController_getFollowers`

Who follows the caller.

#### Signature

```http
GET /client/community/followers (limit?: integer, page?: integer) -> Followers
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/following`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Followers |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/following

**List what I follow**

`operationId: CommunitySocialClientController_getFollowing`

What the caller follows, optionally narrowed to one kind.

#### Signature

```http
GET /client/community/following (followingType?: string, limit?: integer, page?: integer) -> Follows
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/follow`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `followingType` | query | string | — | `member`, `page` or `hashtag`. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Follows |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/notifications

**Get notifications**

`operationId: CommunitySocialClientController_getNotifications`

The caller's community notifications. Pass `unread=true` for only the unseen ones.

#### Signature

```http
GET /client/community/notifications (type?: string, unread?: boolean, limit?: integer, page?: integer) -> Notifications
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/notifications/read`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `unread` | query | boolean | — |  |
| `type` | query | string | — | Filter by type. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Notifications |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/notifications/read

**Mark notifications read**

`operationId: CommunitySocialClientController_markNotificationsRead`

Marks specific notifications read by id.

#### Signature

```http
POST /client/community/notifications/read (body) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/notifications/read-all`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The notifications.

```json
{
  "ids": [
    "NTF-1",
    "NTF-2"
  ]
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/notifications/read-all

**Mark all notifications read**

`operationId: CommunitySocialClientController_markAllNotificationsRead`

Clears the caller's entire unread count in one call.

#### Signature

```http
POST /client/community/notifications/read-all () -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/notifications/unread-count`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/notifications/unread-count

**Get the unread notification count**

`operationId: CommunitySocialClientController_getUnreadCount`

The badge count for community notifications.

#### Signature

```http
GET /client/community/notifications/unread-count () -> The count
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/notifications`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The count |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

Example response:

```json
{
  "count": 7
}
```

## GET /client/community/bookmarks

**Get my bookmarks**

`operationId: CommunitySocialClientController_getBookmarks`

What the caller has saved, optionally by type or collection.

#### Signature

```http
GET /client/community/bookmarks (targetType?: string, collection?: string, limit?: integer, page?: integer) -> Bookmarks
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/bookmarks`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `targetType` | query | string | — |  |
| `collection` | query | string | — |  |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Bookmarks |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/bookmarks

**Bookmark an item**

`operationId: CommunitySocialClientController_bookmark`

Saves a post or other item to the caller's bookmarks. `collection` groups saves; `notes` is private to the caller.

#### Signature

```http
POST /client/community/bookmarks (body) -> The bookmark
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `DELETE /client/community/bookmarks/{target}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

What to save.

```json
{
  "target": "PST-4821",
  "targetType": "post",
  "collection": "read-later"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The bookmark |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/bookmarks/{target}

**Remove a bookmark**

`operationId: CommunitySocialClientController_removeBookmark`

Removes a saved item. The path segment is the **target id** — the thing bookmarked, not the bookmark record.

#### Signature

```http
DELETE /client/community/bookmarks/{target} (target: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/bookmarks`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `target` | path | string | yes | Id of the bookmarked item. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/pages/{pageId}/announcements

**Get page announcements**

`operationId: CommunitySocialClientController_getAnnouncements`

Announcements posted to a page.

#### Signature

```http
GET /client/community/pages/{pageId}/announcements (pageId: string, limit?: integer, page?: integer) -> Announcements
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /client/community/pages/{pageId}/announcements`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |
| `limit` | query | integer | — |  |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Announcements |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/pages/{pageId}/announcements

**Create an announcement**

`operationId: CommunitySocialClientController_createAnnouncement`

Posts an announcement to a page. Announcements typically notify every page member, so this reaches people — write it before sending, not after.

#### Signature

```http
POST /client/community/pages/{pageId}/announcements (pageId: string, body) -> The announcement
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Notifies page members.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | PAGE_NOT_FOUND | Page not found | No community page has that id. | List pages with `GET /client/community/pages`. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/pages/{pageId}/announcements`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `pageId` | path | string | yes | Page id. |

### Request body

The announcement.

```json
{
  "title": "Meetup moved to Thursday",
  "content": "Same time, new room."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The announcement |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Page not found — No community page has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/announcements/{announcementId}

**Get an announcement**

`operationId: CommunitySocialClientController_getAnnouncement`

One announcement.

#### Signature

```http
GET /client/community/announcements/{announcementId} (announcementId: string) -> The announcement
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `404` | ANNOUNCEMENT_NOT_FOUND | Announcement not found | No announcement has that id. | Check the id. |

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/pages/{pageId}/announcements`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `announcementId` | path | string | yes | Announcement id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The announcement |
| `404` | Announcement not found — No announcement has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/people

**Search people**

`operationId: CommunitySocialClientController_searchPeople`

Searches members. With `page` set it searches that page's members; **without `page` it currently returns an empty result** — global people search is not implemented, the handler returns `{ data: [], total: 0 }` unconditionally. Pass a `page` to get real results.

#### Signature

```http
GET /client/community/people (q?: string, page?: string, limit?: integer, pageNum?: integer) -> Matching people
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.
- Global search (no `page`) always returns an empty list.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/pages/{pageId}/members`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `q` | query | string | — | Search text. |
| `page` | query | string | — | Community page id. Without it the search returns nothing. |
| `limit` | query | integer | — |  |
| `pageNum` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Matching people |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

Example response:

```json
{
  "data": [],
  "total": 0
}
```

## GET /client/community/people/suggestions

**Get people suggestions**

`operationId: CommunitySocialClientController_getPeopleSuggestions`

People the caller might want to connect with.

**Two defects to be aware of.** The handler is a stub that always returns `{ data: [], total: 0 }`. And it is declared *after* `GET /client/community/people/{email}`, so the request matches that route first with `email` = `suggestions` — a call here resolves as a profile lookup for a member named "suggestions" and returns `{ error: "Not found" }`. Neither path yields suggestions.

#### Signature

```http
GET /client/community/people/suggestions (limit?: integer) -> Always empty
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Unreachable: shadowed by `GET /client/community/people/{email}`.
- Stub — returns an empty list.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/people`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `limit` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Always empty |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

Example response:

```json
{
  "data": [],
  "total": 0
}
```

## GET /client/community/people/{email}

**Get a public profile**

`operationId: CommunitySocialClientController_getPersonByEmail`

Returns a member's **public** profile by email address — name, image, company, job title, bio, city, country, interests and social links. Deliberately narrow: contact details and account fields are not included.

Two things to know. It is unauthenticated, so anyone with an email address and the org id can check whether that person is a member. And an unknown email returns **HTTP 200 with `{ "error": "Not found" }`**, not a 404 — check the body, not the status.

#### Signature

```http
GET /client/community/people/{email} (email: string) -> The public profile, or `{ error: "Not found" }`
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.
- A missing member returns 200 with an `error` field, not 404.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/people`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `email` | path | string | yes | Member email address. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The public profile, or `{ error: "Not found" }` |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

Example response:

```json
{
  "email": "ada@example.com",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Acme",
  "jobTitle": "Engineer",
  "city": "London",
  "country": "GB"
}
```

## GET /client/community/groups

**List my group chats**

`operationId: CommunitySocialClientController_getMyGroups`

Groups the caller belongs to.

#### Signature

```http
GET /client/community/groups (pageNum?: integer, page?: integer, limit?: integer) -> Groups
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/groups/{groupId}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `page` | query | integer | — |  |
| `limit` | query | integer | — |  |
| `pageNum` | query | integer | — | Page number (1-based). |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Groups |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/groups

**Create a group chat**

`operationId: CommunitySocialClientController_createGroup`

Creates a group conversation with the caller as a member. Distinct from a community page — a group is a chat, not a space with a feed.

#### Signature

```http
POST /client/community/groups (body) -> The group
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/groups/{groupId}/messages`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

The group.

```json
{
  "name": "Photo walk planning",
  "members": [
    "ada@example.com"
  ]
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The group |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/groups/{groupId}

**Get a group chat**

`operationId: CommunitySocialClientController_getGroup`

One group with its members.

#### Signature

```http
GET /client/community/groups/{groupId} (groupId: string) -> The group
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | GROUP_NOT_FOUND | Group not found | No group has that id. | List your groups. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/groups/{groupId}/messages`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `groupId` | path | string | yes | Group id. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The group |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Group not found — No group has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/groups/{groupId}/messages

**Get group messages**

`operationId: CommunitySocialClientController_getGroupMessages`

Messages in a group, newest first. `before` pages backwards through history.

#### Signature

```http
GET /client/community/groups/{groupId}/messages (groupId: string, limit?: integer, before?: string, page?: integer) -> Messages
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/groups/{groupId}/messages`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `groupId` | path | string | yes | Group id. |
| `limit` | query | integer | — |  |
| `before` | query | string | — | Return messages older than this timestamp. |
| `page` | query | integer | — |  |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Messages |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/groups/{groupId}/messages

**Send a group message**

`operationId: CommunitySocialClientController_sendGroupMessage`

Posts a message to a group chat as the caller.

#### Signature

```http
POST /client/community/groups/{groupId}/messages (groupId: string, body) -> The message
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `404` | GROUP_NOT_FOUND | Group not found | No group has that id. | Check the id. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/groups/{groupId}/messages`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `groupId` | path | string | yes | Group id. |

### Request body

The message.

```json
{
  "content": "Saturday at 9 works for me."
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The message |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `404` | Group not found — No group has that id. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/groups/{groupId}/members

**Add a group member**

`operationId: CommunitySocialClientController_addGroupMember`

Adds someone to a group chat. They gain access to the conversation — including, depending on the group's settings, messages already sent.

#### Signature

```http
POST /client/community/groups/{groupId}/members (groupId: string, body) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- The new member may see prior messages.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `DELETE /client/community/groups/{groupId}/members/{email}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `groupId` | path | string | yes | Group id. |

### Request body

Who to add.

```json
{
  "email": "ada@example.com"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/groups/{groupId}/members/{email}

**Remove a group member or leave**

`operationId: CommunitySocialClientController_removeGroupMember`

Removes someone from a group. Passing the caller's own email is how they leave the group themselves.

#### Signature

```http
DELETE /client/community/groups/{groupId}/members/{email} (groupId: string, email: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `POST /client/community/groups/{groupId}/members`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `groupId` | path | string | yes | Group id. |
| `email` | path | string | yes | Member to remove; the caller's own email to leave. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/badges

**List badges**

`operationId: CommunitySocialClientController_getBadges`

The badges defined for the community and what earns them.

#### Signature

```http
GET /client/community/badges () -> Badges
```

#### Access

Public — no credentials required.

#### Notes

- Unauthenticated — anyone with the org id can read this.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `GET /client/community/badges/mine`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Badges |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/badges/mine

**Get my badges**

`operationId: CommunitySocialClientController_getMyBadges`

Badges the caller has earned.

#### Signature

```http
GET /client/community/badges/mine () -> Badges
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/badges`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Badges |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## POST /client/community/media/upload

**Upload media**

`operationId: CommunitySocialClientController_uploadMedia`

Uploads a file as `multipart/form-data` under the field name `file`, and returns its stored path for use in a post or story. The upload is attributed to the caller and counts against their own media library.

#### Signature

```http
POST /client/community/media/upload (body) -> The stored file
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |
| `400` | FILE_REQUIRED | File is required | No `file` part was sent. | Send multipart form data with a `file` field. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/media/mine`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

Multipart form with a `file` field.

### Responses

| Status | Meaning |
| --- | --- |
| `201` | The stored file |
| `400` | File is required — No `file` part was sent. |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## GET /client/community/media/mine

**List my media**

`operationId: CommunitySocialClientController_getMyMedia`

Files the caller has uploaded.

#### Signature

```http
GET /client/community/media/mine (maxKeys?: integer, page?: integer) -> Media
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `PUT /client/community/media/rename`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `page` | query | integer | — |  |
| `maxKeys` | query | integer | — | Maximum files to list. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Media |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## PUT /client/community/media/rename

**Rename media**

`operationId: CommunitySocialClientController_renameMedia`

Renames one of the caller's files. Anything already referencing the old path — a published post, a story — keeps pointing at the old name and may break.

#### Signature

```http
PUT /client/community/media/rename (body) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Existing references are not rewritten.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `DELETE /client/community/media/{path}`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

Old and new path.

```json
{
  "path": "photos/img1.jpg",
  "newName": "photos/lens-test.jpg"
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

## DELETE /client/community/media/{path}

**Delete media**

`operationId: CommunitySocialClientController_deleteMedia`

Deletes one of the caller's files. Posts and stories that embed it will show a broken reference — check where it is used before deleting.

#### Signature

```http
DELETE /client/community/media/{path} (path: string) -> The result
```

#### Access

Requires a bearer JWT (`Authorization: Bearer <token>`).

#### Notes

- Breaks any post or story embedding the file.

#### Errors

| Status | Code | Message | When | What to do |
| --- | --- | --- | --- | --- |
| `401` | NOT_AUTHENTICATED | Not authenticated | No member could be resolved from the token. | Sign in; these endpoints act as the caller. |

Plus the standard platform errors: `403`, `429`, `500`.

#### See also

- `GET /client/community/media/mine`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |
| `path` | path | string | yes | Stored file path. |

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The result |
| `401` | Not authenticated — No member could be resolved from the token. |
| `403` | You do not have permission to perform this action — The caller is authenticated but lacks the role required by the endpoint, or is acting on another org. |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

