Docs index

Social proximity

Requester-relative warmth, evidence, and intro-path scoring fields.

Context guidance: Use when interpreting relationship evidence or proximity scores.

Social proximity

Full proximity scoring and evidence schema are available in /docs/social-proximity.json.

{
  "version": 7,
  "overview": "Social proximity is a requester-relative relationship score. Public people-search responses can expose summary relationship fields and opt-in structured relationship detail; social-proximity detail surfaces expose score breakdowns, evidence, connector paths, and LinkedIn mutual-research status.",
  "api_surfaces": [
    {
      "name": "People search summary fields",
      "auth_mode": "api_key",
      "auth_header": "X-API-Key",
      "endpoints": [
        "POST /api/v1/search/people",
        "POST /api/v1/search/people/preview",
        "POST /api/v1/search/people/enrich"
      ],
      "model": "Person",
      "note": "These values are relative to the searching account owner or delegate_user_id. Existing scalar fields remain available when hydrated. Request relationship_detail for the structured relationship object used by MCP/API agents.",
      "request_parameters": [
        {
          "name": "relationship_detail",
          "type": "none|summary|intro_paths",
          "required": false,
          "description": "Opt-in relationship payload. summary adds social proximity and mutuals. Named connected_to rows may add relationship.public_associations[]: projection-only public employer/industry/location context, distinct from worked_with and without third-party LinkedIn connection dates. intro_paths adds the unified social_map plus confirmed and possible paths. Omit for the lean payload."
        },
        {
          "name": "intro_path_limit",
          "type": "number",
          "required": false,
          "description": "Maximum confirmed-mutual intro paths returned when relationship_detail=intro_paths. Default 3, server max 20. This does not cap the async scored mutual-connector pool; relationship.intro_paths_status.ranking_status, ranking_pending, and ranking_queue_* fields tell you whether confirmed path order is final."
        },
        {
          "name": "possible_intro_limit",
          "type": "number",
          "required": false,
          "description": "Maximum first-degree worked-with overlap paths returned in relationship.possible_intro_paths and relationship.social_map path_type=\"experience_intersection\". Default 20, server max 100."
        },
        {
          "name": "possible_intro_offset",
          "type": "number",
          "required": false,
          "description": "Zero-based offset into first-degree worked-with overlap paths for pagination."
        },
        {
          "name": "mutual_connection_limit",
          "type": "number",
          "required": false,
          "description": "Maximum relationship.mutual_connections.preview entries returned for this page. Default 50 on direct/detail calls, server max 500."
        },
        {
          "name": "mutual_connection_offset",
          "type": "number",
          "required": false,
          "description": "Zero-based offset into relationship.mutual_connections.preview for paging persisted/researched mutual connectors."
        }
      ],
      "fields": [
        {
          "name": "social_proximity_score",
          "type": "number|null",
          "required": false,
          "description": "0-100 requester-relative score used for ranking and reachability summaries. This mirrors search_score: researched_score when fresh LinkedIn mutual research exists, otherwise baseline_score."
        },
        {
          "name": "social_proximity_band",
          "type": "very_warm|warm|some_signal|weak|null",
          "required": false,
          "description": "Machine-friendly band derived from social_proximity_score."
        },
        {
          "name": "social_proximity_tier",
          "type": "string|null",
          "required": false,
          "description": "Human label for social_proximity_band (Very warm, Warm, Some signal, Weak)."
        },
        {
          "name": "best_intro_path_type",
          "type": "supercarl_referral|manual_linkedin_intro|null",
          "required": false,
          "description": "Best intro mode inferred from mutual connector availability. SuperCarl referral is preferred when a SuperCarl mutual path exists."
        },
        {
          "name": "score_version",
          "type": "number|null",
          "required": false,
          "description": "Scoring config version. Current version: 7."
        },
        {
          "name": "mutual_connections_count",
          "type": "number",
          "required": false,
          "description": "Count of surfaced mutual connectors on the result row."
        },
        {
          "name": "mutual_connections",
          "type": "PersonSummary[]",
          "required": false,
          "description": "Subset of mutual connectors shown inline on search results."
        },
        {
          "name": "relationship",
          "type": "RelationshipDetail|null",
          "required": false,
          "description": "Structured requester-relative relationship payload returned when relationship_detail is summary or intro_paths."
        }
      ]
    },
    {
      "name": "API-key social-proximity research",
      "auth_mode": "api_key",
      "auth_header": "X-API-Key",
      "endpoints": [
        "POST /api/v1/relationships/social-proximity/research",
        "GET /api/v1/relationships/social-proximity/research/status"
      ],
      "model": "SocialProximityResearchResponse",
      "note": "Explicitly starts LinkedIn mutual research for one target when recent cached research is unavailable. The status endpoint is read-only and never starts or refreshes research. Search/read endpoints never auto-start research.",
      "request_parameters": [
        {
          "name": "target_user_id",
          "type": "string",
          "required": true,
          "description": "Target Super Carl user id."
        },
        {
          "name": "delegate_user_id",
          "type": "string",
          "required": false,
          "description": "Permitted teammate user id to act as."
        },
        {
          "name": "page_limit",
          "type": "number",
          "required": false,
          "description": "Optional LinkedIn mutual pages to request."
        },
        {
          "name": "page_size",
          "type": "number",
          "required": false,
          "description": "Optional LinkedIn mutual page size."
        },
        {
          "name": "reset",
          "type": "boolean",
          "required": false,
          "description": "Request restart for previous/stale research; recent completed research is still reused within the server cooldown."
        },
        {
          "name": "intro_path_limit",
          "type": "number",
          "required": false,
          "description": "Maximum returned confirmed-mutual intro paths, default 3 and max 20."
        },
        {
          "name": "possible_intro_limit",
          "type": "number",
          "required": false,
          "description": "Maximum first-degree worked-with overlap paths, default 20 and max 100."
        },
        {
          "name": "possible_intro_offset",
          "type": "number",
          "required": false,
          "description": "Zero-based offset into first-degree worked-with overlap paths."
        },
        {
          "name": "mutual_connection_limit",
          "type": "number",
          "required": false,
          "description": "Maximum relationship.mutual_connections.preview entries returned for this page, default 50 and max 500."
        },
        {
          "name": "mutual_connection_offset",
          "type": "number",
          "required": false,
          "description": "Zero-based offset into the persisted mutual-connection list."
        }
      ],
      "fields": [
        {
          "name": "relationship",
          "type": "RelationshipDetail|null",
          "required": false,
          "description": "Current structured relationship and intro-path payload."
        },
        {
          "name": "research",
          "type": "object",
          "required": true,
          "description": "Start/continue result from the LinkedIn mutual research workflow."
        },
        {
          "name": "detail.research_status",
          "type": "SocialProximityResearchStatus",
          "required": false,
          "description": "Current research status and recovery guidance."
        }
      ]
    },
    {
      "name": "Authenticated summaries endpoint",
      "auth_mode": "jwt",
      "auth_header": "Authorization: Bearer <token>",
      "endpoints": [
        "POST /users/social-proximity/summaries"
      ],
      "model": "SocialProximitySummaryResponse",
      "note": "Returns baseline/search scores, evidence, component metadata, and direct-relationship timestamps for each requested target.",
      "fields": [
        {
          "name": "summaries[].summary.search_score",
          "type": "number",
          "required": true,
          "description": "Primary score used by search ranking and banding."
        },
        {
          "name": "summaries[].summary.metadata.components",
          "type": "SocialProximityComponents",
          "required": false,
          "description": "Component-level score breakdown used to produce the total."
        },
        {
          "name": "summaries[].summary.metadata.mutual_connections",
          "type": "object",
          "required": false,
          "description": "Mutual-connection counts, overlap ratios, research readiness, and baseline-vs-researched metadata."
        },
        {
          "name": "summaries[].summary.metadata.direct_relationship",
          "type": "object",
          "required": false,
          "description": "Normalized direct-relationship timestamps (LinkedIn and SuperCarl) used for evidence and recency bonus handling."
        },
        {
          "name": "summaries[].summary.evidence",
          "type": "SocialProximityEvidence[]",
          "required": false,
          "description": "Deduped evidence list sorted by strongest score contribution and recency."
        }
      ]
    },
    {
      "name": "Authenticated detail and research endpoints",
      "auth_mode": "jwt",
      "auth_header": "Authorization: Bearer <token>",
      "endpoints": [
        "GET /users/:targetUserId/social-proximity",
        "POST /users/:targetUserId/social-proximity/research"
      ],
      "model": "SocialProximityDetail",
      "note": "Returns connector path scoring, researched score variants, evidence highlights, and the current LinkedIn mutual-research workflow state.",
      "fields": [
        {
          "name": "baseline",
          "type": "SocialProximityScoreCard",
          "required": true,
          "description": "Baseline score card using local graph evidence and missing-research fallback rules."
        },
        {
          "name": "researched",
          "type": "SocialProximityScoreCard|null",
          "required": false,
          "description": "Refined score card after fresh LinkedIn mutual research is available."
        },
        {
          "name": "connectors_supercarl",
          "type": "SocialProximityConnector[]",
          "required": false,
          "description": "Mutual connectors who can support a SuperCarl referral path."
        },
        {
          "name": "connectors_linkedin_manual",
          "type": "SocialProximityConnector[]",
          "required": false,
          "description": "Mutual connectors that require a manual LinkedIn intro path."
        },
        {
          "name": "research_status",
          "type": "SocialProximityResearchStatus",
          "required": true,
          "description": "Current LinkedIn mutual-research state and recovery guidance."
        }
      ]
    }
  ],
  "score_resolution": {
    "clamp_range": "All totals are clamped to the inclusive range 0-100.",
    "baseline_formula": "baseline_score = direct_relationship + profile_overlap + reciprocal_communication + public_activity + mutual_connections_baseline + cross_network",
    "researched_formula": "researched_score = direct_relationship + profile_overlap + reciprocal_communication + public_activity + mutual_connections_researched + cross_network",
    "search_formula": "search_score = researched_score ?? baseline_score",
    "note": "Search responses expose search_score only. The authenticated detail surface exposes baseline and researched score cards separately."
  },
  "tiers": [
    {
      "min_score": 75,
      "tier": "very_warm",
      "band": "very_warm",
      "label": "Very warm"
    },
    {
      "min_score": 50,
      "tier": "warm",
      "band": "warm",
      "label": "Warm"
    },
    {
      "min_score": 25,
      "tier": "some_signal",
      "band": "some_signal",
      "label": "Some signal"
    },
    {
      "min_score": 0,
      "tier": "weak",
      "band": "weak",
      "label": "Weak"
    }
  ],
  "components": [
    {
      "key": "direct_relationship",
      "label": "Direct relationship",
      "max_points": 35,
      "evidence_category": "direct_relationship",
      "component_fields": [
        "metadata.components.direct_relationship",
        "metadata.direct_relationship",
        "evidence[]"
      ],
      "description": "Scores the strongest direct relationship source only, then adds a recency bonus when that relationship or verification is recent.",
      "scoring": {
        "strongest_source_only": true,
        "base_by_source": [
          {
            "source": "supercarl",
            "evidence_label": "Super Carl Connector",
            "points": 24
          },
          {
            "source": "linkedin",
            "evidence_label": "Connected on LinkedIn",
            "points": 17
          },
          {
            "source": "gmail",
            "evidence_label": "In your address book",
            "points": 15
          },
          {
            "source": "x",
            "evidence_label": "Connected through X",
            "points": 10
          },
          {
            "source": "instagram",
            "evidence_label": "Connected on Instagram",
            "points": 10
          }
        ],
        "recency_bonus": {
          "within_30_days": 6,
          "within_90_days": 3
        }
      },
      "evidence_mapping": [
        {
          "label": "Super Carl Connector",
          "when": "Strongest direct source = supercarl",
          "source": "supercarl"
        },
        {
          "label": "Connected on LinkedIn",
          "when": "Strongest direct source = linkedin",
          "source": "linkedin"
        },
        {
          "label": "In your address book",
          "when": "Strongest direct source = gmail",
          "source": "gmail"
        },
        {
          "label": "Connected through X",
          "when": "Strongest direct source = x",
          "source": "x"
        },
        {
          "label": "Connected on Instagram",
          "when": "Strongest direct source = instagram",
          "source": "instagram"
        },
        {
          "label": "Recent connection or verification",
          "when": "Strongest direct source was connected or verified within 90 days",
          "source": null
        }
      ]
    },
    {
      "key": "profile_overlap",
      "label": "Profile overlap",
      "max_points": 30,
      "evidence_category": "profile_overlap",
      "component_fields": [
        "metadata.components.profile_overlap",
        "evidence[]"
      ],
      "description": "Scores shared professional context such as current company, prior company history, timeline overlap, school background, and geography.",
      "scoring": {
        "same_small_company": 18,
        "same_large_company_with_domain_or_leadership": 16,
        "same_large_company_weak": 8,
        "prior_company": 8,
        "shared_current_industry": {
          "points": 2,
          "max_company_industry_count": 5,
          "excluded_industry_labels": [
            "Software Development",
            "IT Services and IT Consulting",
            "Technology, Information and Internet",
            "Financial Services",
            "Business Consulting and Services",
            "Advertising Services",
            "Venture Capital and Private Equity Principals",
            "Information Technology & Services",
            "Investment Management",
            "Higher Education",
            "Human Resources Services",
            "Computer and Network Security",
            "Hospitals and Health Care",
            "Real Estate",
            "Retail",
            "Non-profit Organizations",
            "Technology",
            "Staffing and Recruiting",
            "Entertainment",
            "Retail Apparel and Fashion",
            "Information and Internet",
            "Marketing Services",
            "Professional Training and Coaching",
            "Entertainment Providers",
            "Government Administration"
          ]
        },
        "timeline_overlap_tiers": [
          {
            "minMonths": 36,
            "score": 9
          },
          {
            "minMonths": 12,
            "score": 7
          },
          {
            "minMonths": 1,
            "score": 5
          }
        ],
        "shared_company_timeline_bonus_tiers": [
          {
            "minMonths": 36,
            "score": 10
          },
          {
            "minMonths": 12,
            "score": 8
          },
          {
            "minMonths": 1,
            "score": 6
          }
        ],
        "school": 4,
        "geography": 3,
        "small_company_exec_bonus": 3
      },
      "evidence_mapping": [
        {
          "label": "Same current company (...)",
          "when": "Current company matches",
          "source": null
        },
        {
          "label": "Same current company (...) with domain or leadership overlap",
          "when": "Current company matches and a stronger large-company corroboration signal exists",
          "source": null
        },
        {
          "label": "Both hold leadership roles at the same company",
          "when": "Small-company exec bonus applied",
          "source": null
        },
        {
          "label": "Shared current industry (...)",
          "when": "Specific current industry overlap applied",
          "source": null
        },
        {
          "label": "Shared company history at ...",
          "when": "Prior shared company applied",
          "source": null
        },
        {
          "label": "Overlapping time at ...",
          "when": "Timeline overlap tiers applied",
          "source": null
        },
        {
          "label": "Shared school background ...",
          "when": "School overlap applied",
          "source": null
        },
        {
          "label": "Same city",
          "when": "Top geography overlap is same_city",
          "source": null
        },
        {
          "label": "Similar geography",
          "when": "Geography overlap applied without same-city match",
          "source": null
        }
      ]
    },
    {
      "key": "reciprocal_communication",
      "label": "Reciprocal communication",
      "max_points": 15,
      "evidence_category": "reciprocal_communication",
      "component_fields": [
        "metadata.components.reciprocal_communication",
        "evidence[]"
      ],
      "description": "Scores direct message exchange on SuperCarl. Reciprocal conversations score materially higher than one-way outreach.",
      "scoring": {
        "max_points": 15,
        "formula_notes": [
          "Reciprocal message exchange uses a higher base, additional volume credit, and a balance bonus.",
          "One-way outreach is capped lower."
        ]
      },
      "evidence_mapping": [
        {
          "label": "Exchanged messages on SuperCarl",
          "when": "Both users have sent messages to each other",
          "source": "supercarl"
        },
        {
          "label": "One-way SuperCarl outreach",
          "when": "Only one user has messaged the other",
          "source": "supercarl"
        }
      ]
    },
    {
      "key": "public_activity",
      "label": "Public activity",
      "max_points": 20,
      "evidence_category": "public_activity",
      "component_fields": [
        "metadata.components.public_activity",
        "evidence[]"
      ],
      "description": "Scores post-level interactions such as likes, comments, reposts, and mentions, with decay for older activity and a multiplier for mutual activity.",
      "scoring": {
        "max_points": 20,
        "weights": {
          "like": 2,
          "reaction": 2,
          "comment": 4,
          "reply": 5,
          "repost": 5,
          "mention": 5
        },
        "mutual_multiplier": 3
      },
      "evidence_mapping": [
        {
          "label": "Mutual social activity across posts",
          "when": "Both users have public interactions toward each other",
          "source": "linkedin_or_activity_source"
        },
        {
          "label": "One-way likes or reactions",
          "when": "Strongest public activity is a like or reaction",
          "source": null
        },
        {
          "label": "One-way comments on posts",
          "when": "Strongest public activity is a comment",
          "source": null
        },
        {
          "label": "Reposted social content",
          "when": "Strongest public activity is a repost",
          "source": null
        },
        {
          "label": "Mentioned in social activity",
          "when": "Strongest public activity is a mention",
          "source": null
        }
      ]
    },
    {
      "key": "mutual_connections",
      "label": "Mutual connections",
      "max_points": 20,
      "evidence_category": "mutual_connections",
      "component_fields": [
        "metadata.components.mutual_connections_baseline",
        "metadata.components.mutual_connections_researched",
        "metadata.components.mutual_connections_search",
        "metadata.mutual_connections",
        "evidence[]"
      ],
      "description": "Scores shared connector overlap from LinkedIn and SuperCarl. When fresh LinkedIn mutual research is missing, a baseline floor is used so known graph overlap still contributes to search ranking.",
      "scoring": {
        "max_points": 20,
        "missing_linkedin_research_baseline": 10,
        "known_graph_evidence_label": "Some graph overlap, LinkedIn mutual not yet researched",
        "missing_research_label": "LinkedIn mutual overlap has not been fully researched yet",
        "linkedin_score_tiers": [
          {
            "minOverlapRatio": 0.02,
            "minMutualCount": 10,
            "score": 20,
            "evidenceLabel": "Very high LinkedIn mutual overlap"
          },
          {
            "minOverlapRatio": 0.01,
            "minMutualCount": 10,
            "score": 15,
            "evidenceLabel": "Strong LinkedIn mutual overlap"
          },
          {
            "minOverlapRatio": 0.002,
            "minMutualCount": 5,
            "score": 10,
            "evidenceLabel": "Meaningful LinkedIn mutual overlap"
          },
          {
            "minOverlapRatio": 0.001,
            "minMutualCount": 10,
            "score": 5,
            "evidenceLabel": "Some LinkedIn mutual overlap"
          },
          {
            "minOverlapRatio": 0,
            "minMutualCount": 3,
            "score": 2,
            "evidenceLabel": "A few LinkedIn mutuals"
          },
          {
            "minOverlapRatio": 0,
            "minMutualCount": 1,
            "score": 1,
            "evidenceLabel": "At least one LinkedIn mutual"
          }
        ],
        "supercarl_bonus_tiers": [
          {
            "minCount": 10,
            "score": 5,
            "evidenceLabel": "Many shared SuperCarl mutuals"
          },
          {
            "minCount": 5,
            "score": 3,
            "evidenceLabel": "Several shared SuperCarl mutuals"
          },
          {
            "minCount": 2,
            "score": 2,
            "evidenceLabel": "A few shared SuperCarl mutuals"
          },
          {
            "minCount": 1,
            "score": 1,
            "evidenceLabel": "Shared SuperCarl mutuals"
          }
        ]
      },
      "evidence_mapping": [
        {
          "label": "Some graph overlap, LinkedIn mutual not yet researched",
          "when": "Local graph overlap exists but fresh LinkedIn mutual research is not ready",
          "source": "linkedin"
        },
        {
          "label": "Very high LinkedIn mutual overlap",
          "when": "Researched LinkedIn overlap meets minMutualCount=10 and minOverlapRatio=0.02",
          "source": "linkedin"
        },
        {
          "label": "Strong LinkedIn mutual overlap",
          "when": "Researched LinkedIn overlap meets minMutualCount=10 and minOverlapRatio=0.01",
          "source": "linkedin"
        },
        {
          "label": "Meaningful LinkedIn mutual overlap",
          "when": "Researched LinkedIn overlap meets minMutualCount=5 and minOverlapRatio=0.002",
          "source": "linkedin"
        },
        {
          "label": "Some LinkedIn mutual overlap",
          "when": "Researched LinkedIn overlap meets minMutualCount=10 and minOverlapRatio=0.001",
          "source": "linkedin"
        },
        {
          "label": "A few LinkedIn mutuals",
          "when": "Researched LinkedIn overlap meets minMutualCount=3 and minOverlapRatio=0",
          "source": "linkedin"
        },
        {
          "label": "At least one LinkedIn mutual",
          "when": "Researched LinkedIn overlap meets minMutualCount=1 and minOverlapRatio=0",
          "source": "linkedin"
        },
        {
          "label": "Many shared SuperCarl mutuals",
          "when": "SuperCarl mutual count >= 10",
          "source": "supercarl"
        },
        {
          "label": "Several shared SuperCarl mutuals",
          "when": "SuperCarl mutual count >= 5",
          "source": "supercarl"
        },
        {
          "label": "A few shared SuperCarl mutuals",
          "when": "SuperCarl mutual count >= 2",
          "source": "supercarl"
        },
        {
          "label": "Shared SuperCarl mutuals",
          "when": "SuperCarl mutual count >= 1",
          "source": "supercarl"
        }
      ]
    },
    {
      "key": "cross_network",
      "label": "Cross-network corroboration",
      "max_points": 10,
      "evidence_category": "cross_network",
      "component_fields": [
        "metadata.components.cross_network",
        "evidence[]"
      ],
      "description": "Adds credit when the same relationship is corroborated across more than one direct network source.",
      "scoring": {
        "per_additional_source": 5,
        "max_points": 10
      },
      "evidence_mapping": [
        {
          "label": "Cross-network corroboration",
          "when": "Two or more direct relationship sources are present",
          "source": null
        }
      ]
    }
  ],
  "evidence": {
    "ordering": "Evidence entries are deduped and sorted by descending score weight, then by recency.",
    "shape": {
      "label": "string",
      "category": "direct_relationship|profile_overlap|reciprocal_communication|public_activity|mutual_connections|cross_network",
      "source": "string|null"
    },
    "categories": [
      {
        "key": "direct_relationship",
        "description": "Strongest direct relationship source plus optional recency evidence."
      },
      {
        "key": "profile_overlap",
        "description": "Shared professional, educational, and geographic context."
      },
      {
        "key": "reciprocal_communication",
        "description": "Message exchange on SuperCarl."
      },
      {
        "key": "public_activity",
        "description": "Likes, comments, reposts, mentions, and mutual post activity."
      },
      {
        "key": "mutual_connections",
        "description": "Local and researched mutual connector overlap across LinkedIn and SuperCarl."
      },
      {
        "key": "cross_network",
        "description": "Extra corroboration when multiple direct networks confirm the relationship."
      }
    ]
  },
  "path_scoring": {
    "description": "Connector path scoring ranks confirmed mutual introduction candidates for the authenticated detail endpoints. It blends viewer->connector and connector->target social proximity, then adds an actionability bonus for SuperCarl connectors. Ranking runs asynchronously and is cached; read responses may include provisional/unranked paths until intro_paths_status.ranking_pending is false. Returned path limits do not cap the candidate pool scored for ranking; caps/timeouts and ranking_queue_* stale-queue fields are surfaced in intro_paths_status. API/MCP clients should prefer relationship.social_map.entries[] as the unified list: confirmed mutual connectors use path_type=\"confirmed_mutual\", while possible \"may know\" paths sourced from first-degree viewer connections that pass the worked_with target profile-intersection filter use path_type=\"experience_intersection\" and are not confirmed mutuals.",
    "formula": "path_score = viewer_connector.search_score * viewerConnectorWeight + connector_target.search_score * connectorTargetWeight + optional supercarlActionabilityBonus",
    "weights": {
      "viewer_connector": 0.6,
      "connector_target": 0.4
    },
    "supercarl_actionability_bonus": 4,
    "max_points": 100,
    "surfaced_on": [
      "GET /users/:targetUserId/social-proximity -> connectors_supercarl[]",
      "GET /users/:targetUserId/social-proximity -> connectors_linkedin_manual[]",
      "POST /api/v1/search/people relationship_detail=intro_paths -> users[].relationship.social_map.entries[]",
      "POST /api/v1/search/people relationship_detail=intro_paths -> users[].relationship.intro_paths[]",
      "POST /api/v1/search/people relationship_detail=intro_paths -> users[].relationship.possible_intro_paths[]",
      "POST /api/v1/relationships/social-proximity/research -> relationship.social_map.entries[]",
      "POST /api/v1/relationships/social-proximity/research -> relationship.intro_paths[]",
      "POST /api/v1/relationships/social-proximity/research -> relationship.possible_intro_paths[]"
    ]
  }
}

Machine-readable JSON