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

# TestDino Developer Portal

> Entry point for building on TestDino: API keys, the OpenAPI spec, the MCP server, quickstarts, and a sandbox to try calls against.

The TestDino developer portal is the entry point for programmatic access: the REST API, the machine-readable OpenAPI specification, the MCP server for AI agents, and the credentials each one needs.

## Quick Reference

| Resource                                                        | Where          | Best for                                  |
| :-------------------------------------------------------------- | :------------- | :---------------------------------------- |
| [API quickstart](/api-reference/quickstart)                     | Guide          | Your first authenticated request          |
| [OpenAPI specification](https://docs.testdino.com/openapi.json) | `openapi.json` | Client generation, agent tool definitions |
| [API keys](/guides/generate-api-keys)                           | Guide          | Creating a `td_pat_` token                |
| [API standards](/api-reference/conventions)                     | Reference      | Auth, pagination, rate limits, errors     |
| [MCP server](/mcp/overview)                                     | Reference      | Giving an AI agent live test data         |
| [Sandbox](https://sandbox.testdino.com)                         | Live app       | Trying the product without your own data  |

## Machine-readable endpoints

Agents and code generators can fetch these directly. No authentication is required to read them.

| File           | URL                                              | Contents                                              |
| :------------- | :----------------------------------------------- | :---------------------------------------------------- |
| OpenAPI (JSON) | `https://docs.testdino.com/openapi.json`         | All 40 operations, typed parameters, response schemas |
| OpenAPI (YAML) | `https://docs.testdino.com/openapi.yaml`         | Same specification in YAML                            |
| Page index     | `https://docs.testdino.com/llms.txt`             | Every documentation page with a description           |
| Page topic map | `https://docs.testdino.com/llms-full.txt`        | Same index plus per-page topics                       |
| MCP manifest   | `https://docs.testdino.com/.well-known/mcp.json` | Documentation MCP server discovery                    |

Every operation in the specification carries a unique `operationId`, a description, typed parameters, and a response schema, so it converts directly into LLM function-calling definitions.

## Authenticate

TestDino has 2 authentication paths. Which one you use depends on the surface you call.

| Surface           | Method                                 | Credential                        |
| :---------------- | :------------------------------------- | :-------------------------------- |
| REST API          | Bearer token                           | Personal access token (`td_pat_`) |
| Remote MCP server | OAuth 2.0 authorization code with PKCE | Issued by the OAuth flow          |
| Local MCP server  | Environment variable                   | Personal access token (`td_pat_`) |

The REST API uses a personal access token sent as a Bearer token on every request.

```bash theme={null}
curl https://api.testdino.com/api/v1/public/{projectId}/token-info \
  -H "Authorization: Bearer $TESTDINO_PAT"
```

Create a PAT from **User Settings → Personal Access Tokens**, granting it access to the specific organizations and projects it may read. Full workflow: [Generate API keys](/guides/generate-api-keys).

### OAuth 2.0 for the remote MCP server

The [remote MCP server](/mcp/remote) at `https://mcp.testdino.com` authenticates over OAuth 2.0. An agent that supports remote MCP discovers the endpoints from standard metadata, so no manual token handling is needed.

| Metadata document    | URL                                                               |
| :------------------- | :---------------------------------------------------------------- |
| Authorization server | `https://mcp.testdino.com/.well-known/oauth-authorization-server` |
| Protected resource   | `https://mcp.testdino.com/.well-known/oauth-protected-resource`   |
| OpenID configuration | `https://mcp.testdino.com/.well-known/openid-configuration`       |

The server supports the `authorization_code` grant with `S256` PKCE, dynamic client registration, and the `mcp` scope. The [local MCP server](/mcp/local) uses a PAT from the `TESTDINO_PAT` environment variable instead.

## Error handling

Every error returns JSON with a stable `error.code`, an HTTP status, and a human-readable message. Branch on `error.code`, not on status alone.

```json theme={null}
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Missing Authorization: Bearer token"
  }
}
```

The full code table, retry guidance, and rate-limit headers are in [API standards](/api-reference/conventions#errors).

## Rate limits

| Scope               | Limit               |
| :------------------ | :------------------ |
| Reads per token     | 100 requests/minute |
| Writes per token    | 60 requests/minute  |
| Manual run creation | 10 requests/minute  |
| Pre-auth per IP     | 200 requests/minute |
| PDF generation      | 1 request/minute    |

Authenticated responses carry `RateLimit-Limit`, `RateLimit-Remaining`, and `RateLimit-Reset`; requests rejected before authentication do not. Back off on `429` and `5xx` only.

## Related

<CardGroup cols={3}>
  <Card title="API Reference" icon="code" href="/api-reference/overview">
    Every endpoint, grouped by resource.
  </Card>

  <Card title="MCP Server" icon="plug" href="/mcp/overview">
    Connect an AI agent to live test data.
  </Card>

  <Card title="Generate API Keys" icon="key" href="/guides/generate-api-keys">
    Create and scope a `td_pat_` token.
  </Card>
</CardGroup>
