## Base URL

| Environment | URL |
| --- | --- |
| Production | `https://api.momentic.ai` |

## Authentication

Send the API key in an `Authorization` header on every request.

```
curl --fail-with-body \
  -H "Authorization: Bearer $MOMENTIC_API_KEY" \
  "https://api.momentic.ai/v1/runs?pageSize=20"
```

Create or manage keys in [API keys and team](/content/docs/account/api-keys-and-team/index.html).

## Error handling

| Status | Meaning | Handling |
| --- | --- | --- |
| `400` | Invalid query or cursor. | Correct the request before retrying. |
| `401` | Missing authentication or authenticated user/organization context. | Check the `Authorization` header and API key configuration. The response can be JSON or a text body. |
| `403` | Invalid API key. | Replace the key with a valid key for your organization. |
| `429` | Request rate limit exceeded. | Reduce polling and wait for the `Retry-After` interval. The response is a text body. |
| `500` | Internal server error or request timeout. | Preserve the response and contact support if the failure persists. The response is a text body. |
| `503` | Temporary failure validating the API key. | Retry later. |
| `529` | Database overload. | Stop automatic retries and try again later. |

## Shared request rules

- All endpoints in this reference use `GET`.
- Multi-value query params are comma-separated. Whitespace around commas is trimmed.
- `startDate` and `endDate` are optional ISO-8601 datetimes. The window may not exceed 92 days; wider windows return `400 {"error": "Date window must not exceed 92 days."}`.
- Invalid query params return `400 {"error": "Invalid query: <detail>"}`.
- If `startDate >= endDate`, the API returns `400 {"error": "Start date must be before end date."}`.

## Pagination

List endpoints use cursor (keyset) pagination.

- Pass `pageSize` (max 100, default 20) to size each page.
- Each response includes a `pagination` object:

```
{
    "pageSize": 20,
    "hasMore": true,
    "nextCursor": "eyJmIjoxNzgyOTA3MzM0MDAwLCJpZCI6InJ1bl8wMUo5RDkwWFBYTUE0VDBUU043NlZGUTJLOCJ9",
    "total": null
}
```

- To fetch the next page, pass the returned `nextCursor` back as the `cursor` query param. When `hasMore` is `false`, `nextCursor` is `null`.
- `total` is `null` unless you pass `includeTotal=true`, which adds an exact match count at the cost of an extra aggregation. Use `hasMore` for “is there more?” checks instead.
- Cursors are opaque; do not construct or parse them. An invalid cursor returns `400 {"error": "Invalid cursor."}`.

## Enum values

| Field | Values |
| --- | --- |
| `status` | `PASSED`, `FAILED`, `CANCELLED` |
| `trigger` | `WEBHOOK`, `CRON`, `MANUAL`, `CLI` |
| `executionType` | `WEB`, `IOS`, `ANDROID` |

## Platform filtering

`executionType` matches the run platform stored on each completed run. For run groups, a group matches when at least one run in the group matches the requested platform. For example, `executionType=IOS,ANDROID` returns mobile run groups.

## Endpoints

Use the Analytics API section in the sidebar for the endpoint reference.
