Saasco logoSaasco logo
Saasco logoSaasco logo

Introduction

Quick StartWhat is Saasco?

Analytics

CRM

postList ContactsgetGet ContactgetGet By EmailgetList RelatedpostUpsert ContactpatchUpdate ContactdelDelete ContactpostGet PropertiespostCount SubscribedpostMigrate Distinct Id

Email Marketing

Knowledge

Support

Projects

Contacts

List Related

Lists the other contacts sharing this contact's email address. An address can be held by more than one contact — most often because the same person was identified under two IDs, for example after the customer migrated auth providers — and they are surfaced as related rather than merged. Returns an empty list when the contact has no email or no siblings.

GET
/projects/{projectId}/crm/contacts/{distinctId}/related

Authorization

Authorization
AuthorizationBearer <token>

In: header

Path Parameters

projectIdrequiredstring

ID of the project that owns the contact.

distinctIdrequiredstring

Distinct ID of the contact whose siblings to list.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://www.saasco.com/api/v2/projects/string/crm/contacts/string/related"
[
  {
    "id": "string",
    "createdAt": "string",
    "updatedAt": "string",
    "projectId": "string",
    "distinctId": "string",
    "email": "string",
    "toDelete": true,
    "properties": {
      "age": 0,
      "avatar": "http://example.com",
      "birthday": "string",
      "createdAt": "string",
      "description": "string",
      "displayName": "string",
      "email": "user@example.com",
      "firstName": "string",
      "gender": "string",
      "id": "string",
      "lastName": "string",
      "name": "string",
      "phone": "string",
      "title": "string",
      "username": "string",
      "website": "string",
      "$id": "string",
      "$lastSeen": "string",
      "$lastIdentifiedAt": "string",
      "$processedAt": "string",
      "$unsubscribed": true,
      "$subscribed": true,
      "$unsubscribeReason": "manual",
      "$unsubscribeSource": "string",
      "$emailValidated": true,
      "$lastEmailValidatedAt": "string",
      "$emailValidationResult": "string",
      "$emailScore": 0,
      "$stripeCustomerId": "string",
      "$os": "string",
      "$browser": "string",
      "$browserVersion": "string",
      "$screenHeight": 0,
      "$screenWidth": 0,
      "$screenDpi": 0,
      "$device": "string",
      "$userAgent": "string",
      "$ip": "string",
      "$timezone": "string",
      "$city": "string",
      "$country": "string",
      "$countryCode": "string",
      "$continent": "string",
      "$region": "string",
      "$locale": "string",
      "$latitude": 0,
      "$longitude": 0,
      "$referrer": "string",
      "$referringDomain": "string",
      "$initialReferrer": "string",
      "$initialReferringDomain": "string",
      "$utmSource": "string",
      "$utmMedium": "string",
      "$utmCampaign": "string",
      "$utmTerm": "string",
      "$utmContent": "string",
      "$initialUtmSource": "string",
      "$initialUtmMedium": "string",
      "$initialUtmCampaign": "string",
      "$initialUtmTerm": "string",
      "$initialUtmContent": "string",
      "$_toDelete": true,
      "$_emailScoreActions": "string",
      "property1": "string",
      "property2": "string"
    }
  }
]
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}

Get By Email

Looks a contact up by email address rather than distinct ID, the usual entry point when all you have is an email from a form or webhook. When more than one contact holds the address, returns the primary: a hard distinct ID over a `soft_` placeholder, then the most recently updated. Returns 404 if no contact matches.

Upsert Contact

Creates a contact, or updates it if one already exists with the same distinct ID. Properties are merged rather than replaced, so omitting a property leaves its current value alone. Send an explicit null to clear one. Omitting `distinctId` generates one with a `soft_` prefix, which is what you want for a contact you only know by email. A new hard distinct ID whose email is already on another contact creates a second, related contact rather than failing.