# Platform

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

**Get the caller's profile**

`operationId: AppController_getProfile`

Returns the authenticated user attached to the request — the quickest way to see who a token resolves to and what it carries.

#### Signature

```http
GET /profile () -> The authenticated user
```

#### Access

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

#### Errors

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

#### See also

- `GET /profile/me`

### Responses

| Status | Meaning |
| --- | --- |
| `200` | The authenticated user |
| `401` | Authentication failed: Invalid or expired token — The `Authorization` header is missing, malformed, or the JWT has expired. |
| `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 /

**Hello world**

`operationId: AppController_getAll_get`

A greeting. The simplest possible proof that the server is answering HTTP at all.

#### Signature

```http
GET / () -> A greeting
```

#### Access

Public — no credentials required.

#### Errors

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

#### See also

- `GET /health`

### Responses

| Status | Meaning |
| --- | --- |
| `200` | A greeting |
| `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
"Hello World!"
```

## GET /version

**Get the application version**

`operationId: AppController_version`

The running build's version — the first thing to check when behaviour differs from what the code says.

#### Signature

```http
GET /version () -> Version information
```

#### Access

Public — no credentials required.

#### Errors

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

#### See also

- `GET /health`

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Version information |
| `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 /health

**Health check**

`operationId: AppController_healthCheck`

Liveness check for monitoring. Sends `Cache-Control: no-cache, no-store, must-revalidate`, so a proxy cannot serve a stale healthy answer for a process that has since died.

This path is exempt from rate limiting. For per-component detail, use `GET /monitoring/health`.

#### Signature

```http
GET /health () -> Health status
```

#### Access

Public — no credentials required.

#### Errors

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

#### See also

- `GET /readiness`
- `GET /monitoring/health`

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Health status |
| `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. |
| `503` | System is unhealthy |

## GET /readiness

**Readiness check**

`operationId: AppController_readinessCheck`

Kubernetes readiness probe: whether the instance is ready to take traffic, which is not the same as being alive. A process can be healthy while still warming up, and routing traffic to it then produces errors.

#### Signature

```http
GET /readiness () -> Readiness status
```

#### Access

Public — no credentials required.

#### Errors

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

#### See also

- `GET /health`

### Responses

| Status | Meaning |
| --- | --- |
| `200` | Readiness status |
| `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. |
| `503` | Application is not ready |

