visibility

PUT /v1/visibility/targets/{targetId}/keywords

Set the search phrases to track positions for.

All visibility endpoints

Authentication

Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X PUT https://api.zinndigital.com/v1/visibility/targets/{targetId}/keywords \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{  }'

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Replaces the phrase list wholesale. The phrases are customer-supplied and never derived: only the customer knows which searches they want to win, and the ones they already rank for are precisely the set this product has nothing to say about. Each phrase carries its own market. The same phrase in two countries is two different questions with two different answers and two separate costs, so `{phrase: "hosting", location: "United Kingdom"}` and `{phrase: "hosting", location: "Germany"}` are two entries rather than one. Sending more phrases than the plan allows is refused with `422` naming the allowance. It is **not** truncated: silently checking the first twenty-five of two hundred reads as a complete list on the very screen the customer checks, and they would conclude the other one hundred and seventy-five were being watched.

Parameters

NameTypeRequiredWhat it is
targetId (path)UuidYesThe watched domain's id.

Request body

NameTypeRequiredWhat it is
keywordsTrackedKeyword[]No

Response

NameTypeRequiredWhat it is
idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
domainstringYesThe hostname
labelstringNoThe customer's own label for this domain.
brandstringNoThe trading name to look for in an answer engine's reply. Genuinely separate from the domain — an answer that recommends a business by name without printing its URL has still me…
categorystringNoWhat this business sells, in the customer's own words. The questions asked of the answer engines are built from it, so it is the single field that decides whether an AI-visibili…
marketstringNoWhere the business sells. Used with `category` to build the questions.
is_externalbooleanYesTrue when this is not a domain hosted with us — a competitor or a prospect. Only external targets count against the plan's allowance.
site_idstringNoThe site this target corresponds to, when it is one of ours.
kindsVisibilityAuditKind[]Yes
cadence_daysintegerYesDays between scheduled audits. `0` means paused — **not** deleted. History and settings survive and it resumes with no further action.
next_due_atstringNo
last_audit_atstringNo
review_profilesReviewProfile[]No
productsTrackedProduct[]NoThe products this organisation has asked us to price-track.
merchant_namesstring[]NoHow this business appears as a **seller** on the marketplaces. Confirmed by the customer and never inferred: Google Shopping publishes a seller name and no domain on its listing…
keywordsTrackedKeyword[]NoThe search phrases this organisation tracks its position for. Customer-supplied and never derived: asking a vendor which phrases a domain already ranks for would return exactly…

Errors this endpoint can return

401 · 403 · 404 · 422