> ## 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 |
| [TestDino app](https://app.testdino.com) | Live app | Sign up and upload your first run |

## 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. The full workflow is in [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>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.