{"openapi":"3.1.0","info":{"title":"Openpulse API","version":"1.0.0","summary":"Read buying signals, accounts and pipeline from an Openpulse workspace.","description":"The programmatic surface of Openpulse, authenticated with a workspace API key.\n\n**A key always acts as a member, never an admin.** Privilege comes from scopes, and\nthe scope vocabulary has no way to express an admin action: a leaked key can read\nsignals and move deals, and can never create a listener, change billing, or mint\nanother key. Routes that declare no scope are unreachable by a key at all, which is\nwhy this document describes fewer operations than the server has handlers.\n\nFor an assistant rather than a program, prefer the MCP server at `/mcp`: it is the\nsame data with tool descriptions a model can act on, and it uses OAuth rather than a\nshared secret. See `/api.md`.","contact":{"email":"support@openpulse.cloud","url":"https://openpulse.cloud/api.md"},"license":{"name":"Proprietary","identifier":"LicenseRef-Openpulse-Terms"}},"servers":[{"url":"https://openpulse.cloud","description":"Production"}],"paths":{"/v1/accounts":{"get":{"operationId":"getV1Accounts","summary":"List accounts","description":"Companies Openpulse has found signals about, cursor-paginated. One row per company rather than per post, which is usually the shape a sales question wants.\n\nRequires a plan that includes account intelligence; a workspace without it gets a 403 naming the plan rather than an empty list.","tags":["accounts"],"security":[{"apiKey":["accounts:read"]}],"parameters":[{"name":"limit","in":"query","description":"Page size, 1-100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"`nextCursor` from the previous page.","schema":{"type":"string"}},{"name":"owner","in":"query","description":"Only accounts assigned to this member.","schema":{"type":"string"}},{"name":"region","in":"query","description":"Only accounts in this region.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `accounts:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/accounts/{key}":{"get":{"operationId":"getV1AccountsByKey","summary":"Get one account","description":"Everything known about one company: its signals, its owner and its region.","tags":["accounts"],"security":[{"apiKey":["accounts:read"]}],"parameters":[{"name":"key","in":"path","required":true,"description":"The namespaced account key, e.g. `d:acme.com` for a domain. Percent-encode it: the `:` is part of the key, not a separator.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `accounts:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/collections":{"post":{"operationId":"postV1Collections","summary":"Create a list","description":"A named list to save signals into, shared across the workspace.","tags":["collections"],"security":[{"apiKey":["collections:write"]}],"parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `collections:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/content/ideas/{id}/export.zip":{"get":{"operationId":"getV1ContentIdeasByIdExportZip","summary":"Download an idea's content as a zip","description":"Every piece written for one content idea, plus its assets, as a zip archive.","tags":["content"],"security":[{"apiKey":["export:read"]}],"parameters":[{"name":"id","in":"path","description":"The id of the resource.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/zip":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `export:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/exports/accounts.csv":{"get":{"operationId":"getV1ExportsAccountsCsv","summary":"Export accounts as CSV","description":"Streams the accounts matching the filters. A key's export is always filtered to what it may read: there is no unscoped dump, because a key is never an admin.","tags":["exports"],"security":[{"apiKey":["export:read"]}],"parameters":[{"name":"owner","in":"query","description":"Only accounts assigned to this member.","schema":{"type":"string"}},{"name":"region","in":"query","description":"Only accounts in this region.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `export:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/exports/pipeline.csv":{"get":{"operationId":"getV1ExportsPipelineCsv","summary":"Export the pipeline as CSV","description":"Streams the deals matching the filters, with their stages and values.","tags":["exports"],"security":[{"apiKey":["export:read"]}],"parameters":[{"name":"stage","in":"query","description":"Only deals in this stage.","schema":{"type":"string"}},{"name":"open","in":"query","description":"`true` for open stages only.","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"Success.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `export:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/exports/signals.csv":{"get":{"operationId":"getV1ExportsSignalsCsv","summary":"Export signals as CSV","description":"Streams the signals matching the filters. Counts against the workspace's export quota; the response is a stream, so read it rather than buffering it whole.","tags":["exports"],"security":[{"apiKey":["export:read"]}],"parameters":[{"name":"listenerId","in":"query","description":"Only this listener's signals.","schema":{"type":"string"}},{"name":"classification","in":"query","description":"Intent label; valid values depend on the listener's mode.","schema":{"type":"string"}},{"name":"maxAgeDays","in":"query","description":"Only signals seen within this many days.","schema":{"type":"integer","minimum":1}},{"name":"source","in":"query","description":"Platform the signal came from.","schema":{"type":"string"}},{"name":"theme","in":"query","description":"Only signals carrying this theme.","schema":{"type":"string"}},{"name":"q","in":"query","description":"Free-text search over the signal's title and summary. Matches whole words, with stemming: `report` finds `reporting`, `repo` does not. Truncated past 120 characters.","schema":{"type":"string","maxLength":120}}],"responses":{"200":{"description":"Success.","content":{"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `export:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/notes":{"post":{"operationId":"postV1Notes","summary":"Write a note","description":"Attaches a note to a signal, an account or a deal.","tags":["notes"],"security":[{"apiKey":["collections:write"]}],"parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `collections:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pipeline":{"get":{"operationId":"getV1Pipeline","summary":"List deals","description":"Every deal in the workspace's pipeline with its stage, cursor-paginated. The board shows all columns at once by fetching pages until they are exhausted; do the same rather than assuming one response is the whole pipeline.","tags":["pipeline"],"security":[{"apiKey":["pipeline:read"]}],"parameters":[{"name":"limit","in":"query","description":"Page size, 1-100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"`nextCursor` from the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `pipeline:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postV1Pipeline","summary":"Add a deal","description":"Creates one deal, optionally from the signal that prompted it.","tags":["pipeline"],"security":[{"apiKey":["pipeline:write"]}],"parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `pipeline:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pipeline/{id}":{"patch":{"operationId":"patchV1PipelineById","summary":"Update a deal","description":"Moves a deal between stages, or edits its value, owner or notes. Partial: only the fields present are changed.","tags":["pipeline"],"security":[{"apiKey":["pipeline:write"]}],"parameters":[{"name":"id","in":"path","description":"The id of the resource.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `pipeline:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pipeline/bulk":{"post":{"operationId":"postV1PipelineBulk","summary":"Add several deals at once","description":"One request rather than a loop, which is what an agent working from a list of signals should reach for: the per-deal writes are applied together and the response reports each outcome.","tags":["pipeline"],"security":[{"apiKey":["pipeline:write"]}],"parameters":[],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `pipeline:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/pipeline/roi":{"get":{"operationId":"getV1PipelineRoi","summary":"Pipeline return over a window","description":"What the pipeline sourced from Openpulse signals is worth over the window: deals opened, deals won, and value. The answer to 'is this paying for itself'.","tags":["pipeline"],"security":[{"apiKey":["pipeline:read"]}],"parameters":[{"name":"days","in":"query","description":"Window length in days.","schema":{"type":"integer","minimum":1,"default":90}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `pipeline:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/results":{"get":{"operationId":"getV1Results","summary":"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.","tags":["results"],"security":[{"apiKey":["signals:read"]}],"parameters":[{"name":"listenerId","in":"query","description":"Only signals from this listener.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size, 1-100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","description":"`nextCursor` from the previous page.","schema":{"type":"string"}},{"name":"maxAgeDays","in":"query","description":"Only signals seen within this many days.","schema":{"type":"integer","minimum":1}},{"name":"classification","in":"query","description":"Intent label. Valid values depend on the listener's mode.","schema":{"type":"string"}},{"name":"source","in":"query","description":"Platform the signal came from.","schema":{"type":"string"}},{"name":"theme","in":"query","description":"Only signals carrying this theme.","schema":{"type":"string"}},{"name":"q","in":"query","description":"Free-text search over the signal's title and summary. Matches whole words, with stemming: `report` finds `reporting`, `repo` does not. Truncated past 120 characters.","schema":{"type":"string","maxLength":120}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `signals:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/results/stats":{"get":{"operationId":"getV1ResultsStats","summary":"Count signals in a window","description":"Totals for the window, counted in the database rather than over a page, so the figures describe every signal rather than the ones that fit in one response. Use this instead of paging through `/v1/results` to answer 'how many'.","tags":["results"],"security":[{"apiKey":["signals:read"]}],"parameters":[{"name":"listenerId","in":"query","description":"Only count this listener's signals.","schema":{"type":"string"}},{"name":"maxAgeDays","in":"query","description":"Window in days. Defaults to the workspace's retention.","schema":{"type":"integer","minimum":1}},{"name":"source","in":"query","description":"Platform the signal came from.","schema":{"type":"string"}},{"name":"theme","in":"query","description":"Only signals carrying this theme.","schema":{"type":"string"}},{"name":"q","in":"query","description":"Free-text search over the signal's title and summary. Matches whole words, with stemming: `report` finds `reporting`, `repo` does not. Truncated past 120 characters.","schema":{"type":"string","maxLength":120}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `signals:read` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/signals/{id}/save":{"post":{"operationId":"postV1SignalsByIdSave","summary":"Save a signal to a list","description":"Adds one signal to a list. Idempotent: saving a signal already in the list is not an error and does not duplicate it.","tags":["signals"],"security":[{"apiKey":["collections:write"]}],"parameters":[{"name":"id","in":"path","description":"The id of the resource.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success.","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"The key is missing, malformed, expired or revoked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the `collections:write` scope, or the workspace's plan does not include this.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. Retry after the interval in the response headers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"message":{"type":"string","description":"Human-readable explanation."},"code":{"type":"string","description":"Stable machine-readable error code."}},"required":["message"]}},"securitySchemes":{"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, pipeline:read, pipeline:write, collections:write, export:read."}}},"security":[{"apiKey":[]}],"externalDocs":{"url":"https://openpulse.cloud/api.md","description":"Openpulse for agents"}}