--- name: citedy-content-writer title: "AI Content Writer" description: > From topic to published blog post in one conversation — generate SEO- and GEO-optimized articles with AI illustrations and voice-over in 55 languages, create social media adaptations for 9 platforms, set up automated content sessions, and manage product knowledge base. End-to-end blog autopilot. Powered by Citedy. version: "1.0.0" author: Citedy tags: - content-marketing - seo - article-generation - social-media - blog-automation - writing - autopilot metadata: openclaw: requires: env: - CITEDY_API_KEY primaryEnv: CITEDY_API_KEY compatible_with: "citedy-seo-agent@3.2.0" privacy_policy_url: https://www.citedy.com/privacy security_notes: | API keys (prefixed citedy_agent_) authenticate against Citedy API endpoints only. All traffic is TLS-encrypted. --- # AI Content Writer — Skill Instructions ## Overview **AI Content Writer** is an end-to-end blog autopilot powered by [Citedy](https://www.citedy.com/). It covers the entire content production pipeline in a single conversation: 1. **Research** — source URLs or topic input, optional web intelligence search 2. **Write** — SEO & GEO-optimized articles in 55 languages, 4 size presets 3. **Enhance** — AI illustrations, voice-over audio, internal link optimization, humanization 4. **Distribute** — social media adaptations for 9 platforms (X, LinkedIn, Facebook, Reddit, Threads, Instagram, Instagram Reels, YouTube Shorts) 5. **Automate** — cron-based autopilot sessions, scheduling, webhook notifications No competitor offers the full pipeline in one agent skill. --- ## When to Use Use this skill when the user wants to: - Write a blog article from a topic or URL - Create social media posts from an existing article - Set up automated daily/weekly content publishing - Manage a product knowledge base for AI-grounded articles - Schedule and fill content calendar gaps - Generate micro-posts across multiple platforms at once - Select a writing persona (25 available) --- ## Setup ### 1. Get an API Key Direct the user to: **https://www.citedy.com/dashboard/settings** → Team & API section. API keys are prefixed `citedy_agent_`. ### 2. Register the Agent ``` POST https://www.citedy.com/api/agent/register Content-Type: application/json { "name": "My Content Agent", "description": "Automated blog content writer" } ``` **Headers:** `Authorization: Bearer ` **Response:** ```json { "agent_id": "ag_xxxx", "status": "active", "blog_handle": "my-blog" } ``` Store `agent_id` — it is required for session and webhook operations. ### 3. Verify Connection ``` GET https://www.citedy.com/api/agent/me Authorization: Bearer ``` --- ## Core Workflows ### Workflow 1: URL to Article Convert any web page, blog post, or competitor article into an original SEO-optimized article. ``` POST https://www.citedy.com/api/agent/autopilot Authorization: Bearer Content-Type: application/json { "source_urls": ["https://example.com/some-article"], "language": "en", "size": "standard", "illustrations": true, "audio": false } ``` After generation, adapt for social: ``` POST https://www.citedy.com/api/agent/adapt Authorization: Bearer Content-Type: application/json { "article_id": "", "platforms": ["linkedin", "x_article"], "include_ref_link": true } ``` --- ### Workflow 2: Topic to Article Write an article from a plain-text topic or title. ``` POST https://www.citedy.com/api/agent/autopilot Authorization: Bearer Content-Type: application/json { "topic": "How to reduce churn in B2B SaaS", "language": "en", "size": "full", "persona": "saas-founder", "enable_search": true } ``` --- ### Workflow 3: Turbo Mode (Fast & Cheap) For quick content at low cost. Two sub-modes: | Mode | Credits | Description | | -------- | --------- | ---------------------------------- | | `turbo` | 2 credits | Fast generation, no web search | | `turbo+` | 4 credits | Fast generation + web intelligence | ``` POST https://www.citedy.com/api/agent/autopilot Authorization: Bearer Content-Type: application/json { "topic": "5 productivity hacks for remote teams", "mode": "turbo", "language": "en" } ``` For turbo+, add `"enable_search": true`. --- ### Workflow 4: Social Adaptations Adapt an existing article to up to 3 platforms per request. ``` POST https://www.citedy.com/api/agent/adapt Authorization: Bearer Content-Type: application/json { "article_id": "art_xxxx", "platforms": ["x_thread", "linkedin", "reddit"], "include_ref_link": true } ``` Available platforms: `x_article`, `x_thread`, `linkedin`, `facebook`, `reddit`, `threads`, `instagram`, `instagram_reels`, `youtube_shorts` --- ### Workflow 5: Autopilot Session (Automated Publishing) Set up recurring content generation on a cron schedule. ``` POST https://www.citedy.com/api/agent/session Authorization: Bearer Content-Type: application/json { "categories": ["SaaS", "productivity", "remote work"], "problems": ["user churn", "onboarding friction", "team alignment"], "languages": ["en"], "interval_minutes": 720, "article_size": "standard", "disable_competition": false } ``` `interval_minutes: 720` = every 12 hours. Sessions run automatically and publish articles to the connected blog. --- ### Workflow 6: Micro-Post Publish short-form content across platforms without writing a full article first. ``` POST https://www.citedy.com/api/agent/post Authorization: Bearer Content-Type: application/json { "topic": "Why async communication beats meetings", "platforms": ["x_thread", "linkedin"], "tone": "professional", "contentType": "tip", "scheduledAt": "2026-03-02T09:00:00Z" } ``` --- ### Workflow 7: Knowledge Base (Products) Ground articles with real product data. The AI references this during generation. **Add a product:** ``` POST https://www.citedy.com/api/agent/products Authorization: Bearer Content-Type: application/json { "name": "Citedy Pro", "description": "AI-powered blog automation platform", "url": "https://www.citedy.com/pricing", "features": ["autopilot", "SEO optimization", "55 languages"] } ``` **List products:** ``` GET https://www.citedy.com/api/agent/products Authorization: Bearer ``` **Search products:** ``` POST https://www.citedy.com/api/agent/products/search Authorization: Bearer Content-Type: application/json { "query": "pricing plans" } ``` **Delete a product:** ``` DELETE https://www.citedy.com/api/agent/products/ Authorization: Bearer ``` --- ### Workflow 8: Schedule Management Check what content is planned and find gaps. ``` GET https://www.citedy.com/api/agent/schedule GET https://www.citedy.com/api/agent/schedule/gaps GET https://www.citedy.com/api/agent/schedule/suggest ``` Note: `schedule/suggest` is a REST-only endpoint — not available as an MCP tool. All require `Authorization: Bearer `. --- ### Workflow 9: Publish Publish or schedule a social adaptation. ``` POST https://www.citedy.com/api/agent/publish Authorization: Bearer Content-Type: application/json { "adaptationId": "adp_xxxx", "action": "schedule", "platform": "linkedin", "accountId": "acc_xxxx", "scheduledAt": "2026-03-02T10:00:00Z" } ``` `action` values: `now`, `schedule`, `cancel` --- ## Examples ### Example 1: Write Article from URL **User:** "Write an article based on this post: https://competitor.com/best-crm-tools" **Agent flow:** 1. Call `POST /api/agent/autopilot` with `source_urls: ["https://competitor.com/best-crm-tools"]`, `size: "standard"`, `language: "en"` — typically returns the full article inline (terminal `status: "generated" | "publishing" | "published"`); if the response is queued (`status: "processing"`), poll `GET /api/agent/articles/{id}` or wait for one of the `article.generated` / `article.published` / `article.failed` webhooks. On `article.failed` (or terminal `status: "failed"`), surface the error and skip the social-adaptations step 2. Return article title, URL, and word count to user 3. Ask: "Want social media adaptations? Which platforms?" --- ### Example 2: Daily Autopilot **User:** "Set up daily articles about fintech in English and Spanish" **Agent flow:** 1. Call `POST /api/agent/session` with `categories: ["fintech", "payments", "banking"]`, `languages: ["en", "es"]`, `interval_minutes: 720`, `article_size: "standard"` 2. Confirm session ID and next scheduled run 3. Optionally register webhook to notify user on each article completion --- ### Example 3: Turbo Mode **User:** "Quickly write 5 short articles about remote work tips" **Agent flow:** 1. For each topic, call `POST /api/agent/autopilot` with `mode: "turbo"`, `size: "mini"` 2. Run calls sequentially or note rate limits 3. Return list of generated article titles and links --- ### Example 4: Social Adaptations **User:** "Take my latest article and make posts for LinkedIn, Reddit, and X" **Agent flow:** 1. Call `GET /api/agent/articles` to find the latest article ID 2. Call `POST /api/agent/adapt` with `platforms: ["linkedin", "reddit", "x_thread"]`, `include_ref_link: true` 3. Return each adaptation with preview text 4. Ask: "Want to publish now or schedule?" --- ## API Reference ### POST /api/agent/autopilot Generate a full blog article. | Parameter | Type | Required | Description | | --------------------- | -------- | ------------------------ | ------------------------------------------------------------------------------------- | | `topic` | string | one of topic/source_urls | Article topic or title | | `source_urls` | string[] | one of topic/source_urls | URLs to base the article on | | `language` | string | no | Language code, default `en`. 55 languages supported | | `size` | string | no | `mini`, `standard`, `full`, `pillar`. Default `standard` | | `mode` | string | no | `standard`, `turbo`. Default `standard` | | `enable_search` | boolean | no | Enable web intelligence. Default `false` | | `persona` | string | no | Writing persona slug (call GET /api/agent/personas, e.g. "musk", "hemingway", "jobs") | | `auto_publish` | boolean | no | Publish immediately after generation. Default uses tenant setting (if unset, `true`) | | `illustrations` | boolean | no | Generate AI illustrations. Default `false` | | `audio` | boolean | no | Generate voice-over audio. Default `false` | | `disable_competition` | boolean | no | Skip competitor analysis. Default `false` | **Response:** ```json { "article_id": "art_xxxx", "status": "processing", "estimated_seconds": 45, "credits_reserved": 20 } ``` --- ### GET /api/agent/articles List generated articles. | Parameter | Type | Description | | --------- | ------- | ------------------------------------------------------ | | `status` | string | Filter: `generated` (draft), `published`, `processing` | | `limit` | integer | Max results, default 20 | | `offset` | integer | Pagination offset | --- ### POST /api/agent/articles/{id}/publish Publish a draft article (`status: "generated"` → `"published"`). - 0 credits. - Returns `{ article_id, status: "publishing", message }`. - Only works on articles with `status: "generated"`. Other statuses return `409 Conflict`. - Fires `article.published` webhook event. --- ### PATCH /api/agent/articles/{id} Unpublish a published article (`status: "published"` → `"generated"`). ```json { "action": "unpublish" } ``` - 0 credits. - Returns `{ article_id, status: "generated", message }`. - Only works on articles with `status: "published"`. Other statuses return `409 Conflict`. - Fires `article.unpublished` webhook event. --- ### DELETE /api/agent/articles/{id} Permanently delete an article and its associated storage files (images, audio). - 0 credits. Irreversible. Credits are NOT refunded. - Returns `{ article_id, message: "Article deleted" }`. - Fires `article.deleted` webhook event. --- ### POST /api/agent/adapt Create social media adaptations from an article. | Parameter | Type | Required | Description | | ------------------ | -------- | -------- | --------------------------------------- | | `article_id` | string | yes | Source article ID | | `platforms` | string[] | yes | 1–3 platforms per request | | `include_ref_link` | boolean | no | Append article backlink. Default `true` | **Platforms:** `x_article`, `x_thread`, `linkedin`, `facebook`, `reddit`, `threads`, `instagram`, `instagram_reels`, `youtube_shorts` --- ### POST /api/agent/publish Publish or schedule an adaptation. | Parameter | Type | Required | Description | | -------------- | ------ | -------- | -------------------------------------- | | `adaptationId` | string | yes | Adaptation ID from `/adapt` | | `action` | string | yes | `now`, `schedule`, `cancel` | | `platform` | string | yes | Target platform | | `accountId` | string | yes | Connected social account ID | | `scheduledAt` | string | no | ISO 8601 datetime for scheduled action | --- ### POST /api/agent/session Create an automated content session. | Parameter | Type | Required | Description | | --------------------- | -------- | -------- | -------------------------------------------------- | | `categories` | string[] | yes | Topic categories for generation | | `problems` | string[] | no | Specific problems or pain points to cover | | `languages` | string[] | no | Language codes. Default `["en"]` | | `interval_minutes` | integer | no | Generation interval, 60-10080. Default `720` (12h) | | `article_size` | string | no | `mini`, `standard`, `full`, `pillar` | | `disable_competition` | boolean | no | Skip competitor analysis. Default `false` | --- ### POST /api/agent/post Create and publish a micro-post. | Parameter | Type | Required | Description | | ------------- | -------- | -------- | ----------------------------------------------------- | | `topic` | string | yes | Post topic | | `platforms` | string[] | yes | Target platforms | | `tone` | string | no | `professional`, `casual`, `humorous`, `authoritative` | | `contentType` | string | no | `tip`, `insight`, `question`, `announcement`, `story` | | `scheduledAt` | string | no | ISO 8601 datetime. Omit for immediate | --- ### GET /api/agent/personas List all available writing personas. No parameters required. **Response:** Array of persona objects with `slug`, `name`, `description`, `style`. --- ### GET /api/agent/settings Get current agent/blog settings. --- ### PUT /api/agent/settings Update agent/blog settings. | Parameter | Type | Description | | ------------------ | ------- | ------------------------------- | | `default_language` | string | Default article language | | `default_size` | string | Default article size | | `auto_publish` | boolean | Auto-publish generated articles | | `default_persona` | string | Default persona slug | --- ### POST /api/agent/products Add a product to knowledge base. | Parameter | Type | Required | Description | | ------------- | -------- | -------- | -------------------- | | `name` | string | yes | Product name | | `description` | string | yes | Product description | | `url` | string | no | Product landing page | | `features` | string[] | no | Key features list | --- ### GET /api/agent/products List all products in knowledge base. --- ### POST /api/agent/products/search Semantic search over knowledge base. | Parameter | Type | Required | Description | | --------- | ------ | -------- | ------------ | | `query` | string | yes | Search query | --- ### DELETE /api/agent/products/:id Remove a product from knowledge base. --- ### GET /api/agent/schedule Get current content schedule (upcoming articles, sessions). --- ### GET /api/agent/schedule/gaps Find gaps in the content calendar where no articles are scheduled. --- ### GET /api/agent/schedule/suggest (REST only, not MCP tool) Get AI-suggested topics to fill schedule gaps based on existing content and SEO opportunities. --- ### POST /api/agent/webhooks Register a webhook endpoint for event notifications. | Parameter | Type | Required | Description | | --------- | -------- | -------- | --------------------------- | | `url` | string | yes | HTTPS endpoint URL | | `events` | string[] | yes | Event types to subscribe to | | `secret` | string | no | HMAC signing secret | --- ### GET /api/agent/webhooks List registered webhooks. --- ### DELETE /api/agent/webhooks/:id Remove a webhook registration. --- ### GET /api/agent/webhooks/deliveries Get recent webhook delivery history with status codes and payloads. --- ### GET /api/agent/health Check API availability. --- ### GET /api/agent/me Get current agent profile, blog info, and credit balance. --- ### GET /api/agent/health Check API health and readiness. **Response:** ```json { "status": "ok", "version": "3.0.0" } ``` --- ## Pricing All costs in credits. **1 credit = $0.01 USD.** ### Article Generation | Size | Standard Mode | Description | | ---------- | ------------- | ---------------------------- | | `mini` | 15 credits | ~500 words, quick post | | `standard` | 20 credits | ~1,000 words, full article | | `full` | 33 credits | ~2,000 words, in-depth piece | | `pillar` | 48 credits | ~4,000 words, pillar content | ### Turbo Mode | Mode | Cost | Notes | | -------- | --------- | ----------------------- | | `turbo` | 2 credits | Fast, no web search | | `turbo+` | 4 credits | Fast + web intelligence | ### Extensions | Extension | Cost | | ---------------------------- | --------------------------------------------- | | +Intelligence (web search) | +8 credits | | +Illustrations (per article) | +9–36 credits depending on count | | +Audio voice-over | +10–55 credits depending on length & language | ### Micro-Post | Endpoint | Cost | | ----------------- | --------- | | `/api/agent/post` | 2 credits | ### Social Adaptations ~5 credits per platform per article. ### Knowledge Base Products storage is free. Semantic search costs minimal credits per query. --- ## Persona List 25 writing personas available. Pass the `slug` to `/api/agent/autopilot`. Call `GET /api/agent/personas` for the full dynamic list. Example slugs: `"musk"`, `"hemingway"`, `"jobs"`, `"saas-founder"`, `"investigative-reporter"`, `"science-communicator"`, `"business-journalist"`, `"cto-engineer"`, `"data-scientist"`, `"marketing-strategist"`, `"comedian-writer"`, `"lifestyle-blogger"`, `"newsletter-writer"`, `"academic-researcher"`, `"creative-storyteller"` --- ## Webhook Event Types Subscribe to these events when registering a webhook: | Event | Triggered When | | ----------------------------- | ------------------------------------ | | `article.generated` | Article generation completed | | `article.published` | Article published (auto or manual) | | `article.unpublished` | Article unpublished (→ draft) | | `article.deleted` | Article permanently deleted | | `article.failed` | Article generation failed | | `social_adaptation.generated` | Social post adaptation created | | `session.articles_generated` | Recurring session published articles | | `billing.credits_low` | Balance below threshold | | `billing.credits_empty` | Balance at 0 | --- ## Rate Limits | Endpoint | Limit | | ---------------------- | ------------------- | | `/api/agent/autopilot` | 10 requests/minute | | `/api/agent/adapt` | 20 requests/minute | | `/api/agent/post` | 30 requests/minute | | `/api/agent/products` | 60 requests/minute | | All other endpoints | 120 requests/minute | Rate limit headers are included in all responses: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`. --- ## Limitations - Social adaptation: maximum 3 platforms per `/api/agent/adapt` call - Autopilot: `source_urls` maximum 5 URLs per request - Knowledge base: maximum 500 products per account - Webhooks: maximum 10 registered endpoints per account - Article sizes above `standard` may take 60–180 seconds to generate - `turbo` and `turbo+` modes do not support `illustrations` or `audio` - Language support varies by persona — not all personas support all 55 languages --- ## Error Handling All errors follow a consistent structure: ```json { "error": { "code": "INSUFFICIENT_CREDITS", "message": "Not enough credits to complete this operation", "required": 20, "available": 5 } } ``` ### Common Error Codes | Code | HTTP Status | Description | | ---------------------- | ----------- | -------------------------------- | | `UNAUTHORIZED` | 401 | Invalid or missing API key | | `INSUFFICIENT_CREDITS` | 402 | Not enough credits | | `RATE_LIMITED` | 429 | Too many requests | | `ARTICLE_NOT_FOUND` | 404 | Article ID does not exist | | `INVALID_PLATFORM` | 400 | Unknown platform slug | | `SESSION_CONFLICT` | 409 | Active session already exists | | `GENERATION_FAILED` | 500 | AI generation error — retry safe | ### Agent Response Guidelines When an error occurs: 1. **`INSUFFICIENT_CREDITS`** — Inform the user of current balance and required credits. Direct to: `https://www.citedy.com/dashboard/billing` 2. **`RATE_LIMITED`** — Wait for `Retry-After` header value before retrying. Do not spam requests. 3. **`GENERATION_FAILED`** — Retry once after 10 seconds. If it fails again, report the error and suggest trying a different topic or smaller size. 4. **`UNAUTHORIZED`** — Guide the user to check their API key at `https://www.citedy.com/dashboard/settings`. --- ## Response Guidelines for the Agent - Always show the user the article title and URL after successful generation - Article generation usually returns the article inline. Check the `/api/agent/autopilot` response `status`: - `"generated"`, `"publishing"`, or `"published"` (success-terminal) → the article payload is in the response; present `title`, `URL`, and `word_count` to the user. - `"failed"` (failure-terminal) → there is no usable article. Surface the error (`error.message` or `error.code`) to the user and follow your retry/fallback path. Do **not** treat this as a success. - `"processing"` or any other non-terminal value (e.g. when the transform pipeline returns 202 admission, or when async generation is requested) → use the response `id`/`article_id` and poll `GET /api/agent/articles/{id}` until `status` reaches a terminal value, or wait for the corresponding webhook (`article.generated`, `article.published`, `article.failed`). - Present credit costs before starting expensive operations (full/pillar articles, audio) - After generating an article, proactively offer social adaptations - After social adaptations, offer to publish or schedule - For autopilot sessions, confirm interval and categories with the user before creating --- ## Want More? This skill covers the full content writing pipeline. Citedy also offers: - **Video Shorts** — AI UGC viral video generation with voice and subtitles for TikTok, Reels, and YouTube Shorts - **Trend Scouting** — Daily trending topic discovery from Hacker News, Reddit, and social signals - **Content Ingestion** — Convert any YouTube video, podcast, or long-form document into a blog article - **SEO Intelligence** — Competitor gap analysis, keyword tracking, and SERP monitoring Explore the full suite: [https://www.citedy.com/tools](https://www.citedy.com/tools)