Schedule an article
curl -X POST https://api.xholic.ai/v1/articles/schedule \ -H "Authorization: Bearer $XHOLIC_API_KEY" \ -H "Content-Type: application/json" \ -d '{"id":"<id>","scheduledAt":"2026-11-03T09:00","timezone":"America/New_York","version":1,"dryRun":true,"idempotencyKey":"my-unique-key-1"}'xholic articles schedule --id '<id>' --scheduled-at '2026-11-03T09:00' --timezone 'America/New_York' --version 1 --dry-run --idempotency-key 'my-unique-key-1'{ "name": "schedule_article", "arguments": { "id": "<id>", "scheduledAt": "2026-11-03T09:00", "timezone": "America/New_York", "version": 1, "dryRun": true, "idempotencyKey": "my-unique-key-1" }}const response = await fetch("https://api.xholic.ai/v1/articles/schedule", { method: "POST", headers: { Authorization: `Bearer ${process.env.XHOLIC_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ "id": "<id>", "scheduledAt": "2026-11-03T09:00", "timezone": "America/New_York", "version": 1, "dryRun": true, "idempotencyKey": "my-unique-key-1" }),});const result = await response.json();console.log(result.summary);import axios from "axios";
const { data } = await axios.post( "https://api.xholic.ai/v1/articles/schedule", { "id": "<id>", "scheduledAt": "2026-11-03T09:00", "timezone": "America/New_York", "version": 1, "dryRun": true, "idempotencyKey": "my-unique-key-1" }, { headers: { Authorization: `Bearer ${process.env.XHOLIC_API_KEY}` } },);console.log(data.summary);import osimport requests
response = requests.post( "https://api.xholic.ai/v1/articles/schedule", headers={"Authorization": f"Bearer {os.environ['XHOLIC_API_KEY']}"}, json={ "id": "<id>", "scheduledAt": "2026-11-03T09:00", "timezone": "America/New_York", "version": 1, "dryRun": True, "idempotencyKey": "my-unique-key-1" },)print(response.json()["summary"])package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { body := strings.NewReader(`{"id":"<id>","scheduledAt":"2026-11-03T09:00","timezone":"America/New_York","version":1,"dryRun":true,"idempotencyKey":"my-unique-key-1"}`) req, _ := http.NewRequest("POST", "https://api.xholic.ai/v1/articles/schedule", body) req.Header.Set("Authorization", "Bearer "+os.Getenv("XHOLIC_API_KEY")) req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() out, _ := io.ReadAll(res.Body) fmt.Println(string(out))}<?php$ch = curl_init("https://api.xholic.ai/v1/articles/schedule");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . getenv('XHOLIC_API_KEY'), 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => '{"id":"<id>","scheduledAt":"2026-11-03T09:00","timezone":"America/New_York","version":1,"dryRun":true,"idempotencyKey":"my-unique-key-1"}',]);$result = json_decode(curl_exec($ch), true);echo $result['summary'];require "net/http"require "json"
uri = URI("https://api.xholic.ai/v1/articles/schedule")req = Net::HTTP::Post.new(uri, "Content-Type" => "application/json")req["Authorization"] = "Bearer #{ENV.fetch("XHOLIC_API_KEY")}"req.body = '{"id":"<id>","scheduledAt":"2026-11-03T09:00","timezone":"America/New_York","version":1,"dryRun":true,"idempotencyKey":"my-unique-key-1"}'res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }puts JSON.parse(res.body)["summary"]Schedule an article to publish on X at a time. Pass the current version from articles.get. Call it only when the user asked for this in the conversation; never on your own initiative. Spends a post credit when it goes live.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Article id from articles.list.
When to publish, as an ISO time with offset such as 2026-10-25T10:00:00-04:00.
IANA timezone such as America/New_York. Use the user’s timezone.
The article’s current version, from articles.get. A stale version is refused so edits never overwrite each other.
X account to act on, as @handle. Leave it out to use the connection’s default account.
Return exactly what would happen without doing it.
A unique key for this write. Repeating a call with the same key returns the first result instead of acting twice.
Example
{ "id": "<id>", "scheduledAt": "2026-11-03T09:00", "timezone": "America/New_York", "version": 1, "dryRun": true, "idempotencyKey": "my-unique-key-1"}Responses
Section titled “Responses”Success
object
One or two readable sentences about the result.
The result. Its shape depends on the action.
object
Example
{ "ok": true}default
Section titled “default”Error
object
object
Example
{ "ok": false, "error": { "code": "UNAUTHENTICATED", "scope": "account" }}