Developers

Content Ingestion API

A small, key-authenticated REST API for programmatically publishing posts, profiles and images to the Activepieces blog. Every entity created through this API is flagged as AI-generated.

Authentication

All requests use a bearer token. Generate keys in the CMS admin under API Keys; a key is shown once at creation. Send it as:

Authorization: Bearer hype_live_xxxxxxxx…

Keys are secrets — use them server-side only. Base URL: https://www.activepieces.com.

Create a profile POST /api/v1/profiles

A profile is a post's author (name, bio, avatar). Pass an avatarUrl and we fetch + resize it, or an avatarAssetId from /media. Pass your own externalId to make the call idempotent.

curl -X POST https://www.activepieces.com/api/v1/profiles \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "hype_author_42",
    "name": "Dana Rivers",
    "bio": "Writes about automation and AI.",
    "avatarUrl": "https://cdn.hype.example/avatars/dana.png"
  }'

Publish a post POST /api/v1/posts

content is Markdown. categories are matched by name and created if missing. Attach an author via profileExternalId, profileId, or an inline profile object (auto-created). status defaults to published — the post is live immediately.

curl -X POST https://www.activepieces.com/api/v1/posts \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "hype_post_1001",
    "title": "5 automations every startup needs",
    "content": "# Intro\n\nMarkdown body of the post…",
    "excerpt": "A quick tour of high-leverage automations.",
    "categories": ["AI", "Productivity"],
    "imageUrl": "https://cdn.hype.example/covers/1001.png",
    "profileExternalId": "hype_author_42",
    "status": "published"
  }'

Response

{ "id": 412, "slug": "5-automations-every-startup-needs",
  "url": "/blog/5-automations-every-startup-needs",
  "status": "published", "aiGenerated": true }

Upload an image POST /api/v1/media

Returns an asset { id, url, thumbnail, small, medium }. Use the id as imageAssetId / avatarAssetId, or skip this and pass imageUrl/avatarUrl directly when creating a post/profile.

# By URL (we download + resize):
curl -X POST https://www.activepieces.com/api/v1/media \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://cdn.hype.example/img.png", "alt": "A robot" }'

# Or upload bytes:
curl -X POST https://www.activepieces.com/api/v1/media \
  -H "Authorization: Bearer $API_KEY" \
  -F file=@./cover.png -F alt="A robot"

Idempotency

Pass your own externalId on posts and profiles. Re-sending the same externalId updates the existing record instead of creating a duplicate — safe to retry.

Reading & dedupe

GET /api/v1/posts, GET /api/v1/profiles (both accept ?externalId= or ?limit=), and GET /api/v1/categories let you check what already exists.