Generate an AI video plan from trend signals
curl --request POST \
--url https://api.video2ctx.dev/v1/trends/plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report": {
"provider": "youtube",
"query": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"sampleSize": 1,
"methodologyVersion": "<unknown>",
"methodology": "<string>",
"sample": {
"candidateVideos": 1,
"enrichedVideos": 1,
"channels": 1,
"observedVideos": 1
},
"confidence": {
"score": 50,
"reasons": [
"<string>"
]
},
"summary": {
"totalViews": 1,
"medianViewsPerHour": 1,
"publishedLast7Days": 1,
"breakoutCount": 1,
"acceleratingCount": 1,
"medianObservedViewsPerHour": 1
},
"videos": [
{
"id": "<string>",
"title": "<string>",
"channel": {
"id": "<string>",
"name": "<string>"
},
"thumbnails": [
{
"url": "<string>",
"width": 1,
"height": 1
}
],
"description": "<string>",
"viewCount": 1,
"confidenceScore": 50,
"hashtags": [
"<string>"
],
"keywords": [
"<string>"
],
"trendScore": 50,
"url": "<string>",
"durationSeconds": 1,
"publishedTimeText": "<string>",
"publishDate": "<string>",
"ageHours": 1,
"viewsPerHour": 1,
"observedViewsPerHour": 1,
"previousViewsPerHour": 1,
"accelerationPercent": 123,
"observationHours": 1,
"viewDelta": 1,
"likeDelta": 1,
"commentDelta": 1,
"commentCount": 1,
"likeCount": 1,
"engagementRate": 1,
"channelBaselineViewsPerHour": 1,
"channelLift": 1,
"searchRank": 2
}
],
"hashtags": [
{}
],
"titlePatterns": [
{}
],
"durationMix": [
{}
],
"plan": {},
"warnings": [
"<string>"
],
"insights": {}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
report: {
provider: 'youtube',
query: '<string>',
generatedAt: '2023-11-07T05:31:56Z',
sampleSize: 1,
methodologyVersion: '<unknown>',
methodology: '<string>',
sample: {candidateVideos: 1, enrichedVideos: 1, channels: 1, observedVideos: 1},
confidence: {score: 50, reasons: ['<string>']},
summary: {
totalViews: 1,
medianViewsPerHour: 1,
publishedLast7Days: 1,
breakoutCount: 1,
acceleratingCount: 1,
medianObservedViewsPerHour: 1
},
videos: [
{
id: '<string>',
title: '<string>',
channel: {id: '<string>', name: '<string>'},
thumbnails: [{url: '<string>', width: 1, height: 1}],
description: '<string>',
viewCount: 1,
confidenceScore: 50,
hashtags: ['<string>'],
keywords: ['<string>'],
trendScore: 50,
url: '<string>',
durationSeconds: 1,
publishedTimeText: '<string>',
publishDate: '<string>',
ageHours: 1,
viewsPerHour: 1,
observedViewsPerHour: 1,
previousViewsPerHour: 1,
accelerationPercent: 123,
observationHours: 1,
viewDelta: 1,
likeDelta: 1,
commentDelta: 1,
commentCount: 1,
likeCount: 1,
engagementRate: 1,
channelBaselineViewsPerHour: 1,
channelLift: 1,
searchRank: 2
}
],
hashtags: [{}],
titlePatterns: [{}],
durationMix: [{}],
plan: {},
warnings: ['<string>'],
insights: {}
}
})
};
fetch('https://api.video2ctx.dev/v1/trends/plan', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.video2ctx.dev/v1/trends/plan"
payload = { "report": {
"provider": "youtube",
"query": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"sampleSize": 1,
"methodologyVersion": "<unknown>",
"methodology": "<string>",
"sample": {
"candidateVideos": 1,
"enrichedVideos": 1,
"channels": 1,
"observedVideos": 1
},
"confidence": {
"score": 50,
"reasons": ["<string>"]
},
"summary": {
"totalViews": 1,
"medianViewsPerHour": 1,
"publishedLast7Days": 1,
"breakoutCount": 1,
"acceleratingCount": 1,
"medianObservedViewsPerHour": 1
},
"videos": [
{
"id": "<string>",
"title": "<string>",
"channel": {
"id": "<string>",
"name": "<string>"
},
"thumbnails": [
{
"url": "<string>",
"width": 1,
"height": 1
}
],
"description": "<string>",
"viewCount": 1,
"confidenceScore": 50,
"hashtags": ["<string>"],
"keywords": ["<string>"],
"trendScore": 50,
"url": "<string>",
"durationSeconds": 1,
"publishedTimeText": "<string>",
"publishDate": "<string>",
"ageHours": 1,
"viewsPerHour": 1,
"observedViewsPerHour": 1,
"previousViewsPerHour": 1,
"accelerationPercent": 123,
"observationHours": 1,
"viewDelta": 1,
"likeDelta": 1,
"commentDelta": 1,
"commentCount": 1,
"likeCount": 1,
"engagementRate": 1,
"channelBaselineViewsPerHour": 1,
"channelLift": 1,
"searchRank": 2
}
],
"hashtags": [{}],
"titlePatterns": [{}],
"durationMix": [{}],
"plan": {},
"warnings": ["<string>"],
"insights": {}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"provider": "youtube",
"generatedAt": "2023-11-07T05:31:56Z",
"angle": "<string>",
"audience": "<string>",
"hook": "<string>",
"recommendedDurationSeconds": 123,
"outline": [
{
"section": "<string>",
"goal": "<string>"
}
],
"titleIdeas": [
"<string>"
],
"hashtags": [
"<string>"
],
"differentiation": [
"<string>"
],
"evidence": [
{
"claim": "<string>",
"videoIds": [
"<string>"
]
}
],
"caveats": [
"<string>"
],
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}Discovery
Generate an AI video plan from trend signals
Uses Kimi K2.6 for strategic synthesis and automatically falls back to GPT-OSS 120B when Kimi is unavailable. The response identifies the model that produced it.
POST
/
v1
/
trends
/
plan
Generate an AI video plan from trend signals
curl --request POST \
--url https://api.video2ctx.dev/v1/trends/plan \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"report": {
"provider": "youtube",
"query": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"sampleSize": 1,
"methodologyVersion": "<unknown>",
"methodology": "<string>",
"sample": {
"candidateVideos": 1,
"enrichedVideos": 1,
"channels": 1,
"observedVideos": 1
},
"confidence": {
"score": 50,
"reasons": [
"<string>"
]
},
"summary": {
"totalViews": 1,
"medianViewsPerHour": 1,
"publishedLast7Days": 1,
"breakoutCount": 1,
"acceleratingCount": 1,
"medianObservedViewsPerHour": 1
},
"videos": [
{
"id": "<string>",
"title": "<string>",
"channel": {
"id": "<string>",
"name": "<string>"
},
"thumbnails": [
{
"url": "<string>",
"width": 1,
"height": 1
}
],
"description": "<string>",
"viewCount": 1,
"confidenceScore": 50,
"hashtags": [
"<string>"
],
"keywords": [
"<string>"
],
"trendScore": 50,
"url": "<string>",
"durationSeconds": 1,
"publishedTimeText": "<string>",
"publishDate": "<string>",
"ageHours": 1,
"viewsPerHour": 1,
"observedViewsPerHour": 1,
"previousViewsPerHour": 1,
"accelerationPercent": 123,
"observationHours": 1,
"viewDelta": 1,
"likeDelta": 1,
"commentDelta": 1,
"commentCount": 1,
"likeCount": 1,
"engagementRate": 1,
"channelBaselineViewsPerHour": 1,
"channelLift": 1,
"searchRank": 2
}
],
"hashtags": [
{}
],
"titlePatterns": [
{}
],
"durationMix": [
{}
],
"plan": {},
"warnings": [
"<string>"
],
"insights": {}
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
report: {
provider: 'youtube',
query: '<string>',
generatedAt: '2023-11-07T05:31:56Z',
sampleSize: 1,
methodologyVersion: '<unknown>',
methodology: '<string>',
sample: {candidateVideos: 1, enrichedVideos: 1, channels: 1, observedVideos: 1},
confidence: {score: 50, reasons: ['<string>']},
summary: {
totalViews: 1,
medianViewsPerHour: 1,
publishedLast7Days: 1,
breakoutCount: 1,
acceleratingCount: 1,
medianObservedViewsPerHour: 1
},
videos: [
{
id: '<string>',
title: '<string>',
channel: {id: '<string>', name: '<string>'},
thumbnails: [{url: '<string>', width: 1, height: 1}],
description: '<string>',
viewCount: 1,
confidenceScore: 50,
hashtags: ['<string>'],
keywords: ['<string>'],
trendScore: 50,
url: '<string>',
durationSeconds: 1,
publishedTimeText: '<string>',
publishDate: '<string>',
ageHours: 1,
viewsPerHour: 1,
observedViewsPerHour: 1,
previousViewsPerHour: 1,
accelerationPercent: 123,
observationHours: 1,
viewDelta: 1,
likeDelta: 1,
commentDelta: 1,
commentCount: 1,
likeCount: 1,
engagementRate: 1,
channelBaselineViewsPerHour: 1,
channelLift: 1,
searchRank: 2
}
],
hashtags: [{}],
titlePatterns: [{}],
durationMix: [{}],
plan: {},
warnings: ['<string>'],
insights: {}
}
})
};
fetch('https://api.video2ctx.dev/v1/trends/plan', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.video2ctx.dev/v1/trends/plan"
payload = { "report": {
"provider": "youtube",
"query": "<string>",
"generatedAt": "2023-11-07T05:31:56Z",
"sampleSize": 1,
"methodologyVersion": "<unknown>",
"methodology": "<string>",
"sample": {
"candidateVideos": 1,
"enrichedVideos": 1,
"channels": 1,
"observedVideos": 1
},
"confidence": {
"score": 50,
"reasons": ["<string>"]
},
"summary": {
"totalViews": 1,
"medianViewsPerHour": 1,
"publishedLast7Days": 1,
"breakoutCount": 1,
"acceleratingCount": 1,
"medianObservedViewsPerHour": 1
},
"videos": [
{
"id": "<string>",
"title": "<string>",
"channel": {
"id": "<string>",
"name": "<string>"
},
"thumbnails": [
{
"url": "<string>",
"width": 1,
"height": 1
}
],
"description": "<string>",
"viewCount": 1,
"confidenceScore": 50,
"hashtags": ["<string>"],
"keywords": ["<string>"],
"trendScore": 50,
"url": "<string>",
"durationSeconds": 1,
"publishedTimeText": "<string>",
"publishDate": "<string>",
"ageHours": 1,
"viewsPerHour": 1,
"observedViewsPerHour": 1,
"previousViewsPerHour": 1,
"accelerationPercent": 123,
"observationHours": 1,
"viewDelta": 1,
"likeDelta": 1,
"commentDelta": 1,
"commentCount": 1,
"likeCount": 1,
"engagementRate": 1,
"channelBaselineViewsPerHour": 1,
"channelLift": 1,
"searchRank": 2
}
],
"hashtags": [{}],
"titlePatterns": [{}],
"durationMix": [{}],
"plan": {},
"warnings": ["<string>"],
"insights": {}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"provider": "youtube",
"generatedAt": "2023-11-07T05:31:56Z",
"angle": "<string>",
"audience": "<string>",
"hook": "<string>",
"recommendedDurationSeconds": 123,
"outline": [
{
"section": "<string>",
"goal": "<string>"
}
],
"titleIdeas": [
"<string>"
],
"hashtags": [
"<string>"
],
"differentiation": [
"<string>"
],
"evidence": [
{
"claim": "<string>",
"videoIds": [
"<string>"
]
}
],
"caveats": [
"<string>"
],
"operationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}{
"error": {
"code": "QUERY_REQUIRED",
"message": "<string>",
"details": "<unknown>",
"requestId": "<string>"
}
}Authorizations
bearerApiKeysessionCookieapiKeydemoUser
Permanent personal API key created in the dashboard. Example: curl -H "Authorization: Bearer aty_…" https://your-host/v1/projects
Body
application/json
Show child attributes
Show child attributes
Response
Evidence-grounded video plan.
Available options:
youtube Example:
"youtube"
Available options:
@cf/moonshotai/kimi-k2.6, @cf/openai/gpt-oss-120b Show child attributes
Show child attributes
Show child attributes
Show child attributes
⌘I