# Quickstart (/docs/quickstart)



This page takes you from zero to a published post. You need a FeedHorizon account with at least one connected social account (open **Connections** in the dashboard).

**Base URL:**

```
https://feedhorizon.com/api/v1
```

Step 1 — Create an API key [#step-1--create-an-api-key]

1. Go to [Dashboard → API & Apps](/dashboard/api-keys)
2. Click **Create API Key**
3. Give it a name (e.g. "My Script") and select **Read & Write** permission
4. Copy the key immediately — it's only shown once

Your key looks like:

```
fh_aee6d4242ae1d2ff857b4a900904f9e5beac1f2168a6c83da9f63053fda8caf8
```

Step 2 — Make your first request [#step-2--make-your-first-request]

Check the key with `GET /api/v1/me`. It returns your organization, plan, rate limit and the scopes of this key:

```bash title="cURL"
curl https://feedhorizon.com/api/v1/me \
  -H "Authorization: Bearer fh_YOUR_API_KEY"
```

Then list your profiles:

```bash title="cURL"
curl -X GET https://feedhorizon.com/api/v1/profiles \
  -H "Authorization: Bearer fh_YOUR_API_KEY"
```

```javascript title="Node.js (fetch)"
const res = await fetch('https://feedhorizon.com/api/v1/profiles', {
    headers: {
        'Authorization': 'Bearer fh_YOUR_API_KEY',
    },
});
const { data } = await res.json();
console.log(data);
```

```python title="Python (requests)"
import requests

res = requests.get(
    "https://feedhorizon.com/api/v1/profiles",
    headers={"Authorization": "Bearer fh_YOUR_API_KEY"},
)
print(res.json()["data"])
```

You should receive a JSON response:

```json
{
    "data": [
        {
            "id": "prof_2f9c1e4b6a3d4e8b9f0a1c2d3e4f5a6b",
            "name": "My Brand",
            "color": "#f5d76e",
            "timezone": "Europe/Berlin",
            "isDefault": true,
            "queueEnabled": false,
            "createdAt": "2026-11-01T09:00:00.000Z",
            "updatedAt": "2026-11-01T09:00:00.000Z"
        }
    ],
    "nextCursor": null
}
```

Copy the `id` of the profile: posts are created inside a profile. Every object comes wrapped in `data`, every list in `data` plus `nextCursor`, and ids carry a prefix such as `prof_` or `acc_` that says what they are. [API basics](/docs/api) explains these conventions, and [Data model](/docs/concepts/data-model) how profiles, accounts and posts fit together.

Step 3 — Create a post [#step-3--create-a-post]

```bash title="cURL"
curl -X POST https://feedhorizon.com/api/v1/posts \
  -H "Authorization: Bearer fh_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "content": "Hello from the FeedHorizon API!",
    "platforms": ["linkedin"],
    "profileId": "YOUR_PROFILE_ID",
    "publishNow": true
  }'
```

The response is the created post. It moves from `scheduled` to `publishing` to `published` within seconds. Leave out `publishNow` for a draft, or send `scheduledFor` instead (see [Scheduling](/docs/guides/scheduling)).

The `Idempotency-Key` header makes the request safe to retry: if the connection drops, send it again with the same key and you get the first response back instead of a second post.

Step 4 — Set up webhooks (optional) [#step-4--set-up-webhooks-optional]

Get notified when posts are published or fail:

```bash title="cURL"
curl -X POST https://feedhorizon.com/api/v1/webhooks \
  -H "Authorization: Bearer fh_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My server",
    "url": "https://your-server.com/webhooks/feedhorizon",
    "events": ["post.published", "post.failed"]
  }'
```

Next steps [#next-steps]

* [Data model](/docs/concepts/data-model) — How profiles, accounts, posts and targets fit together
* [Scheduling](/docs/guides/scheduling) — Drafts, scheduled posts, the queue and retries
* [Authentication](/docs/api/authentication) — API key formats, scopes, and security
* [MCP Server](/docs/mcp) — Let Claude, ChatGPT and other AI assistants schedule posts for you
* [Errors](/docs/api/errors) — Error response format, codes and HTTP status codes
* [Rate Limits](/docs/api/rate-limits) — Understand request limits and headers
* [Idempotency](/docs/api/idempotency) — Retry writes safely
* [Webhooks](/docs/guides/webhooks) — Events and signature verification
