GET /v1/campaigns
分发计划与分发配额 分发计划(缺省不含已归档; includeArchived=true 才含),以及当前档位的分发上限与已用量。免费。
查询参数 字段 类型 说明 productId string 只看该产品的计划。 includeArchived boolean
响应200 字段 类型 说明 success enum 可选值:true data CampaignList └ campaignsarray<Campaign> └ campaignIdstring └ productIdstring └ namestring └ statusenum completed 是算出来的:所有任务都已上线、已核实、失败或跳过。 可选值:activecompletedarchived └ quotainteger 建计划时选了多少个渠道。 └ startsAtstring └ endsAt可为空 string └ countsobject └ totalinteger └ submittedinteger submitted + published + verified。 └ liveinteger published + verified。 └ blockedinteger └ doneinteger └ byStatusobject └ createdAtstring └ quotaDistributionQuota 当前档位的分发上限与已用量。上限为 null 表示不限。 └ planstring └ limitsobject └ channels可为空 integer 单个产品可投递的不同渠道数,按 channelsPeriod 的周期计。 └ channelsPeriodenum month(付费档):按自然月(UTC)计,每个月都可投一批新渠道。 total(免费版):按该产品累计计。 可选值:monthtotal └ tasksPerMonth可为空 integer 每个自然月(UTC)可新建的任务数,各产品合计。 └ activeCampaigns可为空 integer 同时进行中的计划数。 └ usageobject └ activeCampaignsinteger └ tasksThisMonthinteger └ channels可为空 integer 只在请求指定了产品时有值。
示例 bash 复制
curl "https://www.querywin.com/api/v1/campaigns" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"campaigns": [
{
"campaignId": "string",
"productId": "string",
"name": "string",
"status": "active",
"quota": 0,
"startsAt": "2026-09-01T00:00:00.000Z",
"endsAt": "2026-09-01T00:00:00.000Z",
"counts": {
"total": 0,
"submitted": 0,
"live": 0,
"blocked": 0,
"done": 0,
"byStatus": null
},
"createdAt": "2026-09-01T00:00:00.000Z"
}
],
"quota": {
"plan": "string",
"limits": {
"channels": 0,
"channelsPeriod": "month",
"tasksPerMonth": 0,
"activeCampaigns": 0
},
"usage": {
"activeCampaigns": 0,
"tasksThisMonth": 0,
"channels": 0
}
}
}
}POST /v1/campaigns
按明确的渠道清单建计划 每个渠道 id 一条任务,投递素材当场按产品档案备好,零成本。请传实际选定 的渠道 —— 计划是「决定投哪里」的记录,🚫 不是由服务端展开的筛选条件。
该产品已有进行中或已投递任务的渠道会被剔除,列在 skipped 里并给出理由( already_open、 already_submitted、 not_found、 broken、 inactive、 other_product、 locked)。一条都不剩时返回 HTTP 200, ok: false 且 failure: "no_valid_targets"。超出当前档位的分发配额是拒绝:**409 quota_exceeded**,响应体带 dimension、 limit、 used、 requested —— 什么都不会建,🚫 不做「能建几条建几条」。
请求体 字段 类型 说明 productId 必填 string name 必填 string targetIds 必填 array<string> 来自 GET /v1/channels 的渠道 id。只传实际选定的渠道。 endsAt string 可选期限,显示在工作台里。到期不会自动关闭任何东西。
响应200 字段 类型 说明 success enum 可选值:true data CreateCampaignOutcome └ okboolean └ failureenum ok 为 false 时出现。 可选值:no_valid_targets └ campaignCampaign └ campaignIdstring └ productIdstring └ namestring └ statusenum completed 是算出来的:所有任务都已上线、已核实、失败或跳过。 可选值:activecompletedarchived └ quotainteger 建计划时选了多少个渠道。 └ startsAtstring └ endsAt可为空 string └ countsobject └ totalinteger └ submittedinteger submitted + published + verified。 └ liveinteger published + verified。 └ blockedinteger └ doneinteger └ byStatusobject └ createdAtstring └ tasksarray<Task> └ taskIdstring └ campaignIdstring └ productIdstring └ statusenum published 是你 回写的。 verified 是 QueryWin 在上线页面上看到的 (目录与 AI 工具榜看链接,其余看提及)。对外转述时请分开说。 可选值:plannedpreparedin_progressblockedsubmittedpublishedverifiedfailedskipped └ blockedReason可为空 enum 可选值:logincaptchapaymentmissing_materialothernull └ missingarray<string> 档案缺少的必填素材。在工作台里补齐档案后,任务会自行重新准备。 └ listingUrl可为空 string └ markedByenum 最近一次状态变化是谁做的:人(或本接口)、浏览器扩展、或 QueryWin 自身。 可选值:userdevicesystem └ hasGeneratedboolean 已有为该渠道改写的版本。 └ reviewDueAt可为空 string 提交后该回头查看的时间(submittedAt + 该渠道的审核天数)。 └ submittedAt可为空 string └ publishedAt可为空 string └ verifiedAt可为空 string └ nextarray<string> 从当前状态出发,可通过 POST /v1/tasks/{id}/status 设置的状态。 └ targetobject └ targetIdstring └ namestring └ urlstring └ submitUrlstring └ kindstring └ sourceenum 可选值:seeduserrivals └ languagestring └ requiresBacklinkboolean └ check可为空 object QueryWin 在条目上线后做的回查。任务上线前为 null。 └ kindenum 查什么:指向产品的链接(目录、AI 工具榜)或品牌提及(其余类型)。 可选值:link_livemention_seen └ state可为空 enum confirmed = 已看到。 unconfirmed = 一轮回查都没找到(状态不变;请核对地址)。 lost = 曾经有、现在没了(任务已置为失败)。 可选值:confirmedunconfirmedlostnull └ checkedAt可为空 string └ dueAt可为空 string └ updatedAtstring └ skippedarray<object> └ targetIdstring └ reasonenum other_product = 属于别的产品的 AI 引用来源候选; inactive = 已停用或被忽略的渠道; locked = 免费版渠道库窗口之外(按匹配度前 window 条,条数见 GET /v1/channels 的返回;自己添加的、收藏的、AI 引用来源不受限)。 可选值:not_foundbrokeninactiveother_productalready_openalready_submittedlocked
可能的错误 400 product_id_required、 name_required / name_too_long(80 字)、 target_ids_required / too_many_targets(100 条)或 invalid_date
401 鉴权失败
403 missing_scope_publish —— 这把密钥没有 publish 权限
404 product_not_found —— 该 productId 不属于这个账号
409 quota_exceeded —— 响应体带 dimension( active_campaigns / tasks_per_month / channels)、 limit、 used、 requested; channels 另带 period( month / total,与 DistributionQuota.limits.channelsPeriod 一致)
示例 bash 复制
curl -X POST https://www.querywin.com/api/v1/campaigns \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productId": "clx1prod000",
"name": "Directories, September",
"targetIds": [
"clx1tgt001",
"clx1tgt002"
]
}'json — 响应 复制
{
"success": true,
"data": {
"ok": true,
"failure": "no_valid_targets",
"campaign": {
"campaignId": "string",
"productId": "string",
"name": "string",
"status": "active",
"quota": 0,
"startsAt": "2026-09-01T00:00:00.000Z",
"endsAt": "2026-09-01T00:00:00.000Z",
"counts": {
"total": 0,
"submitted": 0,
"live": 0,
"blocked": 0,
"done": 0,
"byStatus": null
},
"createdAt": "2026-09-01T00:00:00.000Z"
},
"tasks": [
{
"taskId": "string",
"campaignId": "string",
"productId": "string",
"status": "planned",
"blockedReason": "login",
"missing": [
"string"
],
"listingUrl": "string",
"markedBy": "user",
"hasGenerated": true,
"reviewDueAt": "2026-09-01T00:00:00.000Z",
"submittedAt": "2026-09-01T00:00:00.000Z",
"publishedAt": "2026-09-01T00:00:00.000Z",
"verifiedAt": "2026-09-01T00:00:00.000Z",
"next": [
"string"
],
"target": {
"targetId": "string",
"name": "string",
"url": "string",
"submitUrl": "string",
"kind": "string",
"source": "seed",
"language": "string",
"requiresBacklink": true
},
"check": {
"kind": "link_live",
"state": "confirmed",
"checkedAt": "2026-09-01T00:00:00.000Z",
"dueAt": "2026-09-01T00:00:00.000Z"
},
"updatedAt": "2026-09-01T00:00:00.000Z"
}
],
"skipped": [
{
"targetId": "string",
"reason": "not_found"
}
]
}
}GET /v1/campaigns/{id}
一条计划及其任务 响应200 字段 类型 说明 success enum 可选值:true data CampaignDetail └ campaignCampaign └ campaignIdstring └ productIdstring └ namestring └ statusenum completed 是算出来的:所有任务都已上线、已核实、失败或跳过。 可选值:activecompletedarchived └ quotainteger 建计划时选了多少个渠道。 └ startsAtstring └ endsAt可为空 string └ countsobject └ totalinteger └ submittedinteger submitted + published + verified。 └ liveinteger published + verified。 └ blockedinteger └ doneinteger └ byStatusobject └ createdAtstring └ tasksarray<Task> └ taskIdstring └ campaignIdstring └ productIdstring └ statusenum published 是你 回写的。 verified 是 QueryWin 在上线页面上看到的 (目录与 AI 工具榜看链接,其余看提及)。对外转述时请分开说。 可选值:plannedpreparedin_progressblockedsubmittedpublishedverifiedfailedskipped └ blockedReason可为空 enum 可选值:logincaptchapaymentmissing_materialothernull └ missingarray<string> 档案缺少的必填素材。在工作台里补齐档案后,任务会自行重新准备。 └ listingUrl可为空 string └ markedByenum 最近一次状态变化是谁做的:人(或本接口)、浏览器扩展、或 QueryWin 自身。 可选值:userdevicesystem └ hasGeneratedboolean 已有为该渠道改写的版本。 └ reviewDueAt可为空 string 提交后该回头查看的时间(submittedAt + 该渠道的审核天数)。 └ submittedAt可为空 string └ publishedAt可为空 string └ verifiedAt可为空 string └ nextarray<string> 从当前状态出发,可通过 POST /v1/tasks/{id}/status 设置的状态。 └ targetobject └ targetIdstring └ namestring └ urlstring └ submitUrlstring └ kindstring └ sourceenum 可选值:seeduserrivals └ languagestring └ requiresBacklinkboolean └ check可为空 object QueryWin 在条目上线后做的回查。任务上线前为 null。 └ kindenum 查什么:指向产品的链接(目录、AI 工具榜)或品牌提及(其余类型)。 可选值:link_livemention_seen └ state可为空 enum confirmed = 已看到。 unconfirmed = 一轮回查都没找到(状态不变;请核对地址)。 lost = 曾经有、现在没了(任务已置为失败)。 可选值:confirmedunconfirmedlostnull └ checkedAt可为空 string └ dueAt可为空 string └ updatedAtstring
可能的错误 401 鉴权失败
404 campaign_not_found
示例 bash 复制
curl "https://www.querywin.com/api/v1/campaigns/{id}" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"campaign": {
"campaignId": "string",
"productId": "string",
"name": "string",
"status": "active",
"quota": 0,
"startsAt": "2026-09-01T00:00:00.000Z",
"endsAt": "2026-09-01T00:00:00.000Z",
"counts": {
"total": 0,
"submitted": 0,
"live": 0,
"blocked": 0,
"done": 0,
"byStatus": null
},
"createdAt": "2026-09-01T00:00:00.000Z"
},
"tasks": [
{
"taskId": "string",
"campaignId": "string",
"productId": "string",
"status": "planned",
"blockedReason": "login",
"missing": [
"string"
],
"listingUrl": "string",
"markedBy": "user",
"hasGenerated": true,
"reviewDueAt": "2026-09-01T00:00:00.000Z",
"submittedAt": "2026-09-01T00:00:00.000Z",
"publishedAt": "2026-09-01T00:00:00.000Z",
"verifiedAt": "2026-09-01T00:00:00.000Z",
"next": [
"string"
],
"target": {
"targetId": "string",
"name": "string",
"url": "string",
"submitUrl": "string",
"kind": "string",
"source": "seed",
"language": "string",
"requiresBacklink": true
},
"check": {
"kind": "link_live",
"state": "confirmed",
"checkedAt": "2026-09-01T00:00:00.000Z",
"dueAt": "2026-09-01T00:00:00.000Z"
},
"updatedAt": "2026-09-01T00:00:00.000Z"
}
]
}
}GET /v1/channels
可投递的入口,按匹配度排序 内置渠道(目录、启动平台、AI 工具榜、社区、内容平台)、你自行添加的条目,以及 —— 传了 productId 时 —— AI 答案在该产品的搜索词上引用过的站点( source: "rivals")。带 productId 时按相关性排序,每条渠道带 taskStatus(该产品在此已有任务时非空)。免费。
** citedByAi 表示 AI 答案在你的搜索词上引用过该站,🚫 不表示该站会收录你的产品** —— 去争取被提及,正是任务要做的事。
查询参数 字段 类型 说明 productId string 按该产品的匹配度排序、附上 taskStatus,并包含它的 AI 引用来源候选。 kind string 渠道类型。 可选值:directorylaunchai_directorycommunitycontentother source string seed = 内置渠道, user = 自行添加, rivals = 该产品的 AI 引用来源。 可选值:seeduserrivals pricing string 投递费用。 可选值:freeconditionalpaidunknown submitMethod string 投递方式:填写表单、在社区发帖,或写信投稿。 可选值:formpostemail q string 按名称、域名与主题搜索。 hideSubmitted boolean 隐藏该产品已有进行中或已投递任务的渠道。需要 productId。 page integer 缺省 1。 pageSize integer 缺省 30。
响应200 字段 类型 说明 success enum 可选值:true data ChannelList └ productId可为空 string └ itemsarray<Channel> └ targetIdstring 作为 targetIds 传给 POST /v1/campaigns。 └ namestring └ urlstring └ submitUrlstring 提交表单或发帖页;对 AI 引用来源,是被 AI 答案引用最多的那一页。 └ kindenum 可选值:directorylaunchai_directorycommunitycontentother └ submitMethodenum form = 填写该站的提交表单, post = 自己在社区发帖, email = 写信向编辑投稿(收件地址在打开页面时读取,不入库)。 可选值:formpostemail └ sourceenum seed = 内置渠道, user = 自行添加, rivals = AI 答案在该产品的搜索词上引用过的站点。 可选值:seeduserrivals └ pricingTypeenum 可选值:freeconditionalpaidunknown └ priceNote可为空 string └ languagestring en、 zh、 multi,或 AI 引用来源按搜索词判出的语言代码。 └ topicsarray<string> └ requiresAccountboolean └ requiresBacklinkboolean └ reviewDays可为空 integer 通常的审核天数。任务会在此之后提醒你回头查看。 └ siteRank可为空 integer 在公开的 Tranco 榜单中的全球排名(数字越小访问量越大)。 null = 不在前一百万。它不是 Domain Rating。 └ hasFormSpecboolean 该渠道的表单字段已登记,素材按它的字数上限裁。 └ relevance可为空 integer 与请求所指产品的匹配分。只用于排序。 └ taskStatus可为空 string 该产品在此渠道进行中或已完成的任务状态; null = 尚无。 └ citedByAi可为空 object 只有 source: "rivals" 有。AI 答案在所列搜索词上引用过该站。这🚫 不是该站会收录你的产品的承诺 —— 去争取正是任务要做的事。 └ queriesinteger 在多少条不同的搜索词上被引用。 └ samplesinteger 多少次 AI 答案采样引用了它。 └ searchesarray<string> └ pagesarray<string> 被引用的页面,引用最多的在前。较早的采样只记录了域名,此时为空。 └ totalinteger └ pageinteger └ pageSizeinteger └ limitedboolean 免费版:只返回默认排序(按 productId 的匹配度)的前 window 条,筛选、搜索、排序参数会以 403 library_locked 拒绝。 total 仍是渠道库的真实总数。 └ window可为空 integer 免费版窗口条数:基础 20 条,每有一位好友通过你的邀请链接注册加 20 条(你本人通过邀请注册的,另加 20 条)。列表不受限时为 null。
示例 bash 复制
curl "https://www.querywin.com/api/v1/channels" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"productId": "string",
"items": [
{
"targetId": "string",
"name": "string",
"url": "string",
"submitUrl": "string",
"kind": "directory",
"submitMethod": "form",
"source": "seed",
"pricingType": "free",
"priceNote": "string",
"language": "string",
"topics": [
"string"
],
"requiresAccount": true,
"requiresBacklink": true,
"reviewDays": 0,
"siteRank": 0,
"hasFormSpec": true,
"relevance": 0,
"taskStatus": "string",
"citedByAi": {
"queries": 0,
"samples": 0,
"searches": [],
"pages": []
}
}
],
"total": 0,
"page": 0,
"pageSize": 0,
"limited": true,
"window": 0
}
}GET /v1/products
产品清单与各自的档案完整度 分发链从这里开始;其余分发接口都要带 productId。 completeness 与 missing 来自已保存的产品档案:档案里空着的格,投递素材里就是空的;必填格缺失时任务会停在 blocked / missing_material,直到档案补齐。用 GET /v1/products/{id} 读取,用 PATCH /v1/products/{id} 填写。免费。
响应200 字段 类型 说明 success enum 可选值:true data ProductList └ productsarray<Product> └ productIdstring └ namestring └ urlstring └ domainstring └ primaryLanguageenum 可选值:enzhjakodefresptitrunlpltrarthviid └ topicsarray<string> └ completenessinteger 档案完整度 0–100。在工作台或通过 PATCH /v1/products/{id} 补齐。 └ missingarray<string> 档案里空着的格。每一格都是所有投递素材里的空缺。 └ sitesarray<object> └ siteIdstring └ domainstring └ syncedThrough可为空 string
示例 bash 复制
curl "https://www.querywin.com/api/v1/products" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"products": [
{
"productId": "string",
"name": "string",
"url": "string",
"domain": "string",
"primaryLanguage": "en",
"topics": [
"string"
],
"completeness": 0,
"missing": [
"string"
],
"sites": [
{
"siteId": null,
"domain": null,
"syncedThrough": null
}
]
}
]
}
}POST /v1/products
创建产品 需要付费档位与 publish 权限。用公开主页地址和可选名称创建产品,占用产品名额,不扣积分。返回已保存的完整档案,再用 PATCH /v1/products/{id} 填写。不抓网页、不调用 AI。同域名重复创建返回 409 product_exists,并带已有 productId;响应丢失时可据此继续操作。产品默认值可以修改,不代表已核实的网站事实。
请求体 字段 类型 说明 url 必填 string name string
响应201 字段 类型 说明 success boolean data ProductDetail └ namestring └ urlstring └ primaryLanguageenum 可选值:enzhjakodefresptitrunlpltrarthviid └ businessTypeenum 可选值:saastoolecommercecontentserviceother └ launchStatusenum 可选值:livebeta └ pricingModelenum 可选值:freefreemiumpaidtrial └ tagline可为空 object └ shortDesc可为空 object └ longDesc可为空 object └ firstComment可为空 object └ topicsarray<string> └ promoCode可为空 string └ videoUrl可为空 string └ demoUrl可为空 string └ links可为空 object └ webAppstring └ appStorestring └ playStorestring └ chromeExtensionstring └ macosstring └ windowsstring └ socials可为空 object └ xstring └ linkedinstring └ githubstring └ instagramstring └ youtubestring └ facebookstring └ contactName可为空 string └ contactEmail可为空 string └ galleryarray<string> └ productIdstring └ domainstring └ thumbnailUrl可为空 string └ completenessinteger (0–100) └ missingarray<string> └ createdAtstring └ updatedAtstring └ sitesarray<object> └ siteIdstring └ domainstring └ syncedThrough可为空 string
可能的错误 400 invalid_product_input、 invalid_url 或 url_not_public
401 鉴权失败
403 plan_required,写操作还可能返回 missing_scope_publish
409 product_exists(带已有 productId)或 product_limit_reached
429 rate_limited —— 每把密钥每分钟最多 120 次请求
示例 bash 复制
curl -X POST https://www.querywin.com/api/v1/products \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"name": "Example"
}'json — 响应 复制
{
"success": true,
"data": {
"name": "string",
"url": "string",
"primaryLanguage": "en",
"businessType": "saas",
"launchStatus": "live",
"pricingModel": "free",
"tagline": null,
"shortDesc": null,
"longDesc": null,
"firstComment": null,
"topics": [
"string"
],
"promoCode": "string",
"videoUrl": "string",
"demoUrl": "string",
"links": {
"webApp": "string",
"appStore": "string",
"playStore": "string",
"chromeExtension": "string",
"macos": "string",
"windows": "string"
},
"socials": {
"x": "string",
"linkedin": "string",
"github": "string",
"instagram": "string",
"youtube": "string",
"facebook": "string"
},
"contactName": "string",
"contactEmail": "string",
"gallery": [
"string"
],
"productId": "string",
"domain": "string",
"thumbnailUrl": "string",
"completeness": 0,
"missing": [
"string"
],
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-09-01T00:00:00.000Z",
"sites": [
{
"siteId": "string",
"domain": "string",
"syncedThrough": "string"
}
]
}
}PATCH /v1/products/{id}
填写或更新产品档案 需要 publish 权限。提交的字段立即保存,未提交的字段不变;对象(包括多语言文案)和数组整项替换。请先读取档案,以保留其他语言。不扣积分、不调用 AI。尚未投递的任务素材会异步刷新。只填写已知事实,不要编造缺失的产品资料。
请求体 字段 类型 说明 name string url string primaryLanguage enum 可选值:enzhjakodefresptitrunlpltrarthviid businessType enum 可选值:saastoolecommercecontentserviceother launchStatus enum 可选值:livebeta pricingModel enum 可选值:freefreemiumpaidtrial tagline object shortDesc object longDesc object firstComment object topics array<string> promoCode string videoUrl string demoUrl string links object └ webAppstring └ appStorestring └ playStorestring └ chromeExtensionstring └ macosstring └ windowsstring socials object └ xstring └ linkedinstring └ githubstring └ instagramstring └ youtubestring └ facebookstring contactName string contactEmail string gallery array<string>
响应200 字段 类型 说明 success boolean data ProductDetail └ namestring └ urlstring └ primaryLanguageenum 可选值:enzhjakodefresptitrunlpltrarthviid └ businessTypeenum 可选值:saastoolecommercecontentserviceother └ launchStatusenum 可选值:livebeta └ pricingModelenum 可选值:freefreemiumpaidtrial └ tagline可为空 object └ shortDesc可为空 object └ longDesc可为空 object └ firstComment可为空 object └ topicsarray<string> └ promoCode可为空 string └ videoUrl可为空 string └ demoUrl可为空 string └ links可为空 object └ webAppstring └ appStorestring └ playStorestring └ chromeExtensionstring └ macosstring └ windowsstring └ socials可为空 object └ xstring └ linkedinstring └ githubstring └ instagramstring └ youtubestring └ facebookstring └ contactName可为空 string └ contactEmail可为空 string └ galleryarray<string> └ productIdstring └ domainstring └ thumbnailUrl可为空 string └ completenessinteger (0–100) └ missingarray<string> └ createdAtstring └ updatedAtstring └ sitesarray<object> └ siteIdstring └ domainstring └ syncedThrough可为空 string
可能的错误 400 invalid_product_input、 invalid_url、 url_not_public、 invalid_email 或 invalid_gallery
401 鉴权失败
403 plan_required,写操作还可能返回 missing_scope_publish
404 product_not_found
409 product_exists(带已有 productId)
429 rate_limited —— 每把密钥每分钟最多 120 次请求
示例 bash 复制
curl -X PATCH https://www.querywin.com/api/v1/products/{id} \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tagline": {
"en": "Your product tagline",
"zh": "你的产品标语"
},
"shortDesc": {
"en": "A factual description of the product."
},
"topics": [
"productivity",
"developer-tools"
],
"contactEmail": "hello@example.com"
}'json — 响应 复制
{
"success": true,
"data": {
"name": "string",
"url": "string",
"primaryLanguage": "en",
"businessType": "saas",
"launchStatus": "live",
"pricingModel": "free",
"tagline": null,
"shortDesc": null,
"longDesc": null,
"firstComment": null,
"topics": [
"string"
],
"promoCode": "string",
"videoUrl": "string",
"demoUrl": "string",
"links": {
"webApp": "string",
"appStore": "string",
"playStore": "string",
"chromeExtension": "string",
"macos": "string",
"windows": "string"
},
"socials": {
"x": "string",
"linkedin": "string",
"github": "string",
"instagram": "string",
"youtube": "string",
"facebook": "string"
},
"contactName": "string",
"contactEmail": "string",
"gallery": [
"string"
],
"productId": "string",
"domain": "string",
"thumbnailUrl": "string",
"completeness": 0,
"missing": [
"string"
],
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-09-01T00:00:00.000Z",
"sites": [
{
"siteId": "string",
"domain": "string",
"syncedThrough": "string"
}
]
}
}GET /v1/products/{id}
读取完整产品档案 返回已保存的多语言文案、链接、联系人、图片、完整度和缺失项。需要 read 权限,不扣积分。产品不属于当前工作区时也返回 product_not_found。
响应200 字段 类型 说明 success boolean data ProductDetail └ namestring └ urlstring └ primaryLanguageenum 可选值:enzhjakodefresptitrunlpltrarthviid └ businessTypeenum 可选值:saastoolecommercecontentserviceother └ launchStatusenum 可选值:livebeta └ pricingModelenum 可选值:freefreemiumpaidtrial └ tagline可为空 object └ shortDesc可为空 object └ longDesc可为空 object └ firstComment可为空 object └ topicsarray<string> └ promoCode可为空 string └ videoUrl可为空 string └ demoUrl可为空 string └ links可为空 object └ webAppstring └ appStorestring └ playStorestring └ chromeExtensionstring └ macosstring └ windowsstring └ socials可为空 object └ xstring └ linkedinstring └ githubstring └ instagramstring └ youtubestring └ facebookstring └ contactName可为空 string └ contactEmail可为空 string └ galleryarray<string> └ productIdstring └ domainstring └ thumbnailUrl可为空 string └ completenessinteger (0–100) └ missingarray<string> └ createdAtstring └ updatedAtstring └ sitesarray<object> └ siteIdstring └ domainstring └ syncedThrough可为空 string
可能的错误 401 鉴权失败
403 plan_required,写操作还可能返回 missing_scope_publish
404 product_not_found
429 rate_limited —— 每把密钥每分钟最多 120 次请求
示例 bash 复制
curl "https://www.querywin.com/api/v1/products/{id}" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"name": "string",
"url": "string",
"primaryLanguage": "en",
"businessType": "saas",
"launchStatus": "live",
"pricingModel": "free",
"tagline": null,
"shortDesc": null,
"longDesc": null,
"firstComment": null,
"topics": [
"string"
],
"promoCode": "string",
"videoUrl": "string",
"demoUrl": "string",
"links": {
"webApp": "string",
"appStore": "string",
"playStore": "string",
"chromeExtension": "string",
"macos": "string",
"windows": "string"
},
"socials": {
"x": "string",
"linkedin": "string",
"github": "string",
"instagram": "string",
"youtube": "string",
"facebook": "string"
},
"contactName": "string",
"contactEmail": "string",
"gallery": [
"string"
],
"productId": "string",
"domain": "string",
"thumbnailUrl": "string",
"completeness": 0,
"missing": [
"string"
],
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-09-01T00:00:00.000Z",
"sites": [
{
"siteId": "string",
"domain": "string",
"syncedThrough": "string"
}
]
}
}POST /v1/products/{id}/images/from-url
从 URL 导入产品图片 需要 publish 权限。抓取公开 HTTP(S) 图片并保存副本:thumbnail 替换缩略图,gallery 追加画廊图(最多六张)。支持 JPEG、PNG、WebP 和 SVG,最大 4 MB;SVG 转为 PNG。复用现有抓取器拦截内网和不安全跳转。不扣积分。重复导入画廊可能增加重复图片;响应丢失后先读取档案再决定是否重试。
请求体 字段 类型 说明 url 必填 string kind enum 可选值:thumbnailgallery 默认 gallery
响应200 字段 类型 说明 success boolean data ProductDetail └ namestring └ urlstring └ primaryLanguageenum 可选值:enzhjakodefresptitrunlpltrarthviid └ businessTypeenum 可选值:saastoolecommercecontentserviceother └ launchStatusenum 可选值:livebeta └ pricingModelenum 可选值:freefreemiumpaidtrial └ tagline可为空 object └ shortDesc可为空 object └ longDesc可为空 object └ firstComment可为空 object └ topicsarray<string> └ promoCode可为空 string └ videoUrl可为空 string └ demoUrl可为空 string └ links可为空 object └ webAppstring └ appStorestring └ playStorestring └ chromeExtensionstring └ macosstring └ windowsstring └ socials可为空 object └ xstring └ linkedinstring └ githubstring └ instagramstring └ youtubestring └ facebookstring └ contactName可为空 string └ contactEmail可为空 string └ galleryarray<string> └ productIdstring └ domainstring └ thumbnailUrl可为空 string └ completenessinteger (0–100) └ missingarray<string> └ createdAtstring └ updatedAtstring └ sitesarray<object> └ siteIdstring └ domainstring └ syncedThrough可为空 string
可能的错误 400 invalid_product_input 或 invalid_url
401 鉴权失败
403 plan_required,写操作还可能返回 missing_scope_publish
404 product_not_found
409 gallery_full
413 image_too_large
415 image_type
429 rate_limited —— 每把密钥每分钟最多 120 次请求
502 image_unreachable
503 storage_unavailable
示例 bash 复制
curl -X POST https://www.querywin.com/api/v1/products/{id}/images/from-url \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/logo.png",
"kind": "thumbnail"
}'json — 响应 复制
{
"success": true,
"data": {
"name": "string",
"url": "string",
"primaryLanguage": "en",
"businessType": "saas",
"launchStatus": "live",
"pricingModel": "free",
"tagline": null,
"shortDesc": null,
"longDesc": null,
"firstComment": null,
"topics": [
"string"
],
"promoCode": "string",
"videoUrl": "string",
"demoUrl": "string",
"links": {
"webApp": "string",
"appStore": "string",
"playStore": "string",
"chromeExtension": "string",
"macos": "string",
"windows": "string"
},
"socials": {
"x": "string",
"linkedin": "string",
"github": "string",
"instagram": "string",
"youtube": "string",
"facebook": "string"
},
"contactName": "string",
"contactEmail": "string",
"gallery": [
"string"
],
"productId": "string",
"domain": "string",
"thumbnailUrl": "string",
"completeness": 0,
"missing": [
"string"
],
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-09-01T00:00:00.000Z",
"sites": [
{
"siteId": "string",
"domain": "string",
"syncedThrough": "string"
}
]
}
}GET /v1/tasks
跨计划的任务流水 投递记录,按最近更新排。可按产品、计划或逗号分隔的状态列表筛选。 byStatus 统计的是状态筛选之前 范围内的全部任务。免费。
查询参数 字段 类型 说明 productId string 只看该产品的任务。 campaignId string status string 逗号分隔,如 prepared,in_progress。 page integer 缺省 1。 pageSize integer 缺省 30。
响应200 字段 类型 说明 success enum 可选值:true data TaskList └ itemsarray<Task> └ taskIdstring └ campaignIdstring └ productIdstring └ statusenum published 是你 回写的。 verified 是 QueryWin 在上线页面上看到的 (目录与 AI 工具榜看链接,其余看提及)。对外转述时请分开说。 可选值:plannedpreparedin_progressblockedsubmittedpublishedverifiedfailedskipped └ blockedReason可为空 enum 可选值:logincaptchapaymentmissing_materialothernull └ missingarray<string> 档案缺少的必填素材。在工作台里补齐档案后,任务会自行重新准备。 └ listingUrl可为空 string └ markedByenum 最近一次状态变化是谁做的:人(或本接口)、浏览器扩展、或 QueryWin 自身。 可选值:userdevicesystem └ hasGeneratedboolean 已有为该渠道改写的版本。 └ reviewDueAt可为空 string 提交后该回头查看的时间(submittedAt + 该渠道的审核天数)。 └ submittedAt可为空 string └ publishedAt可为空 string └ verifiedAt可为空 string └ nextarray<string> 从当前状态出发,可通过 POST /v1/tasks/{id}/status 设置的状态。 └ targetobject └ targetIdstring └ namestring └ urlstring └ submitUrlstring └ kindstring └ sourceenum 可选值:seeduserrivals └ languagestring └ requiresBacklinkboolean └ check可为空 object QueryWin 在条目上线后做的回查。任务上线前为 null。 └ kindenum 查什么:指向产品的链接(目录、AI 工具榜)或品牌提及(其余类型)。 可选值:link_livemention_seen └ state可为空 enum confirmed = 已看到。 unconfirmed = 一轮回查都没找到(状态不变;请核对地址)。 lost = 曾经有、现在没了(任务已置为失败)。 可选值:confirmedunconfirmedlostnull └ checkedAt可为空 string └ dueAt可为空 string └ updatedAtstring └ totalinteger └ pageinteger └ pageSizeinteger └ byStatusobject
示例 bash 复制
curl "https://www.querywin.com/api/v1/tasks" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"items": [
{
"taskId": "string",
"campaignId": "string",
"productId": "string",
"status": "planned",
"blockedReason": "login",
"missing": [
"string"
],
"listingUrl": "string",
"markedBy": "user",
"hasGenerated": true,
"reviewDueAt": "2026-09-01T00:00:00.000Z",
"submittedAt": "2026-09-01T00:00:00.000Z",
"publishedAt": "2026-09-01T00:00:00.000Z",
"verifiedAt": "2026-09-01T00:00:00.000Z",
"next": [
"string"
],
"target": {
"targetId": "string",
"name": "string",
"url": "string",
"submitUrl": "string",
"kind": "string",
"source": "seed",
"language": "string",
"requiresBacklink": true
},
"check": {
"kind": "link_live",
"state": "confirmed",
"checkedAt": "2026-09-01T00:00:00.000Z",
"dueAt": "2026-09-01T00:00:00.000Z"
},
"updatedAt": "2026-09-01T00:00:00.000Z"
}
],
"total": 0,
"page": 0,
"pageSize": 0,
"byStatus": null
}
}GET /v1/tasks/{id}
一条任务及其投递素材 该渠道表单要求的每一格,按渠道的字数上限从产品档案裁出( source: "profile"),加上已有的渠道改写版本( source: "ai")与在工作台里定稿的修改( source: "override")。 source: "none" 表示档案里没有这一格 —— 🚫 不要自行编造。🚫 不会触发改写,不消耗任何积分。
响应200 字段 类型 说明 success enum 可选值:true data TaskDetailResult └ taskTaskDetail
可能的错误 401 鉴权失败
404 task_not_found
示例 bash 复制
curl "https://www.querywin.com/api/v1/tasks/{id}" \
-H "Authorization: Bearer $QUERYWIN_API_KEY"json — 响应 复制
{
"success": true,
"data": {
"task": null
}
}POST /v1/tasks/{id}/materials
为该渠道改写素材(扣积分) 一次 AI 改写,把档案改成适合这个渠道的说法:更紧凑的目录描述、创始人首评、社区帖、给编辑的投稿信,或 —— 对 AI 引用来源 —— 投稿信加一段可供对方页面直接采用的补充段落。同步返回,几秒钟。只依据档案中的事实;任何一段出现档案之外的链接就整段舍弃、不收费。
输入不变时返回上一版且不重复收费 ( cached: true); force: true 强制重写,照价收费。 GET /v1/tasks/{id} 里从档案裁出的素材通常已够投目录;渠道需要另一种语气(社区、投稿信)时再改写。
产物一段都没通过校验时返回 HTTP 200, ok: false 且 failure: "engine_failed"。积分不足才是真正的 402。
请求体 字段 类型 说明 confirmSpend 必填 integer 授权上限(积分),语义与大纲 / 正文相同。单价从 GET /v1/usage 的 materials.pricePerTask 读。免费额度还在时同样必填。 (min 0) force boolean 即使上一版之后没有任何变化也重写。照价收费。
响应200 字段 类型 说明 success enum 可选值:true data WriteMaterialsOutcome └ okboolean └ failureenum ok 为 false 时出现。不收费。 可选值:engine_failedengine_unavailable └ cachedboolean 输入未变;返回的是上一版,未收费。 └ freeUsedboolean └ creditsSpentinteger └ taskTaskDetail
可能的错误 400 confirm_spend_required 或 confirm_spend_too_low(响应体里带当前 price)
401 鉴权失败
402 insufficient_credits —— 响应体带 requiredCredits、 currentBalance、 shortfall
403 missing_scope_spend —— 这把密钥没有 spend 权限
404 task_not_found
429 rate_limited 或 daily_limit_reached(响应体带 resetAt)
示例 bash 复制
curl -X POST https://www.querywin.com/api/v1/tasks/{id}/materials \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"confirmSpend": 10
}'json — 响应 复制
{
"success": true,
"data": {
"ok": true,
"failure": "engine_failed",
"cached": true,
"freeUsed": true,
"creditsSpent": 0,
"task": null
}
}POST /v1/tasks/{id}/status
回写投递结果 记录你用自己的账号投递之后发生的事。QueryWin 从不代你向任何站点投递。表单提交后置为 submitted;条目上线后置为 published 并带上线地址 (条目或帖子本身,🚫 不是站点首页);QueryWin 会在约 72 小时后回查该页面是否出现指向产品的链接(目录、AI 工具榜)或品牌提及(其余类型),并自行置为 verified —— 你不能设置它。
blocked 表示「需要人处理」:请带 reason( login、 captcha、 payment、 missing_material、 other)。 failed / skipped 关闭任务; prepared 放回待投。状态机不允许的转换返回 **409 transition_not_allowed**;任务的 next 字段列出当前状态能推到哪些状态。
请求体 字段 类型 说明 status 必填 enum verified 不能设置;QueryWin 回查条目后自行设置。 可选值:preparedin_progressblockedsubmittedpublishedfailedskipped listingUrl string published 必填:上线的条目或帖子本身,🚫 不是站点首页。仅支持 http/https。已知地址时也可随 submitted 一并传。 note string reason enum blocked 必填。 可选值:logincaptchapaymentmissing_materialother
响应200 字段 类型 说明 success enum 可选值:true data TaskDetailResult └ taskTaskDetail
可能的错误 400 invalid_status、 listing_url_required( published 必须带 listingUrl)、 invalid_listing_url 或 reason_required( blocked 必须带 reason)
401 鉴权失败
403 missing_scope_publish —— 这把密钥没有 publish 权限
404 task_not_found
409 transition_not_allowed —— 先读任务, next 列出允许的状态
示例 bash 复制
curl -X POST https://www.querywin.com/api/v1/tasks/{id}/status \
-H "Authorization: Bearer $QUERYWIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "published",
"listingUrl": "https://example-directory.com/tools/your-product"
}'json — 响应 复制
{
"success": true,
"data": {
"task": null
}
}