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

# Run a SQL query

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

Note: Needs a personal API key with the `query:read` scope. Returns up to 100 rows by default and up to 50,000 with an explicit `LIMIT`; it 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 anything else, confirm access with the cheapest read-only call, like a list or a search. Never send or change anything to test access.

## Rules

- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
