Quick Start
This guide walks you through your first API calls using curl. By the end, you'll have verified your credentials, listed channels, browsed posts, and fetched a single post.
Prerequisites
Before starting, ensure you have:
- A Wortfreunde account
- An API key (get one here)
- curl installed (available on macOS, Linux, and Windows)
Set your API key as an environment variable so you can copy-paste the examples below:
export WORTFREUNDE_API_KEY="your-api-key-here"
Step 1: Check Authentication
First, verify that your API key is valid by calling the /me endpoint:
curl -s https://api.wortfreunde.ch/v1/me \
-H "Authorization: Bearer $WORTFREUNDE_API_KEY" | python3 -m json.tool
python3 -m json.tool formats the JSON response so it's easier to read. You can also use jq if you have it installed: ... | jq .
You should see your account details:
{
"data": {
"account": {
"id": 3,
"name": "Wertstifter GmbH"
},
"token": {
"name": "Development Token",
"scopes": [
"read:channels",
"read:posts",
"read:media"
],
"expires_at": "2027-03-09T09:53:43.348Z"
}
}
}
If you get a 401 error, double-check your API key. Make sure the environment variable is set correctly and the key hasn't expired.
Step 2: List Channels
Now let's see which channels are available in your account:
curl -s https://api.wortfreunde.ch/v1/channels \
-H "Authorization: Bearer $WORTFREUNDE_API_KEY" | python3 -m json.tool
Response:
{
"data": [
{
"id": 161,
"title": "Blog",
"platform": "git",
"team": {
"id": 42,
"name": "Wortfreunde"
},
"posts_count": 3
},
{
"id": 167,
"title": "Blog",
"platform": "blog",
"team": null,
"posts_count": 0
},
}
Note the channel id, you'll need it to list posts for a specific channel.
Step 3: List Posts
Fetch posts from a channel. Replace 161 with a channel ID from the previous step:
curl -s "https://api.wortfreunde.ch/v1/channels/161/posts \
-H "Authorization: Bearer $WORTFREUNDE_API_KEY" | python3 -m json.tool
Response:
{
"data": [
{
"id": 214,
"title": "Warum strukturierte Content-Planung mehr bringt als spontane Posts",
"teaser": "Montagmorgen. Der Cursor blinkt. Was soll ich heute posten? Dir fällt nichts ein. Also scrollst du durch den Feed, hoffst auf Inspiration. Eine Stunde später: immer noch kein Post. Dafür drei neue Tabs mit Artikeln, die du später lesen willst. Das Problem ist fehlende Struktur.",
"slug": "strukturierte-content-planung-vs-spontane-posts",
"publication_status": "published",
"created_at": "2026-03-02T16:54:36.465Z",
"updated_at": "2026-03-09T05:00:48.275Z",
"channel": {
"id": 161,
"title": "Blog",
"platform": "git",
"team": {
"id": 42,
"name": "Wortfreunde"
},
"posts_count": 3
}
},
],
"pagination": {
"page": 1,
"limit": 20,
"total": 42
}
}
Step 4: Get Post Detail
Fetch the full details of a single post using its ID:
curl -s https://api.wortfreunde.ch/v1/posts/301 \
-H "Authorization: Bearer $WORTFREUNDE_API_KEY" | python3 -m json.tool
Response:
{
"data": {
"id": 214,
"title": "Warum strukturierte Content-Planung mehr bringt als spontane Posts",
"body": "... markdown content ...",
"teaser": "Montagmorgen. Der Cursor blinkt. Was soll ich heute posten? Dir fällt nichts ein. Also scrollst du durch den Feed, hoffst auf Inspiration. Eine Stunde später: immer noch kein Post. Dafür drei neue Tabs mit Artikeln, die du später lesen willst. Das Problem ist fehlende Struktur.",
"slug": "strukturierte-content-planung-vs-spontane-posts",
"publication_status": "published",
"created_at": "2026-03-02T16:54:36.465Z",
"updated_at": "2026-03-09T05:00:48.275Z",
"channel": {
"id": 161,
"title": "Blog",
"platform": "git",
"team": {
"id": 42,
"name": "Wortfreunde"
},
"posts_count": 3
},
"tags": [],
"media": [],
"meta_title": "Strukturierte Content-Planung vs. spontane Posts",
"meta_description": "Erfahre, warum strukturierte Content-Planung mehr Sichtbarkeit und Resonanz bringt als spontane Posts.",
"published_at": "2026-03-09T05:00:48.269Z"
}
}
Error Handling
If something goes wrong, the API returns a clear error response:
{
"error": {
"code": "authentication_failed",
"message": "Invalid API key provided"
}
}
Common status codes:
| Code | Meaning |
|---|---|
| 200 | Success |
| 401 | Invalid or missing API key |
| 403 | Valid key but insufficient scopes |
| 404 | Resource not found |
| 429 | Rate limit exceeded |
Next Steps
You've successfully made your first API calls:
- Verified your credentials with
/me - Listed channels with
/channels - Browsed posts with
/channels/:channel_id/posts - Fetched post details with
/channels/:channel_id/posts/:id
What's Next?
- API Endpoints, full endpoint reference
- Chromeless Mode, embed Studio pages without navigation