Updates an existing contact (partial update using PATCH semantics).

Usage Examples

Update email address with concurrency control:

PATCH /api/v1/network/contacts/789
If-Match: W/"AAAAAAAAK0Q="
Content-Type: application/json

{
  "email": "newemail@example.com"
}

Update multiple fields:

{
  "firstName": "Jane",
  "tags": ["vip", "enterprise", "decision-maker"]
}

Clear a field (set to null):

{
  "phone": null,
  "primaryLanguage": null
}

Concurrency Control with ETags

The If-Match header enables optimistic concurrency control:

  1. Fetch the contact: GET /contacts/789 (receives ETag in response)
  2. Modify the data locally
  3. Send update with If-Match: {etag} header
  4. If another client modified the contact in the meantime, you'll receive 412 Precondition Failed
  5. Re-fetch the contact, merge changes, and retry

Best practice: Always include the If-Match header when updating from external CRM systems to prevent overwriting concurrent changes from users.

Partial Update Semantics

This endpoint implements true HTTP PATCH semantics:

  • Only fields present in the request body are updated
  • Omitted fields retain their current values
  • To clear a field, explicitly set it to null
  • If no fields actually change, returns 200 OK with unchanged data

Validation Rules

Same validation rules as POST /contacts apply to updated fields.

Path Parameters
  • id
    Type: string
    required

    The unique identifier of the contact to update

Headers
  • If-Match
    Type: string

    ETag value from a previous GET or PATCH response for optimistic concurrency control

Body·
required

ETag value from a previous GET or PATCH response. Enables optimistic concurrency control to prevent lost updates.

Request body for updating an existing contact. Only include fields you want to change. Omitted fields are left unchanged; fields set to null are cleared.

  • blocked
    Type: null | boolean
  • connections
    Type: array object[] ·

    List of company connections (employments).

    A link between a contact and a company, used when creating or updating contacts.

  • email
    Type: null | string

    Email address.

  • externalRefs
    Type: array object[] ·

    External references to this contact in other systems (e.g. CRM IDs).

    Represents an external system reference (e.g., Salesforce, HubSpot, Pipedrive). Supports multiple CRM systems simultaneously.

  • firstName
    Type: null | string

    First name.

  • lastName
    Type: null | string

    Last name.

  • linkedInUrl
    Type: null | string

    LinkedIn profile URL in the format https://www.linkedin.com/in/{slug}.

  • phone
    Type: null | string

    Phone number.

  • primaryLanguage
    Type: null | string

    ISO 639-1 language code (e.g. 'en', 'sv').

  • profilePictureId
    Type: null | integerFormat: int32
  • strategy
    Type: null | string

    Investment strategy or description.

  • tags
    Type: array string[]

    List of tags or labels.

Responses
  • application/json
  • application/problem+json
  • application/problem+json
  • application/problem+json
  • application/problem+json
  • application/problem+json
  • application/problem+json
Request Example for patch/api/v1/network/contacts/{id}
curl 'https://app.propstreet.com/api/v1/network/contacts/{id}' \
  --request PATCH \
  --header 'If-Match: ' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --data '{
  "externalRefs": [
    {
      "namespace": "",
      "id": ""
    }
  ],
  "firstName": null,
  "lastName": null,
  "email": null,
  "phone": null,
  "linkedInUrl": null,
  "primaryLanguage": null,
  "tags": [
    ""
  ],
  "strategy": null,
  "connections": [
    {
      "company": {
        "kind": "existing",
        "id": ""
      },
      "jobTitle": null,
      "primary": true
    }
  ],
  "blocked": null,
  "profilePictureId": null
}'
{
  "id": "string",
  "uri": null,
  "externalRefs": [
    {
      "namespace": "string",
      "id": "string"
    }
  ],
  "firstName": null,
  "lastName": null,
  "email": null,
  "phone": null,
  "linkedInUrl": null,
  "emails": [
    {
      "address": "string",
      "type": null,
      "isPrimary": true
    }
  ],
  "phones": [
    {
      "number": "string",
      "type": null,
      "isPrimary": true
    }
  ],
  "primaryLanguage": null,
  "tags": [
    "string"
  ],
  "strategy": null,
  "primaryCompanyId": null,
  "companies": [
    {
      "id": "string",
      "uri": null,
      "name": "string",
      "jobTitle": null,
      "isPrimary": true
    }
  ],
  "profilePictureUrl": null,
  "createdUtc": "2026-05-18T20:22:36.959Z",
  "updatedUtc": "2026-05-18T20:22:36.959Z",
  "deletedUtc": null,
  "etag": "string",
  "changeType": null,
  "changeOrigin": null
}