Keywords Add
POST /intent/keywords/add
Bulk-add plain compete-tracking keyword rows (web-UI “Add keywords” parity).
Thin public proxy over the SAME handler the graph8 web UI’s Buyer Intent >
Keywords bulk-add uses (POST /intent/keywords/add-keywords internally).
One deliberate strictness on top of the UI path: entries are trimmed of
leading/trailing whitespace before saving (the UI screen saves them raw).
Everything else matches the UI path:
- Keywords are stored lowercased; the response carries the stored text.
- A keyword that already exists for this org +
signal_type(and is not soft-deleted) is skipped silently by the handler; this route reports it asskippedwith reasonalready_exists. Soft-deleted keywords can be re-added. - For
signal_type='intent'each NEWLY created keyword fires a background SERP fetch that seeds its URL set asynchronously - URLs and resolved contacts/companies appear later, not in this response. - Unlike
create-from-searchthis saves the plain phrase only (no search seeding, nosearch_filters); use/keywords/{id}/filtersafterwards to set per-keyword filters.
Authorizations
Parameters
Header Parameters
Request Body required
object
1-50 keyword phrases to add as plain compete-tracking rows. Stored lowercased. Empty / whitespace-only entries and in-request duplicates (case-insensitive, trimmed) are skipped, not saved twice.
Signal source discriminator, same vocabulary as the web UI: ‘intent’ (default, buyer-intent tracking), ‘jobs’, or ‘job_changes’.
Responses
200
Successful Response
object
object
object
‘empty’ | ‘duplicate_in_request’ | ‘already_exists’
422
Validation Error