Skip to content

Create a site

POST
/v1/clients/{clientId}/sites
curl --request POST \
--url https://api2.recruso.co.uk/v1/clients/1/sites \
--header 'Authorization: <Authorization>' \
--header 'Content-Type: application/json' \
--data '{ "clientId": 137, "siteName": "Trafford Park DC", "memo": "Gatehouse sign-in required; ask for the shift supervisor.", "gre": 1, "grn": 1, "address1": "Northgate House", "address2": "22 Ashburton Road West", "town": "Trafford Park", "county": "Greater Manchester", "country": "United Kingdom", "postCode": "M17 1RU", "telephone1": "0161 872 4410", "telephone2": "0161 872 4411", "fax": "0161 872 4412", "email": "trafford@example-northgate.co.uk", "invoiceMethodId": 1, "useSiteAddressForInvoice": true, "useSiteEmailForInvoice": false, "branchId": 4, "timesheetEmail": "timesheets@example-northgate.co.uk" }'

Creates a site under one of your own agency’s clients. A site is the location work is actually performed at, and it is what rates, bookings and plans hang off — not the client.

Only siteName is required; every other field is optional and can be filled in later with UpdateSite. clientId in the body must match the clientId in the route, otherwise the request returns 400.

siteName must be unique among that client’s active sites. A clash with an active site returns 400. A clash with an archived site returns 409 with that site’s siteId, because the database keeps the name reserved — restore the archived site with RestoreSite, or choose a different name. Note that this 409 body is not an RFC 7807 problem document; it carries siteId and message.

invoiceMethodId is an id from the invoice methods vocabulary; an id that does not exist returns 400. branchId is optional, and when given must be a branch the Recruso user behind your API app can access — any other branch returns 400, not 403.

A client that does not exist, belongs to another agency, or sits under a branch that user cannot access returns 404. On success the response carries the new siteId and a Location header pointing at GetSiteById.

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

Media typeapplication/json

The site to create.

object
clientId

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

integer format: int32
Example
137
siteName

The site’s name. Required, up to 70 characters, and unique among the client’s active sites.

string
Example
Trafford Park DC
memo

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

string
nullable
Example
Gatehouse sign-in required; ask for the shift supervisor.
gre
number format: float
nullable
grn
number format: float
nullable
address1

First line of the site address. Up to 150 characters.

string
nullable
Example
Northgate House
address2

Second line of the site address. Up to 50 characters.

string
nullable
Example
22 Ashburton Road West
town

Town or city of the site address.

string
nullable
Example
Trafford Park
county

County of the site address.

string
nullable
Example
Greater Manchester
country

Country of the site address.

string
nullable
Example
United Kingdom
postCode

Postcode of the site address.

string
nullable
Example
M17 1RU
telephone1

The site’s main telephone number.

string
nullable
Example
0161 872 4410
telephone2

A second telephone number for the site.

string
nullable
Example
0161 872 4411
fax

The site’s fax number.

string
nullable
Example
0161 872 4412
email

The site’s main email address.

string
nullable
Example
trafford@example-northgate.co.uk
invoiceMethodId

How invoices for this site are delivered, as an id from the invoice methods vocabulary.

integer format: int16
nullable
Example
1
useSiteAddressForInvoice

Whether invoices for this site use the site address rather than the client’s invoice address.

boolean
nullable
Example
true
useSiteEmailForInvoice

Whether invoices for this site are sent to the site email rather than the client’s invoice email.

boolean
nullable
Example
false
branchId

The branch this site is managed under.

integer format: int16
nullable
Example
4
timesheetEmail

The address timesheets for this site are sent to.

string
nullable
Example
timesheets@example-northgate.co.uk

Created

Media typeapplication/json

A newly created site.

object
siteId

The site’s unique identifier, assigned by Recruso.

integer format: int32
clientId

The client this site belongs to.

integer format: int32
siteName

The site’s name. Required, up to 70 characters, and unique among the client’s active sites.

string
memo

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

string
nullable
gre
number format: float
nullable
grn
number format: float
nullable
address1

First line of the site address. Up to 150 characters.

string
nullable
address2

Second line of the site address. Up to 50 characters.

string
nullable
town

Town or city of the site address.

string
nullable
county

County of the site address.

string
nullable
country

Country of the site address.

string
nullable
postCode

Postcode of the site address.

string
nullable
telephone1

The site’s main telephone number.

string
nullable
telephone2

A second telephone number for the site.

string
nullable
fax

The site’s fax number.

string
nullable
email

The site’s main email address.

string
nullable
invoiceMethodId

How invoices for this site are delivered, as an id from the invoice methods vocabulary.

integer format: int16
nullable
useSiteAddressForInvoice

Whether invoices for this site use the site address rather than the client’s invoice address.

boolean
nullable
useSiteEmailForInvoice

Whether invoices for this site are sent to the site email rather than the client’s invoice email.

boolean
nullable
branchId

The branch this site is managed under.

integer format: int16
nullable
timesheetEmail

The address timesheets for this site are sent to.

string
nullable
createdBy

The Recruso user who created the site.

integer format: int16
nullable
createdOn

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

string format: date-time
nullable
Example
{
"siteId": 512,
"clientId": 137,
"siteName": "Trafford Park DC",
"memo": "Gatehouse sign-in required; ask for the shift supervisor.",
"address1": "Northgate House",
"address2": "22 Ashburton Road West",
"town": "Trafford Park",
"county": "Greater Manchester",
"country": "United Kingdom",
"postCode": "M17 1RU",
"telephone1": "0161 872 4410",
"telephone2": "0161 872 4411",
"fax": "0161 872 4412",
"email": "trafford@example-northgate.co.uk",
"invoiceMethodId": 1,
"useSiteAddressForInvoice": true,
"useSiteEmailForInvoice": false,
"branchId": 4,
"timesheetEmail": "timesheets@example-northgate.co.uk",
"createdBy": 12,
"createdOn": "2026-03-06T10:41:12"
}

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"
}

Conflict

Media typeapplication/json

Returned with 409 when a site name is already held by an archived site of the same client. Not an RFC 7807 problem document.

object
siteId

The archived site already holding this name. Restore it with RestoreSite, or choose a different name.

integer format: int32
message

An explanation of the conflict, and what to do about it.

string
Example
{
"siteId": 512,
"message": "A site with this name was previously archived for this client. To restore it, use the restore endpoint or choose a different name."
}