Contacts

List, search, write and photo-download contacts across Google, Microsoft 365 and CardDAV.

Guides: Contacts.

MethodPathOperationScope
GET/v1/accounts/{accountId}/contactsList or search contacts, by nameread
POST/v1/accounts/{accountId}/contactsCreate a contactwrite
GET/v1/accounts/{accountId}/contacts/{contactId}Get a contactread
PATCH/v1/accounts/{accountId}/contacts/{contactId}Change a contactwrite
DELETE/v1/accounts/{accountId}/contacts/{contactId}Delete a contactwrite
GET/v1/accounts/{accountId}/contacts/{contactId}/photoDownload a contact's photoread
GET/v1/accounts/{accountId}/contact-foldersList contact foldersread
GET
/v1/accounts/{accountId}/contacts

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Reads the index. q matches part of any name, the organization or any email address, case-insensitively.

Required scope: read.

Path Parameters

accountId*string
Formatuuid

Query Parameters

q?string
Length1 <= length <= 200
folderId?string
Formatuuid
limit?integer
Range1 <= value <= 500
Default100
cursor?string
Length1 <= length <= 512

Response Body

OK

application/json
  1. response
items*array<>
nextCursor*|null
Example Request
curl -X GET 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts'
Example Response
{  "items": [    {      "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",      "folderId": "708b432e-9495-4168-82e1-0cf52a8ef66f",      "displayName": "string",      "givenName": "string",      "middleName": "string",      "familyName": "string",      "nickname": "string",      "emails": [        {          "address": "ada@example.com",          "type": "home"        }      ],      "phones": [        {          "number": "string",          "type": "mobile"        }      ],      "organization": "string",      "jobTitle": "string",      "department": "string",      "birthday": "string",      "notes": "string",      "hasPhoto": true,      "updatedAt": "2026-05-04T09:30:00.000Z"    }  ],  "nextCursor": "eyJ0eG5pZCI6IjQyIiwiaWQiOjEwMDF9"}

Create a contact

POST
/v1/accounts/{accountId}/contacts

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Written to the provider, then to the index, so it is listed at once.

Required scope: write.

Path Parameters

accountId*string
Formatuuid

Request Body

application/json
  1. body
folderId?string
Formatuuid
displayName?string
Length1 <= length <= 256
givenName?string
Length1 <= length <= 256
middleName?string
Length1 <= length <= 256
familyName?string
Length1 <= length <= 256
nickname?string
Length1 <= length <= 256
emails?array<>
Itemsitems <= 20
phones?array<>
Itemsitems <= 20
organization?string
Length1 <= length <= 256
jobTitle?string
Length1 <= length <= 256
department?string
Length1 <= length <= 256
birthday?string
Match^(\d{4}-|--)\d{2}-\d{2}$
notes?string
Lengthlength <= 10000

Response Body

OK

application/json
  1. response
id*string
Formatuuid
folderId*|null
displayName*string|null
givenName*string|null
middleName*string|null
familyName*string|null
nickname*string|null
emails*array<>
phones*array<>
organization*string|null
jobTitle*string|null
department*string|null
birthday*string|null
notes*string|null
hasPhoto*boolean|null
updatedAt*string
Formatdate-time
Example Request
curl -X POST 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "folderId": "708b432e-9495-4168-82e1-0cf52a8ef66f",  "displayName": "string",  "givenName": "string",  "middleName": "string",  "familyName": "string",  "nickname": "string",  "emails": [    {      "address": "ada@example.com",      "type": "home"    }  ],  "phones": [    {      "number": "string",      "type": "mobile"    }  ],  "organization": "string",  "jobTitle": "string",  "department": "string",  "birthday": "string",  "notes": "string",  "hasPhoto": true,  "updatedAt": "2026-05-04T09:30:00.000Z"}

Get a contact

GET
/v1/accounts/{accountId}/contacts/{contactId}

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Reads the index.

Required scope: read.

Path Parameters

accountId*string
Formatuuid
contactId*string
Formatuuid

Response Body

OK

application/json
  1. response
