Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs.
This is the step every competing product replaces with an empty keyword box.
Rate limited to 5 calls an hour per key, and counted against the workspace’s monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded.
To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.
A workspace API key, created in workspace settings and sent as Authorization: Bearer op_live_…. Session cookies are not accepted. Scopes: signals:read, accounts:read, listeners:read, listeners:analyse, pipeline:read, pipeline:write, collections:write, export:read.
Body
application/json
The wizard's step-1 answers. sources and objective decide the mode: find_local_prospects plans a places listener, find_dissatisfaction plans a rivals listener, and every other objective plans market.
What the listener is for. find_dissatisfaction returns a rival profile (competitor names, pain vocabulary); find_local_prospects returns a places profile (categories, locations); every other value, including custom, returns a market keyword plan.
Set on a retry to proceed without a successful crawl, planning from description instead. Sending it true on the first call skips the crawl for no reason, since there is no description yet to plan from.
Competitors you already know about, read only when objective is find_dissatisfaction. The planner treats these as authoritative and fills in the ones it finds that you missed, which is the difference between a rival list you trust and one you have to check.
A competitor's name.
Maximum string length: 120
Response
A complete listener plan, generated and not applied — nothing is created here. crawlSource says whether this came from the site or from your description, which is worth recording: it later tells "this listener underperforms" apart from "this listener was built blind".
A complete listener plan derived from a website: everything the create call needs, with nothing applied yet. Edit it and pass the parts you want.
Which crawler produced the text. none is not a crawler — it records that no crawler could read the site and the plan came from description instead, which is what later tells "this listener underperforms" apart from "this listener was built blind".
The search plan, plus what the crawl learned about the seller. The two halves answer the same question from opposite ends: the plan is what a buyer would say, the offering is what you would reply.
Who else the market is paying, and what they say when it disappoints them. painVocabulary is separate from the plan's includeKeywords on purpose: a review reading "rude staff, an hour on hold" shares no keyword with "scheduling software", so the on-topic words for this mode have to be the words of the complaint rather than of the product.
Local prospecting: the businesses whose own reviews are read for evidence of the problem this product solves.
Show child attributes
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Open Pulse","description":"Open Pulse finds public conversations that are evidence somebody has a budgeted problem, and scores each one against what you sell.","colors":{"primary":"#446317","light":"#C6E868","dark":"#446317"},"logo":{"light":"https://mintcdn.com/open-pulse/2lhu05m2dSiIFlof/logo/light.svg?fit=max\u0026auto=format\u0026n=2lhu05m2dSiIFlof\u0026q=85\u0026s=a403a5531b58270dadb02f1862164683","dark":"https://mintcdn.com/open-pulse/2lhu05m2dSiIFlof/logo/dark.svg?fit=max\u0026auto=format\u0026n=2lhu05m2dSiIFlof\u0026q=85\u0026s=518fb339322cbf15840dff18d8da3847"},"favicon":"https://mintcdn.com/open-pulse/P8LbHWHUpEv-R7cz/favicon.svg?fit=max\u0026auto=format\u0026n=P8LbHWHUpEv-R7cz\u0026q=85\u0026s=4f377ad25662c68808d611467995875a","navbar":{"links":[{"href":"https://openpulse.cloud/sign-in","label":"Sign in"}],"primary":{"type":"button","label":"Get started","href":"https://openpulse.cloud/pricing"}},"footer":{"links":[{"header":"Open Pulse","items":[{"label":"Product","href":"https://openpulse.cloud"},{"label":"Pricing","href":"https://openpulse.cloud/pricing"},{"label":"Developers","href":"https://openpulse.cloud/developers"}]},{"header":"Follow","items":[{"label":"TikTok","href":"https://www.tiktok.com/@getopenpulse"},{"label":"X","href":"https://x.com/getopenpulse"},{"label":"Instagram","href":"https://www.instagram.com/getopenpulse"}]}]},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"open-pulse","hasAudioNarration":false,"actualSubdomain":"open-pulse","customDomains":["docs.openpulse.cloud"],"gitSource":{"type":"github","owner":"optiqlabs","repo":"open-pulse","deployBranch":"develop","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae17d044eb6f5188cc094f4","collectionId":"88fa9485-d841-4c17-9d70-2fa1eaff8c23","liveDeploymentHistoryId":"6ae17d044eb6f5188cc094f4","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ae17d044eb6f5188cc094f4","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"Guides","count":22},{"language":"default","tag":"API Reference","count":20},{"language":"default","tag":"Integrations","count":5},{"language":"default","tag":"Pipeline","count":5},{"language":"default","tag":"Selling Surfaces","count":4},{"language":"default","tag":"Results","count":4},{"language":"default","tag":"Working Leads","count":3},{"language":"default","tag":"Delivering \u0026 Managing","count":3},{"language":"default","tag":"Listeners \u0026 Runs","count":3},{"language":"default","tag":"Exports","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/listeners/derive-a-listener-plan-from-a-website","slug":"/api-reference/listeners/derive-a-listener-plan-from-a-website","pageMetadata":{"title":"Derive a listener plan from a website","description":"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs.\n\nThis is the step every competing product replaces with an empty keyword box.\n\nRate limited to 5 calls an hour per key, and counted against the workspace's monthly allowance. An unreadable website answers 422 with `website_unreadable` rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded.\n\nTo recover from a `website_unreadable` 422, resend the same request with `description` filled in and `acceptLimited: true`: the plan is then generated from the description instead of a crawl.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/listeners/analyse-website","href":"/api-reference/listeners/derive-a-listener-plan-from-a-website","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsx(_components.p, {\n children: \"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs.\"\n }), \"\\n\", _jsx(_components.p, {\n children: \"This is the step every competing product replaces with an empty keyword box.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Rate limited to 5 calls an hour per key, and counted against the workspace’s monthly allowance. An unreadable website answers 422 with \", _jsx(_components.code, {\n children: \"website_unreadable\"\n }), \" rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"To recover from a \", _jsx(_components.code, {\n children: \"website_unreadable\"\n }), \" 422, resend the same request with \", _jsx(_components.code, {\n children: \"description\"\n }), \" filled in and \", _jsx(_components.code, {\n children: \"acceptLimited: true\"\n }), \": the plan is then generated from the description instead of a crawl.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Derive a listener plan from a website","description":"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs.\n\nThis is the step every competing product replaces with an empty keyword box.\n\nRate limited to 5 calls an hour per key, and counted against the workspace's monthly allowance. An unreadable website answers 422 with `website_unreadable` rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded.\n\nTo recover from a `website_unreadable` 422, resend the same request with `description` filled in and `acceptLimited: true`: the plan is then generated from the description instead of a crawl.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/listeners/analyse-website","href":"/api-reference/listeners/derive-a-listener-plan-from-a-website","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"postV1ListenersAnalyseWebsite","summary":"Derive a listener plan from a website","description":"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs.\n\nThis is the step every competing product replaces with an empty keyword box.\n\nRate limited to 5 calls an hour per key, and counted against the workspace's monthly allowance. An unreadable website answers 422 with `website_unreadable` rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded.\n\nTo recover from a `website_unreadable` 422, resend the same request with `description` filled in and `acceptLimited: true`: the plan is then generated from the description instead of a crawl.","tags":["listeners"],"security":["023887b6-2825-4caa-8110-cb21b8a103d3"],"parameters":[],"requestBody":"a2755ebb-58bc-49c1-8407-b7121067cc8a","responses":{"200":"6cb34e32-11b1-4c56-a230-3214be823c88","400":"e30b17cb-87d9-4f5c-84b5-e71558d7a676","401":"c5d6f6ab-326d-4a19-a9cd-268638f1d3f9","403":"1e611238-8ebf-4033-a2e5-e2dae5017a18","422":"1cfcbc56-706c-4b8d-bd7f-edd053ebe3c4","429":"db2f38b2-0399-4219-90fe-9b97878ac5da","502":"2faaf773-8d5a-4ed5-9769-404c636d04d7"},"method":"post","type":"path","servers":["15b4899c-a482-4812-8f0c-fad24a079ee3"],"path":"/v1/listeners/analyse-website","baseUrlOptions":["https://api.openpulse.cloud"],"title":"Derive a listener plan from a website","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"description":"The wizard's step-1 answers. `sources` and `objective` decide the mode: `find_local_prospects` plans a `places` listener, `find_dissatisfaction` plans a `rivals` listener, and every other objective plans `market`.","content":{"application/json":{"schema":{"type":"object","required":["companyName","website","objective","sources"],"properties":{"companyName":{"type":"string","minLength":2,"maxLength":120,"description":"The company's name.","isRequired":true,"uniqueKey":"companyName","typeLabel":"string"},"website":{"type":"string","format":"uri","description":"The company's homepage. This is what gets crawled.","isRequired":true,"uniqueKey":"website","typeLabel":"string\u003curi>"},"objective":{"type":"string","enum":["find_customers","find_competitors","find_partnerships","find_dissatisfaction","find_local_prospects","custom"],"description":"What the listener is for. `find_dissatisfaction` returns a rival profile (competitor names, pain vocabulary); `find_local_prospects` returns a places profile (categories, locations); every other value, including `custom`, returns a market keyword plan.","isRequired":true,"uniqueKey":"objective","typeLabel":"enum\u003cstring>"},"sources":{"type":"array","items":{"type":"string","enum":["x","linkedin","facebook","reddit","hackernews","linkedin_jobs","indeed","ashby","greenhouse","lever","google_reviews","g2","trustpilot","youtube","vendor_community"],"description":"A platform.","uniqueKey":"sources.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Which platforms the resulting plan should carry queries for.","minItems":1,"isRequired":true,"uniqueKey":"sources","typeLabel":"enum\u003cstring>[]"},"customObjective":{"type":"string","maxLength":500,"description":"Free text describing the objective when `objective` is `custom`.","uniqueKey":"customObjective","typeLabel":"string"},"description":{"type":"string","maxLength":2000,"description":"A short description of the business, used to plan when the site cannot be crawled. Required on the retry that follows a `website_unreadable` 422.","uniqueKey":"description","typeLabel":"string"},"acceptLimited":{"type":"boolean","default":false,"description":"Set on a retry to proceed without a successful crawl, planning from `description` instead. Sending it `true` on the first call skips the crawl for no reason, since there is no `description` yet to plan from.","uniqueKey":"acceptLimited","typeLabel":"boolean"},"rivals":{"type":"array","items":{"type":"string","description":"A competitor's name.","maxLength":120,"uniqueKey":"rivals.items.[INDEX]","typeLabel":"string"},"description":"Competitors you already know about, read only when `objective` is `find_dissatisfaction`. The planner treats these as authoritative and fills in the ones it finds that you missed, which is the difference between a rival list you trust and one you have to check.","uniqueKey":"rivals","typeLabel":"string[]"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"companyName":"\u003cstring>","website":"\u003cstring>","sources":[],"customObjective":"\u003cstring>","description":"\u003cstring>","acceptLimited":false,"rivals":["\u003cstring>"]}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"6cb34e32-11b1-4c56-a230-3214be823c88":{"description":"A complete listener plan, generated and **not applied** — nothing is created here. `crawlSource` says whether this came from the site or from your `description`, which is worth recording: it later tells \"this listener underperforms\" apart from \"this listener was built blind\".","content":{"application/json":{"schema":{"type":"object","description":"A complete listener plan derived from a website: everything the create call needs, with nothing applied yet. Edit it and pass the parts you want.","required":["crawledUrl","crawlSource","pagesRead","plan"],"properties":{"crawledUrl":{"type":"string","description":"The URL that was actually read, after redirects.","format":"uri","isRequired":true,"uniqueKey":"crawledUrl","typeLabel":"string\u003curi>"},"crawlSource":{"type":"string","enum":["context","firecrawl","fallback","none"],"description":"Which crawler produced the text. **`none` is not a crawler** — it records that no crawler could read the site and the plan came from `description` instead, which is what later tells \"this listener underperforms\" apart from \"this listener was built blind\".","isRequired":true,"uniqueKey":"crawlSource","typeLabel":"enum\u003cstring>"},"pagesRead":{"type":"array","items":{"type":"string","description":"A URL.","format":"uri","uniqueKey":"pagesRead.items.[INDEX]","typeLabel":"string\u003curi>"},"description":"Which pages the plan was generated from.","isRequired":true,"uniqueKey":"pagesRead","typeLabel":"string\u003curi>[]"},"plan":{"type":"object","description":"The search plan, plus what the crawl learned about the seller. The two halves answer the same question from opposite ends: the plan is what a buyer would say, the offering is what you would reply.","required":["summary","includeKeywords","excludeKeywords","queries","offering","audience","capabilities"],"properties":{"summary":{"type":"string","description":"What the listener is looking for, in one paragraph.","isRequired":true,"uniqueKey":"plan.summary","typeLabel":"string"},"includeKeywords":{"type":"array","items":{"type":"string","description":"A keyword.","uniqueKey":"plan.includeKeywords.items.[INDEX]","typeLabel":"string"},"description":"The on-topic gate. **At least one** — a plan with none would admit everything.","minItems":1,"isRequired":true,"uniqueKey":"plan.includeKeywords","typeLabel":"string[]"},"excludeKeywords":{"type":"array","items":{"type":"string","description":"A keyword.","uniqueKey":"plan.excludeKeywords.items.[INDEX]","typeLabel":"string"},"description":"Phrases that disqualify a candidate outright.","isRequired":true,"uniqueKey":"plan.excludeKeywords","typeLabel":"string[]"},"queries":{"type":"array","items":{"type":"string","description":"A query.","uniqueKey":"plan.queries.items.[INDEX]","typeLabel":"string"},"description":"Flat list kept for older listeners; run against every selected source.","isRequired":true,"uniqueKey":"plan.queries","typeLabel":"string[]"},"offering":{"type":"string","description":"One sentence: what the seller's product is.","isRequired":true,"uniqueKey":"plan.offering","typeLabel":"string"},"audience":{"type":"string","description":"One sentence: who buys it.","isRequired":true,"uniqueKey":"plan.audience","typeLabel":"string"},"capabilities":{"type":"array","items":{"type":"string","description":"A short phrase.","uniqueKey":"plan.capabilities.items.[INDEX]","typeLabel":"string"},"description":"Concrete things the product does, for a draft to quote.","isRequired":true,"uniqueKey":"plan.capabilities","typeLabel":"string[]"},"plannedQueries":{"type":"array","items":{"type":"object","description":"A query aimed at the platforms whose phrasing it suits. Reddit rewards \"anyone using X\" phrasing and LinkedIn rewards topical phrasing; one set of queries against every platform is what produced most of the filler.","required":["text","sources"],"properties":{"text":{"type":"string","description":"The query itself.","isRequired":true,"uniqueKey":"plan.plannedQueries.items.[INDEX].text","typeLabel":"string"},"sources":{"type":"array","items":{"type":"string","enum":["x","linkedin","facebook","reddit","hackernews","linkedin_jobs","indeed","ashby","greenhouse","lever","google_reviews","g2","trustpilot","youtube","vendor_community"],"description":"A platform.","uniqueKey":"plan.plannedQueries.items.[INDEX].sources.items.[INDEX]","typeLabel":"enum\u003cstring>"},"description":"Where to run it.","isRequired":true,"uniqueKey":"plan.plannedQueries.items.[INDEX].sources","typeLabel":"enum\u003cstring>[]"},"intent":{"type":"string","description":"What it is trying to catch, for the per-query yield report.","uniqueKey":"plan.plannedQueries.items.[INDEX].intent","typeLabel":"string"}},"uniqueKey":"plan.plannedQueries.items.[INDEX]","typeLabel":"object"},"description":"Per-source queries. **Preferred over `queries` when present.**","uniqueKey":"plan.plannedQueries","typeLabel":"object[]"},"disabledQueries":{"type":"array","items":{"type":"string","description":"A query text.","uniqueKey":"plan.disabledQueries.items.[INDEX]","typeLabel":"string"},"description":"Queries auto-disabled for never yielding a signal.","uniqueKey":"plan.disabledQueries","typeLabel":"string[]"},"differentiator":{"type":"string","description":"Why someone picks it over the obvious alternative, when the site says.","uniqueKey":"plan.differentiator","typeLabel":"string"}},"isRequired":true,"uniqueKey":"plan","typeLabel":"object"},"siteTitle":{"type":"string","description":"The site's own title, when it had one.","uniqueKey":"siteTitle","typeLabel":"string"},"rivalProfile":{"type":"object","description":"Who else the market is paying, and what they say when it disappoints them. `painVocabulary` is separate from the plan's `includeKeywords` on purpose: a review reading \"rude staff, an hour on hold\" shares no keyword with \"scheduling software\", so the on-topic words for this mode have to be the words of the complaint rather than of the product.","required":["rivals","painVocabulary"],"properties":{"rivals":{"type":"array","items":{"type":"object","description":"One competitor a `rivals` listener watches.","required":["name","aliases","places"],"properties":{"name":{"type":"string","description":"The rival's name.","isRequired":true,"uniqueKey":"rivalProfile.rivals.items.[INDEX].name","typeLabel":"string"},"aliases":{"type":"array","items":{"type":"string","description":"An alias.","uniqueKey":"rivalProfile.rivals.items.[INDEX].aliases.items.[INDEX]","typeLabel":"string"},"description":"What people actually type: \"HubSpot\", \"hubspot\", \"HS\".","isRequired":true,"uniqueKey":"rivalProfile.rivals.items.[INDEX].aliases","typeLabel":"string[]"},"places":{"type":"array","items":{"type":"object","description":"A specific business on Google Maps, confirmed by a person in the wizard.","required":["placeId","name"],"properties":{"placeId":{"type":"string","description":"Google's stable identifier.","isRequired":true,"uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].placeId","typeLabel":"string"},"name":{"type":"string","description":"The business's name.","isRequired":true,"uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].name","typeLabel":"string"},"cid":{"type":"string","description":"Maps cluster id, which the reviews endpoint prefers.","uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].cid","typeLabel":"string"},"address":{"type":"string","description":"Its address, as Maps reports it.","uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].address","typeLabel":"string"},"rating":{"type":"number","description":"Its overall rating.","minimum":0,"maximum":5,"uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].rating","typeLabel":"number"},"reviewCount":{"type":"integer","description":"Its lifetime review count, which is not the number read.","minimum":0,"uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX].reviewCount","typeLabel":"integer"}},"uniqueKey":"rivalProfile.rivals.items.[INDEX].places.items.[INDEX]","typeLabel":"object"},"description":"Its locations, when it has physical ones worth reading reviews of.","isRequired":true,"uniqueKey":"rivalProfile.rivals.items.[INDEX].places","typeLabel":"object[]"},"website":{"type":"string","description":"Its homepage.","format":"uri","uniqueKey":"rivalProfile.rivals.items.[INDEX].website","typeLabel":"string\u003curi>"},"provenance":{"type":"string","enum":["user","retrieved","model"],"description":"Where the name came from. Absent on listeners created before discovery existed.","uniqueKey":"rivalProfile.rivals.items.[INDEX].provenance","typeLabel":"enum\u003cstring>"}},"uniqueKey":"rivalProfile.rivals.items.[INDEX]","typeLabel":"object"},"description":"The competitors being watched.","minItems":1,"isRequired":true,"uniqueKey":"rivalProfile.rivals","typeLabel":"object[]"},"painVocabulary":{"type":"array","items":{"type":"string","description":"A complaint phrase.","uniqueKey":"rivalProfile.painVocabulary.items.[INDEX]","typeLabel":"string"},"description":"What people say when fed up with them.","isRequired":true,"uniqueKey":"rivalProfile.painVocabulary","typeLabel":"string[]"},"rationale":{"type":"string","description":"Why these rivals, shown above the editor.","uniqueKey":"rivalProfile.rationale","typeLabel":"string"}},"uniqueKey":"rivalProfile","typeLabel":"object"},"placesProfile":{"type":"object","description":"Local prospecting: the businesses whose own reviews are read for evidence of the problem this product solves.","required":["categories","locations","places","painVocabulary"],"properties":{"categories":{"type":"array","items":{"type":"string","description":"A category.","uniqueKey":"placesProfile.categories.items.[INDEX]","typeLabel":"string"},"description":"Business categories as Maps would name them: \"dental clinic\", \"law firm\".","isRequired":true,"uniqueKey":"placesProfile.categories","typeLabel":"string[]"},"locations":{"type":"array","items":{"type":"string","description":"A city or region.","uniqueKey":"placesProfile.locations.items.[INDEX]","typeLabel":"string"},"description":"Where to search.","isRequired":true,"uniqueKey":"placesProfile.locations","typeLabel":"string[]"},"places":{"type":"array","items":{"type":"object","description":"A specific business on Google Maps, confirmed by a person in the wizard.","required":["placeId","name"],"properties":{"placeId":{"type":"string","description":"Google's stable identifier.","isRequired":true,"uniqueKey":"placesProfile.places.items.[INDEX].placeId","typeLabel":"string"},"name":{"type":"string","description":"The business's name.","isRequired":true,"uniqueKey":"placesProfile.places.items.[INDEX].name","typeLabel":"string"},"cid":{"type":"string","description":"Maps cluster id, which the reviews endpoint prefers.","uniqueKey":"placesProfile.places.items.[INDEX].cid","typeLabel":"string"},"address":{"type":"string","description":"Its address, as Maps reports it.","uniqueKey":"placesProfile.places.items.[INDEX].address","typeLabel":"string"},"rating":{"type":"number","description":"Its overall rating.","minimum":0,"maximum":5,"uniqueKey":"placesProfile.places.items.[INDEX].rating","typeLabel":"number"},"reviewCount":{"type":"integer","description":"Its lifetime review count, which is not the number read.","minimum":0,"uniqueKey":"placesProfile.places.items.[INDEX].reviewCount","typeLabel":"integer"}},"uniqueKey":"placesProfile.places.items.[INDEX]","typeLabel":"object"},"description":"The confirmed prospect list. **Reviews are only ever read for these.**","isRequired":true,"uniqueKey":"placesProfile.places","typeLabel":"object[]"},"painVocabulary":{"type":"array","items":{"type":"string","description":"A complaint phrase.","uniqueKey":"placesProfile.painVocabulary.items.[INDEX]","typeLabel":"string"},"description":"The complaints that mean this business needs what you sell.","isRequired":true,"uniqueKey":"placesProfile.painVocabulary","typeLabel":"string[]"},"rationale":{"type":"string","description":"Why these categories, shown above the editor.","uniqueKey":"placesProfile.rationale","typeLabel":"string"}},"uniqueKey":"placesProfile","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"crawledUrl":"\u003cstring>","crawlSource":"context","pagesRead":["\u003cstring>"],"plan":{"summary":"\u003cstring>","includeKeywords":["\u003cstring>"],"excludeKeywords":["\u003cstring>"],"queries":["\u003cstring>"],"offering":"\u003cstring>","audience":"\u003cstring>","capabilities":["\u003cstring>"],"plannedQueries":[{"text":"\u003cstring>","sources":["x"],"intent":"\u003cstring>"}],"disabledQueries":["\u003cstring>"],"differentiator":"\u003cstring>"},"siteTitle":"\u003cstring>","rivalProfile":{"rivals":[{"name":"\u003cstring>","aliases":["\u003cstring>"],"places":[{"placeId":"\u003cstring>","name":"\u003cstring>","cid":"\u003cstring>","address":"\u003cstring>","rating":2.5,"reviewCount":1}],"website":"\u003cstring>","provenance":"user"}],"painVocabulary":["\u003cstring>"],"rationale":"\u003cstring>"},"placesProfile":{"categories":["\u003cstring>"],"locations":["\u003cstring>"],"places":[{"placeId":"\u003cstring>","name":"\u003cstring>","cid":"\u003cstring>","address":"\u003cstring>","rating":2.5,"reviewCount":1}],"painVocabulary":["\u003cstring>"],"rationale":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"e30b17cb-87d9-4f5c-84b5-e71558d7a676":{"description":"The body fails validation — a missing field, an empty `sources`, or a `website` that is not a full URL.","content":{"application/json":{"schema":{"type":"object","description":"What went wrong, in a shape every failing route shares.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code, when the failure has one worth branching on. `website_unreadable` and `forbidden` are the two a caller acts on.","uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Validator output on a 400, as an array of issues naming the offending field. Diagnostic only: the shape comes from the validation library and is not part of the contract.","uniqueKey":"detail","typeLabel":"any"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","detail":"\u003cunknown>"}}},"exampleType":"generated"}},"exampleType":"generated"},"c5d6f6ab-326d-4a19-a9cd-268638f1d3f9":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"type":"object","description":"What went wrong, in a shape every failing route shares.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code, when the failure has one worth branching on. `website_unreadable` and `forbidden` are the two a caller acts on.","uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Validator output on a 400, as an array of issues naming the offending field. Diagnostic only: the shape comes from the validation library and is not part of the contract.","uniqueKey":"detail","typeLabel":"any"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","detail":"\u003cunknown>"}}},"exampleType":"generated"}},"exampleType":"generated"},"1e611238-8ebf-4033-a2e5-e2dae5017a18":{"description":"The key lacks the `listeners:analyse` scope.","content":{"application/json":{"schema":{"type":"object","description":"What went wrong, in a shape every failing route shares.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code, when the failure has one worth branching on. `website_unreadable` and `forbidden` are the two a caller acts on.","uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Validator output on a 400, as an array of issues naming the offending field. Diagnostic only: the shape comes from the validation library and is not part of the contract.","uniqueKey":"detail","typeLabel":"any"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","detail":"\u003cunknown>"}}},"exampleType":"generated"}},"exampleType":"generated"},"1cfcbc56-706c-4b8d-bd7f-edd053ebe3c4":{"description":"`website_unreadable`: no crawler could read the site — a JavaScript-only page, a thin splash, a bot wall. **Not an error and not a dead end**: resend with `description` filled in and `acceptLimited: true` to plan from that instead. Nothing was counted against the allowance.","content":{"application/json":{"schema":{"type":"object","description":"What went wrong, in a shape every failing route shares.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code, when the failure has one worth branching on. `website_unreadable` and `forbidden` are the two a caller acts on.","uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Validator output on a 400, as an array of issues naming the offending field. Diagnostic only: the shape comes from the validation library and is not part of the contract.","uniqueKey":"detail","typeLabel":"any"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","detail":"\u003cunknown>"}}},"exampleType":"generated"}},"exampleType":"generated"},"db2f38b2-0399-4219-90fe-9b97878ac5da":{"description":"Either this key has made more than 5 analyses in an hour — `Retry-After` carries the seconds, and a second key resets nothing of the allowance — or the workspace's monthly analyses are spent, in which case the body carries `readyAt`, `used` and `allowed`.","content":{"application/json":{"schema":{"type":"object","description":"A refusal about timing: the workspace is entitled to this and has used its allowance for now. Sending a caller to checkout for this would be telling them to buy something they have already bought.","required":["message","code","plan","readyAt","used","allowed"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user. Names the plan where one would help.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","enum":["plan_required","listener_limit_reached","webhook_limit_reached","cadence_not_allowed","competitor_access_required","competitor_limit_reached","competitor_collect_cooldown","analyse_quota_reached","run_quota_reached","source_not_allowed","custom_scoring_access_required","collection_limit_reached","notes_access_required","account_access_required","territory_access_required","pipeline_access_required","assignment_access_required","export_quota_reached","crm_export_access_required","urgency_alert_access_required","draft_quota_reached","api_key_limit_reached","content_channel_access_required","image_draw_limit_reached","refinement_limit_reached","content_quota_reached"],"description":"Which entitlement was missing. Branch on this rather than on `message`.","isRequired":true,"uniqueKey":"code","typeLabel":"enum\u003cstring>"},"plan":{"type":"string","enum":["op_go","op_growth","op_pro","op_enterprise","none"],"description":"What the workspace holds today. `none` means no subscription.","isRequired":true,"uniqueKey":"plan","typeLabel":"enum\u003cstring>"},"readyAt":{"type":"string","format":"date-time","description":"When the caller may try again. Always populated: \"try again later\" without a time cannot be acted on.","isRequired":true,"uniqueKey":"readyAt","typeLabel":"string\u003cdate-time>"},"used":{"type":"integer","description":"How much of the allowance has been spent.","isRequired":true,"uniqueKey":"used","typeLabel":"integer"},"allowed":{"type":"integer","description":"The allowance for the period.","isRequired":true,"uniqueKey":"allowed","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"plan_required","plan":"op_go","readyAt":"2023-11-07T05:31:56Z","used":123,"allowed":123}}},"exampleType":"generated"}},"exampleType":"generated"},"2faaf773-8d5a-4ed5-9769-404c636d04d7":{"description":"The crawl or the planner failed for a reason that is ours rather than the site's. Retryable. Nothing was counted against the allowance.","content":{"application/json":{"schema":{"type":"object","description":"What went wrong, in a shape every failing route shares.","required":["message"],"properties":{"message":{"type":"string","description":"Human-readable explanation, safe to show a user.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"code":{"type":"string","description":"Stable machine-readable error code, when the failure has one worth branching on. `website_unreadable` and `forbidden` are the two a caller acts on.","uniqueKey":"code","typeLabel":"string"},"detail":{"description":"Validator output on a 400, as an array of issues naming the offending field. Diagnostic only: the shape comes from the validation library and is not part of the contract.","uniqueKey":"detail","typeLabel":"any"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"message":"\u003cstring>","code":"\u003cstring>","detail":"\u003cunknown>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"023887b6-2825-4caa-8110-cb21b8a103d3":{"apiKey":{"type":"http","scheme":"bearer","description":"A workspace API key, created in workspace settings and sent as `Authorization: Bearer op_live_…`. Session cookies are not accepted. Scopes: signals:read, accounts:read, listeners:read, listeners:analyse, pipeline:read, pipeline:write, collections:write, export:read.","scopes":["listeners:analyse"],"schemeName":"apiKey"}}},"servers":{"15b4899c-a482-4812-8f0c-fad24a079ee3":{"url":"https://api.openpulse.cloud","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"A workspace API key, created in workspace settings and sent as `Authorization: Bearer op_live_…`. Session cookies are not accepted. Scopes: signals:read, accounts:read, listeners:read, listeners:analyse, pipeline:read, pipeline:write, collections:write, export:read.","scopes":["listeners:analyse"],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"A workspace API key, created in workspace settings and sent as `Authorization: Bearer op_live_…`. Session cookies are not accepted. Scopes: signals:read, accounts:read, listeners:read, listeners:analyse, pipeline:read, pipeline:write, collections:write, export:read.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"open-pulse","siteName":"Open Pulse","title":"Derive a listener plan from a website - Open Pulse","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T06:52:28.429Z","originalFileLocation":"api-reference/listeners/derive-a-listener-plan-from-a-website.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs. This is the step every competing product replaces with an empty keyword box. Rate limited to 5 calls an hour per key, and counted against the workspace\u0026#x27;s monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded. To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Open Pulse\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Derive a listener plan from a website - Open Pulse\">\u003cmeta data-mint-head property=\"og:description\" content=\"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs. This is the step every competing product replaces with an empty keyword box. Rate limited to 5 calls an hour per key, and counted against the workspace\u0026#x27;s monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded. To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Open Pulse\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://open-pulse.mintlify.site/_mintlify/api/og/v2?division=Listeners\u0026amp;title=Derive+a+listener+plan+from+a+website\u0026amp;description=Crawls+a+website+and+returns+a+complete+listener+plan%3A+keywords%2C+exclusions%2C+per-source+queries%2C+and+a+mode-specific+profile+%E2%80%94+target+roles%2C+rival+names+and+pai\u0026amp;theme=d63bc05a3d20cd1eea42e14a\u0026amp;signature=9fc53baeb258bbcf782b29e7982ac9d6f1571a08f3c9dc38546df1d760526b08\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Derive a listener plan from a website - Open Pulse\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs. This is the step every competing product replaces with an empty keyword box. Rate limited to 5 calls an hour per key, and counted against the workspace\u0026#x27;s monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded. To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://open-pulse.mintlify.site/_mintlify/api/og/v2?division=Listeners\u0026amp;title=Derive+a+listener+plan+from+a+website\u0026amp;description=Crawls+a+website+and+returns+a+complete+listener+plan%3A+keywords%2C+exclusions%2C+per-source+queries%2C+and+a+mode-specific+profile+%E2%80%94+target+roles%2C+rival+names+and+pai\u0026amp;theme=d63bc05a3d20cd1eea42e14a\u0026amp;signature=9fc53baeb258bbcf782b29e7982ac9d6f1571a08f3c9dc38546df1d760526b08\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/open-pulse/_XSUl-ciJBzq3c0r/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Open Pulse\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#446317\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/listeners/derive-a-listener-plan-from-a-website.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.openpulse.cloud/#organization\",\"name\":\"Open Pulse\",\"url\":\"https://docs.openpulse.cloud\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/open-pulse/2lhu05m2dSiIFlof/logo/light.svg?fit=max\u0026auto=format\u0026n=2lhu05m2dSiIFlof\u0026q=85\u0026s=a403a5531b58270dadb02f1862164683\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.openpulse.cloud#website\",\"name\":\"Open Pulse\",\"url\":\"https://docs.openpulse.cloud\",\"publisher\":{\"@id\":\"https://docs.openpulse.cloud/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website#webpage\",\"url\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website\",\"name\":\"Derive a listener plan from a website\",\"description\":\"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs. This is the step every competing product replaces with an empty keyword box. Rate limited to 5 calls an hour per key, and counted against the workspace's monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded. To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.\",\"dateModified\":\"2026-10-27T06:52:28.429Z\",\"isPartOf\":{\"@id\":\"https://docs.openpulse.cloud#website\"},\"breadcrumb\":{\"@id\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Listeners\",\"item\":\"https://docs.openpulse.cloud/api-reference/listeners/list-listeners\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Derive a listener plan from a website\",\"item\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website#apireference\",\"headline\":\"Derive a listener plan from a website\",\"name\":\"Derive a listener plan from a website\",\"description\":\"Crawls a website and returns a complete listener plan: keywords, exclusions, per-source queries, and a mode-specific profile — target roles, rival names and pain vocabulary, or place categories. Everything is editable before it runs. This is the step every competing product replaces with an empty keyword box. Rate limited to 5 calls an hour per key, and counted against the workspace's monthly allowance. An unreadable website answers 422 with website_unreadable rather than an error: the caller is asked to describe the business instead. Nothing is counted against the allowance unless the analysis succeeded. To recover from a website_unreadable 422, resend the same request with description filled in and acceptLimited: true: the plan is then generated from the description instead of a crawl.\",\"url\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website\",\"mainEntityOfPage\":{\"@id\":\"https://docs.openpulse.cloud/api-reference/listeners/derive-a-listener-plan-from-a-website#webpage\"},\"dateModified\":\"2026-10-27T06:52:28.429Z\",\"publisher\":{\"@id\":\"https://docs.openpulse.cloud/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.openpulse.cloud#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Open Pulse\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Open Pulse","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","groups":[{"group":"Listeners","pages":[{"title":"List listeners","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/listeners","href":"/api-reference/listeners/list-listeners"},{"title":"Get one listener","description":"One listener with its full configuration — keywords, exclusions, per-source queries, sensitivity and schedule — plus its current scheduler state.\n\nAn id belonging to another workspace is indistinguishable from one that does not exist: both answer 404.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/listeners/{id}","href":"/api-reference/listeners/get-one-listener"},{"title":"Derive a listener plan from a website","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/listeners/analyse-website","href":"/api-reference/listeners/derive-a-listener-plan-from-a-website"}]},{"group":"Results","pages":[{"title":"List signals","description":"Kept signals across the workspace, newest first, cursor-paginated. A signal is one public post, job posting or review that a listener judged relevant, with its score and the reasoning behind it.\n\n`classification` values differ per listener mode: filtering by one from the wrong mode returns an empty page rather than an error, which reads as 'nothing found' and is not. Pass `listenerId` to scope the filter to a listener whose mode you know.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/results","href":"/api-reference/results/list-signals"},{"title":"Get one signal","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/results/{id}","href":"/api-reference/results/get-one-signal"},{"title":"Count signals in a window","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/results/stats","href":"/api-reference/results/count-signals-in-a-window"},{"title":"Save a signal to a list","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/signals/{id}/save","href":"/api-reference/signals/save-a-signal-to-a-list"}]},{"group":"Accounts","pages":[{"title":"List accounts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/accounts","href":"/api-reference/accounts/list-accounts"},{"title":"Get one account","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/accounts/{key}","href":"/api-reference/accounts/get-one-account"}]},{"group":"Pipeline","pages":[{"title":"List deals","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/pipeline","href":"/api-reference/pipeline/list-deals"},{"title":"Add a deal","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/pipeline","href":"/api-reference/pipeline/add-a-deal"},{"title":"Update a deal","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /v1/pipeline/{id}","href":"/api-reference/pipeline/update-a-deal"},{"title":"Add several deals at once","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/pipeline/bulk","href":"/api-reference/pipeline/add-several-deals-at-once"},{"title":"Pipeline return over a window","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/pipeline/roi","href":"/api-reference/pipeline/pipeline-return-over-a-window"}]},{"group":"Collections \u0026 Notes","pages":[{"title":"Create a list","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/collections","href":"/api-reference/collections/create-a-list"},{"title":"Write a note","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /v1/notes","href":"/api-reference/notes/write-a-note"}]},{"group":"Content","pages":[{"title":"Download a push's content as a zip","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/content/pushes/{id}/export.zip","href":"/api-reference/content/download-a-pushs-content-as-a-zip"}]},{"group":"Exports","pages":[{"title":"Export accounts as CSV","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/exports/accounts.csv","href":"/api-reference/exports/export-accounts-as-csv"},{"title":"Export the pipeline as CSV","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/exports/pipeline.csv","href":"/api-reference/exports/export-the-pipeline-as-csv"},{"title":"Export signals as CSV","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /v1/exports/signals.csv","href":"/api-reference/exports/export-signals-as-csv"}]}]}]},"basePath":"","title":"Derive a listener plan from a website - Open Pulse","buildId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","deploymentId":"dpl_8LJbrAiZvr1K98WQNZXCyY5AvT34","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-i2a3QZ8E.js","utils-ChLwp8m0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DRktVTDc.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-CA2pEs4T.js","snippetPresets-ClQ6XrKD.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Ct_Lv36y.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-Cn2PYw9e.js","shallow-rkyymjXQ.js","getApiPlaygroundDisplay-BB9vkXtE.js","CodeSnippet-Bm5RU7m1.js","CodeSnippets-BgU9Deuz.js","Page-BUDYNlhG.js","getPastedJson-BD-6NNum.js","icon-8Z6tud2e.js","MethodPill-Tuzr4g3V.js","DuplicateIcon-0ceWFYhN.js","createIcon-FBXow_ST.js","DynamicMarkdown-CD8713Yy.js","SectionHeading-7zgzQbH-.js","axios-vUo_bRtp.js","Markdown-D7Ofw1oz.js","clsx-eKJ4rcii.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CwjSCXIK.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-9EK5IAXV.js"]}