Content360
/install content360
Content360 Skill
Authentication
Content360 uses a session + bearer token auth mechanism built on Laravel Sanctum + Inertia.js.
Setup
- Get your bearer token at
https://app.content360.io/os/profile/access-tokens - Set secrets in Zo: Settings → Advanced → Secrets
CONTENT360_API_KEY= your bearer tokenCONTENT360_ORG_ID= your workspace UUID (from the dashboard URL)
- Set your credentials (for automatic session auth):
CONTENT360_EMAIL= your login emailCONTENT360_PASSWORD= your login password
Note: Access tokens require an active web session to work. If the token returns 401, re-authenticate by logging in via the web interface or using the session login flow in content360_sync.py.
Auth Flow
The API requires all of these headers on every request:
Authorization: Bearer {token}
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: {version} # from any authenticated page response
Accept: application/json
Content-Type: application/json
The X-Inertia-Version is a hash that changes on app updates. It's returned in every Inertia JSON response under the X-Inertia-Version response header. The sync script handles this automatically.
Base URLs
- App:
https://app.content360.io - API namespace:
/os/api/{workspace}(workspace = org UUID) - Web namespace:
/os/{workspace}(same routing, differs only by Accept header)
API Endpoints
All require auth headers above. Responses are Inertia JSON.
Posts
| Method | Path | Description |
|---|---|---|
| GET | /os/api/{workspace}/posts |
List posts (paginated) |
| POST | /os/api/{workspace}/posts |
Create post |
| GET | /os/api/{workspace}/posts/{uuid} |
Get single post |
| PUT | /os/api/{workspace}/posts/{uuid} |
Update post |
| DELETE | /os/api/{workspace}/posts/{uuid} |
Delete single post |
| POST | /os/api/{workspace}/posts/add-to-queue/{uuid} |
Add to queue |
| POST | /os/api/{workspace}/posts/schedule/{uuid} |
Schedule queued post |
| POST | /os/api/{workspace}/posts/approve/{uuid} |
Approve post |
| POST | /os/api/{workspace}/posts/duplicate/{uuid} |
Duplicate post |
Create Post Payload
{
"content": "Post text content",
"accounts": ["126117", "126129"],
"status": "draft",
"versions": [
{
"account_id": 126117,
"is_original": true,
"content": [
{
"body": "\x3Cdiv>Post content\x3C/div>",
"media": [],
"url": "",
"opened": true
}
]
}
]
}
status:"draft"or"schedule"accounts: array of account IDs (strings)versions: per-account content blocks (body uses HTML)- For plain text, use
"\x3Cdiv>text\x3C/div>"in body
Accounts
| Method | Path | Description |
|---|---|---|
| GET | /os/api/{workspace}/accounts |
List all connected accounts |
| GET | /os/api/{workspace}/accounts/{id} |
Get single account |
Media
| Method | Path | Description |
|---|---|---|
| GET | /os/api/{workspace}/media |
List media library |
| POST | /os/api/{workspace}/media |
Upload media |
| DELETE | /os/api/{workspace}/media |
Delete media |
Tags
| Method | Path | Description |
|---|---|---|
| GET | /os/api/{workspace}/tags |
List tags |
| POST | /os/api/{workspace}/tags |
Create tag |
| PUT | /os/api/{workspace}/tags/{id} |
Update tag |
| DELETE | /os/api/{workspace}/tags/{id} |
Delete tag |
Other
| Method | Path | Description |
|---|---|---|
| GET | /os/{workspace}/calendar |
Calendar view |
| GET | /os/{workspace}/posts/rss_campaigns |
RSS campaigns |
| GET | /os/{workspace}/repeated-posts |
Repeated posts |
| GET | /os/{workspace}/templates |
Templates |
| GET | /os/{workspace}/inbox |
Inbox |
| POST | /os/api/{workspace}/posts/import |
Import posts |
Webhook Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /os/{workspace}/webhooks |
List webhooks |
| POST | /os/{workspace}/webhooks/store |
Create webhook |
| PUT | /os/{workspace}/webhooks/{id} |
Update webhook |
| DELETE | /os/{workspace}/webhooks/{id} |
Delete webhook |
Running the Sync Script
# Dry run
python3 /home/workspace/Skills/content360/scripts/content360_sync.py --dry-run
# Real sync
python3 /home/workspace/Skills/content360/scripts/content360_sync.py
# Sync specific platforms
python3 /home/workspace/Skills/content360/scripts/content360_sync.py --platforms facebook,linkedin,youtube
The script reads from your Notion content calendar, creates posts in Content360 as drafts, and schedules them. See README.md for full setup instructions.
Notion Database Properties
The sync script expects these properties in your Notion content calendar database:
| Property | Type | Description |
|---|---|---|
Posted |
checkbox | Skip posts already marked as posted |
Schedule |
date | Schedule date/time (optional) |
Platform |
select | Platform: facebook, linkedin, x, instagram, youtube, tiktok, pinterest, reddit |
Caption |
rich_text | Main post content |
Hook |
rich_text | Opening hook/headline (optional) |
CTA |
rich_text | Call-to-action text (optional) |
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install content360 - After installation, invoke the skill by name or use
/content360 - Provide required inputs per the skill's parameter spec and get structured output
What is Content360?
Integrates with Content360 (app.content360.io) to create, schedule, and publish social media content across Facebook, LinkedIn, X, Instagram, YouTube, TikTok... It is an AI Agent Skill for Claude Code / OpenClaw, with 130 downloads so far.
How do I install Content360?
Run "/install content360" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Content360 free?
Yes, Content360 is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Content360 support?
Content360 is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Content360?
It is built and maintained by Noesis-Boss (@noesis-boss); the current version is v1.0.0.