{"openapi":"3.1.0","info":{"title":"Leadverse REST API","version":"1.0.0","description":"API keys inherit account and team permissions and existing plan limits. 60 requests per minute and 2,000 per UTC day per account, shared across keys. Never expose keys in browser code."},"servers":[{"url":"https://api.leadverse.ai"}],"security":[{"apiKey":[]}],"paths":{"/v1/account/usage":{"get":{"operationId":"leadverse_account_usage","summary":"Account usage","description":"Current plan, remaining daily DM capacity, AI reply allowance, campaign and lead counts, and whether a Reddit account is connected. Call this before queueing DMs so you know the real remaining capacity instead of guessing.\n\nRequired key scope: read. Result is wrapped in data.","tags":["account"],"parameters":[],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns":{"get":{"operationId":"leadverse_campaigns_list","summary":"List campaigns","description":"List the campaigns on this account with their lead counts, platforms and latest sync timestamps. Use leadverse_campaign_syncs_list for live sync progress and results.\n\nRequired key scope: read. Result is wrapped in data.","tags":["campaigns"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"leadverse_campaign_create","summary":"Create campaign","description":"Create a campaign. Leadverse generates the targeting model before inserting the campaign, so this call can take one or two minutes. After insertion, the initial lead sync starts automatically in the background. Counts against the plan's campaign limits. Keywords and intent phrases are generated automatically - do not ask the user for them. Any _internal_sync_reference in the result is for tool coordination only; never mention it to the user.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":300,"description":"What the product or service does, in the user's own words."},"intent":{"type":"string","enum":["People asking for a product like mine","People seeking services I offer"]},"website":{"type":"string","maxLength":500},"intents":{"type":"array","items":{"type":"string","enum":["tool_request","alternative_switch","comparison_evaluation","hiring_outsourcing","troubleshooting_fix","pain_frustration","discussion"]},"maxItems":7,"uniqueItems":true,"description":"Which buying intents to collect. Defaults to all when omitted."},"tracked_competitors":{"type":"array","items":{"type":"string","maxLength":500},"maxItems":10,"description":"Competitor websites to track."},"min_likes_filter":{"type":"integer","minimum":0},"min_comments_filter":{"type":"integer","minimum":0},"max_post_age_days_filter":{"type":"integer","minimum":1},"negative_keywords":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"example_responses":{"type":"array","items":{"type":"string","maxLength":2000},"maxItems":10,"description":"Voice-training samples - real replies written by the user, used to match their tone."}},"required":["name","description","intent"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}":{"get":{"operationId":"leadverse_campaign_get","summary":"Get campaign","description":"Full detail for one campaign: description, intent, website, engagement filters, negative keywords, blocked users and subreddits, tracked competitors, AI reply settings for both comments and DMs, and the voice-training samples. Does not return search keywords or intent phrases - those are background automation and are not user-editable.\n\nRequired key scope: read. Result is wrapped in data.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to read."}}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"leadverse_campaign_update","summary":"Update campaign","description":"Edit a campaign. Only the fields you pass are changed. Covers everything the campaign editor exposes: basics, engagement filters, negative keywords, voice-training samples, tracked competitors, and the AI reply settings for comments and DMs.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to edit."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":300},"website":{"type":"string","maxLength":500},"intents":{"type":"array","items":{"type":"string","enum":["tool_request","alternative_switch","comparison_evaluation","hiring_outsourcing","troubleshooting_fix","pain_frustration","discussion"]},"maxItems":7,"uniqueItems":true},"tracked_competitors":{"type":"array","items":{"type":"string","maxLength":500},"maxItems":10},"min_likes_filter":{"type":"integer","minimum":0},"min_comments_filter":{"type":"integer","minimum":0},"max_post_age_days_filter":{"type":"integer","minimum":1},"negative_keywords":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"example_responses":{"type":"array","items":{"type":"string","maxLength":2000},"maxItems":10},"use_same_settings_for_comments_and_dms":{"type":"boolean"},"reply_settings":{"type":"object","description":"AI reply settings used for comment suggestions.","properties":{"use_custom_prompt":{"type":"boolean"},"custom_prompt_instructions":{"type":"string","maxLength":2000},"reply_tone":{"type":"string","maxLength":100},"reply_length":{"type":"string","maxLength":100},"reply_pitch_level":{"type":"string","maxLength":100},"reply_call_to_action":{"type":"boolean"},"reply_personalization":{"type":"boolean"},"reply_keywords":{"type":"string","maxLength":500}},"additionalProperties":false},"dm_reply_settings":{"type":"object","description":"AI reply settings used for Reddit DMs. Ignored when use_same_settings_for_comments_and_dms is true.","properties":{"dm_use_custom_prompt":{"type":"boolean"},"dm_custom_prompt_instructions":{"type":"string","maxLength":2000},"dm_reply_tone":{"type":"string","maxLength":100},"dm_reply_length":{"type":"string","maxLength":100},"dm_reply_pitch_level":{"type":"string","maxLength":100},"dm_reply_call_to_action":{"type":"boolean"},"dm_reply_personalization":{"type":"boolean"},"dm_reply_keywords":{"type":"string","maxLength":500}},"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"leadverse_campaign_delete","summary":"Delete campaign","description":"Permanently delete a campaign and its leads. This cannot be undone - always confirm with the user first, quoting the campaign name.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to delete."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/syncs":{"post":{"operationId":"leadverse_campaign_sync","summary":"Start campaign sync","description":"Run a manual sync now to look for new leads. Consumes one of the plan's manual syncs for the day. The sync continues in the background after this returns; use leadverse_campaign_syncs_list to check progress, then call leadverse_leads_search after completion. Any _internal_sync_reference in the result is for tool coordination only; never mention it to the user.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to sync."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"leadverse_campaign_syncs_list","summary":"List campaign syncs","description":"List a campaign's sync runs using the same history as the Leadverse campaign screen. Use it after campaign creation or a manual sync to check whether processing is still running, completed, failed or skipped and to read progress plus strong and partial match counts. Results are newest first and paginated. Internal sync references are for tool coordination only; never mention them to the user.\n\nRequired key scope: read. Result is wrapped in data.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign whose sync progress and history should be read."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/blocklist":{"patch":{"operationId":"leadverse_campaign_blocklist_update","summary":"Update blocklist","description":"Block or unblock Reddit users and subreddits for a campaign. Blocked sources stop producing leads. Use this when the user says a subreddit or poster is irrelevant.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to update."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"block_users":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"unblock_users":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"block_subreddits":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"unblock_subreddits":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"apply_to_all_campaigns":{"type":"boolean","description":"Apply the same change to every campaign on the account, matching the UI checkbox."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/targeting/load":{"post":{"operationId":"leadverse_campaign_targeting_get","summary":"Load targeting editor","description":"Read the editable targeting sections that decide which posts score as leads - the same fields the \"Optimize leads\" screen shows. Returns the section values plus their maximum lengths. The section names differ between product and service campaigns; always read before writing so you send the right ones. Note: if the campaign is still on an older targeting model, this upgrades it first, which can take a minute.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to read targeting for."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/targeting":{"patch":{"operationId":"leadverse_campaign_targeting_update","summary":"Update targeting","description":"Rewrite the campaign's targeting sections. Call leadverse_campaign_targeting_get first and send back the same section keys it returned, respecting the returned length limits. This regenerates the scoring model and changes which posts become leads from the next sync onward. It does not rescore existing leads.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["campaigns"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to update."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sections":{"type":"object","description":"Section key/value pairs exactly as returned by leadverse_campaign_targeting_get.","minProperties":1,"additionalProperties":{"type":"string","maxLength":1200}}},"required":["sections"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads":{"get":{"operationId":"leadverse_leads_search","summary":"Search leads","description":"Search and filter leads across campaigns by status, buying intent, platform and free text. Returns STRONG matches (AI score 8-10) by default - in Leadverse those are the leads. Scores 6-7 are partial matches: weaker signals that can be useful for product research but are not leads, and are excluded unless you pass match: \"partial\". Anything below 6 is noise and is never returned. Never describe partial matches or total row counts as lead volume. Returns the post, its AI score and the lead status. Each lead also carries author_dm_contact: when set, this user already sent (or queued) a DM to that lead's Reddit author via another lead, and a second DM would be refused - when picking leads to DM, pass exclude_contacted_authors: true. Defaults to every platform, matching the Leads screen; pass platforms: [\"reddit\"] to exclude older leads from platforms Leadverse no longer syncs.\n\nRequired key scope: read. Result is wrapped in data.","tags":["leads"],"parameters":[{"name":"campaign_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":""},"maxItems":20},"style":"form","explode":true},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["new","contacted","closed","all"]},"style":"form","explode":true},{"name":"platforms","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["reddit","x","linkedin","facebook"]},"maxItems":4,"uniqueItems":true,"description":"Restrict to these platforms. Omit for all, as the Leads screen does."},"style":"form","explode":true},{"name":"categories","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","enum":["tool_request","alternative_switch","comparison_evaluation","hiring_outsourcing","troubleshooting_fix","pain_frustration","discussion"]},"maxItems":7,"uniqueItems":true},"style":"form","explode":true},{"name":"match","in":"query","required":false,"schema":{"type":"string","enum":["strong","partial","all"],"description":"strong (score 8-10) is the default and is what \"leads\" means. partial (6-7) are weaker signals, useful for product research but not leads. all (1-10) includes noise and should only be used if explicitly asked."},"style":"form","explode":true},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":200},"style":"form","explode":true},{"name":"exclude_contacted_authors","in":"query","required":false,"schema":{"type":"boolean","description":"Drop leads whose Reddit author was already DM'd or has a DM queued (author_dm_contact set). Use when selecting leads to DM."},"style":"form","explode":true},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["ai_score","created_date","post_created_date"]},"style":"form","explode":true},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads/{lead_id}":{"get":{"operationId":"leadverse_lead_get","summary":"Get lead","description":"Full detail for one lead: the complete post or comment, its AI score and the reasoning behind it, the subreddit's self-promotion policy, and the history of actions already taken on it.\n\nRequired key scope: read. Result is wrapped in data.","tags":["leads"],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."}}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads/status":{"patch":{"operationId":"leadverse_lead_update_status","summary":"Update lead status","description":"Set the status of up to 50 leads at once (new, contacted or closed).\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["leads"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_ids":{"type":"array","items":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."},"minItems":1,"maxItems":50,"uniqueItems":true},"status":{"type":"string","enum":["new","contacted","closed"]}},"required":["lead_ids","status"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads/delete":{"post":{"operationId":"leadverse_lead_delete","summary":"Delete leads","description":"Remove leads from the list. By default this hides them the same way the per-lead Delete button does, which also teaches the ranking model they were unwanted. Pass permanent: true only when the user explicitly wants the rows erased. Always confirm before deleting.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["leads"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_ids":{"type":"array","items":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."},"minItems":1,"maxItems":50,"uniqueItems":true},"permanent":{"type":"boolean","description":"Erase the rows instead of hiding them. Irreversible."}},"required":["lead_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads/{lead_id}/drafts":{"post":{"operationId":"leadverse_reply_draft","summary":"Draft a reply","description":"Generate a reply for a lead using the campaign's own AI reply settings, exactly as the Generate button in Leadverse does - its tone, length, pitch, call to action, keywords and voice-training samples, or its custom prompt instructions if the campaign is configured that way. To change how replies read, edit the campaign with leadverse_campaign_update rather than asking for a one-off variation. Consumes one AI reply from the plan's allowance. Returns text only - nothing is sent or posted. Comment drafts are SUGGESTIONS the user posts themselves; Leadverse never posts comments to Reddit. To deliver a DM use leadverse_dm_send or leadverse_dm_queue_add. A first DM is deliberately short, casual and link-free, and often stays general rather than quoting specifics from the post - that is correct, not a weakness. Reddit filters link-heavy messages from cold senders into spam, so the goal of message one is only to get a reply. Do not rewrite the draft to add links, the product name, or more detail unless the user asks. Once they reply, leadverse_conversation_reply is the safe place to send links.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["comment","dm"]}},"required":["type"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leads/{lead_id}/messages":{"post":{"operationId":"leadverse_dm_send","summary":"Send a Reddit DM","description":"Send a Reddit DM to one lead right now from the connected account, the same as the Send button on a lead in Leadverse. Sending is immediate and cannot be undone - always show the user the exact message and get confirmation first. Daily DM caps and account limits are enforced; if one is hit the send is refused and nothing is delivered. Each Reddit author can be DM'd only once across all leads: if the lead's author_dm_contact field is set the send will be refused, so pick leads without it (leadverse_leads_search with exclude_contacted_authors: true). For more than a few leads use leadverse_dm_queue_add instead, which paces delivery.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"lead_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":10000,"description":"The exact DM text to send. Never send a draft the user has not seen."}},"required":["message"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/dm-queue":{"post":{"operationId":"leadverse_dm_queue_add","summary":"Queue Reddit DMs","description":"Queue Reddit DMs to leads. Leadverse delivers them automatically using the account's pacing and daily limits - there is no further confirmation step, so treat queueing as the user's approval to send. Leave content empty and Leadverse writes each DM in the campaign voice just before it goes out. Leads whose Reddit author was already DM'd or queued (even via another lead) are skipped and reported in skippedAuthorContacted. Pass dry_run: true to check capacity and eligibility without queueing anything.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign the leads belong to."},"lead_ids":{"type":"array","items":{"type":"integer","minimum":1,"description":"Numeric Leadverse lead id."},"minItems":1,"maxItems":50,"uniqueItems":true},"dry_run":{"type":"boolean","description":"Report what would happen without queueing."}},"required":["campaign_id","lead_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"operationId":"leadverse_dm_queue_list","summary":"List queued DMs","description":"List DMs waiting to be sent, with their scheduled send time and current content.\n\nRequired key scope: read. Result is wrapped in data.","tags":["outreach"],"parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Restrict to one campaign."},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/dm-queue/{queued_dm_id}":{"patch":{"operationId":"leadverse_dm_queue_update","summary":"Edit queued DM","description":"Rewrite the content of a queued DM. Only possible while it is still waiting - once Leadverse starts sending it, the edit is refused.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"queued_dm_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Queued DM to edit."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":5000}},"required":["content"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"leadverse_dm_queue_remove","summary":"Remove queued DM","description":"Remove a DM from the queue so it is never sent. Only possible while it is still waiting.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"queued_dm_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Queued DM to remove."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/dm-queue/{queued_dm_id}/generate":{"post":{"operationId":"leadverse_dm_queue_generate","summary":"Generate queued DM","description":"Generate or regenerate the content of a queued DM using the same campaign settings and protected workflow as the Generate button in the Leadverse queue. Consumes one AI reply allowance and saves the generated text directly onto the queued DM, where it can still be edited before delivery.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"queued_dm_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Queued DM whose content should be generated."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/outreach-agent":{"get":{"operationId":"leadverse_outreach_agent_get","summary":"Get outreach agent","description":"Read the outreach agent configuration for a campaign: whether it is on, its daily DM limit, the minimum lead score it acts on, and follow-up settings.\n\nRequired key scope: read. Result is wrapped in data.","tags":["outreach"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to read."}}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"leadverse_outreach_agent_configure","summary":"Configure outreach agent","description":"Configure the outreach agent. Enabling it lets Leadverse find qualifying leads and send them DMs automatically, every day, without asking again - say this plainly to the user and get explicit confirmation before enabling. Requires a connected Reddit account, which must be set up in the Leadverse UI. The daily limit is capped by the plan. If the response includes reddit_account_health, relay that warning to the user - their Reddit account is at elevated risk of being flagged for automated DMs.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["outreach"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Campaign to configure."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"is_enabled":{"type":"boolean"},"daily_limit":{"type":"integer","minimum":1,"maximum":100},"min_lead_score":{"type":"integer","minimum":1,"maximum":10},"followup_enabled":{"type":"boolean"},"followup_reminder_delay_days":{"type":"integer","minimum":1,"maximum":7}},"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/conversations":{"get":{"operationId":"leadverse_conversations_list","summary":"List conversations","description":"List Reddit DM threads with their normalized latest messages. Uses the same four sort options as the Leadverse Conversations screen and returns pagination metadata.\n\nRequired key scope: read. Result is wrapped in data.","tags":["conversations"],"parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Restrict to one campaign."},"style":"form","explode":true},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["all","replied","awaiting"],"description":"Matches the All, Replied and Awaiting tabs in the Conversations screen."},"style":"form","explode":true},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["priority","recent_activity","newest_reply","newest_sent"],"description":"Defaults to priority, matching the Conversations screen."},"style":"form","explode":true},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":200,"description":"Search recipient, subreddit, post title, tags or latest message."},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/conversations/{conversation_id}":{"get":{"operationId":"leadverse_conversation_get","summary":"Get conversation","description":"Read one page of a Reddit DM thread, newest page first. Messages inside each page are returned oldest to newest; use offset and has_more to load earlier messages.\n\nRequired key scope: read. Result is wrapped in data.","tags":["conversations"],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Conversation to read."}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/conversations/{conversation_id}/replies":{"post":{"operationId":"leadverse_conversation_reply","summary":"Reply to conversation","description":"Send a reply in an existing Reddit DM thread from the connected account. This is where links and specifics belong - the conversation is already live, so Reddit spam filtering is no longer a concern. Only possible when the lead sent the most recent message - you cannot send two messages in a row without a response, exactly as in the Leadverse inbox. Sends immediately and cannot be undone, so always show the user the exact text and get confirmation first. Subject to the daily reply limit.\n\nRequired key scope: write. Runs asynchronously. A successful HTTP response acknowledges the operation, not completion. Explicitly sending this request authorizes its effects. Inspect the operation status and result.","tags":["conversations"],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Conversation to reply in."}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._:-]{8,128}$"},"description":"Reuse for retries of the same request. Receipts are retained for at least 7 days. A UUID is recommended."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":10000}},"required":["message"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"202":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/insights/leads":{"get":{"operationId":"leadverse_insights_leads","summary":"Lead insights","description":"Lead analytics: volume over time, top subreddits, buying-intent breakdown and recurring pain points.\n\nRequired key scope: read. Result is wrapped in data.","tags":["insights"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Restrict to one campaign."}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/insights/outreach":{"get":{"operationId":"leadverse_insights_outreach","summary":"Outreach insights","description":"Outreach analytics: DMs sent, reply rate and outcomes over time.\n\nRequired key scope: read. Result is wrapped in data.","tags":["insights"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Restrict to one campaign."}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/campaigns/{campaign_id}/market-signals":{"get":{"operationId":"leadverse_market_signals","summary":"Market signals","description":"Demand signals mined from tracked discussions - what people are asking for, complaining about and comparing. Pass category \"competitors\" for competitor-specific chatter.\n\nRequired key scope: read. Result is wrapped in data.","tags":["insights"],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Restrict to one campaign."}},{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["market","competitors"]},"style":"form","explode":true},{"name":"sort","in":"query","required":false,"schema":{"type":"string","enum":["top","recent"]},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/competitors":{"get":{"operationId":"leadverse_competitors","summary":"Competitors","description":"Tracked competitors with their recent posts, engagement and trend data.\n\nRequired key scope: read. Result is wrapped in data.","tags":["insights"],"parameters":[{"name":"campaign_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":""},"maxItems":20},"style":"form","explode":true},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":365},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/viral-posts":{"get":{"operationId":"leadverse_viral_posts","summary":"Viral posts","description":"High-performing Reddit posts in the account's tracked subreddits, useful as templates for what gets traction.\n\nRequired key scope: read. Result is wrapped in data.","tags":["insights"],"parameters":[{"name":"subreddits","in":"query","required":false,"schema":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":20},"style":"form","explode":true},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":200},"style":"form","explode":true},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","enum":["likes","comments","post_created_date"]},"style":"form","explode":true},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","enum":["asc","desc"]},"style":"form","explode":true},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"description":"Rows to return (max 50)."},"style":"form","explode":true},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":100000},"style":"form","explode":true}],"responses":{"200":{"description":"Tool result, including its pagination fields when applicable.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{}}}}}},"400":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/operations/{operation_id}":{"get":{"operationId":"get_operation","summary":"Get operation status and result","tags":["operations"],"description":"Requires the same active API key that created the operation. Polling counts toward rate limits. Unknown operations must be reconciled before starting another request.","parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Operation receipt. Poll its URL with the same API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationResponse"}}}},"401":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Request rejected. See error.code.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"Leadverse API key"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"OperationResponse":{"type":"object","required":["operation"],"properties":{"operation":{"type":"object","required":["id","status","url"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["running","succeeded","failed","unknown"]},"url":{"type":"string"},"created_date":{"type":"string"},"completed_date":{"type":["string","null"]},"result":{},"error":{"type":["object","null"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}