Documentation Index

Fetch the complete documentation index at: /llms.txt

Use this file to discover all available pages before exploring further.

Skip to main content
POST
/
compose
Build a post draft
curl --request POST \
  --url https://xquik.com/api/v1/compose \
  --header 'Content-Type: <content-type>' \
  --header 'x-api-key: <api-key>' \
  --data '
{
  "step": "<string>",
  "topic": "<string>",
  "goal": "<string>",
  "styleUsername": "<string>",
  "tone": "<string>",
  "mediaType": "<string>",
  "callToAction": "<string>",
  "additionalContext": "<string>",
  "draft": "<string>",
  "hasLink": true,
  "hasMedia": true
}
'
import requests

url = "https://xquik.com/api/v1/compose"

payload = {
"step": "<string>",
"topic": "<string>",
"goal": "<string>",
"styleUsername": "<string>",
"tone": "<string>",
"mediaType": "<string>",
"callToAction": "<string>",
"additionalContext": "<string>",
"draft": "<string>",
"hasLink": True,
"hasMedia": True
}
headers = {
"Content-Type": "<content-type>",
"x-api-key": "<api-key>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'Content-Type': '<content-type>', 'x-api-key': '<api-key>'},
body: JSON.stringify({
step: '<string>',
topic: '<string>',
goal: '<string>',
styleUsername: '<string>',
tone: '<string>',
mediaType: '<string>',
callToAction: '<string>',
additionalContext: '<string>',
draft: '<string>',
hasLink: true,
hasMedia: true
})
};

fetch('https://xquik.com/api/v1/compose', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://xquik.com/api/v1/compose"

payload := strings.NewReader("{\n \"step\": \"<string>\",\n \"topic\": \"<string>\",\n \"goal\": \"<string>\",\n \"styleUsername\": \"<string>\",\n \"tone\": \"<string>\",\n \"mediaType\": \"<string>\",\n \"callToAction\": \"<string>\",\n \"additionalContext\": \"<string>\",\n \"draft\": \"<string>\",\n \"hasLink\": true,\n \"hasMedia\": true\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("x-api-key", "<api-key>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
Free. This endpoint does not consume credits.
Use 3 Compose calls. The endpoint returns guidance and checks. It does not write or publish the final post.

Workflow

  1. Call compose with a topic.
  2. If fresh context helps, fetch one suggested radarRecommendations endpoint.
  3. Pass selected facts to refine with the topic, goal, and tone.
  4. Write a draft. Call score with the full text.
The guidance uses Xquik editorial heuristics. It does not predict reach. X does not publish its production ranking weights.

Requests

  • 1. Compose
  • 2. Refine
  • 3. Score
Returns 18 editorial rules, 4 follow-up questions, and 7 source-specific Radar recommendations.
curl https://xquik.com/api/v1/compose \
  -X POST \
  -H "x-api-key: xq_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "step": "compose",
    "topic": "PostgreSQL query planning",
    "goal": "authority"
  }'
Required fields: step, topic.Optional fields:
  • goal: engagement, followers, authority, or conversation. Defaults to engagement.
  • styleUsername: Username from a saved style analysis.

Headers

Send either an API key or an authenticated session cookie.
string
Full account API key. An authenticated session cookie also works.
string
required
Use application/json.

Body

string
required
Use compose, refine, or score.
string
Required for compose and refine.
string
Required for refine. Optional for compose.
string
Saved style username for compose.
string
Required for refine.
string
Optional photo, video, or none value for refine.
string
Optional requested action for refine.
string
Optional audience, constraint, or source context for refine. Include selected facts from a recommended Radar endpoint when current context helps.
string
Required full post text for score.
Set true when a separate link card is attached during score.
boolean
Deprecated compatibility field. Text checks ignore it.

Response

  • 200 OK
The response shape matches the requested workflow step.

Compose Response

object[]
required
18 Xquik editorial rules. Each item has rule.
string[]
required
4 questions for the next writing step.
object[]
required
7 source-specific suggestions for researching a fresh post angle.
string
required
Radar endpoint for the suggested source.
string
required
Source-specific instructions for using returned facts.
string
required
Radar source identifier.
string
required
Current-topic research that the source supports.
object[]
required
19 published signal names. Every multiplier states that X does not publish the production weight.
object[]
required
19 published signal names. Every weight is null.
string
required
States that X publishes no universal engagement window or decay rate.
string[]
required
4 negative predictions named by X’s public model. No severity order is claimed.
string
required
Signal source and evidence limits.
string
required
X post intent seeded with the topic.
string
required
Optional Radar research guidance and exact fields required for refine.
object[]
Saved styles. Present when saved styles exist and styleUsername is omitted.
string
Cached style username.
integer
Cached post count for the style.
string[]
Cached examples. Present when styleUsername matches a cached style.
string
Fallback instruction when the requested style is unavailable.

Refine Response

string[]
required
Goal, tone, media, and editorial guidance.
object[]
required
3 patterns. Each item has description and pattern.
string
required
X post intent seeded with the topic.
string
required
Exact fields required for the score call.

Score Response

The checks cover:
  1. External links in the body
  2. Hashtags
  3. Excessive capitalization
  4. Length from 50 through 280 characters
  5. Excessive punctuation
  6. Emojis
  7. Em dashes, en dashes, or double dashes
  8. At least 8 substantive words
  9. Duplicate link-card URLs
These are Xquik style checks. They are not X ranking guarantees.
{
  "checklist": [
    { "factor": "No external links in body", "passed": true },
    { "factor": "No hashtags", "passed": true },
    { "factor": "No excessive capitalization", "passed": true },
    { "factor": "Length between 50 and 280 characters", "passed": true },
    { "factor": "No excessive punctuation", "passed": true },
    { "factor": "No emojis", "passed": true },
    { "factor": "No em dashes or double dashes", "passed": true },
    { "factor": "Sufficient substance", "passed": true },
    { "factor": "Link-in-reply strategy", "passed": true }
  ],
  "intentUrl": "https://x.com/intent/tweet?text=...",
  "nextStep": "All 9 checks passed. Get an account from GET /api/v1/x/accounts. Then send the draft to POST /api/v1/x/tweets. The intentUrl also supports one-click posting.",
  "passed": true,
  "passedCount": 9,
  "topSuggestion": "All Xquik editorial checks passed.",
  "totalChecks": 9
}
intentUrl appears only when all 9 checks pass. Failed items include a suggestion.

Errors

  • 400 Invalid Input
  • 401 Unauthenticated
  • 429 Rate Limited
{
  "error": "invalid_input",
  "message": "step is required. Must be \"compose\", \"refine\", or \"score\"."
}
Missing step-specific fields also return invalid_input.
Research current context with Radar. Save accepted text with Create Draft. Analyze a reference voice with Analyze Style.
Last modified on July 23, 2026
Morty Proxy This is a proxified and sanitized view of the page, visit original site.