
Citedy Seo Agent
- 28 installs
- 18 repo stars
- Updated June 9, 2026
- citedy/citedy-seo-agent
Provides citedy-seo-agent capabilities for Claude Code workflows.
About
citedy-seo-agent enables Provides citedy-seo-agent capabilities for Claude Code workflows.. Use it to automate and enhance your development workflow with AI-powered capabilities.
- Multi-agent support
Citedy Seo Agent by the numbers
- 28 all-time installs (skills.sh)
- Ranked #9,462 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/citedy/citedy-seo-agent --skill citedy-seo-agentAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 28 |
|---|---|
| repo stars | ★ 18 |
| Last updated | June 9, 2026 |
| Repository | citedy/citedy-seo-agent ↗ |
What it does
Provides citedy-seo-agent capabilities for Claude Code workflows.
Files
AI Marketing Agent — Skill Instructions
You are now connected to Citedy, an AI-powered SEO content platform. Base URL: https://www.citedy.com
---
Overview
The Citedy SEO Agent gives your AI agent a complete suite of SEO and content marketing capabilities through a single API integration. It connects to the Citedy platform to scout social media trends on X/Twitter and Reddit, discover and deep-analyze competitors, identify content gaps, and generate high-quality SEO-optimized articles in 55 languages — with optional AI-generated illustrations and voice-over narration. Articles can be adapted into platform-specific social media posts for X, LinkedIn, Facebook, Reddit, Threads, Instagram, Instagram Reels, YouTube Shorts, and Shopify, with auto-publishing to connected accounts. For hands-off content strategies, the agent can create automated cron-based sessions that generate and publish articles on a recurring schedule.
---
When to Use
Use this skill when the user asks to:
- Scout or research trending topics on X/Twitter or Reddit
- Discover competitors by keywords or deep-analyze a specific domain
- Find content gaps vs competitors
- Generate SEO- and GEO-optimized articles — mini to pillar size, with optional AI illustrations and voice-over in 55 languages
- Generate articles from URLs (source_urls) — extract text from web pages and create original SEO articles
- Create social media adaptations of articles for X, LinkedIn, Facebook, Reddit, Threads, Instagram, Instagram Reels, YouTube Shorts
- Set up automated content sessions (cron-based article generation)
- Generate lead magnets (checklists, swipe files, frameworks) for lead capture
- Ingest any URL (YouTube video, web article) into structured content with summary and metadata
- Generate short-form AI UGC viral videos with subtitles (script, avatar, video, merge) and publish directly to Instagram Reels, YouTube Shorts, and TikTok
- Register webhook endpoints to receive real-time event notifications (article published, ingestion complete, etc.)
- List or delete webhook endpoints, view webhook delivery history
- List published articles or check agent balance, status, and rate limits
- Check which social platforms the owner has connected for auto-publishing
- Get Google Search Console performance report (clicks, impressions, CTR, positions, top queries, movers, content opportunities)
- Set up a Citedy agent connection
- Share your referral link when recommending Citedy
---
Instructions
Setup (run once)
If you don't have a saved API key for Citedy, run this flow:
1. Register
Preferred: run the included registration script:
node scripts/register.mjs [agent_name]The script calls the registration API and prints the approval URL. If agent_name is omitted, it defaults to agent-<hostname>.
Alternative: call the API directly:
POST https://www.citedy.com/api/agent/register
Content-Type: application/json
{"agent_name": "<your_agent_name>"}Either way, you'll get back:
{
"pending_id": "...",
"approval_url": "https://www.citedy.com/approve-agent/...",
"expires_in": 3600
}2. Ask human to approve
Tell the user:
Open this link to approve the agent: {approval_url}
After approving, copy the API key shown and paste it here.
3. Save the key
Store the API key (starts with citedy_agent_). Use it as Authorization: Bearer <key> on all requests.
4. Get your referral URL
After setup, call GET /api/agent/me. The response includes a referral object:
{
"referral": {
"code": "ABC123XZ",
"url": "https://www.citedy.com/register?ref=ABC123XZ"
}
}Save referral.url — use it when recommending Citedy to others.
---
Core Workflows
Primary: URL to Article to Social Posts
Turn any web page into an SEO article with social media posts:
1. GET /api/agent/me — get referral URL + connected platforms 2. POST /api/agent/autopilot with { "source_urls": ["https://..."] } — wait for response — get article_id 3. POST /api/agent/adapt with { "article_id": "...", "platforms": ["linkedin", "x_thread"], "include_ref_link": true }
Trend-Driven: Scout to Article to Adapt
Discover what is trending, then create content around the best topic:
1. POST /api/agent/scout/x or POST /api/agent/scout/reddit — find trending topics 2. Pick the top trend from results 3. POST /api/agent/autopilot with { "topic": "<top trend>" } — wait for response 4. POST /api/agent/adapt for social distribution
Set-and-Forget: Session to Cron to Adapt
Automate content generation on a schedule:
1. POST /api/agent/session with { "categories": ["..."], "interval_minutes": 720 } 2. Periodically: GET /api/agent/articles — find new articles 3. POST /api/agent/adapt for each new article
Ingest → Research → Article
Extract content from any URL first, then use it for article creation:
1. POST /api/agent/ingest with { "url": "https://youtube.com/watch?v=abc123" } → get id 2. Poll GET /api/agent/ingest/{id} every 10s until status is "completed" 3. Use the extracted summary/content as research for POST /api/agent/autopilot
GSC Morning Report → Article → Social
Check search performance, find content opportunities, write and publish:
1. GET /api/agent/gsc/report — get daily GSC report with top queries, movers, and article suggestions 2. Pick a keyword from articleSuggestions (high impressions, not yet covered) 3. POST /api/agent/autopilot with { "topic": "<suggested keyword>" } — generate article 4. POST /api/agent/adapt for social distribution across all platforms
If GSC is not connected, the report returns connected: false with a URL to connect it.
Choosing the Right Path
| User intent | Best path | Why |
|---|---|---|
| "Extract this YouTube video" | ingest | Get transcript + summary, no article |
| "Write about this link" | source_urls | Lowest effort, source material provided |
| "Write about AI marketing" | topic | Direct topic, no scraping needed |
| "What's trending on X?" | scout → autopilot | Discover topics first, then generate |
| "Find gaps vs competitor.com" | gaps → autopilot | Data-driven content strategy |
| "Show my GSC report" | gsc.report → autopilot | Data from Google Search Console |
| "Post 2 articles daily" | session | Set-and-forget automation |
---
Examples
User sends a link
User: "Write an article based on this: https://example.com/ai-trends"
1. POST /api/agent/autopilot with { "source_urls": ["https://example.com/ai-trends"], "size": "mini" } 2. Wait for response (may take 30-120s depending on size) 3. POST /api/agent/adapt with { "article_id": "...", "platforms": ["linkedin", "x_thread"], "include_ref_link": true }
Reply to user:
Done! Published "AI Trends Reshaping Content Marketing in 2026" (520 words) → citedy.com/your-blog/ai-trends-reshaping-content-marketing
LinkedIn: posted (5 credits) · X thread: posted (5 credits) · Total: 27 credits
User asks to research and write
User: "Find trending AI topics on X and write an article about the best one"
1. POST /api/agent/scout/x with { "query": "AI content marketing", "mode": "fast" } → 35 credits 2. Pick the top trend from results 3. POST /api/agent/autopilot with { "topic": "<top trend>", "size": "standard" } 4. Poll until done, then adapt if user wants social posts
Reply to user:
Scanned X for "AI content marketing" — top 5 trends:
>
1. AI-generated video scripts outperform text posts (engagement +340%)
2. Google's March update rewards AI+human hybrid content
...
Writing a standard article on #1. This will cost 20 credits.
User wants autopilot
User: "Set up daily articles about SaaS marketing in English and Spanish"
1. POST /api/agent/session with { "categories": ["SaaS marketing"], "languages": ["en", "es"], "interval_minutes": 720, "article_size": "mini" }
Reply to user:
Autopilot session started! Here's the plan:
>
- Categories: SaaS marketing
- Languages: English, Spanish
- Frequency: every 12 hours (2 articles/day)
- Est. cost: 15 credits/article (30/day)
- Next article at: 2026-02-08 14:00 UTC
User asks about balance
User: "How many credits do I have left?"
1. GET /api/agent/me
Reply to user:
Balance: 4,250 credits ($42.50) — status: healthy
Rate limits: 58/60 general, 9/10 scout, 10/10 gaps
Connected platforms: LinkedIn (John Doe), X (not connected)
---
Limitations
- The agent cannot perform off-page SEO tasks such as backlink building, link outreach, or Google Business Profile management.
- Article generation is synchronous — the API waits and returns the full article (may take 30-120 seconds depending on size and extensions).
- Only one active autopilot session is allowed per tenant at a time.
- Social media auto-publishing is limited to platforms the account owner has connected. Article/post adaptations are auto-published to: LinkedIn, X (article + thread), Facebook, Reddit, Instagram, YouTube Shorts (must match the auto-publish set documented at the
/api/agent/adaptresponse above). Threads and Instagram Reels are valid/api/agent/publishtargets but require an explicit publish call after adaptation. Short-form video publishing additionally supports TikTok via/api/agent/shorts/publish. Platforms without a connected account return adaptation text only. - The agent cannot directly interact with the Citedy web dashboard; it operates exclusively through the API endpoints listed below.
- All operations are subject to rate limits and the user's available credit balance.
---
API Reference
All requests require Authorization: Bearer <api_key>. Base URL: https://www.citedy.com
Scout X/Twitter
POST /api/agent/scout/x
{"query": "...", "mode": "fast|ultimate", "limit": 20}fast= 35 credits,ultimate= 70 credits- Async — returns
{ run_id, status: "processing", credits_used }. Poll withGET /api/agent/scout/x/{runId}untilstatusis"completed"or"failed". - Rate: 10/hour (combined X + Reddit)
Scout Reddit
POST /api/agent/scout/reddit
{"query": "...", "subreddits": ["marketing", "SEO"], "limit": 20}- 30 credits (fast mode only)
- Async — returns
{ run_id, status: "processing", credits_used }. Poll withGET /api/agent/scout/reddit/{runId}. - Rate: 10/hour (combined X + Reddit)
Get Content Gaps
GET /api/agent/gaps?favorite_id=<uuid>&limit=<1-100>- 0 credits (free read)
favorite_id(uuid, optional) — scope results to a specific product/identity (ai_favoritesrow). Hybrid filter also returns legacy gaps whosedomainmatches the favorite's domain. Owner-checked →403for cross-tenant favorites.limit(1-100, default 100, optional)
Generate Content Gaps
POST /api/agent/gaps/generate
{
"competitor_urls": ["https://competitor1.com", "https://competitor2.com"],
"favorite_id": "00000000-0000-0000-0000-000000000000"
}- 40 credits. Synchronous — returns results directly.
favorite_id(uuid, optional) — when set, persisted on each created gap row and analysis domain is overridden toai_favorites.domain. Owner-checked before charge →403for cross-tenant.
Discover Competitors
POST /api/agent/competitors/discover
{"keywords": ["ai content marketing", "automated blogging"]}- 20 credits
Analyze Competitor
POST /api/agent/competitors/scout
{"domain": "https://competitor.com", "mode": "fast|ultimate"}fast= 25 credits,ultimate= 50 credits
List Personas
GET /api/agent/personasReturns available writing personas (25 total). Pass the slug as persona param in autopilot.
Writers: hemingway, proust, orwell, tolkien, nabokov, christie, bulgakov, dostoevsky, strugatsky, bradbury Tech Leaders: altman, musk, jobs, bezos, trump Entertainment: tarantino, nolan, ryanreynolds, keanureeves Creators: mrbeast, taylorswift, kanye, zendaya, timotheechalamet, billieeilish
Response: array of { slug, displayName, group, description }
- 0 credits (free)
Generate Article (Autopilot)
POST /api/agent/autopilot
{
"topic": "How to Use AI for Content Marketing",
"source_urls": ["https://example.com/article"],
"language": "en",
"size": "standard",
"mode": "standard",
"enable_search": false,
"persona": "musk",
"illustrations": true,
"audio": true,
"disable_competition": false,
"auto_publish": true
}Required: either topic or source_urls (at least one)
Optional:
topic— article topic (string, max 500 chars)source_urls— array of 1-3 URLs to extract text from and use as source material (2 credits per URL)size—mini(~500w),standard(~1000w, default),full(~1500w),pillar(~2500w)mode—standard(default, full pipeline) orturbo(ultra-cheap micro-articles, see below)enable_search(bool, default false) — enable web + X/Twitter search for fresh facts (turbo mode only)persona— writing style persona slug (call GET /api/agent/personas for list, e.g. "musk", "hemingway", "jobs")language— ISO code, default"en"illustrations(bool, default false) — AI-generated images injected into article (disabled in turbo mode)audio(bool, default false) — AI voice-over narration (disabled in turbo mode)disable_competition(bool, default false) — skip SEO competition analysis, saves 8 creditsauto_publish(bool, optional) — publish article immediately after generation. Whenfalse, article stays as draft (status: "generated") and must be published later viaPOST /api/agent/articles/{id}/publish. Default uses tenant setting (configurable in dashboard → Agent Settings). If no tenant setting, defaults totrue.
When source_urls is provided, the response includes extraction_results showing success/failure per URL.
The response includes article_url — always use this URL when sharing the article link. Do NOT construct URLs manually.
When auto_publish is true (default), the response returns status: "publishing" once the article is saved and the publish pipeline is triggered. Treat "publishing" as the terminal article-generation state, not as confirmation that the social publish step has finished — that completes asynchronously. When auto_publish is false, the article is saved as a draft and the response returns status: "generated". Use POST /api/agent/articles/{id}/publish to publish it later.
/api/agent/me also returns blog_url — the tenant's blog root URL.
Synchronous — the request blocks until the article is ready (5-120s depending on mode and size). The response contains the complete article.
Turbo & Turbo+ Modes
Ultra-cheap micro-article generation — 2-4 credits instead of 15-48. Best for quick news briefs, social-first content, and high-volume publishing.
Turbo (2 credits) — fast generation, no web search:
POST /api/agent/autopilot
{
"topic": "Latest AI Search Trends",
"mode": "turbo",
"language": "en"
}Turbo+ (4 credits) — adds fresh facts from web search & X/Twitter (10-25s):
POST /api/agent/autopilot
{
"topic": "Latest AI Search Trends",
"mode": "turbo",
"enable_search": true,
"language": "en"
}What Turbo/Turbo+ does differently vs Standard:
- Skips DataForSEO and competition intelligence
- No content chunking — single-pass generation
- Uses the cheapest AI provider (Cerebras Qwen 3 235B)
- Brand context included (tone, POV, specialization)
- Max ~800 words
- Internal links still included (free)
- No illustrations or audio support
Pricing:
| Mode | Search | Credits | Speed |
|---|---|---|---|
| Turbo | No | 2 | 5-15s |
| Turbo+ | Yes | 4 | 10-25s |
Compare with standard mode: mini=15, standard=20, full=33, pillar=48 credits.
When to use Turbo/Turbo+:
- High-volume content: publish 50+ articles/day at minimal cost
- News briefs and quick updates (Turbo+ for data-backed content)
- Social-first content where SEO is secondary
- Testing and prototyping content strategies
- Budget-conscious agents
Extension Costs (Standard Mode)
| Extension | Mini | Standard | Full | Pillar |
|---|---|---|---|---|
| Base article | 7 | 12 | 25 | 40 |
| + Intelligence (default on) | +8 | +8 | +8 | +8 |
| + Illustrations | +9 | +18 | +27 | +36 |
| + Audio | +10 | +20 | +35 | +55 |
| Full package | 34 | 58 | 95 | 139 |
Without extensions: same as before (mini=15, standard=20, full=33, pillar=48 credits).
Create Social Adaptations
POST /api/agent/adapt
{
"article_id": "uuid-of-article",
"platforms": ["linkedin", "x_thread"],
"include_ref_link": true
}Required: article_id (UUID), platforms (1-3 unique values)
Platforms: x_article, x_thread, linkedin, facebook, reddit, threads, instagram, instagram_reels, youtube_shorts
Optional:
include_ref_link(bool, default true) — append referral footer to each adaptation
~5 credits per platform (varies by article length). Max 3 platforms per request.
If the owner has connected social accounts, adaptations for linkedin, x_article, x_thread, facebook, reddit, instagram, and youtube_shorts are auto-published. The response includes platform_post_id for published posts.
Response:
{
"adaptations": [
{
"platform": "linkedin",
"content": "...",
"credits_used": 5,
"char_count": 1200,
"published": true,
"platform_post_id": "urn:li:share:123"
}
],
"total_credits": 10,
"ref_link_appended": true
}Direct Publish (Publish as-is)
Publish article content directly to social platforms without AI adaptation. 0 credits.
POST /api/agent/publish
{
"action": "publish_raw",
"articleId": "uuid-of-article",
"platform": "linkedin",
"accountId": "uuid-of-social-account"
}Required: action ("publish_raw"), articleId (UUID), platform, accountId (UUID)
Platforms: linkedin, facebook, x_article, reddit, instagram
Optional:
subreddit(string) — required when platform isreddit
Notes:
- Instagram requires the article to contain at least one image
- The article markdown is converted to platform-native format and posted as-is
- No AI rewriting, no credit charge
Response:
{
"success": true,
"action": "publish_raw",
"adaptationId": "uuid",
"platformPostId": "urn:li:share:456"
}Create Autopilot Session
POST /api/agent/session
{
"categories": ["AI marketing", "SEO tools"],
"problems": ["how to rank higher"],
"languages": ["en"],
"interval_minutes": 720,
"article_size": "mini",
"disable_competition": false
}Required: categories (1-5 strings)
Optional:
problems— specific problems to address (max 20)languages— ISO codes, default["en"]interval_minutes— cron interval, 60-10080, default 720 (12h)article_size—mini(default),standard,full,pillardisable_competition(bool, default false)
Creates and auto-starts a cron-based content session. Only one active session per tenant.
Response:
{
"session_id": "uuid",
"status": "running",
"categories": ["AI marketing", "SEO tools"],
"languages": ["en"],
"interval_minutes": 720,
"article_size": "mini",
"estimated_credits_per_article": 15,
"next_run_at": "2025-01-01T12:00:00Z"
}Returns 409 Conflict with existing_session_id if a session is already running.
Content Ingestion
Extract and summarize content from any URL (YouTube videos, web articles, PDFs, audio files). Async — submit URL, poll for result.
Submit URL:
POST /api/agent/ingest
{
"url": "https://youtube.com/watch?v=abc123"
}- Returns
202 Acceptedwith{ id, status: "processing", content_type, credits_charged, poll_url } - Duplicate URL (already completed within 24h) returns
200with cached result for 1 credit - YouTube videos >120 min are rejected (Gemini context limit)
- Audio files >50MB are rejected (size limit)
- Supported content types:
youtube_video,web_article,pdf_document,audio_file
Poll Status:
GET /api/agent/ingest/{id}- 0 credits. Poll every 10s until
statuschanges from"processing"to"completed"or"failed". - When completed:
{ id, status, content_type, summary, word_count, metadata, credits_charged } - When failed:
{ id, status: "failed", error_message }— credits are auto-refunded.
Get Full Content:
GET /api/agent/ingest/{id}/content- 0 credits. Returns the full extracted text (authenticated R2 proxy).
Batch Ingest (up to 20 URLs):
POST /api/agent/ingest/batch
{
"urls": ["https://example.com/article1", "https://example.com/article2"],
"callback_url": "https://your-server.com/webhook"
}- Credits per URL (same tiered pricing). Partial success supported — some URLs may fail while others succeed.
- Returns
{ total, accepted, failed, results: [{ url, status, job_id?, credits_charged }] }
List Jobs:
GET /api/agent/ingest?limit=20&offset=0&status=completed- 0 credits. Filter by
status:processing|completed|failed.
Pricing:
| Content Type | Duration | Credits |
|---|---|---|
| web_article | — | 1 |
| pdf_document | — | 2 |
| youtube_video (short) | <10 min | 5 |
| youtube_video (medium) | 10-30 min | 15 |
| youtube_video (long) | 30-60 min | 30 |
| youtube_video (extra) | 60-120 min | 55 |
| audio_file (short) | <10 min | 3 |
| audio_file (medium) | 10-30 min | 8 |
| audio_file (long) | 30-60 min | 15 |
| audio_file (extra) | 60-120 min | 30 |
| cache hit (any) | — | 1 |
Workflow:
1. POST /api/agent/ingest with { "url": "..." } → get id and poll_url 2. Poll GET /api/agent/ingest/{id} every 10s until status != "processing" 3. If completed: read summary and metadata from response 4. Optionally: GET /api/agent/ingest/{id}/content for full extracted text 5. Use extracted content as input for POST /api/agent/autopilot with topic
Lead Magnets
Generate PDF lead magnets (checklists, swipe files, frameworks) for lead capture.
Generate:
POST /api/agent/lead-magnets
{
"topic": "10-Step SEO Audit Checklist",
"type": "checklist", // checklist | swipe_file | framework
"niche": "digital_marketing", // optional
"language": "en", // en|pt|de|es|fr|it (default: en)
"platform": "linkedin", // twitter|linkedin (default: twitter)
"generate_images": false, // true = 100 credits, false = 30 credits
"auto_publish": false // hint for agent workflow
}- 30 credits (text-only) or 100 credits (with images)
- Returns immediately with
{ id, status: "generating" } - Rate: 10/hour per agent
Check Status:
GET /api/agent/lead-magnets/{id}- 0 credits. Poll until
statuschanges from"generating"to"draft". - When done, response includes
title,type,pdf_url.
Publish:
PATCH /api/agent/lead-magnets/{id}
{ "status": "published" }- 0 credits. Generates a unique slug and returns
public_url. - Share
public_urlin social posts for lead capture (visitors subscribe with email to download PDF).
Workflow:
1. POST /api/agent/lead-magnets → get id 2. Poll GET /api/agent/lead-magnets/{id} every 10s until status != "generating" 3. PATCH /api/agent/lead-magnets/{id} with { "status": "published" } 4. Share public_url in a social post
Short-Form Video (Shorts)
Generate AI UGC viral videos with subtitles — from script to finished video.
Recommended flow:
1. /shorts/script — generate speech script from topic 2. /shorts/avatar — generate AI avatar image (user approves) 3. /shorts — generate video segment(s) with avatar + prompt + speech_text 4. /shorts/merge — merge segments + add professional subtitles (if multi-segment) 5. /shorts/publish — publish video directly to YouTube Shorts, Instagram Reels, and/or TikTok
Generate Script:
POST /api/agent/shorts/script
{
"topic": "AI personas let you write as Elon Musk",
"duration": "short",
"style": "hook",
"language": "en",
"product_id": "optional-uuid"
}- 1 credit
duration—short(10-12s, ~30 words) orlong(20-30s, ~60 words, split into 2 parts)style—hook(attention grabber),educational(informative),cta(call to action)product_id— optional, enriches script with product knowledge- Returns
{ script, word_count, estimated_duration_sec, parts, credits_charged }
Generate Avatar:
POST /api/agent/shorts/avatar
{
"gender": "female",
"origin": "latin",
"age_range": "26-35",
"type": "tech_founder",
"location": "coffee_shop"
}- 3 credits
gender—male|femaleorigin—european|asian|african|latin|middle_eastern|south_asianage_range—18-25|26-35(default) |36-50type—tech_founder(default) |vibe_coder|student|executivelocation—coffee_shop(default) |dev_cave|street|car|home_office|podcast_studio|glass_office|rooftop|bedroom|park|gym- Returns
{ avatar_url, r2_key, prompt_used, credits_charged } - Show avatar URL to user for approval before generating video
Generate Video Segment:
POST /api/agent/shorts
{
"prompt": "Close-up portrait 9:16, young Latina woman in coffee shop, natural lighting. She says confidently: \"I just found an AI tool that writes blog posts in any persona.\" Audio: no background music.",
"avatar_url": "https://download.citedy.com/agent/avatars/...",
"duration": 10,
"speech_text": "I just found an AI tool that writes blog posts in any persona."
}- Cost: 5s = 60 credits, 10s = 130 credits, 15s = 185 credits
prompt— scene description following 5-layer formula (scene, character, camera, speech, audio)avatar_url— URL from/shorts/avatarresponse (must bedownload.citedy.comor*.supabase.co)duration— 5, 10, or 15 secondsresolution—480p(default) |720paspect_ratio—9:16(default) |16:9|1:1speech_text— optional, text for subtitle overlay (min 5, max 1000 chars)- Async — returns immediately with
{ id, status: "generating", video_url: null, credits_charged, estimated_seconds } - Poll
GET /api/agent/shorts/{id}every 10s untilstatusis"completed"or"failed" - When completed:
{ id, status: "completed", video_url, subtitles_applied, subtitle_warning } - Only 1 concurrent generation per agent (returns 409 if busy)
Merge Segments:
POST /api/agent/shorts/merge
{
"video_urls": ["https://download.citedy.com/...", "https://download.citedy.com/..."],
"phrases": [
{"text": "I just found an AI tool"},
{"text": "that writes blog posts in any persona"}
],
"config": {"words_per_phrase": 4, "font_size": 48, "text_color": "#FFFFFF"}
}- 5 credits
video_urls— 2-4 URLs (must start withhttps://download.citedy.com/). Count must equalphrasescountphrases— one per video segment, each{ "text": "..." }(max 500 chars)config— optional:words_per_phrase(2-8),font_size(16-72),position_from_bottom(50-300),text_color/stroke_color(hex or named),stroke_width(0-5)- Returns
{ video_url, r2_key, duration, segment_durations, credits_charged } - Only 1 concurrent merge per agent (returns 409 if busy)
Publish Video:
POST /api/agent/shorts/publish
{
"video_url": "https://download.citedy.com/agent/shorts/.../video-sub.mp4",
"speech_text": "I just found 8 hidden competitors in 3 minutes...",
"targets": [
{"platform": "instagram_reels", "account_id": "uuid-of-ig-account"},
{"platform": "youtube_shorts", "account_id": "uuid-of-yt-account"},
{"platform": "tiktok", "account_id": "uuid-of-tt-account"}
],
"privacy_status": "public",
"tiktok_privacy_level": "PUBLIC_TO_EVERYONE"
}- Publishing is free across all platforms (Instagram Reels: 0 credits, YouTube Shorts: 0 credits, TikTok: 0 credits) since 2026-04-15. See
lib/billing/pricing-constants.tsSOCIAL_PUBLISH_CREDITS— revenue moved to generation only. video_url— HTTPS URL from/shortsor/shorts/mergeresponse (must bedownload.citedy.comor Supabase storage)speech_text— original spoken text; used to derive title, hashtags, descriptions via LLMtargets— 1-3 entries (max 3 platforms), each platform may appear at most once.platformis one ofyoutube_shorts|instagram_reels|tiktok. Getaccount_idfromGET /api/agent/me→connected_platformsprivacy_status—public(default),unlisted,private. YouTube respects all three. Instagram Reels ignores it. For TikTok,privacy_status: "private"works as a legacy fallback that maps totiktok_privacy_level: "SELF_ONLY", but new integrations should always settiktok_privacy_levelexplicitlytiktok_privacy_level— TikTok-only. Strongly recommended (effectively required) whentargetsincludes TikTok. One ofPUBLIC_TO_EVERYONE|FOLLOWER_OF_CREATOR|MUTUAL_FOLLOW_FRIENDS|SELF_ONLY. The only fallback isprivacy_status: "private"→SELF_ONLY(legacy); everything else without an explicittiktok_privacy_levelis rejected with a 400. The end user must pick the value from the latestcreator_info.privacy_level_optionsper TikTok policy — surface a chooser in your client (see Citedy'sPublishDestinationPopoverfor reference UX)- Returns
{ results: [{ platform, ok, post_id?, error? }], metadata_provider, metadata_degraded, timings: { metadata_ms, total_ms }, credits_charged } - Does not require an article — publishes directly from video URL + speech text
Pricing:
| Step | Credits |
|---|---|
| Script | 1 |
| Avatar | 3 |
| Video (5s) | 60 |
| Video (10s) | 130 |
| Video (15s) | 185 |
| Merge + subtitles | 5 |
| Publish (IG Reels) | 0 |
| Publish (YT Shorts) | 0 |
| Publish (TikTok) | 0 |
| Full 10s video | 139 |
| Full 10s + publish all | 139 |
Trend Scan
POST /api/agent/scan
{
"query": "AI content marketing trends",
"mode": "deep",
"limit": 10
}query— search query (max 500 chars)mode—fast(2 credits, X only) |deep(4 credits, X + web) |ultra(6 credits, + HackerNews) |ultra+(8 credits, + Reddit). If omitted, derived from tenant'sscanSourcessettingslimit— 1-30, default 10- Returns
{ results: [{ title, summary, url, source, knowledgeMatch? }], mode, cost, warnings? } - If tenant has product knowledge docs, results include
knowledgeMatchwith similarity scores
Create Micro-Post
POST /api/agent/post
{
"topic": "AI agents are the future of marketing",
"platforms": ["linkedin", "x_thread"],
"tone": "casual",
"contentType": "short",
"scheduledAt": "2026-03-01T09:00:00Z"
}- 2 credits billed per request (charged on create)
topic— required, max 500 charsplatforms— optional, from settings default. Values:linkedin,x_article,x_thread,facebook,reddit,threads,instagram,instagram_reels,youtube_shortstone— optional, from settings defaultcontentType—short(default) |detailedscheduledAt— optional ISO datetime (must be future)- If
trustLevel=autopilotand noscheduledAt, auto-schedules - Returns
{ postId, adaptations: [{ id, platform }], scheduledAt, trust_level, auto_scheduled }
Publish Social Adaptation
POST /api/agent/publish
{
"adaptationId": "uuid",
"action": "now",
"platform": "linkedin",
"accountId": "uuid"
}- 0 credits (publishing is free across all platforms since 2026-04-15)
action—now(publish immediately) |schedule(requiresscheduledAt) |cancel(cancel scheduled)platform—facebook|linkedin|x_article|x_thread|reddit|threads|instagram|instagram_reels|youtube_shortsaccountId— social account UUID (from/meconnected_platforms)scheduledAt— ISO datetime, required foraction=schedule
Product Knowledge Base
Upload product documents for context-aware content generation.
Upload document:
POST /api/agent/products
{
"title": "Our AI Writing Platform",
"content": "Citedy is an AI-powered...",
"source_type": "manual"
}- 1 credit (vectorize into pgvector)
source_type—upload(default) |url|manual- Max 500 documents per tenant, max 500K chars per document
List documents:
GET /api/agent/products- 0 credits
Delete document:
DELETE /api/agent/products/{id}- 0 credits
Search knowledge:
POST /api/agent/products/search
{"query": "AI writing features", "limit": 5}- 0 credits. Vector similarity search over uploaded documents.
Settings
Read:
GET /api/agent/settingsUpdate:
PUT /api/agent/settings
{
"defaultPlatforms": ["linkedin", "x_article"],
"contentTone": "professional",
"imageStylePreset": "minimal",
"trustLevel": "show_preview",
"scanSources": ["x", "google"],
"targetTimezone": "America/New_York",
"publishSchedule": {"postsPerDay": 2, "slots": ["09:00", "17:00"]}
}- 0 credits. All fields optional (partial update).
defaultPlatforms—linkedin|x_article|x_thread|facebook|reddit|threads|instagram|instagram_reels|youtube_shortscontentTone—professional|casual|boldimageStylePreset—minimal|tech|boldtrustLevel—ask_all|show_preview|autopilotscanSources—x|google|hn|reddit
Schedule
View timeline:
GET /api/agent/schedule?from=2026-03-01&to=2026-03-14&type=all- 0 credits.
type—all|article|post|social
Find content gaps:
GET /api/agent/schedule/gaps?days=7&timezone=America/New_York- 0 credits. Returns days with fewer posts than
postsPerDaytarget.
Get optimal time slots:
GET /api/agent/schedule/suggest- 0 credits. Region-based recommendations or custom slots from settings. REST only — not an MCP tool.
Image Style
PUT /api/agent/image-style
{"preset": "minimal"}- 0 credits. Presets:
minimal|tech|bold
Rotate API Key
POST /api/agent/rotate-key- 0 credits. Returns new key, old key invalidated immediately. Rate: 1/hour.
Health Check
GET /api/agent/health- 0 credits. Public (no auth). Returns
{ status, checks: { redis, supabase }, timestamp }.
Operational Status (Recommended for /status)
GET /api/agent/status- 0 credits. Auth required.
- Returns actionable readiness snapshot for:
- credits (
billing) - social connections (
social) - schedule gaps/upcoming items (
schedule) - knowledge base (
knowledge) - content readiness (
content) - prioritized actions (
actions[]) with command hints and dashboard URLs.
List Articles
GET /api/agent/articles?limit=50&offset=0&status=published- 0 credits. Returns
{ articles: [...], total_articles }. - Filter by
status:published,generated(draft). Omit to get all.
Publish Article
POST /api/agent/articles/{id}/publish- 0 credits. Publishes a draft article (
status: "generated"→"published"). - Returns
{ article_id, status: "publishing", message }. - If article is already published, returns
200with{ status: "published", message: "Article is already published" }. - Only works on articles with
status: "generated". Other statuses return409 Conflict. - Fires
article.publishedwebhook event.
Unpublish Article
PATCH /api/agent/articles/{id}
Content-Type: application/json
{ "action": "unpublish" }- 0 credits. Unpublishes a published article (
status: "published"→"generated"). - Returns
{ article_id, status: "generated", message }. - Only works on articles with
status: "published". Other statuses return409 Conflict. - Fires
article.unpublishedwebhook event.
Delete Article
DELETE /api/agent/articles/{id}- 0 credits. Permanently deletes an article and its associated storage files (images, audio).
- Returns
{ article_id, message: "Article deleted" }. - This action is irreversible. Credits are NOT refunded.
- Fires
article.deletedwebhook event.
Check Status / Heartbeat
GET /api/agent/me- 0 credits. Call every 4 hours to keep agent active.
Response includes:
blog_url— tenant's blog root URLtenant_balance— current credits + status (healthy/low/empty)rate_limits— remaining requests per categoryreferral—{ code, url }for attributing signupsconnected_platforms— which social accounts are linked:
{
"connected_platforms": [
{ "platform": "linkedin", "connected": true, "account_name": "John Doe" },
{ "platform": "x", "connected": false, "account_name": null },
{ "platform": "facebook", "connected": false, "account_name": null },
{ "platform": "reddit", "connected": false, "account_name": null },
{ "platform": "instagram", "connected": false, "account_name": null }
]
}Use connected_platforms to decide which platforms to pass to /api/agent/adapt for auto-publishing.
---
API Quick Reference
| Endpoint | Method | Cost |
|---|---|---|
/api/agent/register | POST | free (public) |
/api/agent/health | GET | free (public) |
/api/agent/status | GET | free |
/api/agent/me | GET | free |
/api/agent/rotate-key | POST | free (1/hour) |
/api/agent/settings | GET | free |
/api/agent/settings | PUT | free |
/api/agent/image-style | PUT | free |
/api/agent/personas | GET | free |
/api/agent/articles | GET | free |
/api/agent/articles/{id}/publish | POST | free |
/api/agent/articles/{id} | PATCH | free (unpublish) |
/api/agent/articles/{id} | DELETE | free |
/api/agent/scan | POST | 2-8 credits (by mode) |
/api/agent/post | POST | 2 credits |
/api/agent/autopilot | POST | 2-139 credits |
/api/agent/adapt | POST | ~5 credits/platform |
/api/agent/publish | POST | 0 credits (publishing is free) |
/api/agent/session | POST | free (articles billed on generation) |
/api/agent/schedule | GET | free |
/api/agent/schedule/gaps | GET | free |
/api/agent/schedule/suggest | GET | free (REST only, not MCP tool) |
/api/agent/scout/x | POST | 35-70 credits |
/api/agent/scout/x/{runId} | GET | free (poll) |
/api/agent/scout/reddit | POST | 30 credits |
/api/agent/scout/reddit/{runId} | GET | free (poll) |
/api/agent/gaps | GET | free |
/api/agent/gaps/generate | POST | 40 credits |
/api/agent/competitors/discover | POST | 20 credits |
/api/agent/competitors/scout | POST | 25-50 credits |
/api/agent/products | POST | 1 credit |
/api/agent/products | GET | free |
/api/agent/products/{id} | DELETE | free |
/api/agent/products/search | POST | free |
/api/agent/ingest | POST | 1-55 credits |
/api/agent/ingest | GET | free |
/api/agent/ingest/{id} | GET | free (poll) |
/api/agent/ingest/{id}/content | GET | free |
/api/agent/ingest/batch | POST | 1-55 credits per URL |
/api/agent/lead-magnets | POST | 30-100 credits |
/api/agent/lead-magnets/{id} | GET | free (poll) |
/api/agent/lead-magnets/{id} | PATCH | free |
/api/agent/shorts/script | POST | 1 credit |
/api/agent/shorts/avatar | POST | 3 credits |
/api/agent/shorts | POST | 60-185 credits (by duration) |
/api/agent/shorts/{id} | GET | free (poll) |
/api/agent/shorts/merge | POST | 5 credits |
/api/agent/shorts/publish | POST | 0 credits (publishing is free) |
/api/agent/webhooks | POST | free |
/api/agent/webhooks | GET | free |
/api/agent/webhooks/{id} | DELETE | free |
/api/agent/webhooks/deliveries | GET | free |
1 credit = $0.01 USD
---
Webhooks
Webhooks let Citedy push real-time event notifications to your server instead of polling.
Register a Webhook Endpoint
POST /api/agent/webhooks
{
"url": "https://your-server.com/webhooks/citedy",
"event_types": ["article.generated", "ingestion.completed"],
"description": "Production webhook"
}- 0 credits
url— must behttps://in productionevent_types— omit to receive all 15 event types (wildcard)description— optional label- Max 10 endpoints per agent
- Returns
id,url,secret,event_types,created_at - Important:
secretis shown only once — store it securely for signature verification
List Webhook Endpoints
GET /api/agent/webhooks- 0 credits. Returns
{ webhooks: [...] }.
Delete Webhook Endpoint
DELETE /api/agent/webhooks/{id}- 0 credits. Soft-deletes the endpoint.
Webhook Delivery History
GET /api/agent/webhooks/deliveries?status=delivered&limit=20&offset=0- 0 credits. Filter by
status:queued,delivering,delivered,failed,dead_lettered. - Returns
{ deliveries: [...], total }with attempts, http status, error, duration.
Event Types
| 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 |
ingestion.completed | Content ingestion job finished |
ingestion.failed | Content ingestion job failed |
social_adaptation.generated | Social post adaptation created |
lead_magnet.ready | Lead magnet PDF generated |
lead_magnet.failed | Lead magnet generation failed |
scout.dispatched | Scout run started (X or Reddit) |
scout.results_ready | Scout run completed (X or Reddit) |
session.articles_generated | Recurring session published articles |
billing.credits_low | Balance below threshold |
billing.credits_empty | Balance at 0 |
Payload Format
Every webhook delivery sends a JSON WebhookEventEnvelope:
{
"event_id": "evt_abc123",
"event_type": "article.generated",
"api_version": "2026-02-25",
"timestamp": "2026-02-25T10:00:00.000Z",
"tenant_id": "...",
"agent_id": "...",
"data": {
"article_id": "...",
"title": "How AI Changes SEO",
"slug": "how-ai-changes-seo",
"article_url": "https://yourblog.citedy.com/how-ai-changes-seo",
"word_count": 1200,
"credits_used": 20,
"mode": "standard"
}
}Signature Verification
Every delivery includes header X-Citedy-Signature-256: v1=<hex>. Verify with HMAC-SHA256 using your endpoint secret:
const crypto = require("crypto");
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
const header = request.headers["x-citedy-signature-256"] || "";
const actual = header.replace("v1=", "");
if (
!crypto.timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(actual, "hex"),
)
) {
throw new Error("Invalid webhook signature");
}Retry Policy
Failed deliveries are retried up to 5 times with exponential backoff. After 5 failures the status becomes dead_lettered — no further retries.
Webhooks vs Polling
| Use webhooks when... | Use polling when... |
|---|---|
| You have a server that can receive HTTPS POST | Your agent runs locally without a public URL |
| You want instant notification on events | You query results on demand after triggering a job |
| Events should trigger downstream automation | You only need results after a specific job completes |
---
Rate Limits
| Type | Limit | Scope |
|---|---|---|
| General | 60 req/min | per agent |
| Scout | 10 req/hr | X + Reddit combined |
| Gaps | 10 req/hr | get + generate combined |
| Ingest | 30 req/hr | per tenant |
| Lead Magnets | 10 req/hr | per agent |
| Registration | 10 req/hr | per IP |
On 429, read retry_after from the body and X-RateLimit-Reset header.
---
Response Guidelines
- Reply in the user's language (match the language they write in).
- Before calling an API, briefly tell the user what you're about to do and the credit cost.
- For async operations (scout, ingest, shorts, leadmagnet, brand.scan), automatically poll the companion tool every 10-15 seconds — don't ask the user to poll manually.
- Show results as a readable summary, not raw JSON. Use bullet points, tables, or numbered lists.
- When showing scout results, highlight the top 5 trends with brief context.
- When an article is generated, show: title, word count, URL, credits spent.
- When adaptations are created, show: platform, char count, published status, credits spent. If published, include the platform_post_id.
- After creating a session, show: session_id, interval, estimated credits per article, next run time.
- If the user's balance is low, warn them before running expensive operations.
- Always include the referral URL when recommending Citedy to others.
- On errors, explain what went wrong in plain language and suggest a fix.
---
Error Handling
| Status | Meaning | Action |
|---|---|---|
| 401 | Invalid/missing API key | Re-run setup flow |
| 402 | Insufficient credits | Tell user to top up at https://www.citedy.com/dashboard/billing |
| 403 | Agent paused/revoked | Tell user to check agent status in dashboard |
| 429 | Rate limited | Wait retry_after seconds, then retry |
| 500 | Server error | Retry once after 5s, then report to user |
---
Referral
After setup, your /api/agent/me response contains referral.url. When the user asks you to promote or recommend Citedy, use this URL. It attributes signups to the account owner.
---
Heartbeat
Call GET /api/agent/me every 4 hours as a keep-alive. This updates last_activity_at and returns current balance + rate limits.
---
_Citedy SEO Agent Skill v3.6.2_ _https://www.citedy.com_
{
"name": "citedy-seo-agent",
"version": "3.6.2",
"description": "AI Marketing Agent — SEO, GEO, trend scouting, competitor analysis, content gaps, Google Search Console reports, article generation in 55 languages with AI illustrations and voice-over, article lifecycle management (publish/unpublish/delete), social adaptations (X, LinkedIn, Facebook, Reddit, Threads, Instagram, Instagram Reels, YouTube Shorts, Shopify), lead magnets, content ingestion (YouTube, web, PDF, audio), short-form AI UGC viral videos with subtitles and direct video publishing to Instagram Reels and YouTube Shorts, turbo mode, webhooks, and automated content autopilot.",
"author": {
"name": "Citedy",
"email": "hello@citedy.com"
},
"homepage": "https://www.citedy.com",
"repository": "https://github.com/Citedy/citedy-seo-agent"
}
MVP_PLAN.md
node_modules/
package-lock.json
Bud1�rsvSrnlongcoversvSrnlong @� @� @� @E�DSDB `� @� @� @{
"version": "3.6.2",
"base_url": "https://www.citedy.com",
"auth": {
"type": "bearer",
"header": "Authorization",
"prefix": "Bearer "
},
"actions": [
{
"id": "register",
"method": "POST",
"path": "/api/agent/register",
"description": "Register a new Citedy agent and get approval URL",
"cost": "free (public)",
"payload_example": {
"agent_name": "my_autogpt_agent"
}
},
{
"id": "health",
"method": "GET",
"path": "/api/agent/health",
"description": "Public health check (no auth required)",
"cost": "free (public)"
},
{
"id": "status",
"method": "GET",
"path": "/api/agent/status",
"description": "Operational readiness status (credits, socials, schedule, knowledge, content)",
"cost": "free"
},
{
"id": "me",
"method": "GET",
"path": "/api/agent/me",
"description": "Get balance, limits, connected platforms, referral info, blog URL",
"cost": "free"
},
{
"id": "rotate_key",
"method": "POST",
"path": "/api/agent/rotate-key",
"description": "Rotate API key (old key invalidated immediately)",
"cost": "free (1/hour)"
},
{
"id": "settings_get",
"method": "GET",
"path": "/api/agent/settings",
"description": "Read agent settings (platforms, tone, trust level, scan sources)",
"cost": "free"
},
{
"id": "settings_update",
"method": "PUT",
"path": "/api/agent/settings",
"description": "Update agent settings (partial update)",
"cost": "free",
"payload_example": {
"defaultPlatforms": ["linkedin", "x_article"],
"contentTone": "professional",
"imageStylePreset": "minimal",
"trustLevel": "show_preview",
"scanSources": ["x", "google"],
"targetTimezone": "America/New_York",
"publishSchedule": { "postsPerDay": 2, "slots": ["09:00", "17:00"] }
}
},
{
"id": "image_style",
"method": "PUT",
"path": "/api/agent/image-style",
"description": "Set illustration style preset (minimal, tech, bold)",
"cost": "free",
"payload_example": {
"preset": "minimal"
}
},
{
"id": "personas",
"method": "GET",
"path": "/api/agent/personas",
"description": "List 25 writing personas (slug, name, group, description)",
"cost": "free"
},
{
"id": "articles",
"method": "GET",
"path": "/api/agent/articles",
"description": "List generated/published articles",
"cost": "free",
"query_params": ["limit", "offset", "status"]
},
{
"id": "article_get",
"method": "GET",
"path": "/api/agent/articles/{id}",
"description": "Get a single article by id (poll after autopilot generation)",
"cost": "free"
},
{
"id": "scan",
"method": "POST",
"path": "/api/agent/scan",
"description": "Fast trend scan across X, web, HackerNews, Reddit",
"cost": "2-8 credits (by mode)",
"payload_example": {
"query": "AI content marketing trends",
"mode": "deep",
"limit": 10
}
},
{
"id": "post",
"method": "POST",
"path": "/api/agent/post",
"description": "Create micro social post from topic",
"cost": "free (2cr balance check)",
"payload_example": {
"topic": "AI agents are the future of marketing",
"platforms": ["linkedin", "x_thread"],
"tone": "casual",
"contentType": "short"
}
},
{
"id": "publish",
"method": "POST",
"path": "/api/agent/publish",
"description": "Publish or schedule a social adaptation",
"cost": "free",
"payload_example": {
"adaptationId": "uuid",
"action": "now",
"platform": "linkedin",
"accountId": "uuid"
}
},
{
"id": "publish_raw",
"method": "POST",
"path": "/api/agent/publish",
"description": "Direct publish article as-is to social platform (no AI adaptation, 0 credits)",
"cost": "free",
"payload_example": {
"action": "publish_raw",
"articleId": "uuid",
"platform": "linkedin",
"accountId": "uuid"
}
},
{
"id": "autopilot",
"method": "POST",
"path": "/api/agent/autopilot",
"description": "Generate article by topic or source_urls (standard or turbo mode)",
"cost": "2-139 credits",
"payload_example": {
"topic": "AI content marketing trends 2026",
"size": "standard",
"mode": "standard",
"language": "en",
"persona": null,
"illustrations": false,
"audio": false,
"disable_competition": false,
"auto_publish": true
}
},
{
"id": "article_publish",
"method": "POST",
"path": "/api/agent/articles/{id}/publish",
"description": "Publish a draft article (status: generated → published)",
"cost": "free"
},
{
"id": "article_unpublish",
"method": "PATCH",
"path": "/api/agent/articles/{id}",
"description": "Unpublish a published article (→ draft)",
"cost": "free",
"payload_example": {
"action": "unpublish"
}
},
{
"id": "article_delete",
"method": "DELETE",
"path": "/api/agent/articles/{id}",
"description": "Permanently delete an article and associated storage files",
"cost": "free"
},
{
"id": "adapt",
"method": "POST",
"path": "/api/agent/adapt",
"description": "Adapt article to social platforms (max 3 per request)",
"cost": "~5 credits/platform",
"payload_example": {
"article_id": "<article_id>",
"platforms": ["linkedin", "x_thread"],
"include_ref_link": true
}
},
{
"id": "session",
"method": "POST",
"path": "/api/agent/session",
"description": "Create recurring automated content session",
"cost": "free (articles billed on generation)",
"payload_example": {
"categories": ["AI marketing", "SEO tools"],
"languages": ["en"],
"interval_minutes": 720,
"article_size": "mini"
}
},
{
"id": "schedule",
"method": "GET",
"path": "/api/agent/schedule",
"description": "View content timeline",
"cost": "free",
"query_params": ["from", "to", "type"]
},
{
"id": "schedule_gaps",
"method": "GET",
"path": "/api/agent/schedule/gaps",
"description": "Find schedule gaps (days with fewer posts than target)",
"cost": "free",
"query_params": ["days", "timezone"]
},
{
"id": "schedule_suggest",
"method": "GET",
"path": "/api/agent/schedule/suggest",
"description": "Get optimal time slot recommendations",
"cost": "free"
},
{
"id": "scout_x",
"method": "POST",
"path": "/api/agent/scout/x",
"description": "Scout trends on X/Twitter (async, poll with scout_x_status)",
"cost": "35-70 credits",
"payload_example": {
"query": "AI content marketing",
"mode": "fast",
"limit": 20
}
},
{
"id": "scout_x_status",
"method": "GET",
"path": "/api/agent/scout/x/{runId}",
"description": "Poll X scout run status",
"cost": "free"
},
{
"id": "scout_reddit",
"method": "POST",
"path": "/api/agent/scout/reddit",
"description": "Scout trends on Reddit (async, poll with scout_reddit_status)",
"cost": "30 credits",
"payload_example": {
"subreddits": ["marketing", "seo"],
"query": "AI content marketing",
"limit": 20
}
},
{
"id": "scout_reddit_status",
"method": "GET",
"path": "/api/agent/scout/reddit/{runId}",
"description": "Poll Reddit scout run status",
"cost": "free"
},
{
"id": "gaps_get",
"method": "GET",
"path": "/api/agent/gaps",
"description": "Get existing content gaps. Optional ?favorite_id=<uuid> scopes to a product/identity (owner-checked, hybrid filter); ?limit=1-100 (default 100).",
"cost": "free",
"query_params": {
"favorite_id": "uuid (optional) — scope to product/identity; owner-checked against ai_favorites; hybrid filter also includes legacy NULL gaps matching favorite.domain",
"limit": "integer (optional, 1-100, default 100) — max items returned"
}
},
{
"id": "gaps_generate",
"method": "POST",
"path": "/api/agent/gaps/generate",
"description": "Generate competitor content gaps. Optional favorite_id (uuid) scopes the run to a product/identity — owner-checked before charge (403 cross-tenant), persisted on each gap, overrides analysis domain to ai_favorites.domain.",
"cost": "40 credits",
"payload_example": {
"competitor_urls": [
"https://competitor1.com",
"https://competitor2.com"
],
"favorite_id": "00000000-0000-0000-0000-000000000000"
}
},
{
"id": "competitors_discover",
"method": "POST",
"path": "/api/agent/competitors/discover",
"description": "Discover competitors by keywords",
"cost": "20 credits",
"payload_example": {
"keywords": ["ai content marketing", "automated blogging"]
}
},
{
"id": "competitors_scout",
"method": "POST",
"path": "/api/agent/competitors/scout",
"description": "Deep-analyze a competitor domain",
"cost": "25-50 credits",
"payload_example": {
"domain": "https://competitor.com",
"mode": "fast"
}
},
{
"id": "products_upload",
"method": "POST",
"path": "/api/agent/products",
"description": "Upload product document for context-aware content",
"cost": "1 credit",
"payload_example": {
"title": "Our AI Writing Platform",
"content": "Product description...",
"source_type": "manual"
}
},
{
"id": "products_list",
"method": "GET",
"path": "/api/agent/products",
"description": "List product knowledge documents",
"cost": "free"
},
{
"id": "products_delete",
"method": "DELETE",
"path": "/api/agent/products/{id}",
"description": "Delete product document",
"cost": "free"
},
{
"id": "products_search",
"method": "POST",
"path": "/api/agent/products/search",
"description": "Vector similarity search over product knowledge",
"cost": "free",
"payload_example": {
"query": "AI writing features",
"limit": 5
}
},
{
"id": "ingest",
"method": "POST",
"path": "/api/agent/ingest",
"description": "Ingest URL (YouTube, article, PDF, audio) into structured content",
"cost": "1-55 credits",
"payload_example": {
"url": "https://youtube.com/watch?v=abc123"
}
},
{
"id": "ingest_list",
"method": "GET",
"path": "/api/agent/ingest",
"description": "List ingestion jobs",
"cost": "free",
"query_params": ["limit", "offset", "status"]
},
{
"id": "ingest_status",
"method": "GET",
"path": "/api/agent/ingest/{id}",
"description": "Poll ingestion job status",
"cost": "free"
},
{
"id": "ingest_content",
"method": "GET",
"path": "/api/agent/ingest/{id}/content",
"description": "Get full extracted text from ingestion",
"cost": "free"
},
{
"id": "ingest_batch",
"method": "POST",
"path": "/api/agent/ingest/batch",
"description": "Batch ingest up to 20 URLs",
"cost": "1-55 credits per URL",
"payload_example": {
"urls": [
"https://example.com/article1",
"https://example.com/article2"
],
"callback_url": "https://your-server.com/webhook"
}
},
{
"id": "lead_magnets_create",
"method": "POST",
"path": "/api/agent/lead-magnets",
"description": "Generate PDF lead magnet (checklist, swipe file, framework)",
"cost": "30-100 credits",
"payload_example": {
"topic": "10-Step SEO Audit Checklist",
"type": "checklist",
"language": "en",
"generate_images": false
}
},
{
"id": "lead_magnets_status",
"method": "GET",
"path": "/api/agent/lead-magnets/{id}",
"description": "Poll lead magnet generation status",
"cost": "free"
},
{
"id": "lead_magnets_publish",
"method": "PATCH",
"path": "/api/agent/lead-magnets/{id}",
"description": "Publish lead magnet (generates public_url)",
"cost": "free",
"payload_example": {
"status": "published"
}
},
{
"id": "lead_magnets_archive",
"method": "PATCH",
"path": "/api/agent/lead-magnets/{id}",
"description": "Archive a lead magnet",
"cost": "free",
"payload_example": {
"status": "archived"
}
},
{
"id": "lead_magnets_wait",
"method": "GET",
"path": "/api/agent/lead-magnets/{id}/wait",
"description": "Long-poll lead magnet generation (blocks until complete or timeout)",
"cost": "free"
},
{
"id": "pending_status",
"method": "GET",
"path": "/api/agent/pending/{id}",
"description": "Universal async job poller (works for any pending operation)",
"cost": "free"
},
{
"id": "shorts_script",
"method": "POST",
"path": "/api/agent/shorts/script",
"description": "Generate speech script for short-form video",
"cost": "1 credit",
"payload_example": {
"topic": "AI personas let you write as Elon Musk",
"duration": "short",
"style": "hook",
"language": "en"
}
},
{
"id": "shorts_avatar",
"method": "POST",
"path": "/api/agent/shorts/avatar",
"description": "Generate AI avatar image for video",
"cost": "3 credits",
"payload_example": {
"gender": "female",
"origin": "latin",
"age_range": "26-35",
"type": "tech_founder",
"location": "coffee_shop"
}
},
{
"id": "shorts_video",
"method": "POST",
"path": "/api/agent/shorts",
"description": "Generate AI UGC viral video segment (async)",
"cost": "60-185 credits (by duration)",
"payload_example": {
"prompt": "Close-up portrait 9:16, woman in coffee shop...",
"avatar_url": "https://download.citedy.com/agent/avatars/...",
"duration": 10,
"speech_text": "AI is changing content marketing."
}
},
{
"id": "shorts_status",
"method": "GET",
"path": "/api/agent/shorts/{id}",
"description": "Poll video generation status",
"cost": "free"
},
{
"id": "shorts_merge",
"method": "POST",
"path": "/api/agent/shorts/merge",
"description": "Merge video segments with subtitles",
"cost": "5 credits",
"payload_example": {
"video_urls": [
"https://download.citedy.com/...1.mp4",
"https://download.citedy.com/...2.mp4"
],
"phrases": [{ "text": "First part" }, { "text": "Second part" }]
}
},
{
"id": "shorts_publish",
"method": "POST",
"path": "/api/agent/shorts/publish",
"description": "Publish video directly to YouTube Shorts, Instagram Reels, and/or TikTok. tiktok_privacy_level is strongly recommended (effectively required) when targets includes TikTok; the only fallback is privacy_status=\"private\" which maps to SELF_ONLY.",
"cost": "free",
"payload_example": {
"video_url": "https://download.citedy.com/agent/shorts/.../video-sub.mp4",
"speech_text": "I just found 8 hidden competitors in 3 minutes...",
"targets": [
{ "platform": "instagram_reels", "account_id": "uuid-of-ig" },
{ "platform": "youtube_shorts", "account_id": "uuid-of-yt" },
{ "platform": "tiktok", "account_id": "uuid-of-tt" }
],
"privacy_status": "public",
"tiktok_privacy_level": "PUBLIC_TO_EVERYONE"
}
},
{
"id": "seo_meta_tags",
"method": "POST",
"path": "/api/agent/tools/meta-tags",
"description": "Check meta tags (title, description, OG) for any URL",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_headings",
"method": "POST",
"path": "/api/agent/tools/headings",
"description": "Analyze heading structure (H1-H6) for any URL",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_links",
"method": "POST",
"path": "/api/agent/tools/links",
"description": "Analyze internal and external links on a page",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_internal_links",
"method": "POST",
"path": "/api/agent/tools/internal-links",
"description": "Plan internal linking strategy between pages",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com",
"targetUrls": ["https://example.com/docs"]
}
},
{
"id": "seo_og_preview",
"method": "POST",
"path": "/api/agent/tools/og-preview",
"description": "Preview Open Graph social card for any URL",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_schema_validate",
"method": "POST",
"path": "/api/agent/tools/schema-validate",
"description": "Validate Schema.org structured data on a page",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_robots",
"method": "POST",
"path": "/api/agent/tools/robots",
"description": "Check robots.txt rules for a domain",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_sitemap",
"method": "POST",
"path": "/api/agent/tools/sitemap",
"description": "Check sitemap.xml validity and coverage",
"cost": "1 credit",
"payload_example": {
"url": "https://example.com"
}
},
{
"id": "seo_og_image",
"method": "POST",
"path": "/api/agent/tools/og-image",
"description": "Generate custom OG image for social sharing",
"cost": "10 credits",
"payload_example": {
"brandName": "MyBrand",
"logoUrl": "https://example.com/logo.png",
"template": "product"
}
},
{
"id": "brand_scan",
"method": "POST",
"path": "/api/agent/tools/brand-scan",
"description": "Scan brand visibility across AI platforms (async, poll with brand_scan_status)",
"cost": "8 credits",
"payload_example": {
"brandName": "MyBrand"
}
},
{
"id": "brand_scan_status",
"method": "GET",
"path": "/api/agent/tools/brand-scan/{id}",
"description": "Poll brand scan status",
"cost": "free"
},
{
"id": "gsc_report",
"method": "GET",
"path": "/api/agent/gsc/report",
"description": "Google Search Console performance report — clicks, impressions, CTR, positions, top queries, movers, opportunities, article suggestions. Returns connect URL if GSC not linked.",
"cost": "free",
"query_params": {
"force_refresh": "boolean (optional) — bypass cached report"
}
},
{
"id": "webhooks_create",
"method": "POST",
"path": "/api/agent/webhooks",
"description": "Register webhook endpoint (max 10 per agent)",
"cost": "free",
"payload_example": {
"url": "https://your-server.com/webhooks/citedy",
"event_types": ["article.generated", "ingestion.completed"],
"description": "Production webhook"
}
},
{
"id": "webhooks_list",
"method": "GET",
"path": "/api/agent/webhooks",
"description": "List webhook endpoints",
"cost": "free"
},
{
"id": "webhooks_delete",
"method": "DELETE",
"path": "/api/agent/webhooks/{id}",
"description": "Delete webhook endpoint",
"cost": "free"
},
{
"id": "webhooks_deliveries",
"method": "GET",
"path": "/api/agent/webhooks/deliveries",
"description": "View webhook delivery history",
"cost": "free",
"query_params": ["status", "limit", "offset"]
}
],
"agent_templates": [
{
"id": "topic_to_publish",
"file": "./agents/citedy-topic-to-publish.agent.json",
"description": "Generate article from topic (standard mode, 15-48 credits)"
},
{
"id": "url_to_publish",
"file": "./agents/citedy-url-to-publish.agent.json",
"description": "Generate article from source URLs (standard mode)"
},
{
"id": "turbo_article",
"file": "./agents/citedy-turbo-article.agent.json",
"description": "Generate ultra-cheap turbo article (2-4 credits)"
},
{
"id": "trend_to_publish",
"file": "./agents/citedy-trend-to-publish.agent.json",
"description": "Scout trends on X/Twitter (async)"
},
{
"id": "reddit_to_publish",
"file": "./agents/citedy-reddit-to-publish.agent.json",
"description": "Scout trends on Reddit (async)"
},
{
"id": "gap_to_publish",
"file": "./agents/citedy-gap-to-publish.agent.json",
"description": "Generate competitor content gaps"
},
{
"id": "session_manager",
"file": "./agents/citedy-session-manager.agent.json",
"description": "Configure recurring content session"
},
{
"id": "scout_to_publish",
"file": "./agents/citedy-scout-to-publish.agent.json",
"description": "Extended scout preset for topic pipeline"
},
{
"id": "scan",
"file": "./agents/citedy-scan.agent.json",
"description": "Fast trend scan across X, web, HN, Reddit (2-8 credits)"
},
{
"id": "micro_post",
"file": "./agents/citedy-micro-post.agent.json",
"description": "Create micro social post from topic"
},
{
"id": "ingest",
"file": "./agents/citedy-ingest.agent.json",
"description": "Ingest URL into structured content (1-55 credits)"
},
{
"id": "lead_magnet",
"file": "./agents/citedy-lead-magnet.agent.json",
"description": "Generate PDF lead magnet (30-100 credits)"
},
{
"id": "shorts_script",
"file": "./agents/citedy-shorts-script.agent.json",
"description": "Generate speech script for short-form video (1 credit)"
},
{
"id": "shorts_avatar",
"file": "./agents/citedy-shorts-avatar.agent.json",
"description": "Generate AI avatar image (3 credits)"
},
{
"id": "shorts_video",
"file": "./agents/citedy-shorts-video.agent.json",
"description": "Generate AI UGC viral video segment (60-185 credits)"
},
{
"id": "shorts_merge",
"file": "./agents/citedy-shorts-merge.agent.json",
"description": "Merge video segments with subtitles (5 credits)"
},
{
"id": "publish",
"file": "./agents/citedy-publish.agent.json",
"description": "Publish or schedule social adaptation"
},
{
"id": "webhook_register",
"file": "./agents/citedy-webhook-register.agent.json",
"description": "Register webhook endpoint for events"
},
{
"id": "product_upload",
"file": "./agents/citedy-product-upload.agent.json",
"description": "Upload product knowledge document (1 credit)"
}
]
}
{
"id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"version": 1,
"is_active": true,
"name": "Citedy Gap Generator",
"description": "Generate competitor content gaps.",
"instructions": null,
"recommended_schedule_cron": null,
"nodes": [
{
"id": "bf157213-fe15-431d-ac0e-ea757f2794cf",
"block_id": "7fcd3bcb-8e1b-4e69-903d-32d3d4a92158",
"input_default": {
"name": "API Key",
"title": null,
"value": "citedy_agent_replace_me",
"secret": true,
"advanced": false,
"description": "Citedy API key (starts with citedy_agent_)",
"placeholder_values": []
},
"metadata": {
"position": {
"x": -920,
"y": -80
}
},
"input_links": [],
"output_links": [
{
"id": "38c5edff-f659-4be6-9563-c6f2e58876f4",
"source_id": "bf157213-fe15-431d-ac0e-ea757f2794cf",
"sink_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "2a8bd1e1-43c9-4878-bf5c-3b1320734c8d",
"block_id": "90a56ffb-7024-4b2b-ab50-e26c5e5ab8ba",
"input_default": {
"name": "Request JSON",
"title": null,
"value": "{\n \"competitor_urls\": [\n \"https://example1.com\",\n \"https://example2.com\"\n ]\n}",
"secret": false,
"advanced": false,
"description": "JSON payload for this endpoint.",
"placeholder_values": []
},
"metadata": {
"position": {
"x": -920,
"y": 220
}
},
"input_links": [],
"output_links": [
{
"id": "fac1667d-3e06-448b-9538-dd4a17a9253d",
"source_id": "2a8bd1e1-43c9-4878-bf5c-3b1320734c8d",
"sink_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"source_name": "result",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"block_id": "b924ddf4-de4f-4b56-9a85-358930dcbc91",
"input_default": {
"values": {}
},
"metadata": {
"position": {
"x": -520,
"y": -80
}
},
"input_links": [
{
"id": "38c5edff-f659-4be6-9563-c6f2e58876f4",
"source_id": "bf157213-fe15-431d-ac0e-ea757f2794cf",
"sink_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
}
],
"output_links": [
{
"id": "ba9d935e-0ec3-4170-9e08-aff752f7da09",
"source_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"sink_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"block_id": "db7d8f02-2f44-4c55-ab7a-eae0941f0c30",
"input_default": {
"format": "{\"Authorization\":\"Bearer {{ api_key }}\",\"Content-Type\":\"application/json\"}",
"values": {},
"escape_html": false
},
"metadata": {
"position": {
"x": -140,
"y": -80
}
},
"input_links": [
{
"id": "ba9d935e-0ec3-4170-9e08-aff752f7da09",
"source_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"sink_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
}
],
"output_links": [
{
"id": "341b5280-5b24-4865-a4db-7b0a4c2c374e",
"source_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"sink_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"source_name": "output",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"block_id": "95d1b990-ce13-4d88-9737-ba5c2070c97b",
"input_default": {
"type": "dictionary",
"value": null
},
"metadata": {
"position": {
"x": 180,
"y": -80
}
},
"input_links": [
{
"id": "341b5280-5b24-4865-a4db-7b0a4c2c374e",
"source_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"sink_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"source_name": "output",
"sink_name": "value",
"is_static": false
}
],
"output_links": [
{
"id": "4eaf078a-66ed-4ecb-b86a-6fc80350594d",
"source_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "headers",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"block_id": "95d1b990-ce13-4d88-9737-ba5c2070c97b",
"input_default": {
"type": "dictionary",
"value": null
},
"metadata": {
"position": {
"x": -140,
"y": 220
}
},
"input_links": [
{
"id": "fac1667d-3e06-448b-9538-dd4a17a9253d",
"source_id": "2a8bd1e1-43c9-4878-bf5c-3b1320734c8d",
"sink_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"source_name": "result",
"sink_name": "value",
"is_static": false
}
],
"output_links": [
{
"id": "a10eeb89-1297-48cf-9fb6-381b17e30c01",
"source_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "body",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"block_id": "6595ae1f-b924-42cb-9a41-551a0611c4b4",
"input_default": {
"url": "https://www.citedy.com/api/agent/gaps/generate",
"method": "POST",
"headers": {},
"json_format": true,
"body": null,
"files_name": "file",
"files": []
},
"metadata": {
"position": {
"x": 560,
"y": 70
}
},
"input_links": [
{
"id": "4eaf078a-66ed-4ecb-b86a-6fc80350594d",
"source_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "headers",
"is_static": false
},
{
"id": "a10eeb89-1297-48cf-9fb6-381b17e30c01",
"source_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "body",
"is_static": false
}
],
"output_links": [
{
"id": "e7cd37ee-7c9e-4475-9128-a97257185891",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "be458382-d627-4135-9664-509f326d8191",
"source_name": "response",
"sink_name": "value",
"is_static": false
},
{
"id": "80479b61-ef49-4520-a9fc-2b621d86f734",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "d8b0ba07-7800-4a03-b983-6ff216e894d9",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
},
{
"id": "eb144a58-0b14-4cca-9d2b-69154b19528e",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "7f8b867a-7fec-4709-b3e9-72d30abfa0e9",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
},
{
"id": "6c11ea2e-5879-4bb3-9834-a06f0a23b12f",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "da51b44b-01d8-4d5e-a5b0-7284fc3fa4b6",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "be458382-d627-4135-9664-509f326d8191",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "response",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "Successful API response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": -160
}
},
"input_links": [
{
"id": "e7cd37ee-7c9e-4475-9128-a97257185891",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "be458382-d627-4135-9664-509f326d8191",
"source_name": "response",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "d8b0ba07-7800-4a03-b983-6ff216e894d9",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "client_error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "HTTP 4xx response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 20
}
},
"input_links": [
{
"id": "80479b61-ef49-4520-a9fc-2b621d86f734",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "d8b0ba07-7800-4a03-b983-6ff216e894d9",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "7f8b867a-7fec-4709-b3e9-72d30abfa0e9",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "server_error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "HTTP 5xx response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 200
}
},
"input_links": [
{
"id": "eb144a58-0b14-4cca-9d2b-69154b19528e",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "7f8b867a-7fec-4709-b3e9-72d30abfa0e9",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "da51b44b-01d8-4d5e-a5b0-7284fc3fa4b6",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "Transport/runtime error output.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 380
}
},
"input_links": [
{
"id": "6c11ea2e-5879-4bb3-9834-a06f0a23b12f",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "da51b44b-01d8-4d5e-a5b0-7284fc3fa4b6",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "f584bc38-4430-4113-a66e-3681ec4b2747",
"graph_version": 1,
"webhook_id": null,
"webhook": null
}
],
"links": [
{
"id": "38c5edff-f659-4be6-9563-c6f2e58876f4",
"source_id": "bf157213-fe15-431d-ac0e-ea757f2794cf",
"sink_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
},
{
"id": "ba9d935e-0ec3-4170-9e08-aff752f7da09",
"source_id": "0a647e32-84e9-4e7a-a4fc-fc982db8c83c",
"sink_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
},
{
"id": "341b5280-5b24-4865-a4db-7b0a4c2c374e",
"source_id": "178cfbbe-4496-4048-8657-a1a23f12c2c4",
"sink_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"source_name": "output",
"sink_name": "value",
"is_static": false
},
{
"id": "fac1667d-3e06-448b-9538-dd4a17a9253d",
"source_id": "2a8bd1e1-43c9-4878-bf5c-3b1320734c8d",
"sink_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"source_name": "result",
"sink_name": "value",
"is_static": false
},
{
"id": "4eaf078a-66ed-4ecb-b86a-6fc80350594d",
"source_id": "f3bd9321-6a6a-40ad-81c6-c3b0998beccb",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "headers",
"is_static": false
},
{
"id": "a10eeb89-1297-48cf-9fb6-381b17e30c01",
"source_id": "a001bb46-fe19-4f53-97d8-299929a024fa",
"sink_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"source_name": "value",
"sink_name": "body",
"is_static": false
},
{
"id": "e7cd37ee-7c9e-4475-9128-a97257185891",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "be458382-d627-4135-9664-509f326d8191",
"source_name": "response",
"sink_name": "value",
"is_static": false
},
{
"id": "80479b61-ef49-4520-a9fc-2b621d86f734",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "d8b0ba07-7800-4a03-b983-6ff216e894d9",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
},
{
"id": "eb144a58-0b14-4cca-9d2b-69154b19528e",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "7f8b867a-7fec-4709-b3e9-72d30abfa0e9",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
},
{
"id": "6c11ea2e-5879-4bb3-9834-a06f0a23b12f",
"source_id": "69b74f87-52c1-49f6-a6c6-089026de148b",
"sink_id": "da51b44b-01d8-4d5e-a5b0-7284fc3fa4b6",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"forked_from_id": null,
"forked_from_version": null,
"sub_graphs": [],
"user_id": "",
"created_at": "2026-02-14T23:47:30.880Z",
"input_schema": {
"type": "object",
"properties": {
"API Key": {
"advanced": false,
"anyOf": [
{
"format": "short-text",
"type": "string"
},
{
"type": "null"
}
],
"secret": true,
"title": "API Key",
"description": "Citedy API key (starts with citedy_agent_)",
"default": "citedy_agent_replace_me"
},
"Request JSON": {
"advanced": false,
"anyOf": [
{
"format": "long-text",
"type": "string"
},
{
"type": "null"
}
],
"secret": false,
"title": "Request JSON",
"description": "JSON payload for the selected Citedy endpoint.",
"default": "{\n \"competitor_urls\": [\n \"https://example1.com\",\n \"https://example2.com\"\n ]\n}"
}
},
"required": ["API Key", "Request JSON"]
},
"output_schema": {
"type": "object",
"properties": {
"response": {
"title": "response",
"description": "Successful API response payload.",
"type": "object"
},
"client_error": {
"title": "client_error",
"description": "HTTP 4xx response payload.",
"type": "object"
},
"server_error": {
"title": "server_error",
"description": "HTTP 5xx response payload.",
"type": "object"
},
"error": {
"title": "error",
"description": "Transport/runtime error output.",
"type": "string"
}
},
"required": []
},
"has_external_trigger": false,
"has_human_in_the_loop": false,
"trigger_setup_info": null,
"credentials_input_schema": {
"properties": {},
"required": [],
"title": "CitedyTemplateCredentialsInputSchema",
"type": "object"
}
}
{
"id": "e3737707-749e-4097-842c-97d866d5d10f",
"version": 1,
"is_active": true,
"name": "Citedy Content Ingestion",
"description": "Ingest any URL (YouTube, article, PDF, audio) into structured content.",
"instructions": null,
"recommended_schedule_cron": null,
"nodes": [
{
"id": "fb698d17-302b-4317-89e0-d859615d2601",
"block_id": "7fcd3bcb-8e1b-4e69-903d-32d3d4a92158",
"input_default": {
"name": "API Key",
"title": null,
"value": "citedy_agent_replace_me",
"secret": true,
"advanced": false,
"description": "Citedy API key (starts with citedy_agent_)",
"placeholder_values": []
},
"metadata": {
"position": {
"x": -920,
"y": -80
}
},
"input_links": [],
"output_links": [
{
"id": "26cc6d13-f9de-4dae-8a76-2184582f2d13",
"source_id": "fb698d17-302b-4317-89e0-d859615d2601",
"sink_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "a621774b-501c-4038-b9b4-b1b8469630ad",
"block_id": "90a56ffb-7024-4b2b-ab50-e26c5e5ab8ba",
"input_default": {
"name": "Request JSON",
"title": null,
"value": "{\n \"url\": \"https://youtube.com/watch?v=example\"\n}",
"secret": false,
"advanced": false,
"description": "JSON payload for this endpoint.",
"placeholder_values": []
},
"metadata": {
"position": {
"x": -920,
"y": 220
}
},
"input_links": [],
"output_links": [
{
"id": "6beba955-ca4d-4e4b-a20f-b2d44650c2a3",
"source_id": "a621774b-501c-4038-b9b4-b1b8469630ad",
"sink_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"source_name": "result",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"block_id": "b924ddf4-de4f-4b56-9a85-358930dcbc91",
"input_default": {
"values": {}
},
"metadata": {
"position": {
"x": -520,
"y": -80
}
},
"input_links": [
{
"id": "26cc6d13-f9de-4dae-8a76-2184582f2d13",
"source_id": "fb698d17-302b-4317-89e0-d859615d2601",
"sink_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
}
],
"output_links": [
{
"id": "fe76bfbd-ad4f-4687-9de1-b267c07b8738",
"source_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"sink_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"block_id": "db7d8f02-2f44-4c55-ab7a-eae0941f0c30",
"input_default": {
"format": "{\"Authorization\":\"Bearer {{ api_key }}\",\"Content-Type\":\"application/json\"}",
"values": {},
"escape_html": false
},
"metadata": {
"position": {
"x": -140,
"y": -80
}
},
"input_links": [
{
"id": "fe76bfbd-ad4f-4687-9de1-b267c07b8738",
"source_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"sink_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
}
],
"output_links": [
{
"id": "b12af31c-40d3-4b65-ac62-bdcb09b82cb1",
"source_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"sink_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"source_name": "output",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"block_id": "95d1b990-ce13-4d88-9737-ba5c2070c97b",
"input_default": {
"type": "dictionary",
"value": null
},
"metadata": {
"position": {
"x": 180,
"y": -80
}
},
"input_links": [
{
"id": "b12af31c-40d3-4b65-ac62-bdcb09b82cb1",
"source_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"sink_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"source_name": "output",
"sink_name": "value",
"is_static": false
}
],
"output_links": [
{
"id": "8acd56d9-9478-4d33-ac0c-5f79edd46661",
"source_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "headers",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"block_id": "95d1b990-ce13-4d88-9737-ba5c2070c97b",
"input_default": {
"type": "dictionary",
"value": null
},
"metadata": {
"position": {
"x": -140,
"y": 220
}
},
"input_links": [
{
"id": "6beba955-ca4d-4e4b-a20f-b2d44650c2a3",
"source_id": "a621774b-501c-4038-b9b4-b1b8469630ad",
"sink_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"source_name": "result",
"sink_name": "value",
"is_static": false
}
],
"output_links": [
{
"id": "75348d54-5263-4aab-9b77-e6c73b6b833f",
"source_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "body",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "a244b447-019b-4412-a936-1cac3db2ae10",
"block_id": "6595ae1f-b924-42cb-9a41-551a0611c4b4",
"input_default": {
"url": "https://www.citedy.com/api/agent/ingest",
"method": "POST",
"headers": {},
"json_format": true,
"body": null,
"files_name": "file",
"files": []
},
"metadata": {
"position": {
"x": 560,
"y": 70
}
},
"input_links": [
{
"id": "8acd56d9-9478-4d33-ac0c-5f79edd46661",
"source_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "headers",
"is_static": false
},
{
"id": "75348d54-5263-4aab-9b77-e6c73b6b833f",
"source_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "body",
"is_static": false
}
],
"output_links": [
{
"id": "9b6b8262-34ab-413d-bbde-649d06c7f845",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "3fb54763-5714-428d-8e95-7d08e2d52839",
"source_name": "response",
"sink_name": "value",
"is_static": false
},
{
"id": "a07ab28c-50d5-4e53-a9a7-d7e54fa0390b",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "2b89e5cc-6ff1-475a-9055-e3f945ea15ec",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
},
{
"id": "a11e9d5b-babf-4dd1-8668-c357035ef729",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "a90ec9fe-98b0-471c-8332-61567590838d",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
},
{
"id": "a4ed9a5c-95f3-44d5-a66a-cdaeefdd507f",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "7eb2be43-8bc6-49a9-a995-94bd08e22b7e",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "3fb54763-5714-428d-8e95-7d08e2d52839",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "response",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "Successful API response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": -160
}
},
"input_links": [
{
"id": "9b6b8262-34ab-413d-bbde-649d06c7f845",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "3fb54763-5714-428d-8e95-7d08e2d52839",
"source_name": "response",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "2b89e5cc-6ff1-475a-9055-e3f945ea15ec",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "client_error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "HTTP 4xx response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 20
}
},
"input_links": [
{
"id": "a07ab28c-50d5-4e53-a9a7-d7e54fa0390b",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "2b89e5cc-6ff1-475a-9055-e3f945ea15ec",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "a90ec9fe-98b0-471c-8332-61567590838d",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "server_error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "HTTP 5xx response payload.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 200
}
},
"input_links": [
{
"id": "a11e9d5b-babf-4dd1-8668-c357035ef729",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "a90ec9fe-98b0-471c-8332-61567590838d",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
},
{
"id": "7eb2be43-8bc6-49a9-a995-94bd08e22b7e",
"block_id": "363ae599-353e-4804-937e-b2ee3cef3da4",
"input_default": {
"name": "error",
"title": null,
"value": null,
"format": "",
"secret": false,
"advanced": false,
"description": "Transport/runtime error output.",
"escape_html": false
},
"metadata": {
"position": {
"x": 1000,
"y": 380
}
},
"input_links": [
{
"id": "a4ed9a5c-95f3-44d5-a66a-cdaeefdd507f",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "7eb2be43-8bc6-49a9-a995-94bd08e22b7e",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"output_links": [],
"graph_id": "e3737707-749e-4097-842c-97d866d5d10f",
"graph_version": 1,
"webhook_id": null,
"webhook": null
}
],
"links": [
{
"id": "26cc6d13-f9de-4dae-8a76-2184582f2d13",
"source_id": "fb698d17-302b-4317-89e0-d859615d2601",
"sink_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"source_name": "result",
"sink_name": "values_#_api_key",
"is_static": false
},
{
"id": "6beba955-ca4d-4e4b-a20f-b2d44650c2a3",
"source_id": "a621774b-501c-4038-b9b4-b1b8469630ad",
"sink_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"source_name": "result",
"sink_name": "value",
"is_static": false
},
{
"id": "fe76bfbd-ad4f-4687-9de1-b267c07b8738",
"source_id": "7b86835b-656f-495a-ab9d-09102f47dcdb",
"sink_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"source_name": "dictionary",
"sink_name": "values",
"is_static": false
},
{
"id": "b12af31c-40d3-4b65-ac62-bdcb09b82cb1",
"source_id": "e1fe6c6b-f442-4aa7-a9f2-f207d1626f39",
"sink_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"source_name": "output",
"sink_name": "value",
"is_static": false
},
{
"id": "8acd56d9-9478-4d33-ac0c-5f79edd46661",
"source_id": "cf8be562-a21e-4b93-8127-cc1766dc7050",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "headers",
"is_static": false
},
{
"id": "75348d54-5263-4aab-9b77-e6c73b6b833f",
"source_id": "6ff46bca-c71d-453c-aea5-fbbe03677e4c",
"sink_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"source_name": "value",
"sink_name": "body",
"is_static": false
},
{
"id": "9b6b8262-34ab-413d-bbde-649d06c7f845",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "3fb54763-5714-428d-8e95-7d08e2d52839",
"source_name": "response",
"sink_name": "value",
"is_static": false
},
{
"id": "a07ab28c-50d5-4e53-a9a7-d7e54fa0390b",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "2b89e5cc-6ff1-475a-9055-e3f945ea15ec",
"source_name": "client_error",
"sink_name": "value",
"is_static": false
},
{
"id": "a11e9d5b-babf-4dd1-8668-c357035ef729",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "a90ec9fe-98b0-471c-8332-61567590838d",
"source_name": "server_error",
"sink_name": "value",
"is_static": false
},
{
"id": "a4ed9a5c-95f3-44d5-a66a-cdaeefdd507f",
"source_id": "a244b447-019b-4412-a936-1cac3db2ae10",
"sink_id": "7eb2be43-8bc6-49a9-a995-94bd08e22b7e",
"source_name": "error",
"sink_name": "value",
"is_static": false
}
],
"forked_from_id": null,
"forked_from_version": null,
"sub_graphs": [],
"user_id": "",
"created_at": "2026-02-28T12:00:00.000Z",
"input_schema": {
"type": "object",
"properties": {
"API Key": {
"advanced": false,
"anyOf": [
{
"format": "short-text",
"type": "string"
},
{
"type": "null"
}
],
"secret": true,
"title": "API Key",
"description": "Citedy API key (starts with citedy_agent_)",
"default": "citedy_agent_replace_me"
},
"Request JSON": {
"advanced": false,
"anyOf": [
{
"format": "long-text",
"type": "string"
},
{
"type": "null"
}
],
"secret": false,
"title": "Request JSON",
"description": "JSON payload for the selected Citedy endpoint.",
"default": "{\n \"url\": \"https://youtube.com/watch?v=example\"\n}"
}
},
"required": ["API Key", "Request JSON"]
},
"output_schema": {
"type": "object",
"properties": {
"response": {
"title": "response",
"description": "Successful API response payload.",
"type": "object"
},
"client_error": {
"title": "client_error",
"description": "HTTP 4xx response payload.",
"type": "object"
},
"server_error": {
"title": "server_error",
"description": "HTTP 5xx response payload.",
"type": "object"
},
"error": {
"title": "error",
"description": "Transport/runtime error output.",
"type": "string"
}
},
"required": []
},
"has_external_trigger": false,
"has_human_in_the_loop": false,
"trigger_setup_info": null,
"credentials_input_schema": {
"properties": {},
"required": [],
"title": "CitedyTemplateCredentialsInputSchema",
"type": "object"
}
}
{
"version": "3.6.2",
"templates": [
{
"id": "citedy-topic-to-publish",
"file": "citedy-topic-to-publish.agent.json",
"name": "Citedy Topic to Publish",
"description": "Turn any topic into a complete, SEO-optimized article with optional AI illustrations and voice-over — all in one automated step (15-48 credits). Handles research, structure, internal linking, and publishing.",
"endpoint": "https://www.citedy.com/api/agent/autopilot",
"method": "POST"
},
{
"id": "citedy-url-to-publish",
"file": "citedy-url-to-publish.agent.json",
"name": "Citedy URL to Publish",
"description": "Feed one or more source URLs — web articles, competitor pages, research — and get a fresh, SEO-optimized article ready to publish. Repurpose what already works.",
"endpoint": "https://www.citedy.com/api/agent/autopilot",
"method": "POST"
},
{
"id": "citedy-turbo-article",
"file": "citedy-turbo-article.agent.json",
"name": "Citedy Turbo Article",
"description": "Generate a fully optimized SEO article from a single keyword for just 2-4 credits — the fastest, most affordable path from idea to published content. Ideal for high-volume operations.",
"endpoint": "https://www.citedy.com/api/agent/autopilot",
"method": "POST"
},
{
"id": "citedy-scan",
"file": "citedy-scan.agent.json",
"name": "Citedy Trend Scan",
"description": "Run a simultaneous trend scan across X, the open web, HackerNews, and Reddit for 2-8 credits. Get a unified, ranked view of what's gaining momentum right now.",
"endpoint": "https://www.citedy.com/api/agent/scan",
"method": "POST"
},
{
"id": "citedy-trend-scout-x",
"file": "citedy-trend-to-publish.agent.json",
"name": "Citedy Trend Scout (X)",
"description": "Monitor X (Twitter) in real time and surface trending discussions most relevant to your niche, returned as a ranked list of publishable topic opportunities.",
"endpoint": "https://www.citedy.com/api/agent/scout/x",
"method": "POST"
},
{
"id": "citedy-trend-scout-reddit",
"file": "citedy-reddit-to-publish.agent.json",
"name": "Citedy Trend Scout (Reddit)",
"description": "Scan Reddit communities for rising conversations and extract high-value content opportunities your audience is already searching for.",
"endpoint": "https://www.citedy.com/api/agent/scout/reddit",
"method": "POST"
},
{
"id": "citedy-gap-generator",
"file": "citedy-gap-to-publish.agent.json",
"name": "Citedy Gap Generator",
"description": "Analyze competitors and surface content gaps where they earn traffic and you don't (~40 credits). Get a prioritized list of topics with genuine ranking potential. Optional `favorite_id` (uuid) scopes the run to a specific product/identity (owner-checked).",
"endpoint": "https://www.citedy.com/api/agent/gaps/generate",
"method": "POST"
},
{
"id": "citedy-micro-post",
"file": "citedy-micro-post.agent.json",
"name": "Citedy Micro-Post",
"description": "Generate concise, platform-native social posts from any topic or article in seconds — optimized for engagement on X, LinkedIn, and beyond.",
"endpoint": "https://www.citedy.com/api/agent/post",
"method": "POST"
},
{
"id": "citedy-lead-magnet",
"file": "citedy-lead-magnet.agent.json",
"name": "Citedy Lead Magnet",
"description": "Produce downloadable PDF lead magnets — checklists, swipe files, or strategic frameworks — from any topic (30-100 credits). Ready to gate behind a signup form.",
"endpoint": "https://www.citedy.com/api/agent/lead-magnets",
"method": "POST"
},
{
"id": "citedy-ingest",
"file": "citedy-ingest.agent.json",
"name": "Citedy Content Ingestion",
"description": "Feed any URL — YouTube video, web article, PDF, or audio file — and receive clean, structured content extracted and ready for repurposing (1-55 credits).",
"endpoint": "https://www.citedy.com/api/agent/ingest",
"method": "POST"
}
]
}
AutoGPT Templates
Files (19 templates)
Article Generation
1. citedy-topic-to-publish.agent.json — standard article from topic 2. citedy-url-to-publish.agent.json — standard article from source URLs 3. citedy-turbo-article.agent.json — turbo/turbo+ article (2-4 credits)
Trend Discovery
4. citedy-trend-to-publish.agent.json — X/Twitter scout 5. citedy-reddit-to-publish.agent.json — Reddit scout 6. citedy-scout-to-publish.agent.json — extended scout preset 7. citedy-scan.agent.json — fast multi-source scan
Social & Publishing
8. citedy-micro-post.agent.json — micro social post 9. citedy-publish.agent.json — publish/schedule adaptation
Content Ingestion
10. citedy-ingest.agent.json — URL ingestion (YouTube, article, PDF, audio)
Lead Magnets
11. citedy-lead-magnet.agent.json — PDF lead magnet
Shorts Pipeline
12. citedy-shorts-script.agent.json — speech script (1 credits) 13. citedy-shorts-avatar.agent.json — AI avatar image (3 credits) 14. citedy-shorts-video.agent.json — video segment (60-185 credits) 15. citedy-shorts-merge.agent.json — merge + subtitles (5 credits)
Automation & Integration
16. citedy-session-manager.agent.json — recurring session 17. citedy-gap-to-publish.agent.json — competitor gaps 18. citedy-webhook-register.agent.json — webhook endpoint 19. citedy-product-upload.agent.json — product knowledge
Input Contract
Each template requires:
API Key(string, secret): Citedy API key withcitedy_agent_prefixRequest JSON(string): valid JSON payload for template endpoint
Output Contract
response— 2xx successclient_error— 4xx errorserver_error— 5xx errorerror— transport/runtime error
Changelog
3.0.0 - 2026-02-28
Added
- 12 new importable templates (19 total):
citedy-turbo-article— ultra-cheap turbo article (2-4 credits)citedy-scan— fast multi-source trend scan (2-8 credits)citedy-micro-post— micro social post creationcitedy-publish— publish/schedule social adaptationscitedy-ingest— content ingestion (YouTube, article, PDF, audio)citedy-lead-magnet— PDF lead magnet generation (30-100 credits)citedy-shorts-script— speech script for shorts (1 credit)citedy-shorts-avatar— AI avatar image (3 credits)citedy-shorts-video— AI UGC viral video segment (60-185 credits)citedy-shorts-merge— merge segments with subtitles (5 credits)citedy-webhook-register— register webhook endpointcitedy-product-upload— upload product knowledge (1 credit)actions.jsonexpanded from 11 to 48 endpoint definitions with cost info- All endpoints now include
costfield for credit pricing - New action categories: scan, post, publish, settings, schedule, image-style, personas, products, ingest, lead-magnets, shorts, webhooks, rotate-key, health
Changed
- Bumped version to 3.0.0 in
actions.jsonandmanifest.json - Updated
citedy-topic-to-publishdefault payload: addedmode,persona,disable_competitionfields, changed default size fromminitostandard - Updated
citedy-url-to-publishdefault payload: same field additions - Updated
README.mdandQUICKSTART.mdwith all 19 templates and pricing reference - Updated
agents/README.mdwith full template listing
Compatibility
- Existing 7 templates remain compatible (additive field changes only)
- API contracts unchanged — new templates call new v3.0.0 endpoints
1.0.0 - 2026-02-14
Added
- Rebuilt AutoGPT integration package from scratch under
autogpt/. - Added 7 importable templates:
citedy-topic-to-publishcitedy-url-to-publishcitedy-trend-to-publishcitedy-reddit-to-publishcitedy-gap-to-publishcitedy-session-managercitedy-scout-to-publish- Added
actions.jsonwith endpoint/action reference and template index. - Added
validate-templates.mjsfor static graph integrity checks. - Added AutoGPT docs:
README.md,QUICKSTART.md,agents/README.md. - Added release draft text:
GITHUB_RELEASE_v1.0.0.md.
Changed
- Updated
SKILL.mdfrontmatter with requirednamefor TinyClaw-friendly skill metadata. - Updated public package README with TinyClaw install and AutoGPT quickstart.
Compatibility
- Existing Citedy API functionality unchanged.
- Existing skill workflow unchanged.
- New assets are additive and isolated to package/docs/templates.
#!/usr/bin/env node
/**
* Deploy Citedy agents to AutoGPT Platform via External API.
*
* Usage:
* AUTOGPT_API_KEY=agpt_... node deploy-to-autogpt.mjs
*
* Creates each agent as a connected graph:
* Input → SendWebRequest → Output
*
* Node IDs use placeholders that the server remaps via reassign_ids().
*/
import { readFileSync } from "fs";
import { dirname, join } from "path";
import { fileURLToPath } from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const AUTOGPT_API_KEY = process.env.AUTOGPT_API_KEY;
if (!AUTOGPT_API_KEY) {
console.error("Error: Set AUTOGPT_API_KEY env variable");
process.exit(1);
}
const BASE_URL = "https://backend.agpt.co/external-api/v1";
// Block IDs from AutoGPT Platform (stable across deployments)
const BLOCKS = {
INPUT: "c0a8e994-ebf1-4a9c-a4d8-89d09c86741b",
OUTPUT: "363ae599-353e-4804-937e-b2ee3cef3da4",
WEB_REQUEST: "6595ae1f-b924-42cb-9a41-551a0611c4b4",
};
const manifest = JSON.parse(
readFileSync(join(__dirname, "agents", "manifest.json"), "utf-8"),
);
function loadAgentTemplate(file) {
try {
return JSON.parse(readFileSync(join(__dirname, "agents", file), "utf-8"));
} catch {
return null;
}
}
/**
* Build a fully-wired graph for one agent.
* Uses placeholder node IDs — server reassigns them and remaps links.
*/
function buildGraph(entry) {
const template = loadAgentTemplate(entry.file);
const inputNodeId = "aaaaaaaa-0001-0001-0001-000000000001";
const webNodeId = "aaaaaaaa-0002-0002-0002-000000000002";
const outputNodeId = "aaaaaaaa-0003-0003-0003-000000000003";
const inputNode = {
id: inputNodeId,
block_id: BLOCKS.INPUT,
input_default: {
name: "input",
title: "Input",
description: "Request payload (JSON) for " + entry.name,
},
metadata: { position: { x: -200, y: 0 } },
};
const webRequestNode = {
id: webNodeId,
block_id: BLOCKS.WEB_REQUEST,
input_default: {
url: entry.endpoint,
method: entry.method || "POST",
headers: { "Content-Type": "application/json" },
body: template?.input?.body_template || {},
},
metadata: { position: { x: 200, y: 0 } },
};
const outputNode = {
id: outputNodeId,
block_id: BLOCKS.OUTPUT,
input_default: {
name: "result",
title: "Result",
description: "API response from Citedy",
},
metadata: { position: { x: 600, y: 0 } },
};
// Wire: Input.result → WebRequest.body, WebRequest.response → Output.value
const links = [
{
id: "bbbbbbbb-0001-0001-0001-000000000001",
source_id: inputNodeId,
sink_id: webNodeId,
source_name: "result",
sink_name: "body",
is_static: false,
},
{
id: "bbbbbbbb-0002-0002-0002-000000000002",
source_id: webNodeId,
sink_id: outputNodeId,
source_name: "response",
sink_name: "value",
is_static: false,
},
];
return {
name: entry.name,
description: entry.description + " | Citedy AI SEO Platform (citedy.com)",
nodes: [inputNode, webRequestNode, outputNode],
links,
};
}
async function createGraph(graph) {
const resp = await fetch(`${BASE_URL}/graphs`, {
method: "POST",
headers: {
"X-API-Key": AUTOGPT_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify(graph),
});
if (!resp.ok) {
const text = await resp.text();
throw new Error(`${resp.status}: ${text}`);
}
return resp.json();
}
async function main() {
const skipNames = process.argv.includes("--skip")
? new Set(process.argv[process.argv.indexOf("--skip") + 1]?.split(","))
: new Set();
console.log(
`\nDeploying ${manifest.templates.length} Citedy agents to AutoGPT Platform...\n`,
);
const results = [];
for (const entry of manifest.templates) {
if (skipNames.has(entry.id)) {
console.log(`⏭ Skipping: ${entry.name}`);
continue;
}
try {
const graph = buildGraph(entry);
const created = await createGraph(graph);
const linkCount = created.links?.length ?? 0;
console.log(
`✅ ${entry.name} → ${created.id} (${created.nodes?.length} nodes, ${linkCount} links)`,
);
results.push({
id: entry.id,
graphId: created.id,
name: entry.name,
status: "created",
});
} catch (err) {
console.error(`❌ ${entry.name}: ${err.message}`);
results.push({
id: entry.id,
name: entry.name,
status: "error",
error: err.message,
});
}
}
console.log(`\n--- Summary ---`);
console.log(
`Created: ${results.filter((r) => r.status === "created").length}`,
);
console.log(`Errors: ${results.filter((r) => r.status === "error").length}`);
console.log(`\nGraph IDs:`);
results
.filter((r) => r.graphId)
.forEach((r) => console.log(` ${r.name}: ${r.graphId}`));
}
main().catch(console.error);
Release v1.0.0 - Citedy SEO Agent AutoGPT + TinyClaw Support
Why this release
This release restores and ships a complete integration package so AutoGPT and TinyClaw owners can start with Citedy API quickly, without changing the existing Citedy backend functionality.
Included
- TinyClaw-ready
SKILL.mdmetadata (namein frontmatter) - AutoGPT templates in
autogpt/agents/: citedy-topic-to-publish.agent.jsoncitedy-url-to-publish.agent.jsoncitedy-trend-to-publish.agent.jsoncitedy-reddit-to-publish.agent.jsoncitedy-gap-to-publish.agent.jsoncitedy-session-manager.agent.jsoncitedy-scout-to-publish.agent.json- Action/reference catalog:
autogpt/actions.json - Operator docs:
autogpt/README.mdautogpt/QUICKSTART.mdautogpt/agents/README.md- Validation tool:
autogpt/validate-templates.mjs
Quick start for AutoGPT owners
1. Import any template from autogpt/agents/*.agent.json. 2. Run with:
API Key=citedy_agent_...Request JSON= endpoint payload
3. Read outputs: response, client_error, server_error, error.
Quick start for TinyClaw owners
1. Copy skill file to TinyClaw install skills directory:
mkdir -p ~/tinyclaw/.agents/skills/citedy-seo-agent
cp /absolute/path/to/citedy-seo-agent/SKILL.md ~/tinyclaw/.agents/skills/citedy-seo-agent/SKILL.md2. Restart TinyClaw:
tinyclaw restartNotes
- This release is additive and does not modify Citedy API contracts.
- For async endpoints (
scout,ingest,shorts,leadmagnet,brand.scan), use status polling endpoints fromactions.json.
Content Writer
Generates SEO-optimized articles and distributes them across social platforms.
Responsibilities
- Generate articles from topics, URLs, or ingested content (mini to pillar size)
- Add AI illustrations and voice-over narration
- Create social media adaptations for 9 platforms
- Publish and schedule content across connected accounts
- Ingest YouTube videos, web articles, PDFs, and audio into structured content
Key Workflows
1. Topic → Article — POST /api/agent/autopilot with topic → full SEO article 2. URL → Article — POST /api/agent/autopilot with source_urls → article from reference 3. Ingest → Research — POST /api/agent/ingest → extract content → use as research 4. Article → Social — POST /api/agent/adapt → adaptations for X, LinkedIn, Facebook, Reddit, Instagram, etc. 5. Publish — POST /api/agent/publish → immediate or scheduled publishing
GSC Analyst
Monitors Google Search Console performance and identifies content opportunities.
Responsibilities
- Pull daily GSC performance reports (clicks, impressions, CTR, positions)
- Identify top queries and pages driving traffic
- Track position movers (gainers and losers)
- Discover content opportunities from high-impression, low-CTR keywords
- Suggest article topics based on search data
- Provide the morning briefing with actionable next steps
Key Workflows
1. Morning Report — GET /api/agent/gsc/report → daily cached report (0 credits) 2. Fresh Data — GET /api/agent/gsc/report?force_refresh=true → live GSC pull 3. Report → Article — pick keyword from articleSuggestions → POST /api/agent/autopilot 4. Full Pipeline — GSC report → autopilot → adapt → social.publish
../skills{
"$schema": "https://glama.ai/mcp/schemas/server.json",
"maintainers": ["nttylock", "Citedy"]
}