The MeAnd23W_Relatives table is the primary table for 23andMe DNA relative (match) data. Each row represents one DNA relative for one 23andMe profile. It is the current, comprehensive relatives table, populated by the browser-based gather process against the modern 23andMe site.
MeAnd23W_Relatives is the active table used by the current 23andMe gather. MeAnd23W_Matches is a legacy table populated only by the older (pre-redesign) 23andMe import path and has a smaller column set. New gathers write to MeAnd23W_Relatives. See the MeAnd23W_Matches page for details.Rows are created and updated as the gather walks the 23andMe relatives list and then, optionally, visits each relative for deeper data. Different gather steps fill in different columns:
| Step | When It Happens | Fields Populated |
|---|---|---|
| Relatives List Batch — every page of relatives |
The relatives list is read in pages and written in bulk. Each relative is inserted or updated. | psid, Name/first/last, Sex, Relationship, PredictedRelationship, PredictedRange, DNAShared, SegmentsShared, Residence, CurrentLocationLat/Long, FamilySurnames, FamilyLocations, Notes, SharingStatus, IntroductionStatus, added, patsid, matside, rel_user, rel_alg, img, ehid, eid, url, MaxSegmentLength, IsFavorite, GrandparentLocations, TimeLastActive, HasFamilySearch, PrivacyContexts, HasExchangedMessage, HasPendingInboundInvitation, HasPendingOutboundInvitation, created_date |
| Haplogroups Per-relative |
When haplogroup gathering visits an individual relative | MaternalHaplogroup, PaternalHaplogroup |
| Ancestry Composition Per-relative |
When ancestry composition gathering visits an individual relative | Ancestry, AncestryComposition (JSON) |
| In Common With (ICW) Per-relative |
When ICW gathering visits an individual relative | icw_date (shared-match rows are stored in MeAnd23W_ICW) |
| Chromosome / Segments Per-relative |
When chromosome gathering visits an individual relative | chromo_date (segment rows are stored in MeAnd23W_FIANew) |
(psid, ehid) pair.| Column | Type | Description |
|---|---|---|
| Id | int (PK) | Auto-incrementing primary key |
| loginUsername | string | DNAGedcom username who gathered this data |
| psid | string | The 23andMe profile ID being gathered (the profile/kit whose relatives these are) |
| ehid | string | The relative’s profile ID (relative_profile_id). Unique match identifier; part of the (psid, ehid) key. |
| eid | string | The relative’s profile ID as reported in the profile_id field |
| eiid | string | Secondary match ID. Not populated by the current gather (stored empty). |
| Name | string | Relative’s display name (first + last) |
| first | string | First name (or first initial if name is private) |
| last | string | Last name (or last initial if name is private) |
| url | string | Relative’s profile URL path on 23andMe |
| img | string | URL to the relative’s profile image |
| Column | Type | Description |
|---|---|---|
| Relationship | string | User-set / overridden relationship (overridden_relationship_id) |
| PredictedRelationship | string | 23andMe’s algorithm-predicted relationship (predicted_relationship_id) |
| PredictedRange | string | Predicted relationship range, formatted as “low-high” from relationship_range |
| DNAShared | string | Shared DNA as a proportion (ibd_proportion, e.g. 0.0123). Multiply by 7440 to approximate shared cM. |
| SegmentsShared | string | Number of shared DNA segments (num_segments) |
| MaxSegmentLength | string | Longest shared segment length (max_segment_length) |
| patsid | string | “True” if the relative is on the paternal side (is_paternal_side) |
| matside | string | “True” if the relative is on the maternal side (is_maternal_side) |
| rel_user | string | User/overridden relationship code (duplicate of Relationship source) |
| rel_alg | string | Algorithm-predicted relationship code (duplicate of PredictedRelationship source) |
| Column | Type | Description |
|---|---|---|
| MaternalHaplogroup | string | Maternal (mtDNA) haplogroup. Populated by the per-relative haplogroup gather step, not by the list pass. |
| PaternalHaplogroup | string | Paternal (Y-DNA) haplogroup. Populated by the per-relative haplogroup gather step, not by the list pass. |
| Column | Type | Description |
|---|---|---|
| Sex | string | Relative’s sex |
| BirthYear | string | Birth year. Stored empty by the current list pass. |
| Birthplace | string | Birthplace. Stored empty by the current list pass. |
| Residence | string | Current location, assembled from city, county, state, and country (current_location) |
| Ancestry | string | Ancestry summary text. Populated by the ancestry composition gather step. |
| FamilySurnames | string | Family surnames the relative listed (surnames) |
| FamilyLocations | string | Family locations the relative listed (raw_family_locations) |
| Notes | string | Note the user entered on the relative (note) |
| Column | Type | Description |
|---|---|---|
| SharingStatus | string | Open-sharing status (is_open_sharing) |
| IntroductionStatus | string | Communication summary built from message/invitation flags (e.g. “Messaged”, “Pending Inbound”, “Pending Outbound”) |
| can_resend | string | Whether an introduction can be re-sent. Stored empty by the current list pass. |
| resend_date | string | Date an introduction may be re-sent. Stored empty by the current list pass. |
| HasExchangedMessage | string | “true”/“false” — a message has been exchanged (has_exchanged_message) |
| HasPendingInboundInvitation | string | “true”/“false” — pending incoming invitation (has_pending_inbound_invitation) |
| HasPendingOutboundInvitation | string | “true”/“false” — pending outgoing invitation (has_pending_outbound_invitation) |
| Column | Type | Description |
|---|---|---|
| IsFavorite | string | “true”/“false” — relative is marked favorite (is_favorite) |
| CurrentLocationLat | string | Latitude of the relative’s current location |
| CurrentLocationLong | string | Longitude of the relative’s current location |
| GrandparentLocations | string (JSON) | Grandparent birth-location data stored as a JSON string (grandparent_birth_locations) |
| TimeLastActive | string | When the relative was last active on 23andMe (time_last_active) |
| HasFamilySearch | string | “true”/“false” — relative has a linked FamilySearch tree (has_familysearch) |
| PrivacyContexts | string | Comma-separated list of privacy contexts (privacy_contexts) |
| FamilyTreeUrl | string | External family-tree URL (Ancestry, FamilySearch, etc.). Filled by per-relative gathering when available. |
| AncestryComposition | string (JSON) | Ancestry composition breakdown stored as a JSON string. Populated by the ancestry composition gather step. |
GrandparentLocations and AncestryComposition hold raw JSON strings rather than scalar values. Parse them in your own tooling to read the structured detail. PrivacyContexts holds a comma-separated list.| Column | Type | Description |
|---|---|---|
| added | string | Date the relative opted in to DNA Relatives (date_opted_in) |
| created_date | string | Date this record was created (gather timestamp) |
| icw_date | string | When ICW data was last gathered for this relative |
| chromo_date | string | When chromosome/segment data was last gathered for this relative |
| visible | string | Visibility flag. Stored empty by the current list pass. |
| disc | string | Discovery/legacy flag. Stored empty by the current list pass. |
| sync | string | Sync status flag (“0” until uploaded) |
Relatives are keyed on the (psid, ehid) pair. When the relatives list is re-gathered, an existing row is updated rather than duplicated — but only the list-level columns are written. Columns filled by the separate per-relative steps are deliberately left untouched so a list re-run never wipes out data gathered earlier:
List-level columns (name, relationship, DNA proportions, sharing/contact flags, location, and the 2026-01-11 fields) are refreshed on each re-gather.