# Enrik - [Getting started](https://docs.enrik.ai/index.md): Find, qualify, enrich, and act on companies — a quick tour of Enrik. - [Create your workspace](https://docs.enrik.ai/create-your-workspace.md): Sign up, create a workspace, and invite teammates. - [Define your ICP](https://docs.enrik.ai/define-your-icp.md): Describe the companies you want to find with an Ideal Customer Profile. - [Create a source](https://docs.enrik.ai/create-a-source.md): Run a discovery job to surface candidate companies. - [Review candidates](https://docs.enrik.ai/review-candidates.md): Keep the good fits, reject the rest. - [Promote companies](https://docs.enrik.ai/promote-companies.md): Turn accepted candidates into company records. - [Run enrichment](https://docs.enrik.ai/run-enrichment.md): Fill in firmographic and contact detail on your records. - [Use signals](https://docs.enrik.ai/use-signals.md): See buying and timing signals on your companies. - [Create activation assets](https://docs.enrik.ai/create-activation-assets.md): Generate outreach-ready content for your contacts. - [Export data](https://docs.enrik.ai/export-data.md): Send your records out as an export job or a signed webhook. - [Sync to HubSpot](https://docs.enrik.ai/sync-hubspot.md): Push your companies and contacts into HubSpot. - [Use the Assistant](https://docs.enrik.ai/use-copilot.md): Ask the workspace Assistant to read your data and draft actions. - [Formula columns](https://docs.enrik.ai/formula-columns.md): Compute values from other fields, right in your tables. - [Custom API columns](https://docs.enrik.ai/custom-api-columns.md): Pull values from your own API into a table column. - [Workflows](https://docs.enrik.ai/workflows.md): Automate steps on a visual canvas. - [AI agents](https://docs.enrik.ai/ai-agents.md): Build and publish an AI agent that runs over your records. - [Billing & the free trial](https://docs.enrik.ai/billing-and-trial.md): Plans, the trial, the grace period, and managing your subscription. - [Security & data handling](https://docs.enrik.ai/security-and-data-handling.md): How your data is isolated, protected, and handled — and how to verify our webhooks. - [FAQ](https://docs.enrik.ai/faq.md): Common questions during the private beta. - [Authentication and quick start](https://docs.enrik.ai/api-reference/introduction.md): Use scoped workspace API keys and durable command retries. - [Set up Enrik with an agent](https://docs.enrik.ai/api-reference/agent-setup.md): Confirm a company profile and complete workspace setup with scoped operations. - [Send feedback about the API](https://docs.enrik.ai/api-reference/feedback.md): Tell the Enrik team what worked, what broke and what confused your agent, with no sender stored. - [Versioning and deprecation](https://docs.enrik.ai/api-reference/versioning.md): How an operation moves from beta to stable, how a deprecation is announced, and how a breaking change ships. - [Changelog](https://docs.enrik.ai/api-reference/changelog.md): Every change to the public Enrik API, newest first. - [List companies](https://docs.enrik.ai/api-reference/companies/list-companies.md): Pages through the workspace’s live companies, newest first unless `sort` says otherwise. Pass `pageInfo.endCursor` as `cursor` to fetch the next page, with the same query. With `rankingMode` (and `sort=contextual_priority`) the companies are ranked by recommendation and each carries it; ranking read… - [Create a company](https://docs.enrik.ai/api-reference/companies/create-a-company.md): Creates a company. Send an `Idempotency-Key`: a retry with the same key and body returns the company the first request created instead of creating another, and the same key with another body is refused with 409 `idempotency_key_reused`. Returning that company to a retry also needs `crm:read`; withou… - [Create up to 100 companies](https://docs.enrik.ai/api-reference/companies/create-up-to-100-companies.md): Creates up to 100 companies, each from the body `companies.create` takes. Send an `Idempotency-Key` for the whole request: a retry with the same key and body returns the first answer, item for item, instead of creating again, and the same key with another body is refused with 409 `idempotency_key_re… - [Update up to 100 companies](https://docs.enrik.ai/api-reference/companies/update-up-to-100-companies.md): Changes up to 100 companies, each item the body `companies.update` takes plus the `id` of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one a… - [Create or update up to 100 companies by domain](https://docs.enrik.ai/api-reference/companies/create-or-update-up-to-100-companies-by-domain.md): Creates or updates up to 100 companies, each found by its `domain` as `companies.upsert` finds it: a company created needs `name` (else the item fails with `validation_error` at `name`), and a domain more than one live company has fails the item with `conflict`, `details.code` `ambiguous_domain`. Th… - [List deleted companies](https://docs.enrik.ai/api-reference/companies/list-deleted-companies.md): Pages through the workspace’s deleted companies, most recently deleted first. A deleted company can be restored. - [Create or update a company by domain](https://docs.enrik.ai/api-reference/companies/create-or-update-a-company-by-domain.md): Creates the company with this `domain`, or updates the live company that has it; a URL is reduced to its host first. An update writes only the fields you send and keeps the rest, as `companies.update` does; a create also needs `name`, or the request is refused with 422 `validation_error` at `name`.… - [Get a company](https://docs.enrik.ai/api-reference/companies/get-a-company.md): One live company, by id. A deleted company is not found. - [Delete a company](https://docs.enrik.ai/api-reference/companies/delete-a-company.md): Moves a company to the trash, from where it can be restored. Its contacts stay, and keep their link to it. Deleting one that is already deleted also answers `ok`, so a retry is harmless; an id that never existed is not found. - [Update a company](https://docs.enrik.ai/api-reference/companies/update-a-company.md): Changes the fields you send and keeps the rest; `null` clears a field. Sending the same body twice is harmless. To keep from overwriting someone else’s change, send the `updatedAt` you read as `expectedUpdatedAt`: if the company changed since, nothing is written and the answer is 409 `stale_version`… - [List a company’s contacts](https://docs.enrik.ai/api-reference/companies/list-a-company’s-contacts.md): Pages through the live contacts of a live company, newest first. - [Get where a company’s fields came from](https://docs.enrik.ai/api-reference/companies/get-where-a-company’s-fields-came-from.md): For each field of a live company that a source filled in: the source, how the value was arrived at, how fresh it is and whether sources disagreed, with the credit lines the sources require. Show every credit line wherever you show those fields. - [Restore a deleted company](https://docs.enrik.ai/api-reference/companies/restore-a-deleted-company.md): Brings a deleted company back. Restoring a company that is live answers it unchanged, so a retry is harmless. If another live, unlinked company took its domain meanwhile, the restore of an unlinked company is refused with 409 `conflict`. - [Get a company’s signal summary](https://docs.enrik.ai/api-reference/companies/get-a-company’s-signal-summary.md): What a live company’s active signals add up to: the latest one, the counts and the priority. An API key is served what the app shows. With no signals, or while the app hides the company’s signal-check results, the answer is the empty summary: the counts are 0 and the latest-signal fields and the pri… - [List a company’s signals](https://docs.enrik.ai/api-reference/companies/list-a-company’s-signals.md): Pages through the signals recorded about a live company, newest first. Filter by stored `status`; an active signal past its age reads `expired`. An API key is served what the app shows: the same signals, fields and `evidence` passages. Signals from signal checks that the app hides, because their evi… - [List a company’s timeline](https://docs.enrik.ai/api-reference/companies/list-a-company’s-timeline.md): Pages through what happened to a live company, newest first. - [A company was created](https://docs.enrik.ai/api-reference/companies/a-company-was-created.md): Sent to each active subscription for `company.created` once a company is created, whoever created it; `changeSource` says who. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every atte… - [A company was deleted](https://docs.enrik.ai/api-reference/companies/a-company-was-deleted.md): Sent to each active subscription for `company.deleted` once a company is moved to the trash. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every attempt. Answer 2xx within 10 seconds.… - [A company was restored](https://docs.enrik.ai/api-reference/companies/a-company-was-restored.md): Sent to each active subscription for `company.restored` once a company is restored from the trash. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every attempt. Answer 2xx within 10 se… - [A company changed](https://docs.enrik.ai/api-reference/companies/a-company-changed.md): Sent to each active subscription for `company.updated` once a company’s fields change; `changedFields` names them and `changeSource` says who changed them (with `apiKeyId` when it was a key). The POST is signed with `X-Enrik-Signature: t=,v1=.">` under… - [Get a company’s ICP assessment](https://docs.enrik.ai/api-reference/icpassessments/get-a-company’s-icp-assessment.md): The stored assessment of one company against an ICP profile version: its score, verdict and how it fared on each criterion. Name `icpProfileId` (and `icpProfileVersionId` for an exact version); without them, the workspace’s one active profile is used, and more than one is refused. Reading never eval… - [List candidates](https://docs.enrik.ai/api-reference/companycandidates/list-candidates.md): Pages through the workspace’s company candidates, by review priority unless `sort` says otherwise. Filter by job, status, scores or source. Pass `rankingMode` with `sort=contextual_priority` for a ranked list (`contextualRanking.available` says whether the workspace can have one); its rows also carr… - [Accept candidates](https://docs.enrik.ai/api-reference/companycandidates/accept-candidates.md): Accepts each candidate on its own; one failure never fails another. A repeat reports the accepted ones as invalid_status and changes nothing. - [Archive candidates](https://docs.enrik.ai/api-reference/companycandidates/archive-candidates.md): Archives each candidate on its own; one failure never fails another. A repeat reports the archived ones as invalid_status and changes nothing. - [Promote candidates](https://docs.enrik.ai/api-reference/companycandidates/promote-candidates.md): Promotes each candidate on its own, reporting one of six outcomes per item; one failure never fails another. An already promoted or linked candidate is skipped, so a repeat creates no company. Needs `crm:write` beside `discovery:write`. - [Reject candidates](https://docs.enrik.ai/api-reference/companycandidates/reject-candidates.md): Rejects each candidate on its own; one failure never fails another. A repeat reports the rejected ones as invalid_status and changes nothing. - [Get a candidate](https://docs.enrik.ai/api-reference/companycandidates/get-a-candidate.md): One company candidate, by id, with its scores and how they were reached. - [Accept a candidate](https://docs.enrik.ai/api-reference/companycandidates/accept-a-candidate.md): Moves a new or needs_review candidate to accepted, ready to promote. A repeat changes nothing and answers 422 invalid_status. - [Archive a candidate](https://docs.enrik.ai/api-reference/companycandidates/archive-a-candidate.md): Moves an accepted, rejected or promoted candidate to archived, which hides it from review. A promoted candidate’s company stays. A repeat changes nothing and answers 422 invalid_status. - [Promote a candidate](https://docs.enrik.ai/api-reference/companycandidates/promote-a-candidate.md): Turns an accepted candidate into a workspace company (through the Enrik flow for a candidate from Enrik data): 201 when a company was created, 200 when it was linked to one the workspace has. A domain the workspace already holds answers 409. A repeat creates nothing: a candidate from another source… - [Reject a candidate](https://docs.enrik.ai/api-reference/companycandidates/reject-a-candidate.md): Moves a new or needs_review candidate to rejected: the dismiss of the review queue. A repeat changes nothing and answers 422 invalid_status. - [List discovery jobs](https://docs.enrik.ai/api-reference/companydiscoveryjobs/list-discovery-jobs.md): Pages through the workspace’s company discovery jobs, newest first. Filter by `status` or `sourceType`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Create a discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/create-a-discovery-job.md): Creates a job in `draft`; it finds no candidates until it is started, and creating one spends nothing. The job and its audit row commit only after this answer is checked. A retry with the same Idempotency-Key and body replays the same answer for 24 hours instead of creating a second job. A job an AP… - [Get a discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/get-a-discovery-job.md): One company discovery job, by id, with the counters it recorded while it ran. - [Update a draft discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/update-a-draft-discovery-job.md): Changes the label or the ICP and brief links of a draft job, fenced against a concurrent start; a job that is no longer a draft answers 409. The same patch again leaves the same job; a refused answer after the write is committed. - [Archive a discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/archive-a-discovery-job.md): Moves the job to archived; the row stays. A queued or running job answers 409 conflict: cancel it first. An archived job answers the neutral 404, so a repeat adds nothing. - [Cancel a discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/cancel-a-discovery-job.md): Cancels a draft, queued or running job. A job an API key created may be canceled by any key holding `discovery:run` and by any member who may cancel jobs; a member’s job by that member, or by another with members:manage, and never by a key (403). A job that already ended is returned unchanged, so re… - [List a discovery job’s candidates](https://docs.enrik.ai/api-reference/companydiscoveryjobs/list-a-discovery-job’s-candidates.md): Pages through the candidates one discovery job found. Filter by `status`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Get a discovery job’s quality summary](https://docs.enrik.ai/api-reference/companydiscoveryjobs/get-a-discovery-job’s-quality-summary.md): How good one discovery job’s candidates are: how many fall in each review band, the average scores and a one-word verdict. Computed when asked, never stored. - [Start a discovery job](https://docs.enrik.ai/api-reference/companydiscoveryjobs/start-a-discovery-job.md): After the plan check (and, for a controlled source, the job quota) moves a draft or queued job to queued, publishing it and recording its usage in that transaction, which commits only after the queued job passed this schema. Answers the job as read after the commit; poll it from there. Starting a qu… - [A discovery job reached its outcome](https://docs.enrik.ai/api-reference/companydiscoveryjobs/a-discovery-job-reached-its-outcome.md): Sent to each active subscription for `companyDiscoveryJob.terminal` once a company discovery job completes, completes with errors, fails or is canceled. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with… - [Get a company signal](https://docs.enrik.ai/api-reference/companysignals/get-a-company-signal.md): Returns one signal under the same display rule as the app. A signal whose check evidence the app would hide is answered as a neutral 404. The response includes the displayed evidence and omits internal provenance fields. - [A signal was applied to a company](https://docs.enrik.ai/api-reference/companysignals/a-signal-was-applied-to-a-company.md): Sent to each active subscription for `companySignal.created` once a new signal is applied to a company. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every attempt. Answer 2xx within… - [List contacts](https://docs.enrik.ai/api-reference/contacts/list-contacts.md): Pages through the workspace’s live contacts, newest first unless `sort` says otherwise. Pass `pageInfo.endCursor` as `cursor` to fetch the next page, with the same `filters` and `sort`. A sort by a custom field is refused with 400 `invalid_sort`. - [Create a contact](https://docs.enrik.ai/api-reference/contacts/create-a-contact.md): Creates a contact. It needs at least one of `firstName`, `lastName` or `email`, not blank; a body without one is refused with 422 `validation_error`, its one details entry at the path `""` (the body). Send an `Idempotency-Key`: a retry with the same key and body returns the contact the first request… - [Create up to 100 contacts](https://docs.enrik.ai/api-reference/contacts/create-up-to-100-contacts.md): Creates up to 100 contacts, each from the body `contacts.create` takes. Send an `Idempotency-Key` for the whole request: a retry with the same key and body returns the first answer, item for item, instead of creating again, and the same key with another body is refused with 409 `idempotency_key_reus… - [Update up to 100 contacts](https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts.md): Changes up to 100 contacts, each item the body `contacts.update` takes plus the `id` of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one aft… - [Create or update up to 100 contacts by e-mail](https://docs.enrik.ai/api-reference/contacts/create-or-update-up-to-100-contacts-by-e-mail.md): Creates or updates up to 100 contacts, each found by its `email` as `contacts.upsert` finds it, comparing the address ignoring case; a `companyId` or `ownerUserId` the workspace does not have fails the item with `validation_error` (`related_record_not_found`). The body is checked as a whole first: a… - [List deleted contacts](https://docs.enrik.ai/api-reference/contacts/list-deleted-contacts.md): Pages through the workspace’s deleted contacts, most recently deleted first. A deleted contact can be restored. - [Create or update a contact by e-mail](https://docs.enrik.ai/api-reference/contacts/create-or-update-a-contact-by-e-mail.md): Creates the contact with this `email`, or updates the live contact that has it, comparing the address ignoring case. An update writes only the fields you send and keeps the rest, as `contacts.update` does. The answer says which it was, as `outcome`. A contact in the trash is not matched: restore it… - [Get a contact](https://docs.enrik.ai/api-reference/contacts/get-a-contact.md): One live contact, by id. A deleted contact is not found. - [Delete a contact](https://docs.enrik.ai/api-reference/contacts/delete-a-contact.md): Moves a contact to the trash, from where it can be restored. Deleting one that is already deleted also answers `ok`, so a retry is harmless; an id that never existed is not found. - [Update a contact](https://docs.enrik.ai/api-reference/contacts/update-a-contact.md): Changes the fields you send and keeps the rest; `null` clears a field. Sending the same body twice is harmless. To keep from overwriting someone else’s change, send the `updatedAt` you read as `expectedUpdatedAt`: if the contact changed since, nothing is written and the answer is 409 `stale_version`… - [Restore a deleted contact](https://docs.enrik.ai/api-reference/contacts/restore-a-deleted-contact.md): Brings a deleted contact back. Restoring a contact that is live answers it unchanged, so a retry is harmless. - [List a contact’s timeline](https://docs.enrik.ai/api-reference/contacts/list-a-contact’s-timeline.md): Pages through what happened to a live contact, newest first. - [A contact was created](https://docs.enrik.ai/api-reference/contacts/a-contact-was-created.md): Sent to each active subscription for `contact.created` once a contact is created, whoever created it; `changeSource` says who. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every atte… - [A contact was deleted](https://docs.enrik.ai/api-reference/contacts/a-contact-was-deleted.md): Sent to each active subscription for `contact.deleted` once a contact is moved to the trash. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every attempt. Answer 2xx within 10 seconds.… - [A contact was restored](https://docs.enrik.ai/api-reference/contacts/a-contact-was-restored.md): Sent to each active subscription for `contact.restored` once a contact is restored from the trash. The POST is signed with `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret, with a fresh `t` on every attempt. Answer 2xx within 10 se… - [A contact changed](https://docs.enrik.ai/api-reference/contacts/a-contact-changed.md): Sent to each active subscription for `contact.updated` once a contact’s fields change; `changedFields` names them and `changeSource` says who changed them (with `apiKeyId` when it was a key). The POST is signed with `X-Enrik-Signature: t=,v1=.">` under… - [List custom fields](https://docs.enrik.ai/api-reference/customfielddefinitions/list-custom-fields.md): Pages through the custom fields the workspace defined on one object type: the active ones by position, then (with `includeInactive=true`) the deactivated ones. A contact’s or company’s `customFields` holds each value under the field’s `key`. Pass `pageInfo.endCursor` as `cursor` to fetch the next pa… - [List discovery briefs](https://docs.enrik.ai/api-reference/discoverybriefs/list-discovery-briefs.md): Pages through the workspace’s discovery briefs, newest first. Filter by `icpProfileId` or `status`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Create a discovery brief](https://docs.enrik.ai/api-reference/discoverybriefs/create-a-discovery-brief.md): Saves a brief pinned to one ICP profile version of this workspace; a version of another profile or workspace answers 404. The brief and its audit row commit only after this answer is checked. A retry with the same Idempotency-Key and body replays the same answer for 24 hours instead of creating a se… - [Get a discovery brief](https://docs.enrik.ai/api-reference/discoverybriefs/get-a-discovery-brief.md): One discovery brief, by id, with what it asks for. - [Update a discovery brief](https://docs.enrik.ai/api-reference/discoverybriefs/update-a-discovery-brief.md): Changes the title, the brief or the status. A title or brief change appends a compatibility version; once the brief has an authored version it needs the revision you were shown, and a stale one is 409 `stale_version`. The change commits only after this answer is checked; a retry with the same Idempo… - [Archive a discovery brief](https://docs.enrik.ai/api-reference/discoverybriefs/archive-a-discovery-brief.md): Moves the brief to `archived`. Takes no body, so no precondition. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. An archived, absent or foreign brief answers the neutral 404. - [List a discovery brief’s versions](https://docs.enrik.ai/api-reference/discoverybriefs/list-a-discovery-brief’s-versions.md): Pages through the versions of one discovery brief, newest first. Filter by `snapshotKind`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Add a discovery brief version](https://docs.enrik.ai/api-reference/discoverybriefs/add-a-discovery-brief-version.md): Appends an immutable authored version. `expectedRevision` is required (a never-versioned brief is 0); a stale one is 409 `stale_version`. Answers the version and the brief’s new revision, which commit only after this answer is checked; a retry with the same Idempotency-Key replays it instead of appe… - [Get a discovery brief version](https://docs.enrik.ai/api-reference/discoverybriefs/get-a-discovery-brief-version.md): One exact version of one discovery brief. A version of another brief is not found. - [Get the export field catalogue](https://docs.enrik.ai/api-reference/exportfields/get-the-export-field-catalogue.md): Every field an export of a record type can carry, the workspace’s custom fields and the recommendation fields included, in one answer. Name them in an export’s `source.fieldKeys`. - [List export jobs](https://docs.enrik.ai/api-reference/exportjobs/list-export-jobs.md): Reads the workspace’s export jobs, newest first, whoever created them: in the app or with an API key. Optional filters and an opaque cursor; a page holds at most 100 jobs. - [Create a draft export](https://docs.enrik.ai/api-reference/exportjobs/create-a-draft-export.md): Creates a `draft` export job; nothing is read or written until `exportJobs.start`. Needs the read permission of the record type (`crm:read`; candidates also `discovery:read`) and the plan’s exports feature. The same `Idempotency-Key` and body answers the first job again. An API key creates `csv_file… - [Preview an export](https://docs.enrik.ai/api-reference/exportjobs/preview-an-export.md): Resolves up to 10 records of a source and escapes them as the CSV file would. Creates no job, file or delivery, and counts against no quota. - [Get an export job](https://docs.enrik.ai/api-reference/exportjobs/get-an-export-job.md): Reads one export job of the workspace. Poll it after `exportJobs.start` until `status` is final, then download the file with `exportJobs.download`. A job of another workspace answers the same `404` as a missing one. - [Archive an export](https://docs.enrik.ai/api-reference/exportjobs/archive-an-export.md): Archives a job, which stays readable with `status` `archived`. Archiving it again is `404`; recover a lost answer by reading the job. - [Cancel an export](https://docs.enrik.ai/api-reference/exportjobs/cancel-an-export.md): Cancels a `draft`, `queued` or `running` job. A job that already finished is answered unchanged. - [Download an export’s CSV file](https://docs.enrik.ai/api-reference/exportjobs/download-an-export’s-csv-file.md): Streams the CSV file of a finished `csv_file` export, as an attachment named by `fileName`, until `downloadExpiresAt`. Each download is recorded in the workspace’s audit log. A job without a file yet (still running, failed, or a webhook delivery) is `409 conflict`; past `downloadExpiresAt`, or once… - [Start an export](https://docs.enrik.ai/api-reference/exportjobs/start-an-export.md): Queues a `draft` job and counts it against the plan’s `exports_created` quota, once. It runs in the background: poll `exportJobs.get` until `status` is final, then download the file with `exportJobs.download`. A job that is no longer `draft` or `queued` is `409 conflict`, so a lost answer is recover… - [Send anonymous feedback](https://docs.enrik.ai/api-reference/feedback/send-anonymous-feedback.md): Stores one anonymous note about the public API. Any valid API key may send it, whatever its scopes; no workspace, user, key, request id, address or user agent is stored with it, and its time is kept to the hour. Do not include personal data. Send a fresh UUIDv4 as `Idempotency-Key` for every note an… - [Check that the API is up](https://docs.enrik.ai/api-reference/health/check-that-the-api-is-up.md): Answers `{ "status": "ok" }` while the API is up. It needs no API key and reads no dependency, so it says the service answers, not that every feature works. It is the `status` link of the API catalog at `/.well-known/api-catalog`. - [List ICP profiles](https://docs.enrik.ai/api-reference/icpprofiles/list-icp-profiles.md): Pages through the workspace’s ideal customer profiles, newest first. Filter by `status`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Create an ICP profile](https://docs.enrik.ai/api-reference/icpprofiles/create-an-icp-profile.md): Creates a profile and its first immutable version. The profile, the version and their audit rows commit only after this answer is checked. A retry with the same Idempotency-Key and body replays the same answer for 24 hours instead of creating a second profile; a name already in use answers 409. - [Get an ICP profile](https://docs.enrik.ai/api-reference/icpprofiles/get-an-icp-profile.md): One ideal customer profile, by id. Its criteria are in its versions. - [Update an ICP profile](https://docs.enrik.ai/api-reference/icpprofiles/update-an-icp-profile.md): Changes the name, description or status, never the criteria (a criteria change is a new version). Name the revision you were shown: without it the answer is 422 `icp_profile_precondition_required`, and a stale one is 409 `stale_version`. The change commits only after this answer is checked; a retry… - [Archive an ICP profile](https://docs.enrik.ai/api-reference/icpprofiles/archive-an-icp-profile.md): Moves the profile to `archived`. Takes no body, so no precondition. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. An archived, absent or foreign profile answers the neutral 404. - [Restore an ICP profile](https://docs.enrik.ai/api-reference/icpprofiles/restore-an-icp-profile.md): Moves an archived profile back to `active`. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. A profile that is not archived answers the neutral 404. - [List an ICP profile’s versions](https://docs.enrik.ai/api-reference/icpprofiles/list-an-icp-profile’s-versions.md): Every version of one ICP profile, the highest version number first. A profile that is not found has no versions, so the answer is an empty array. - [Add an ICP profile version](https://docs.enrik.ai/api-reference/icpprofiles/add-an-icp-profile-version.md): Appends a new immutable version and makes it the profile’s current one. Name the revision you were shown: without it the answer is 422 `icp_profile_precondition_required`, and a stale one is 409 `stale_version`. The version commits only after this answer is checked; a retry with the same Idempotency… - [Get an ICP profile version](https://docs.enrik.ai/api-reference/icpprofiles/get-an-icp-profile-version.md): One version of one ICP profile. A version of another profile is not found. - [Describe the calling API key](https://docs.enrik.ai/api-reference/apikeys/describe-the-calling-api-key.md): Answers the id of the API key that sent the request, its name, display prefix and expiry, its workspace and the scope names it holds. Any valid API key may call it, whatever its scopes; a browser session gets 401. What a key may do is also bounded by the permissions frozen when it was minted, so a l… - [Revoke the calling API key](https://docs.enrik.ai/api-reference/apikeys/revoke-the-calling-api-key.md): Revokes the API key that sent the request, and the secret a rotation left working with it. From the next request on, the key answers 401; it stays listed in Settings → API keys as revoked. It cannot be undone: an owner or admin mints a new key there. Any valid API key may call it, whatever its scope… - [Rotate the calling API key](https://docs.enrik.ai/api-reference/apikeys/rotate-the-calling-api-key.md): Gives the API key that sent the request a new secret. The key keeps its id, name, scopes and expiry; only the secret changes. The secret that sent the request keeps working until `previousKeyExpiresAt` (by default one hour, at most 24 hours, `0` for none), so every client can move to the new one, th… - [Read workspace company setup](https://docs.enrik.ai/api-reference/websiteonboarding/read-workspace-company-setup.md): Reads shared workspace state and the current writable profile hash. Creates nothing. - [Read workspace setup access](https://docs.enrik.ai/api-reference/websiteonboarding/read-workspace-setup-access.md): Scoped API keys read workspace setup facts without creator membership. Every authenticated active human member can read their own session workspace gate status, regardless of role permissions. A key is eligible when it holds `setup:run`; a member when their role may change setup. Creates nothing and… - [Confirm workspace company profile](https://docs.enrik.ai/api-reference/websiteonboarding/confirm-workspace-company-profile.md): Requires one UUID Idempotency-Key matching body operationId. Requires a user or independent API-key actor with setup and company-context read/update. Atomically saves the company profile, resulting snapshot, revision, milestones and durable receipt. When the saved profile has a nonblank website and… - [Draft workspace company profile from website or description](https://docs.enrik.ai/api-reference/websiteonboarding/draft-workspace-company-profile-from-website-or-description.md): Requires one UUID Idempotency-Key matching body operationId. Durably admits one execution owner, then acquires website evidence once or uses a supplied description without fetching. Enrik sponsors up to two bounded model calls per command within the workspace lifetime allowance. Saves localized find… - [Complete workspace setup](https://docs.enrik.ai/api-reference/websiteonboarding/complete-workspace-setup.md): Requires one UUID Idempotency-Key matching body operationId. Atomically records completion and a durable receipt. Only human actors may supply optional private answers; API keys must omit answers entirely. Completed generations ignore further answers and revision preconditions. - [Read workspace setup completion](https://docs.enrik.ai/api-reference/websiteonboarding/read-workspace-setup-completion.md): Reads the current generation and its completed milestone. Creates nothing and contains no private answers. - [Reset workspace company setup](https://docs.enrik.ai/api-reference/websiteonboarding/reset-workspace-company-setup.md): Requires one UUID Idempotency-Key matching body operationId. Starts a new generation and clears confirmation. Preserves the saved company profile and historical command receipts. - [Choose workspace setups](https://docs.enrik.ai/api-reference/websiteonboarding/choose-workspace-setups.md): Requires one UUID Idempotency-Key matching body operationId. Records immutable choices once per confirmed generation. API-key selection also acknowledges the handoff atomically; browser selection requires prior acknowledgement. Target segments require ICP profiles. Explicitly selecting nothing is va… - [Start workspace company setup](https://docs.enrik.ai/api-reference/websiteonboarding/start-workspace-company-setup.md): Requires one UUID Idempotency-Key matching body operationId. Creates setup if absent and records a durable command receipt. Existing state is preserved. - [List saved views](https://docs.enrik.ai/api-reference/savedviews/list-saved-views.md): Pages through the workspace’s saved views of one object type, ordered by name. Pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Create a saved view](https://docs.enrik.ai/api-reference/savedviews/create-a-saved-view.md): Creates a saved view. Send an `Idempotency-Key`: a retry with the same key and body returns the view the first request created instead of creating another. Returning that view to a retry also needs `crm:read`, as reading it would; without it the retry is refused with 403 `permission_denied`. A sort… - [Get a saved view](https://docs.enrik.ai/api-reference/savedviews/get-a-saved-view.md): One saved view, by id. Name the object type of a company view (`objectType=company`); a view of another object type is not found. - [Delete a saved view](https://docs.enrik.ai/api-reference/savedviews/delete-a-saved-view.md): Deletes a saved view. Deleting one that is already deleted also answers `ok`, so a retry is harmless; an id that never existed is not found. Name the object type of a company view (`objectType=company`); a view of another object type is not found. - [Update a saved view](https://docs.enrik.ai/api-reference/savedviews/update-a-saved-view.md): Renames a saved view, replaces its query, or both, and keeps the rest. Sending the same body twice is harmless. Name the object type of a company view (`objectType=company`); a view of another object type is not found. - [List signal definitions](https://docs.enrik.ai/api-reference/signaldefinitions/list-signal-definitions.md): Pages through the workspace’s signal definitions, newest first. Filter by `lifecycle`; pass `pageInfo.endCursor` as `cursor` to fetch the next page. An unknown parameter is refused. - [Create a signal definition](https://docs.enrik.ai/api-reference/signaldefinitions/create-a-signal-definition.md): Creates a definition and its first draft version, while signal definitions are switched on (503 otherwise). Both commit only after this answer is checked. A retry with the same Idempotency-Key and body replays the same answer for 24 hours instead of creating a second definition; a name already in us… - [Get a signal definition](https://docs.enrik.ai/api-reference/signaldefinitions/get-a-signal-definition.md): One signal definition, by id. What it says is in its versions. - [Update a signal definition](https://docs.enrik.ai/api-reference/signaldefinitions/update-a-signal-definition.md): Changes the name or description, never the content (a content change is a new version). Name the revision you were shown: a stale one is 409 `stale_version` and writes nothing. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. - [Archive a signal definition](https://docs.enrik.ai/api-reference/signaldefinitions/archive-a-signal-definition.md): Moves the definition to `archived`, which stops new publication. Name the revision you were shown: a stale one is 409 `stale_version` and writes nothing. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. - [Restore a signal definition](https://docs.enrik.ai/api-reference/signaldefinitions/restore-a-signal-definition.md): Moves an archived definition back to `active`. Name the revision you were shown: a stale one is 409 `stale_version` and writes nothing. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. - [List a signal definition’s versions](https://docs.enrik.ai/api-reference/signaldefinitions/list-a-signal-definition’s-versions.md): Every version of one signal definition, the highest version number first. - [Add a signal definition version](https://docs.enrik.ai/api-reference/signaldefinitions/add-a-signal-definition-version.md): Appends an immutable draft version and answers it with the definition’s new revision. It is not published. Name the revision you were shown: a stale one is 409 `stale_version` and writes nothing. The change commits only after this answer is checked; a retry with the same Idempotency-Key replays it. - [Get a signal definition version](https://docs.enrik.ai/api-reference/signaldefinitions/get-a-signal-definition-version.md): One exact version of one signal definition: the snapshot a pin or a check refers to. A version of another definition is not found. - [Get the signal detector catalogue](https://docs.enrik.ai/api-reference/signaldetectors/get-the-signal-detector-catalogue.md): Every kind of detector a signal definition can use, and, for one that cannot run, why. Reading it starts nothing. - [List event deliveries of a subscription](https://docs.enrik.ai/api-reference/webhookeventdeliveries/list-event-deliveries-of-a-subscription.md): Pages through one subscription’s deliveries, newest first, optionally in one state. A foreign subscription reads as an empty list. Pass `pageInfo.endCursor` as `cursor`, with the same `subscriptionId` and `state`, to fetch the next page. - [Get an event delivery](https://docs.enrik.ai/api-reference/webhookeventdeliveries/get-an-event-delivery.md): One delivery with its attempts (status code or error and duration; never a request or response body). Foreign or absent ids are a neutral 404. - [Redeliver an event](https://docs.enrik.ai/api-reference/webhookeventdeliveries/redeliver-an-event.md): Owners and admins only. Sends the same event id and body again with a fresh retry budget and a 72-hour window. Refused with 409 while the delivery is pending or in flight, when the subscription or destination is not active, or when the event is 27 days old or older. Validated before commit. The requ… - [List event types](https://docs.enrik.ai/api-reference/webhookeventtypes/list-event-types.md): Pages through every event type a subscription can name, in catalogue order: its version and stability, the permission the subscription’s creator must hold, and the read operation and key scope a receiver uses to fetch what an event names. Pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [List event subscriptions](https://docs.enrik.ai/api-reference/webhooksubscriptions/list-event-subscriptions.md): Pages through the workspace’s subscriptions, archived ones included, newest first. Pass `pageInfo.endCursor` as `cursor` to fetch the next page. - [Create an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/create-an-event-subscription.md): Subscribes a receiver to event types. Owners and admins only (webhook_subscriptions:manage, which `webhooks:write` carries); the creator must also be allowed to read what each event type names. Name either a receiver `url` or an existing destination. A `url` creates a dedicated destination with its… - [Get an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/get-an-event-subscription.md): One subscription; foreign, absent or deleted ids are a neutral 404. - [Update an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/update-an-event-subscription.md): Changes the event types the subscription receives, its receiver `url` or its `description`. Each event type needs the same read permission as on create. A `url` or `description` change updates the subscription’s destination, so an export sending there follows it; the signing secret stays. Deliveries… - [Archive an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/archive-an-event-subscription.md): Ends the subscription for good and cancels its pending deliveries, with one audit entry. The destination a create made for its inline `url` is archived with it; a destination named by `destinationId` stays. An already archived repeat is a neutral 404; recover by reading the subscription. - [Disable an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/disable-an-event-subscription.md): Pauses the subscription: stops new deliveries and cancels pending ones. Disabling a disabled one answers it unchanged; an archived one is a neutral 404. - [Enable an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/enable-an-event-subscription.md): Resumes a paused subscription and resets its failure count; deliveries canceled while it was paused stay canceled. Enabling an active one answers it unchanged; an archived one is a neutral 404. - [Rotate the signing secret](https://docs.enrik.ai/api-reference/webhooksubscriptions/rotate-the-signing-secret.md): Replaces the signing secret of the subscription’s destination and answers the new one once; the old one stops verifying at once, for every subscription and export that sends there. Validated before commit. The required Idempotency-Key recovers the answer, with its secret, for 24 hours; recovery answ… - [Test an event subscription](https://docs.enrik.ai/api-reference/webhooksubscriptions/test-an-event-subscription.md): Sends one signed `webhook.ping` to the receiver now, paused or not, and answers its status and how long it took. One attempt, no retry, within the 10-second event timeout. Nothing is stored: the ping is not an event and does not appear in the delivery log. A repeat sends another ping; an archived su… - [A subscription was tested](https://docs.enrik.ai/api-reference/webhooksubscriptions/a-subscription-was-tested.md): Sent once to the subscription’s URL by `POST /v1/webhook-subscriptions/{id}/test`, with the headers and the signature of every event: `X-Enrik-Signature: t=,v1=.">` under the destination’s signing secret. One attempt, no retry: the test answers the rec… - [List workspace members](https://docs.enrik.ai/api-reference/workspacemembers/list-workspace-members.md): Pages through the workspace’s active members, ordered by user id, with the id and name of each. A member’s `id` is the value `ownerUserId` takes on contacts and companies; an `ownerUserId` that is not an active member is refused. It needs `crm:write`, as setting an owner does. Pass `pageInfo.endCurs… ## OpenAPI Specs - [openapi](https://api.enrik.ai/v1/openapi.json) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.