curl --request POST \
--url https://api.radarkit.ai/v1/projects/{project}/content/articles \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt_id": 2048,
"keyword": "best crm for startups"
}
'import requests
url = "https://api.radarkit.ai/v1/projects/{project}/content/articles"
payload = {
"prompt_id": 2048,
"keyword": "best crm for startups"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({prompt_id: 2048, keyword: 'best crm for startups'})
};
fetch('https://api.radarkit.ai/v1/projects/{project}/content/articles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"id": 551,
"project": "64f1a2b3c4d5e6f708192a3b",
"status": "processing",
"current_step": "creating",
"error": null,
"retryable": false,
"prompt": {
"id": 2048
},
"article": {
"id": 812,
"title": null,
"keyword": "best crm for startups",
"article_type": "comparison",
"write_mode": "ai",
"status": "draft",
"crawl_status": "pending",
"outline_status": "pending",
"word_count": null,
"scores": {
"radarkit": null,
"seo": null,
"geo": null,
"readability": null
},
"editor_url": "https://radarkit.ai/dashboard/64f1a2b3c4d5e6f708192a3b/content/812",
"created_at": "2026-09-03T10:30:00+00:00",
"updated_at": "2026-09-03T10:30:00+00:00"
},
"started_at": "2026-09-03T10:30:00+00:00",
"completed_at": null
},
"meta": {
"project": "64f1a2b3c4d5e6f708192a3b",
"reused": false,
"ai_content_credits_remaining": 19,
"next_step": "Poll GET /v1/content/runs/{id} until status is completed, then open editor_url or fetch the body with include=body."
},
"credits": {
"charged": 1,
"remaining": 2941
},
"request_id": "req_01j9x519n0o1p2q3r4s5t6u7v8"
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Missing or invalid API key. Send it as: Authorization: Bearer rk_live_YOUR_KEY"
},
"request_id": "req_01j9x4q7z8y9x0w1v2u3t4s5r6"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Slow down and retry.",
"details": {
"retry_after": 21
}
},
"request_id": "req_01j9x4r2s3t4u5v6w7x8y9z0a1"
}Create article
Has the Content agent write an article for one of your prompts. The agent reads the pages AI models cite for that prompt, builds an outline and writes in your brand’s voice. The draft lands in your editor. Writing takes a few minutes, so keep the run id and poll Get article run.
If an article for the same prompt, type and keyword is already being written or is done, you get that run back with meta.reused: true and no content credit is spent. Send force: true to write another.
Articles started here appear in the project’s Agents section on a sheet named API.
Cost: 1 API credit plus 1 AI content credit from the project owner. Nothing is charged when the request is refused.
Limits: 10 calls per minute per key.
Needs: Agents. Your seat must be allowed to manage content.
curl --request POST \
--url https://api.radarkit.ai/v1/projects/{project}/content/articles \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt_id": 2048,
"keyword": "best crm for startups"
}
'import requests
url = "https://api.radarkit.ai/v1/projects/{project}/content/articles"
payload = {
"prompt_id": 2048,
"keyword": "best crm for startups"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({prompt_id: 2048, keyword: 'best crm for startups'})
};
fetch('https://api.radarkit.ai/v1/projects/{project}/content/articles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"id": 551,
"project": "64f1a2b3c4d5e6f708192a3b",
"status": "processing",
"current_step": "creating",
"error": null,
"retryable": false,
"prompt": {
"id": 2048
},
"article": {
"id": 812,
"title": null,
"keyword": "best crm for startups",
"article_type": "comparison",
"write_mode": "ai",
"status": "draft",
"crawl_status": "pending",
"outline_status": "pending",
"word_count": null,
"scores": {
"radarkit": null,
"seo": null,
"geo": null,
"readability": null
},
"editor_url": "https://radarkit.ai/dashboard/64f1a2b3c4d5e6f708192a3b/content/812",
"created_at": "2026-09-03T10:30:00+00:00",
"updated_at": "2026-09-03T10:30:00+00:00"
},
"started_at": "2026-09-03T10:30:00+00:00",
"completed_at": null
},
"meta": {
"project": "64f1a2b3c4d5e6f708192a3b",
"reused": false,
"ai_content_credits_remaining": 19,
"next_step": "Poll GET /v1/content/runs/{id} until status is completed, then open editor_url or fetch the body with include=body."
},
"credits": {
"charged": 1,
"remaining": 2941
},
"request_id": "req_01j9x519n0o1p2q3r4s5t6u7v8"
}{
"error": {
"code": "UNAUTHENTICATED",
"message": "Missing or invalid API key. Send it as: Authorization: Bearer rk_live_YOUR_KEY"
},
"request_id": "req_01j9x4q7z8y9x0w1v2u3t4s5r6"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "<string>",
"message": "<string>",
"details": {}
},
"request_id": "req_01j9x4m2p7q8r9s0t1u2v3w4x5"
}{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Slow down and retry.",
"details": {
"retry_after": 21
}
},
"request_id": "req_01j9x4r2s3t4u5v6w7x8y9z0a1"
}Authorizations
Your API key. Create one in Settings, API keys. Send it as Authorization: Bearer rk_live_YOUR_KEY.
Path Parameters
The project id. 24 characters. From List projects.
^[0-9a-f]{24}$Body
The prompt the article targets.
The keyword the article should rank for, as in the Create Content dialog.
255The article format. Default is the format the cited pages use most.
blog_post, listicle, comparison, alternatives, faq, first_person_review Two-letter country the article should rank in; drives the SERP research. Default is the project region.
2Language of the SERP research and of the article. Default is English.
en, da, de, es, fr, it, pt, nl, pl, ru Instructions for the writer.
1500Write a new article even if one for the same prompt, type and keyword exists.
Name of the content sheet the article row goes on, under Agents → Sheets. Default is the project's "API" sheet. A sheet holds 50 rows; a full one rolls over to "Name 2" and meta.sheet tells you where the row landed.
80Response
The run has started.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
What this call cost and what is left. Also in the X-RadarKit-Credits-Charged and X-RadarKit-Credits-Remaining headers.
Show child attributes
Show child attributes
A unique id for this call. Also in the X-Request-Id header. Quote it when you contact support.
"req_01j9x4m2p7q8r9s0t1u2v3w4x5"