Legacy ID lookup
Translate saved legacy identifiers and notification references to public V2 IDs.
Saved application identifiers and legacy notification references are not public V2 IDs. POST /v2/legacy-ids/lookup translates them (operation lookup_legacy_ids). Use an organization API key. The route is HTTP only. It does not require a V2 webhook destination, and it creates no identities and changes no memberships.
Send 1 to 100 items. Each item has string kind and id fields. Results return in the submitted order. A mapped result includes v2_kind and v2_id. Read that public resource with the matching V2 route, then store v2_id. Unmapped results leave v2_kind, v2_id, and run_kind null.
Kinds
The supported kinds are campaign, account, person, signal, monitor, and run.
| Kind | Legacy reference | Public resource |
|---|---|---|
campaign | Legacy campaign ID | campaign |
account | Legacy company or district record ID | account |
person | Legacy person record ID | person |
signal | Signal id | signal |
monitor | Legacy monitor ID | monitor |
run | Workflow run id | run; run_kind is monitor, discovery, or import |
curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439011","kind":"campaign"}]}'curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439012","kind":"account"}]}'curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439013","kind":"person"}]}'curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439014","kind":"signal"}]}'curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439015","kind":"monitor"}]}'curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439016","kind":"run"}]}'One request can mix saved references. This batch looks up a campaign and an account together.
curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439011","kind":"campaign"},{"id":"507f1f77bcf86cd799439012","kind":"account"}]}'Legacy notification
A legacy notification still carries legacy identifiers. The lookup does not depend on enabling V2 webhooks. Take its run_id, its campaign id, and its signal_id, then submit those three references.
run_id is the run. icp_id is the legacy campaign ID. Each value in resources.signals_created is a signal_id.
curl --fail-with-body --request POST "$LINKT_API_URL/v2/legacy-ids/lookup" \
--header "x-api-key: $LINKT_API_KEY" \
--header "Content-Type: application/json" \
--data '{"items":[{"id":"507f1f77bcf86cd799439021","kind":"run"},{"id":"507f1f77bcf86cd799439022","kind":"campaign"},{"id":"507f1f77bcf86cd799439023","kind":"signal"}]}'Store each mapped v2_id. The V2 webhooks page describes the public notification format.
Wrong account or person kind
unsupported for an account or person reference can mean the caller used the other kind. The caller resubmits with that kind.
A company or district record is an account. A person record is a person. Export jobs, legacy jobs that are not monitors, files, schedules, and other legacy kinds stay unsupported.
Copies deleted before rollout
Copies deleted before retired_copy_ids existed, and not stored as created_by_copy_id, stay not_found. The lookup does not reconstruct that history.
A copy removed after that field exists can still map while its identity remains readable. A missing id and a foreign id both return not_found. An owned copy with no identity yet returns not_yet_available; retry later. The lookup creates no identity. A malformed id for a supported kind returns invalid for that item only.