Skip to content

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 as skipped with reason already_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-search this saves the plain phrase only (no search seeding, no search_filters); use /keywords/{id}/filters afterwards to set per-keyword filters.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

object
keywords
required

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.

Array<string>
>= 1 items <= 50 items
signal_type

Signal source discriminator, same vocabulary as the web UI: ‘intent’ (default, buyer-intent tracking), ‘jobs’, or ‘job_changes’.

string
default: intent
Allowed values: intent jobs job_changes

Responses

200

Successful Response

object
data
required
object
created
Array<object>
default:
object
created_at
Any of:
string format: date-time
id
required
string
keyword
required

Stored (lowercased) keyword text.

string
signal_type
required
string
created_count
integer
skipped
Array<object>
default:
object
keyword
required
string
reason
required

‘empty’ | ‘duplicate_in_request’ | ‘already_exists’

string
skipped_count
integer
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string