Documentation Index Fetch the complete documentation index at: https://docs.xquik.com/llms.txt
Use this file to discover all available pages before exploring further.
Free - does not consume credits
curl -X GET "https://xquik.com/api/v1/extractions?limit=20&toolType=reply_extractor" \
-H "x-api-key: xq_YOUR_KEY_HERE" | jq
Your API key. Session cookie authentication is also supported. Generate a key from the dashboard .
Query parameters
Number of extractions to return per page. Default: 50. Maximum: 100.
Filter by tool type. One of: article_extractor, community_extractor, community_moderator_explorer, community_post_extractor, community_search, favoriters, follower_explorer, following_explorer, list_follower_explorer, list_member_extractor, list_post_extractor, mention_extractor, people_search, post_extractor, quote_extractor, reply_extractor, repost_extractor, space_explorer, thread_extractor, tweet_search_extractor, user_likes, user_media, verified_follower_explorer.
Filter by job status. One of: completed, failed, running.
Cursor for pagination. Use the nextCursor value from the previous response to fetch the next page.
Response
200 OK
401 Unauthenticated
429 Rate Limited
Array of extraction job summaries. Show Extraction object properties
Unique extraction job ID.
Tool type used for this extraction.
Job status: completed, failed, or running.
Total number of extracted results.
ISO 8601 timestamp of when the job was created.
ISO 8601 timestamp of when the job finished. Only present for completed jobs.
Whether more results exist beyond this page.
Cursor to pass as the after parameter for the next page. Only present when hasMore is true.
{
"extractions" : [
{
"id" : "a1b2c3d4-e5f6-7890-abcd-ef1234567890" ,
"toolType" : "reply_extractor" ,
"status" : "completed" ,
"totalResults" : 150 ,
"createdAt" : "2026-02-24T10:00:00.000Z" ,
"completedAt" : "2026-02-24T10:00:12.000Z"
},
{
"id" : "b2c3d4e5-f6a1-7890-abcd-ef2345678901" ,
"toolType" : "follower_explorer" ,
"status" : "completed" ,
"totalResults" : 4832 ,
"createdAt" : "2026-02-23T18:30:00.000Z" ,
"completedAt" : "2026-02-23T18:31:45.000Z"
},
{
"id" : "c3d4e5f6-a1b2-7890-abcd-ef3456789012" ,
"toolType" : "repost_extractor" ,
"status" : "failed" ,
"totalResults" : 0 ,
"createdAt" : "2026-02-23T12:00:00.000Z"
}
],
"hasMore" : true ,
"nextCursor" : "eyJjIjoiMjAyNi0wMi0yM1QxMjowMDowMC4wMDBaIiwiaSI6Ijc3NzY4In0"
}
{ "error" : "unauthenticated" }
Missing or invalid API key. { "error" : "rate_limit_exceeded" , "message" : "Too many requests. Try again later." , "retryAfter" : 1 }
Wait for the Retry-After value before making another request.
Results are ordered by creation date (newest first). To iterate through all extractions:
Make the initial request without the after parameter.
Check hasMore in the response. If true, use nextCursor as the after value in the next request.
Repeat until hasMore is false.
import { appendFile } from "node:fs/promises" ;
let cursor = undefined ;
let pageIndex = 0 ;
do {
const params = new URLSearchParams ({
limit: "100" ,
status: "completed" ,
});
if ( cursor ) params . set ( "after" , cursor );
const pageCursor = cursor ?? null ;
const response = await fetch ( `https://xquik.com/api/v1/extractions? ${ params } ` , {
headers: { "x-api-key" : "xq_YOUR_KEY_HERE" },
});
const data = await response . json ();
const rows = data . extractions . map (( job ) => ({
extraction_id: job . id ,
tool_type: job . toolType ,
status: job . status ,
total_results: job . totalResults ,
created_at: job . createdAt ,
completed_at: job . completedAt ?? null ,
detail_path: `/api/v1/extractions/ ${ job . id } ` ,
export_path:
job . status === "completed"
? `/api/v1/extractions/ ${ job . id } /export?format=csv`
: null ,
page_index: pageIndex ,
page_cursor: pageCursor ,
next_cursor: data . nextCursor ?? null ,
has_more: data . hasMore ,
handoff_format: "jsonl" ,
}));
if ( rows . length > 0 ) {
await appendFile (
"xquik-extraction-jobs.jsonl" ,
` ${ rows . map (( row ) => JSON . stringify ( row )). join ( " \n " ) } \n ` ,
);
}
cursor = data . hasMore ? data . nextCursor : undefined ;
pageIndex += 1 ;
} while ( cursor );
Job inventory handoff
Use GET /extractions as the job inventory step before fetching details or
exporting files. Treat nextCursor as opaque and pass it back as after; do
not dump raw job lists into shared logs.
Page checkpoint Store page_index, page_cursor, next_cursor, has_more, limit,
tool_type_filter, and status_filter after each successful page.
Completed jobs Store completed job id, toolType, totalResults, completedAt,
detail_path, and export_path for the next fetch or file export.
Running or failed jobs Keep status, createdAt, and id so dashboards can retry failed jobs or
poll running jobs without rereading older pages.
Store page checkpoints separately from job rows:
{
"page_index" : 2 ,
"page_cursor" : "eyJjIjoiMjAyNi0wMi0yM1QxODozMTo0NS4wMDBaIiwiaSI6Ijc3NzY4In0" ,
"next_cursor" : "eyJjIjoiMjAyNi0wMi0yM1QxMjowMDowMC4wMDBaIiwiaSI6Ijc3NzY0In0" ,
"has_more" : true ,
"limit" : 100 ,
"tool_type_filter" : "reply_extractor" ,
"status_filter" : "completed" ,
"handoff_format" : "jsonl"
}