---
ref: tool:posthog/run-sql-query
name: Run a SQL query
company: company:posthog
workflows: [workflow:high-intent-visitors, workflow:free-to-paid-activation]
access: [mcp, cli, api]
tags: [capability:track-product-usage, category:product-analytics, has:api, has:cli, has:mcp]
docs: https://posthog.com/docs/api/query
updated: 2026-09-27
---

# Run a SQL query

Runs a SQL (HogQL) query over the project's events, persons and other data and returns the rows.

Over the API, send the SQL as `{"query": {"kind": "HogQLQuery", "query": "..."}}` with a personal API key that has the `query:read` scope. A query returns up to 100 rows by default and up to 50,000 with an explicit `LIMIT`; the endpoint is for ad-hoc analysis, not bulk export.

## Set up

Use the first option your agent supports.

### MCP (official, remote)

Add this server to your agent's MCP settings, then sign in when asked.

```json
{ "mcpServers": { "posthog": { "url": "https://mcp.posthog.com/mcp" } } }
```

Call the MCP tool `execute-sql`.

Server URL: https://mcp.posthog.com/mcp

### CLI (official)

Install the command, then confirm it runs.

```sh
npm install -g @posthog/cli@latest
posthog-cli --version
```

Run `posthog-cli api call execute-sql`.

Set `$POSTHOG_CLI_API_KEY` in your environment first (get a key: https://app.posthog.com/settings/user-api-keys?preset=mcp_server).

### API (official)

- Base URL: https://us.posthog.com
- Endpoint: `POST /api/projects/:project_id/query/`
- Auth: send the header `Authorization: Bearer $POSTHOG_PERSONAL_API_KEY`
- Get a key: https://us.posthog.com/settings/user-api-keys
- Docs: https://posthog.com/docs/api

Before doing anything else, make one read-only call to confirm access.

## Rules

- Ask the user before anything that sends messages, costs money, or changes data.
- Never print API keys.
