# Quickstart

Create an API key, check it, and read the action items from your latest call. Three requests.

Source: https://docs.itsconvo.com/

API Base URL: https://www.itsconvo.com/api/v1

You need the [Convo desktop app](https://www.itsconvo.com) on a Starter plan or above. The API is at `https://www.itsconvo.com/api/v1`.

<span id="get-your-api-key" className="block scroll-mt-24" aria-hidden="true" />

## 1. Create an API key

1. Open the desktop app and go to **Settings → Convo API**.
2. Click **Create key**, give the key a name and accept the API Terms of Use.
3. Copy the key. It is shown only once.

The examples read the key from `CONVO_API_KEY`. Keep it on your server. More in [Authentication](/authentication).

```bash
export CONVO_API_KEY="convo_..."
```

<span id="make-your-first-request" className="block scroll-mt-24" aria-hidden="true" />

## 2. Check your key

Call `GET /user/profile` to check your key and see your profile, plan and AI credit usage.

<Tabs items={["curl", "JavaScript", "Python"]}>
<Tab value="curl">
```bash
curl https://www.itsconvo.com/api/v1/user/profile \
  -H "Authorization: Bearer $CONVO_API_KEY"
```
</Tab>
<Tab value="JavaScript">
```javascript
const API = "https://www.itsconvo.com/api/v1";
const headers = { Authorization: `Bearer ${process.env.CONVO_API_KEY}` };

const { data: profile } = await (await fetch(`${API}/user/profile`, { headers })).json();
console.log(profile.subscription.tier);
```
</Tab>
<Tab value="Python">
```python
import os
import requests

API = "https://www.itsconvo.com/api/v1"
headers = {"Authorization": f"Bearer {os.environ['CONVO_API_KEY']}"}

profile = requests.get(f"{API}/user/profile", headers=headers).json()["data"]
print(profile["subscription"]["tier"])
```
</Tab>
</Tabs>

<span id="see-the-response" className="block scroll-mt-24" aria-hidden="true" />

```json
{
  "data": {
    "profile": { "name": "Alice Chen", "email": "alice@example.com" },
    "subscription": { "tier": "professional", "status": "active" },
    "apiUsage": { "aiGenerations": { "used": 1240, "limit": 15000, "remaining": 13760, "resetsAt": "2026-04-01T00:00:00.000Z" } }
  }
}
```

This response is shortened. Rate limit headers, including `X-RateLimit-Remaining`, are included in the response. A `401` means the key is wrong or the `Bearer ` prefix is missing. See [Error Codes](/errors).

## 3. Find your latest call

Calls come newest first.

<Tabs items={["curl", "JavaScript", "Python"]}>
<Tab value="curl">
```bash
curl "https://www.itsconvo.com/api/v1/conversations?limit=1" \
  -H "Authorization: Bearer $CONVO_API_KEY"
```
</Tab>
<Tab value="JavaScript">
```javascript
const { data: calls } = await (await fetch(`${API}/conversations?limit=1`, { headers })).json();
const callId = calls[0].id;
```
</Tab>
<Tab value="Python">
```python
calls = requests.get(f"{API}/conversations", params={"limit": 1}, headers=headers).json()["data"]
call_id = calls[0]["id"]
```
</Tab>
</Tabs>

```json
{
  "data": [
    {
      "id": "session_1773842400000",
      "title": "Acme pilot pricing call",
      "startTime": "2026-03-18T14:00:00.000Z",
      "endTime": "2026-03-18T14:45:00.000Z",
      "duration": 45,
      "segmentCount": 187
    }
  ],
  "pagination": { "total": 42, "limit": 1, "offset": 0 }
}
```

## 4. Read its action items

<Tabs items={["curl", "JavaScript", "Python"]}>
<Tab value="curl">
```bash
curl https://www.itsconvo.com/api/v1/conversations/session_1773842400000/keypoints \
  -H "Authorization: Bearer $CONVO_API_KEY"
```
</Tab>
<Tab value="JavaScript">
```javascript
const { data: keyPoints } = await (await fetch(`${API}/conversations/${callId}/keypoints`, { headers })).json();
console.log(keyPoints.keypoints.actionItems);
```
</Tab>
<Tab value="Python">
```python
key_points = requests.get(f"{API}/conversations/{call_id}/keypoints", headers=headers).json()["data"]
print(key_points["keypoints"]["actionItems"])
```
</Tab>
</Tabs>

```json
{
  "data": {
    "id": "session_1773842400000",
    "title": "Acme pilot pricing call",
    "keypoints": {
      "decisions": ["Start a two-team pilot in April"],
      "actionItems": [
        { "item": "Send the pilot pricing to Sarah", "owner": "Alice", "confidence": 0.95, "priority": "high" }
      ]
    },
    "createdAt": "2026-03-18T14:47:10.000Z"
  }
}
```

This response is shortened. The app generates key points after each call. If a call has none yet, you get a `404`. `POST` to the same path generates them, for free.

## What's Next?

<Cards>
  <Card icon={<MessagesSquare aria-hidden="true" />} title="List Conversations" description="Fetch your recent meetings and their metadata." href="/api-reference/conversations/list-conversations" />
  <Card icon={<FileText aria-hidden="true" />} title="Get a Transcript" description="Retrieve the full speaker-attributed transcript for any meeting." href="/api-reference/conversations/get-transcript" />
  <Card icon={<DocsSparkles aria-hidden="true" />} title="Generate Key Points" description="Get an AI-generated summary with decisions and action items." href="/api-reference/a-i--generation/generate-keypoints" />
  <Card icon={<Blocks aria-hidden="true" />} title="Core Concepts" description="Understand the data model before building your integration." href="/core-concepts" />
  <Card icon={<Webhook aria-hidden="true" />} title="Webhooks" description="Get a signed request when a call's key points are ready." href="/webhooks" />
  <Card icon={<MCPIcon aria-hidden="true" />} title="MCP Server" description="Ask Claude, ChatGPT or Cursor about your calls." href="/mcp" />
</Cards>