Profile cards connect through identity tokens to separate checked and unresolved records.
Keep uncertain identity matches separate.
  1. Start with a known profile roster and keep your original inputs. The Actor takes known profiles and cannot search all profiles by age, location, or follower count. A manual list is required first.
  2. Run one public profile first to test your setup. Check its canonical channelUrl, handle, channelId, status, statusReason, and observedAt against the public source. A useful row may be partial, and a name match alone does not fix a wrong target.
  3. Store identifiers as text strings and define your namespace as instagram:channelId. Do not mix Instagram channelId with other platform IDs just because numbers match. The fbid field is a Meta-linked identifier and is not a Facebook Page ID.
  4. Build a normalized input alias table from safe profile URLs and @handles while keeping the original input. Strip normal trailing slashes and query marks for comparison, but do not turn story or login routes into profile identities. Alias normalization is separate from the Actor's exact-string duplicate collapse.
  5. Group current observations by nonblank channelId values. Keep input-to-channelId edges and canonical channelUrl values. When one handle maps to different channelId values at different observation times, keep both records and check the public source without overwriting old data blindly. Missing history cannot explain why a conflict happened.
  6. Handle missing channelId values by keeping the canonical channelUrl or handle as weaker provisional evidence. Never merge accounts by display name alone. Keep blocked, private, or parser_miss rows outside the verified identity table. A local provisional key is tracking metadata, not an invented stable identity.
  7. Split your results into verified identities, input aliases, unresolved observations, and conflicts. Count known identities separately from input rows, useful rows, and observed handles. Explain any gap between source status and collected data before adding extra facts.
  8. Append a new observation with observedAt for later refreshes. The Actor does not return historical changes automatically, so you must check identity before comparing counts or link lists over time.

Worked example and tables

The following tables show original fiction to illustrate how the method works.

Roster-to-ID Alias Table

Worked example and tables
Roster RowOriginal InputRaw Source channelIdStatusCanonical channelUrlobservedAtReview State
R1@greenstudio10001okhttps://www.instagram.com/greenstudio2026-03-01Verified alias
R2https://www.instagram.com/greenstudio/?ref=sheet10001okhttps://www.instagram.com/greenstudio2026-03-01Verified alias
R3@green_studio20002okhttps://www.instagram.com/green_studio2026-03-01Verified alias
R4@summerlabnullpartialhttps://www.instagram.com/summerlab2026-03-01Provisional
R5@private_notesnullprivatenull2026-03-01Unresolved

Two-Known-ID Register

Worked example and tables
channelIdAssociated Aliases / InputsStatus SummaryReview State
10001@greenstudio, https://www.instagram.com/greenstudio/?ref=sheetokVerified identity
20002@green_studiookVerified identity

Conflict and Review Rows

Worked example and tables
Original InputRaw Source channelIdStatusobservedAtReview State
@greenstudio30003ok2026-06-01Conflict with 10001 (no rename or sale proof)

The verified table has two unique known identities, not five identities and not one display name identity. Rows R1 and R2 form two input aliases for channelId 10001. Row R4 is provisional because it lacks a channelId, and row R5 is unresolved because it is private. In a later fictional observation, @greenstudio maps to channelId 30003. Store this as an identity conflict with observedAt timestamps. It does not prove a rename, account sale, or impersonation. You must check edge tables and source facts before merging any conflicting rows.

Sources & further reading

By Chronometrica · Updated

Back to top ↑