id*string
Formatuuid
folderId*|null
displayName*string|null
givenName*string|null
middleName*string|null
familyName*string|null
nickname*string|null
emails*array<>
phones*array<>
organization*string|null
jobTitle*string|null
department*string|null
birthday*string|null
notes*string|null
hasPhoto*boolean|null
updatedAt*string
Formatdate-time
Example Request
curl -X GET 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts/6181f81d-cf41-4ce3-b932-5cbe6b7d01c5'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "folderId": "708b432e-9495-4168-82e1-0cf52a8ef66f",  "displayName": "string",  "givenName": "string",  "middleName": "string",  "familyName": "string",  "nickname": "string",  "emails": [    {      "address": "ada@example.com",      "type": "home"    }  ],  "phones": [    {      "number": "string",      "type": "mobile"    }  ],  "organization": "string",  "jobTitle": "string",  "department": "string",  "birthday": "string",  "notes": "string",  "hasPhoto": true,  "updatedAt": "2026-05-04T09:30:00.000Z"}

Change a contact

PATCH
/v1/accounts/{accountId}/contacts/{contactId}

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Fields present change (null clears); emails and phones replace the whole list.

Required scope: write.

Path Parameters

accountId*string
Formatuuid
contactId*string
Formatuuid

Request Body

application/json
  1. body
displayName?|null
givenName?|null
middleName?|null
familyName?|null
nickname?|null
emails?array<>
Itemsitems <= 20
phones?array<>
Itemsitems <= 20
organization?|null
jobTitle?|null
department?|null
birthday?|null
notes?|null

Response Body

OK

application/json
  1. response
id*string
Formatuuid
folderId*|null
displayName*string|null
givenName*string|null
middleName*string|null
familyName*string|null
nickname*string|null
emails*array<>
phones*array<>
organization*string|null
jobTitle*string|null
department*string|null
birthday*string|null
notes*string|null
hasPhoto*boolean|null
updatedAt*string
Formatdate-time
Example Request
curl -X PATCH 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts/6181f81d-cf41-4ce3-b932-5cbe6b7d01c5' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",  "folderId": "708b432e-9495-4168-82e1-0cf52a8ef66f",  "displayName": "string",  "givenName": "string",  "middleName": "string",  "familyName": "string",  "nickname": "string",  "emails": [    {      "address": "ada@example.com",      "type": "home"    }  ],  "phones": [    {      "number": "string",      "type": "mobile"    }  ],  "organization": "string",  "jobTitle": "string",  "department": "string",  "birthday": "string",  "notes": "string",  "hasPhoto": true,  "updatedAt": "2026-05-04T09:30:00.000Z"}

Delete a contact

DELETE
/v1/accounts/{accountId}/contacts/{contactId}

Runs against the live API with the key you enter: this change really happens. Use a key limited to a test account.

Required scope: write.

Path Parameters

accountId*string
Formatuuid
contactId*string
Formatuuid

Response Body

OK

application/json
  1. response
Example Request
curl -X DELETE 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts/6181f81d-cf41-4ce3-b932-5cbe6b7d01c5'
Example Response
null
GET
/v1/accounts/{accountId}/contacts/{contactId}/photo

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Fetched from the provider on first request and cached until the photo changes.

Required scope: read.

Path Parameters

accountId*string
Formatuuid
contactId*string
Formatuuid

Response Body

The photo as the provider stores it (image/jpeg, image/png, ...)

response?stringimage/*
Example Request
curl -X GET 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contacts/6181f81d-cf41-4ce3-b932-5cbe6b7d01c5/photo'
Example Response
"string"

List contact folders

GET
/v1/accounts/{accountId}/contact-folders

Runs in your browser against api.workwae.com with the key you enter. Use a read-only key, limited to a test account if you can.

Microsoft 365 contact folders, the default folder first; empty for Google accounts.

Required scope: read.

Path Parameters

accountId*string
Formatuuid

Response Body

OK

application/json
  1. response
items*array<>
Example Request
curl -X GET 'https://api.workwae.com/v1/accounts/6f1c2a4e-8b3d-4e5f-9a7b-1c2d3e4f5a6b/contact-folders'
Example Response
{  "items": [    {      "id": "c4e6a8b0-1d3f-4a5c-8e7b-9d1f3a5c7e9b",      "name": "string",      "isDefault": true    }  ]}