Skip to content

Create a site contact

POST
/v1/clients/{clientId}/sites/{siteId}/contact-persons
curl --request POST \
--url https://api2.recruso.co.uk/v1/clients/1/sites/1/contact-persons \
--header 'Authorization: <Authorization>' \
--header 'Content-Type: application/json' \
--data '{ "siteId": 512, "department": "Warehouse operations", "position": "Shift Manager", "title": "Ms", "forename": "Priya", "surname": "Raman", "telephone1": "0161 872 4415", "telephone2": "0161 872 4416", "mobile": "07700 900318", "email": "p.raman@example-northgate.co.uk", "fax": "0161 872 4417", "notes": "Best reached on the early shift, 06:00-14:00.", "canUseClientApp": true, "sector": "example" }'

Adds a contact person to one of your own agency’s sites. Site contacts are who the agency deals with day to day — they raise the work, and activities and cost-centre links hang off them.

Only forename is required. siteId in the body must match the siteId in the route, otherwise the request returns 400.

title is a title name, not an id — one of the values published by the titles vocabulary. An unrecognised name returns 400 listing the accepted values.

Contacts are not name-checked for uniqueness: a site can hold two contacts with the same name. The site must belong to the client named in the route, otherwise 404. On success the response carries the new contactPersonId and a Location header pointing at GetSiteContactPersonById.

Access. Requires a client-credentials access token. Tokens issued through the interactive user login are rejected.

clientId
required
integer format: int32

The clientId path parameter

siteId
required
integer format: int32

The siteId path parameter

Media typeapplication/json

The contact person to add to a site.

object
siteId

The site the contact belongs to. Must match the site id in the route.

integer format: int32
Example
512
department

The contact’s department at the site. Up to 100 characters.

string
nullable
Example
Warehouse operations
position

The contact’s job title at the site. Up to 100 characters.

string
nullable
Example
Shift Manager
title

The contact’s title, given by name rather than by id. Must be one of the names published by the titles vocabulary; an unrecognised name returns 400 listing the accepted values.

string
nullable
Example
Ms
forename

The contact’s forename. Required, up to 50 characters.

string
Example
Priya
surname

The contact’s surname. Up to 50 characters.

string
nullable
Example
Raman
telephone1

The contact’s main telephone number. Up to 50 characters.

string
nullable
Example
0161 872 4415
telephone2

A second telephone number for the contact. Up to 50 characters.

string
nullable
Example
0161 872 4416
mobile

The contact’s mobile number. Up to 50 characters.

string
nullable
Example
07700 900318
email

The contact’s email address. Up to 150 characters.

string
nullable
Example
p.raman@example-northgate.co.uk
fax

The contact’s fax number. Up to 50 characters.

string
nullable
Example
0161 872 4417
notes

Free-text notes about the contact. Up to 550 characters.

string
nullable
Example
Best reached on the early shift, 06:00-14:00.
canUseClientApp

Whether this contact may sign in to the client portal.

boolean
nullable
Example
true
sector
string
nullable

Created

Media typeapplication/json

A newly created site contact.

object
contactPersonId

The contact’s unique identifier, assigned by Recruso.

integer format: int32
siteId

The site this contact belongs to.

integer format: int32
department

The contact’s department at the site. Up to 100 characters.

string
nullable
position

The contact’s job title at the site. Up to 100 characters.

string
nullable
title

The contact’s title, given by name rather than by id. Must be one of the names published by the titles vocabulary; an unrecognised name returns 400 listing the accepted values.

string
nullable
forename

The contact’s forename. Required, up to 50 characters.

string
surname

The contact’s surname. Up to 50 characters.

string
nullable
telephone1

The contact’s main telephone number. Up to 50 characters.

string
nullable
telephone2

A second telephone number for the contact. Up to 50 characters.

string
nullable
mobile

The contact’s mobile number. Up to 50 characters.

string
nullable
email

The contact’s email address. Up to 150 characters.

string
nullable
fax

The contact’s fax number. Up to 50 characters.

string
nullable
notes

Free-text notes about the contact. Up to 550 characters.

string
nullable
isDeleted

Whether the contact is deleted. Always false here — a deleted contact returns 404 from every read operation until it is restored.

boolean
nullable
createdBy

The Recruso user who created the contact.

integer format: int16
nullable
createdOn

When the contact was created, in UK local time (GMT/BST) — not UTC.

string format: date-time
nullable
modifiedBy

The Recruso user who last updated the contact. Null until the contact is first updated.

integer format: int16
nullable
modifiedOn

When the contact was last updated, in UK local time (GMT/BST) — not UTC. Null until the contact is first updated.

string format: date-time
nullable
canUseClientApp

Whether this contact may sign in to the client portal.

boolean
nullable
sector
string
nullable
Example
{
"contactPersonId": 88,
"siteId": 512,
"department": "Warehouse operations",
"position": "Shift Manager",
"title": "Ms",
"forename": "Priya",
"surname": "Raman",
"telephone1": "0161 872 4415",
"telephone2": "0161 872 4416",
"mobile": "07700 900318",
"email": "p.raman@example-northgate.co.uk",
"fax": "0161 872 4417",
"notes": "Best reached on the early shift, 06:00-14:00.",
"isDeleted": false,
"createdBy": 12,
"createdOn": "2026-03-09T11:24:07",
"modifiedBy": 12,
"modifiedOn": "2026-06-11T14:02:09",
"canUseClientApp": true
}

Bad Request

Media typeapplication/problem+json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Unauthorized

Media typeapplication/problem+json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Forbidden

Media typeapplication/problem+json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}

Not Found

Media typeapplication/problem+json
object
type
string
nullable
title
string
nullable
status
integer format: int32
nullable
detail
string
nullable
instance
string
nullable
Examplegenerated
{
"type": "example",
"title": "example",
"status": 1,
"detail": "example",
"instance": "example"
}