The official API for the QualRecruit platform, used to retrieve and manipulate projects, respondents, the panel, incentives and scheduling.

Server
https://{tenant_id}.service.respondentlink.app/-/api/v1

Production

Server Variables

Your API token

Clients

Operations related to clients

Search clients

Returns the clients whose name contains the query, ordered by name.

Auth
Request Body

Name filter and row window.

objectobject
Querystring

Case insensitive substring matched against the client name. Empty returns all clients, ordered by name.

maxLength: 50

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /client/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/client/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"Query": "{string}",
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching clients for the requested page.

arrayarray[object]
Iduuid

Unique identifier of the client.

Namestring

Display name of the client.

400

The row window is negative, inverted, or wider than 1000 rows.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"Name": "{string}"
}
]
Copy

Get a client

Returns a single client by identifier.

Auth
Path Params
idstring

Identifier of the client.

GET /client/{id}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/client/{id}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The requested client.

objectobject
Iduuid

Unique identifier of the client.

Namestring

Display name of the client.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No client exists with this identifier.

Response
{
"Id": "{uuid}",
"Name": "{string}"
}
Copy

Incentives

Operations related to incentives

Search incentives

Returns incentives across all projects, most recently initiated first. Every filter is optional and filters combine, so sending an empty body returns the entire history. Results are paged with StartRow and EndRow, and at most 1000 rows may be requested at a time.

Auth
Request Body

Filters and row window.

objectobject
AfterDatestring?

Only return incentives initiated on or after this instant.

BeforeDatestring?

Only return incentives initiated on or before this instant.

ProjectIdstring?

Only return incentives issued from this project.

PanelIdstring?

Only return incentives issued to this panelist.

RespondentIdstring?

Only return incentives issued to this respondent.

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /incentive/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/incentive/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"AfterDate": "{null,string}",
"BeforeDate": "{null,string}",
"ProjectId": "{null,string}",
"PanelId": "{null,string}",
"RespondentId": "{null,string}",
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching incentives for the requested page.

arrayarray[object]
Iduuid

Unique identifier of the incentive.

RespondentIduuid

Respondent the incentive was issued to.

ProjectIduuid

Project the incentive was issued from.

PanelIdstring?

The ID of the respondent's panel record.

Descriptionstring

Description recorded against the incentive.

InitiatedOndate-time

When the incentive was requested.

InitiatedBystring

Email address of the user that requested the incentive.

Amountinteger|string

The incentive value in whole units (e.g., '10' for 10 dollars).

pattern: ^-?(?:0|[1-9]\d*)$

Currencystring

ISO 4217 currency code of the incentive value.

Statusstring

Where the incentive is in the ordering and delivery process.

Enum: requested,ordered,delivered,cancelled,failed,problem,unknown

Namestring?

Name of the recipient.

Emailstring?

Email address the incentive was delivered to.

Phonestring?

Phone number of the respondent.

400

'date_range' when BeforeDate is later than AfterDate, 'end_row' when the row window is inverted or wider than 1000 rows.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"RespondentId": "{uuid}",
"ProjectId": "{uuid}",
"PanelId": "{null,string}",
"Description": "{string}",
"InitiatedOn": "{date-time}",
"InitiatedBy": "{string}",
"Amount": "{integer,string}",
"Currency": "{string}",
"Status": "{string}",
"Name": "{null,string}",
"Email": "{null,string}",
"Phone": "{null,string}"
}
]
Copy

Get an incentive

Returns a single incentive by identifier.

Auth
Path Params
idstring

Identifier of the incentive.

GET /incentive/{id}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/incentive/{id}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The requested incentive.

objectobject
Iduuid

Unique identifier of the incentive.

RespondentIduuid

Respondent the incentive was issued to.

ProjectIduuid

Project the incentive was issued from.

PanelIdstring?

The ID of the respondent's panel record.

Descriptionstring

Description recorded against the incentive.

InitiatedOndate-time

When the incentive was requested.

InitiatedBystring

Email address of the user that requested the incentive.

Amountinteger|string

The incentive value in whole units (e.g., '10' for 10 dollars).

pattern: ^-?(?:0|[1-9]\d*)$

Currencystring

ISO 4217 currency code of the incentive value.

Statusstring

Where the incentive is in the ordering and delivery process.

Enum: requested,ordered,delivered,cancelled,failed,problem,unknown

Namestring?

Name of the recipient.

Emailstring?

Email address the incentive was delivered to.

Phonestring?

Phone number of the respondent.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No incentive exists with this identifier.

Response
{
"Id": "{uuid}",
"RespondentId": "{uuid}",
"ProjectId": "{uuid}",
"PanelId": "{null,string}",
"Description": "{string}",
"InitiatedOn": "{date-time}",
"InitiatedBy": "{string}",
"Amount": "{integer,string}",
"Currency": "{string}",
"Status": "{string}",
"Name": "{null,string}",
"Email": "{null,string}",
"Phone": "{null,string}"
}
Copy

List panel exports

Returns the 100 most recent panel export requests, newest first.

Auth
GET /panel/export
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/export' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The most recent export requests.

arrayarray[object]
Iduuid

Unique identifier of the export request. Use it to poll the request for completion.

Statusstring

Where the export is in the queue.

Enum: created,in_progress,complete,failed

Createddate-time

When the export was requested.

Startedstring?

When the export started processing. Null while the request is queued.

Completedstring?

When the export finished. Null until the request completes or fails.

Keystring?

Password for the exported ZIP archive. Set once the export completes.

Urlstring?

Time limited download link for the exported archive. Only returned when reading a single completed request, and valid for 30 minutes from the time it was issued.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"Status": "{string}",
"Created": "{date-time}",
"Started": "{null,string}",
"Completed": "{null,string}",
"Key": "{null,string}",
"Url": "{null,string}"
}
]
Copy

Request a panel export

Queues an export of the panelists matching the filters. An identical request made within the last five minutes is returned as-is instead of queueing a second export.

Auth
Request Body

Filters selecting the panelists to export.

objectobject
Filtersobject?

Filters selecting the panelists to export, keyed by column. Keys are either a panel question identifier prefixed with 'Data.' or one of the built in fields (Id, Email, FirstName, LastName, PhoneNumber, Status, Tags, Types, Created, LastUpdated, DateOfBirth, Location.Country, Location.City, Location.Province, Location.PostalCode, Quality.AggregateRating, Quality.Banned). Omit to export the whole panel.

POST /panel/export
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/export' \
--header 'Authorization: Bearer {token}' \
--data '{
"Filters": {}
}'
Copy
Responses
200

The queued - or matching recent - export request.

objectobject
Iduuid

Unique identifier of the export request. Use it to poll the request for completion.

Statusstring

Where the export is in the queue.

Enum: created,in_progress,complete,failed

Createddate-time

When the export was requested.

Startedstring?

When the export started processing. Null while the request is queued.

Completedstring?

When the export finished. Null until the request completes or fails.

Keystring?

Password for the exported ZIP archive. Set once the export completes.

Urlstring?

Time limited download link for the exported archive. Only returned when reading a single completed request, and valid for 30 minutes from the time it was issued.

400

A filter references a column that is not part of the panel.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
{
"Id": "{uuid}",
"Status": "{string}",
"Created": "{date-time}",
"Started": "{null,string}",
"Completed": "{null,string}",
"Key": "{null,string}",
"Url": "{null,string}"
}
Copy

Get a panel export

Returns the state of a panel export request.

Auth
Path Params
requestIdstring

Identifier of the export request.

GET /panel/export/{requestId}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/export/{requestId}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The export request, with a download link when complete.

objectobject
Iduuid

Unique identifier of the export request. Use it to poll the request for completion.

Statusstring

Where the export is in the queue.

Enum: created,in_progress,complete,failed

Createddate-time

When the export was requested.

Startedstring?

When the export started processing. Null while the request is queued.

Completedstring?

When the export finished. Null until the request completes or fails.

Keystring?

Password for the exported ZIP archive. Set once the export completes.

Urlstring?

Time limited download link for the exported archive. Only returned when reading a single completed request, and valid for 30 minutes from the time it was issued.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No export request exists with this identifier.

Response
{
"Id": "{uuid}",
"Status": "{string}",
"Created": "{date-time}",
"Started": "{null,string}",
"Completed": "{null,string}",
"Key": "{null,string}",
"Url": "{null,string}"
}
Copy

Get the panel schema

Returns the columns that describe the panel.

Auth
GET /panel/schema
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/schema' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The current panel schema.

objectobject
Versioninteger|string

Version of the panel schema definition.

pattern: ^-?(?:0|[1-9]\d*)$

Columns6 fieldsarray[object]

A list of panel columns.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
{
"Version": "{integer,string}",
"Columns": [
{
"Identifier": "{string}",
"Disabled": "{boolean}",
"ShortText": "{string}",
"Text": "{string}",
"Type": "{string}",
"MultipleChoice": "{null}"
}
]
}
Copy

Get a panelist

Returns a single panelist by identifier.

Auth
Path Params
idstring

Identifier of the panelist.

GET /panel/{id}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/{id}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The requested panelist.

objectobject
Iduuid

Unique identifier of the panelist.

FirstNamestring

Given name of the panelist.

LastNamestring

Family name of the panelist.

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist in E.164 format.

Createddate-time

When the panelist was added to the panel.

DateOfBirthdate-time

Date of birth of the panelist.

LastUpdateddate-time

When the panelist record was last modified.

Commentsstring

Internal notes recorded against the panelist.

Location4 fieldsobject

Where the panelist lives.

Dataobject

Answers to the panel columns, keyed by column identifier. See the panel schema endpoint for the identifiers and value types available.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Tagsarray[string]

Tags applied to the panelist.

Qualityobject

Quality signals collected from the panelist's participation history.

AggregateRatingnumber|string

Average of the ratings the panelist has received. Zero when never rated.

pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$

Bannedboolean

True when the panelist is blocked from further recruitment.

Utm
nullnull
401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No panelist exists with this identifier.

Response
{
"Id": "{uuid}",
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Created": "{date-time}",
"DateOfBirth": "{date-time}",
"LastUpdated": "{date-time}",
"Comments": "{string}",
"Location": {
"Country": "{string}",
"Province": "{string}",
"City": "{string}",
"PostalCode": "{string}"
},
"Data": {},
"Status": "{string}",
"Tags": [
"{array[string]...}"
],
"Quality": {
"AggregateRating": "{number,string}",
"Banned": "{boolean}"
},
"Utm": "{null}"
}
Copy

Delete a panelist

Permanently removes a panelist. Only panelists with no attachment to an existing project may be deleted.

Auth
Path Params
idstring

Identifier of the panelist.

DELETE /panel/{id}
curl --request DELETE \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/{id}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
204

The panelist was deleted.

No response body
401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

403

The panelist has project history and cannot be deleted.

404

No panelist exists with this identifier.

Response
No response
Copy

Update a panelist

Replaces the details of a single panelist. The request carries the complete record, so fields left empty are written as empty.

Auth
Path Params
idstring

Identifier of the panelist.

Request Body

Replacement details for the panelist. The Id field is ignored when updating a single record.

objectobject
Idstring?

Panelist to update. Required by the bulk update endpoint and ignored everywhere else.

DateOfBirthdate-time

Date of birth of the panelist. Must be on or after 1 January 1900 and not in the future.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Dataobject

Answers to the panel questions, keyed by question identifier. Identifiers must exist in the panel schema and values must match the question type: an array of strings for multiple choice, a number for numeric questions, a date for date, datetime and time questions, and a string otherwise. The name, last name, phone and email questions are written from the matching top level fields and do not need to be sent here.

Locationobject

Where the panelist lives.

Countrystring

Two letter ISO 3166-1 country code. Must be a country that has been enabled for the tenant.

maxLength: 2

minLength: 2

PostalCodestring

Postal or ZIP code of the panelist.

maxLength: 25

Commentsstring

Internal notes to record against the panelist.

maxLength: 1024

Tagsarray[string]

Tags to apply. Each tag must already exist on the panel.

FirstNamestring

Given name of the panelist.

maxLength: 50

LastNamestring

Family name of the panelist.

maxLength: 50

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist, in any format parseable for the location country. Stored in E.164 format.

PUT /panel/{id}
curl --request PUT \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/{id}' \
--header 'Authorization: Bearer {token}' \
--data '{
"Id": "{null,string}",
"DateOfBirth": "{date-time}",
"Status": "{string}",
"Data": {},
"Location": {
"Country": "{string}",
"PostalCode": "{string}"
},
"Comments": "{string}",
"Tags": [
"{array[string]...}"
],
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}"
}'
Copy
Responses
200

The panelist as stored after the update.

objectobject
Iduuid

Unique identifier of the panelist.

FirstNamestring

Given name of the panelist.

LastNamestring

Family name of the panelist.

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist in E.164 format.

Createddate-time

When the panelist was added to the panel.

DateOfBirthdate-time

Date of birth of the panelist.

LastUpdateddate-time

When the panelist record was last modified.

Commentsstring

Internal notes recorded against the panelist.

Location4 fieldsobject

Where the panelist lives.

Dataobject

Answers to the panel columns, keyed by column identifier. See the panel schema endpoint for the identifiers and value types available.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Tagsarray[string]

Tags applied to the panelist.

Qualityobject

Quality signals collected from the panelist's participation history.

AggregateRatingnumber|string

Average of the ratings the panelist has received. Zero when never rated.

pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$

Bannedboolean

True when the panelist is blocked from further recruitment.

Utm
nullnull
400

'update_failed' when the write did not apply, otherwise the field that failed validation: 'tags' when a tag does not exist on the panel, 'country' when the location country is missing or has not been enabled for your tenant, 'need_email_or_phone' when both contact fields are empty, 'invalid_phone' when the number cannot be parsed for that country, 'invalid_dob' when the date of birth is before 1900 or in the future, 'invalid_data' when a question identifier is unknown, 'invalid_data_format' when an answer does not match its question type.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No panelist exists with this identifier.

Response
{
"Id": "{uuid}",
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Created": "{date-time}",
"DateOfBirth": "{date-time}",
"LastUpdated": "{date-time}",
"Comments": "{string}",
"Location": {
"Country": "{string}",
"Province": "{string}",
"City": "{string}",
"PostalCode": "{string}"
},
"Data": {},
"Status": "{string}",
"Tags": [
"{array[string]...}"
],
"Quality": {
"AggregateRating": "{number,string}",
"Banned": "{boolean}"
},
"Utm": "{null}"
}
Copy

Search panelists

Returns the panelists matching the filters. Filters are combined with AND and may target both built-in fields and panel questions. Results are paged with StartRow and EndRow, and at most 1000 rows may be requested at a time.

Auth
Request Body

Filters and row window.

objectobject
Filtersobject?

Filters to apply, keyed by column. Keys are either a panel question identifier prefixed with 'Data.' or one of the built in fields (Id, Email, FirstName, LastName, PhoneNumber, Status, Tags, Types, Created, LastUpdated, DateOfBirth, Location.Country, Location.City, Location.Province, Location.PostalCode, Quality.AggregateRating, Quality.Banned). Omit to search the whole panel.

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /panel/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"Filters": {},
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching panelists for the requested page.

arrayarray[object]
Iduuid

Unique identifier of the panelist.

FirstNamestring

Given name of the panelist.

LastNamestring

Family name of the panelist.

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist in E.164 format.

Createddate-time

When the panelist was added to the panel.

DateOfBirthdate-time

Date of birth of the panelist.

LastUpdateddate-time

When the panelist record was last modified.

Commentsstring

Internal notes recorded against the panelist.

Location4 fieldsobject

Where the panelist lives.

Dataobject

Answers to the panel columns, keyed by column identifier. See the panel schema endpoint for the identifiers and value types available.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Tagsarray[string]

Tags applied to the panelist.

Qualityobject

Quality signals collected from the panelist's participation history.

AggregateRatingnumber|string

Average of the ratings the panelist has received. Zero when never rated.

pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$

Bannedboolean

True when the panelist is blocked from further recruitment.

Utm
nullnull
400

The row window is negative, inverted or wider than 1000 rows, or a filter references a column that is not part of the panel.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Created": "{date-time}",
"DateOfBirth": "{date-time}",
"LastUpdated": "{date-time}",
"Comments": "{string}",
"Location": {
"Country": "{string}",
"Province": "{string}",
"City": "{string}",
"PostalCode": "{string}"
},
"Data": {},
"Status": "{string}",
"Tags": [
"{array[string]...}"
],
"Quality": {
"AggregateRating": "{number,string}",
"Banned": "{boolean}"
},
"Utm": "{null}"
}
]
Copy

Create a panelist

Adds a single panelist to the panel. The email address must not already be in use.

Auth
Request Body

Panelist to create.

objectobject

Panelist to create. Identical to an update request except that Id is ignored.

Idstring?

Panelist to update. Required by the bulk update endpoint and ignored everywhere else.

DateOfBirthdate-time

Date of birth of the panelist. Must be on or after 1 January 1900 and not in the future.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Dataobject

Answers to the panel questions, keyed by question identifier. Identifiers must exist in the panel schema and values must match the question type: an array of strings for multiple choice, a number for numeric questions, a date for date, datetime and time questions, and a string otherwise. The name, last name, phone and email questions are written from the matching top level fields and do not need to be sent here.

Locationobject

Where the panelist lives.

Countrystring

Two letter ISO 3166-1 country code. Must be a country that has been enabled for the tenant.

maxLength: 2

minLength: 2

PostalCodestring

Postal or ZIP code of the panelist.

maxLength: 25

Commentsstring

Internal notes to record against the panelist.

maxLength: 1024

Tagsarray[string]

Tags to apply. Each tag must already exist on the panel.

FirstNamestring

Given name of the panelist.

maxLength: 50

LastNamestring

Family name of the panelist.

maxLength: 50

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist, in any format parseable for the location country. Stored in E.164 format.

POST /panel
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel' \
--header 'Authorization: Bearer {token}' \
--data '{
"Id": "{null,string}",
"DateOfBirth": "{date-time}",
"Status": "{string}",
"Data": {},
"Location": {
"Country": "{string}",
"PostalCode": "{string}"
},
"Comments": "{string}",
"Tags": [
"{array[string]...}"
],
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}"
}'
Copy
Responses
200

The created panelist.

objectobject
Iduuid

Unique identifier of the panelist.

FirstNamestring

Given name of the panelist.

LastNamestring

Family name of the panelist.

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist in E.164 format.

Createddate-time

When the panelist was added to the panel.

DateOfBirthdate-time

Date of birth of the panelist.

LastUpdateddate-time

When the panelist record was last modified.

Commentsstring

Internal notes recorded against the panelist.

Location4 fieldsobject

Where the panelist lives.

Dataobject

Answers to the panel columns, keyed by column identifier. See the panel schema endpoint for the identifiers and value types available.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Tagsarray[string]

Tags applied to the panelist.

Qualityobject

Quality signals collected from the panelist's participation history.

AggregateRatingnumber|string

Average of the ratings the panelist has received. Zero when never rated.

pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$

Bannedboolean

True when the panelist is blocked from further recruitment.

Utm
nullnull
400

The field that failed validation: 'tags' when a tag does not exist on the panel, 'country' when the location country is missing or has not been enabled for your tenant, 'need_email_or_phone' when both contact fields are empty, 'invalid_phone' when the number cannot be parsed for that country, 'invalid_dob' when the date of birth is before 1900 or in the future, 'invalid_data' when a question identifier is unknown, 'invalid_data_format' when an answer does not match its question type.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

409

Another panelist already uses this email address.

Response
{
"Id": "{uuid}",
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Created": "{date-time}",
"DateOfBirth": "{date-time}",
"LastUpdated": "{date-time}",
"Comments": "{string}",
"Location": {
"Country": "{string}",
"Province": "{string}",
"City": "{string}",
"PostalCode": "{string}"
},
"Data": {},
"Status": "{string}",
"Tags": [
"{array[string]...}"
],
"Quality": {
"AggregateRating": "{number,string}",
"Banned": "{boolean}"
},
"Utm": "{null}"
}
Copy

Import panelists in bulk

Adds up to 5000 panelists in a single transaction. Every panelist needs an email address, the addresses must be unique within the request, and none of them may already exist on the panel. Nothing is written unless the whole batch validates.

Auth
Request Body

Panelists to create. Maximum 5000 per call.

arrayarray[object]
Idstring?

Panelist to update. Required by the bulk update endpoint and ignored everywhere else.

DateOfBirthdate-time

Date of birth of the panelist. Must be on or after 1 January 1900 and not in the future.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Dataobject

Answers to the panel questions, keyed by question identifier. Identifiers must exist in the panel schema and values must match the question type: an array of strings for multiple choice, a number for numeric questions, a date for date, datetime and time questions, and a string otherwise. The name, last name, phone and email questions are written from the matching top level fields and do not need to be sent here.

Locationobject

Where the panelist lives.

Countrystring

Two letter ISO 3166-1 country code. Must be a country that has been enabled for the tenant.

maxLength: 2

minLength: 2

PostalCodestring

Postal or ZIP code of the panelist.

maxLength: 25

Commentsstring

Internal notes to record against the panelist.

maxLength: 1024

Tagsarray[string]

Tags to apply. Each tag must already exist on the panel.

FirstNamestring

Given name of the panelist.

maxLength: 50

LastNamestring

Family name of the panelist.

maxLength: 50

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist, in any format parseable for the location country. Stored in E.164 format.

POST /panel/@import
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/@import' \
--header 'Authorization: Bearer {token}' \
--data '[
{
"Id": "{null,string}",
"DateOfBirth": "{date-time}",
"Status": "{string}",
"Data": {},
"Location": {
"Country": "{string}",
"PostalCode": "{string}"
},
"Comments": "{string}",
"Tags": [
"{array[string]...}"
],
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}"
}
]'
Copy
Responses
204

Every panelist in the batch was created.

No response body
400

'too_many_imports' for more than 5000 panelists, 'emails_required' when an email address is missing, 'duplicate_emails' when the batch repeats an address, 'import_failed' when an address is already on the panel or the write failed. Otherwise the first field that failed validation: 'tags' when a tag does not exist on the panel, 'country' when the location country is missing or has not been enabled for your tenant, 'need_email_or_phone' when both contact fields are empty, 'invalid_phone' when the number cannot be parsed for that country, 'invalid_dob' when the date of birth is before 1900 or in the future, 'invalid_data' when a question identifier is unknown, 'invalid_data_format' when an answer does not match its question type.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
No response
Copy

Update panelists in bulk

Applies up to 5000 panelist updates in one call. Each entry must carry the Id of the panelist to update and a complete record - fields left empty are written as empty. Panelists that could not be updated are reported in the response rather than failing the call.

Auth
Request Body

Panelist updates. Maximum 5000 per call.

arrayarray[object]
Idstring?

Panelist to update. Required by the bulk update endpoint and ignored everywhere else.

DateOfBirthdate-time

Date of birth of the panelist. Must be on or after 1 January 1900 and not in the future.

Statusstring

Mailing status of the panelist.

Enum: unsubscribed,subscribed,disabled

Dataobject

Answers to the panel questions, keyed by question identifier. Identifiers must exist in the panel schema and values must match the question type: an array of strings for multiple choice, a number for numeric questions, a date for date, datetime and time questions, and a string otherwise. The name, last name, phone and email questions are written from the matching top level fields and do not need to be sent here.

Locationobject

Where the panelist lives.

Countrystring

Two letter ISO 3166-1 country code. Must be a country that has been enabled for the tenant.

maxLength: 2

minLength: 2

PostalCodestring

Postal or ZIP code of the panelist.

maxLength: 25

Commentsstring

Internal notes to record against the panelist.

maxLength: 1024

Tagsarray[string]

Tags to apply. Each tag must already exist on the panel.

FirstNamestring

Given name of the panelist.

maxLength: 50

LastNamestring

Family name of the panelist.

maxLength: 50

Emailstring

Email address of the panelist.

PhoneNumberstring

Phone number of the panelist, in any format parseable for the location country. Stored in E.164 format.

POST /panel/@bulkUpdate
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/panel/@bulkUpdate' \
--header 'Authorization: Bearer {token}' \
--data '[
{
"Id": "{null,string}",
"DateOfBirth": "{date-time}",
"Status": "{string}",
"Data": {},
"Location": {
"Country": "{string}",
"PostalCode": "{string}"
},
"Comments": "{string}",
"Tags": [
"{array[string]...}"
],
"FirstName": "{string}",
"LastName": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}"
}
]'
Copy
Responses
200

How many updates were applied, and the identifiers that failed.

objectobject
FailedIdsarray[string]

A list of panelists GUIDs that could not be updated.

SuccessCountinteger|string

Number of panelists that were updated.

pattern: ^-?(?:0|[1-9]\d*)$

RequestCountinteger|string

Number of updates that were submitted.

pattern: ^-?(?:0|[1-9]\d*)$

400

An empty list, 'too_many_updates' for more than 5000 entries, 'id_field_required' when an entry has no Id, 'duplicate_ids' when an Id is repeated, or 'bad_data: ' followed by the fields that failed validation: 'tags' when a tag does not exist on the panel, 'country' when the location country is missing or has no messaging numbers, 'need_email_or_phone' when both contact fields are empty, 'invalid_phone' when the number cannot be parsed for that country, 'invalid_dob' when the date of birth is before 1900 or in the future, 'invalid_data' when a question identifier is unknown, 'invalid_data_format' when an answer does not match its question type.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
{
"FailedIds": [
"{array[string]...}"
],
"SuccessCount": "{integer,string}",
"RequestCount": "{integer,string}"
}
Copy

Create a project

Creates an open project owned by the given user. Supplying DuplicateProjectId copies the schema and settings of an existing project. Requires the Write Access API to be enabled for your tenant.

Auth
Request Body

Details of the project to create.

objectobject
PublicNamestring

Name shown to respondents in invitations and surveys.

InternalNamestring

Name shown to platform users.

DefaultTimeZonestring

Time zone sessions in the project default to in TZ Database format (e.g., 'US/Eastern'). Must be one of the time zones configured for the tenant.

DefaultLocalestring

Language and country respondents are contacted in, formatted as 'language-country' (for example 'EN-US'). Locale must be an enabled locale for the tenant.

InitialOwnerstring

Email address of an existing user who will be set as the owner of the project.

Propertiesobject?

Custom property values to set, keyed by property identifier. Values must match the type of the property as returned by the project properties endpoint; dates may be sent as ISO 8601 strings. Unknown identifiers are rejected.

Tagsarray[string]

Tags to apply. Each tag must already exist on the tenant.

stringstring
DisableSmsboolean

Set to true to block all SMS messaging for the project. Cannot be changed once set.

Typestring

Project methodology: 'qual' for qualitative, 'quant' for quantitative. Quantitative projects are only accepted when the tenant has the quantitative feature enabled.

Enum: qual,quant

DuplicateProjectIdstring?

Existing project to copy the schema, surveys, and templates from.

ClientIdstring?

Client to associate the project with.

POST /project
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project' \
--header 'Authorization: Bearer {token}' \
--data '{
"PublicName": "{string}",
"InternalName": "{string}",
"DefaultTimeZone": "{string}",
"DefaultLocale": "{string}",
"InitialOwner": "{string}",
"Properties": {},
"Tags": [
"{array[string]...}"
],
"DisableSms": "{boolean}",
"Type": "{string}",
"DuplicateProjectId": "{null,string}",
"ClientId": "{null,string}"
}'
Copy
Responses
200

The created project.

objectobject
Iduuid

Unique identifier of the project.

Namestring

The internal name of the project as displayed to platform users.

ClientIdstring?

Client the project belongs to, if one is set.

ClientNamestring?

Name of the client the project belongs to, if one is set.

Createddate-time

When the project was created.

LastUpdatedstring?

When the project was last modified.

Tagsarray[string]

Tags applied to the project.

Counts3 fieldsobject

Recruitment progress across all groups in the project.

Propertiesobject

Custom project properties, keyed by property identifier. See the project properties endpoint for the identifiers and value types configured for this tenant.

Statestring

Lifecycle state of the project.

Enum: open,pending_close,closed

400

'invalid_property_or_format' for an unknown property identifier or a value of the wrong type, 'invalid_tag' for a tag that does not exist, 'quant_disabled' when a quantitative project is requested without the feature, 'invalid_locale' or 'invalid_time_zone' when those are not configured for the tenant, 'invalid_owner' when the initial owner is not a user, 'duplicate_project_not_found' when the project to duplicate does not exist.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

403

The write API is disabled for this tenant.

Response
{
"Id": "{uuid}",
"Name": "{string}",
"ClientId": "{null,string}",
"ClientName": "{null,string}",
"Created": "{date-time}",
"LastUpdated": "{null,string}",
"Tags": [
"{array[string]...}"
],
"Counts": {
"Required": "{integer,string}",
"Count": "{integer,string}",
"Held": "{integer,string}"
},
"Properties": {},
"State": "{string}"
}
Copy

Get a project

Returns a single project by identifier, including its tags, custom properties and recruitment counts.

Auth
Path Params
idstring

Identifier of the project.

GET /project/{id}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{id}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The requested project.

objectobject
Iduuid

Unique identifier of the project.

Namestring

The internal name of the project as displayed to platform users.

ClientIdstring?

Client the project belongs to, if one is set.

ClientNamestring?

Name of the client the project belongs to, if one is set.

Createddate-time

When the project was created.

LastUpdatedstring?

When the project was last modified.

Tagsarray[string]

Tags applied to the project.

Counts3 fieldsobject

Recruitment progress across all groups in the project.

Propertiesobject

Custom project properties, keyed by property identifier. See the project properties endpoint for the identifiers and value types configured for this tenant.

Statestring

Lifecycle state of the project.

Enum: open,pending_close,closed

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier.

Response
{
"Id": "{uuid}",
"Name": "{string}",
"ClientId": "{null,string}",
"ClientName": "{null,string}",
"Created": "{date-time}",
"LastUpdated": "{null,string}",
"Tags": [
"{array[string]...}"
],
"Counts": {
"Required": "{integer,string}",
"Count": "{integer,string}",
"Held": "{integer,string}"
},
"Properties": {},
"State": "{string}"
}
Copy

List custom project properties

Returns the custom project properties configured for the tenant. Their identifiers are the keys of the Properties dictionary when creating, reading or searching projects.

Auth
GET /project/@properties
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/@properties' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The properties configured for this tenant, ordered by name.

arrayarray[object]
Idstring

Identifier of the property. Use this as the key when defining project properties.

Namestring

Display name of the property.

Typestring

Value type accepted for this property.

Enum: user,text,number,date,unknown

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{string}",
"Name": "{string}",
"Type": "{string}"
}
]
Copy

Get a project schema

Returns the tabs and columns that make up the project grid.

Auth
Path Params
projectIdstring

Identifier of the project.

GET /project/{projectId}/schema
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/schema' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The current schema for the project.

objectobject
Iduuid

Unique identifier of the project.

Groups8 fieldsarray[object]

Groups (tabs) defined for the project.

Columns7 fieldsarray[object]

Columns defined on the project.

Versioninteger|string

Version of the schema definition.

pattern: ^-?(?:0|[1-9]\d*)$

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier.

Response
{
"Id": "{uuid}",
"Groups": [
{
"Name": "{string}",
"Label": "{string}",
"Incentive": "{string}",
"FieldDate": {
"StartDate": "{null,string}",
"EndDate": "{null,string}"
},
"RespondentsRequired": "{integer,string}",
"Private": "{boolean}",
"TimeZone": "{string}",
"Variables": {}
}
],
"Columns": [
{
"Identifier": "{string}",
"Groups": [
"{array[string]...}"
],
"Text": "{string}",
"ShortText": "{string}",
"Private": "{boolean}",
"Type": "{string}",
"MultipleChoice": "{null}"
}
],
"Version": "{integer,string}"
}
Copy

List respondents in a project

Returns the respondents recruited into a project, oldest first, with their answers to the project questions.

Auth
Path Params
projectIdstring

Identifier of the project.

Query String
allboolean

Set to true to also return staged respondents that are not published.

Default: false

groupstring

Only return respondents in this group (tab). Omit to return every group.

GET /project/{projectId}/respondents
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/respondents' \
--header 'Authorization: Bearer {token}' \
--data all={all} \
--data group={group}
Copy
Responses
200

The respondents matching the request.

arrayarray[object]
Iduuid

Unique identifier of the respondent.

Groupstring

Group (grid tab) the respondent belongs to.

Namestring

Name of the respondent.

Emailstring

Email address of the respondent.

PhoneNumberstring

Phone number of the respondent in E.164 format.

Countrystring

Two letter ISO 3166-1 country code of the respondent.

Languagestring

Language of the respondent.

PanelIdstring?

The unique identifier of the respondent's panel record.

LastUpdateddate-time

When the respondent record was last modified.

Createddate-time

When the respondent was added to the project.

Dataobject

Answers given by the respondent, keyed by question identifier. Multiple choice answers are returned as an array of the selected options and numeric answers as numbers; see the project schema endpoint for the type of each question.

Status6 fieldsobject

Recruitment state of the respondent.

400

'invalid_group' when the group is not part of the project schema.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier, or it has no schema.

Response
[
{
"Id": "{uuid}",
"Group": "{string}",
"Name": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Country": "{string}",
"Language": "{string}",
"PanelId": "{null,string}",
"LastUpdated": "{date-time}",
"Created": "{date-time}",
"Data": {},
"Status": {
"Disqualified": "{boolean}",
"Held": "{boolean}",
"Overridden": "{boolean}",
"Presence": "{string}",
"Staged": "{boolean}",
"Planned": "{boolean}"
}
}
]
Copy

List the survey feed for a group

Returns survey sessions targeting a group that have not yet been attached to a respondent. Identifiers are survey session identifiers rather than respondent identifiers, contact fields are empty and every entry is marked as staged.

Auth
Path Params
projectIdstring

Identifier of the project.

Query String
groupstring

Group (tab) targeted by the survey links.

GET /project/{projectId}/feed
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/feed' \
--header 'Authorization: Bearer {token}' \
--data group={group}
Copy
Responses
200

The feed entries for the group.

arrayarray[object]
Iduuid

Unique identifier of the respondent.

Groupstring

Group (grid tab) the respondent belongs to.

Namestring

Name of the respondent.

Emailstring

Email address of the respondent.

PhoneNumberstring

Phone number of the respondent in E.164 format.

Countrystring

Two letter ISO 3166-1 country code of the respondent.

Languagestring

Language of the respondent.

PanelIdstring?

The unique identifier of the respondent's panel record.

LastUpdateddate-time

When the respondent record was last modified.

Createddate-time

When the respondent was added to the project.

Dataobject

Answers given by the respondent, keyed by question identifier. Multiple choice answers are returned as an array of the selected options and numeric answers as numbers; see the project schema endpoint for the type of each question.

Status6 fieldsobject

Recruitment state of the respondent.

400

'invalid_group' when the group is not part of the project schema.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier, or it has no schema.

Response
[
{
"Id": "{uuid}",
"Group": "{string}",
"Name": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Country": "{string}",
"Language": "{string}",
"PanelId": "{null,string}",
"LastUpdated": "{date-time}",
"Created": "{date-time}",
"Data": {},
"Status": {
"Disqualified": "{boolean}",
"Held": "{boolean}",
"Overridden": "{boolean}",
"Presence": "{string}",
"Staged": "{boolean}",
"Planned": "{boolean}"
}
}
]
Copy

Get validation results for a group

Validates a group (tab) against the project schema and returns qualification and quota errors and quota counts.

Auth
Path Params
projectIdstring

Identifier of the project.

Query String
groupstring

Group (tab) to validate.

allboolean

Set to true to also retrieve validation information for staged respondents that are not published.

Default: false

GET /project/{projectId}/validation
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/validation' \
--header 'Authorization: Bearer {token}' \
--data group={group} \
--data all={all}
Copy
Responses
200

The validation results for the group.

objectobject
Respondents2 fieldsarray[object]

Respondents evaluated by the validator, with any qualification errors found for each.

QuotaErrors3 fieldsarray[object]

Quotas in the group that are broken or close to being broken.

QuotaCounts6 fieldsarray[object]

Current count of respondents in each quota of the group.

400

'invalid_group' when the group is not part of the project schema.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier, or it has no schema.

Response
{
"Respondents": [
{
"Id": "{uuid}",
"Errors": [
{
"Column": "{string}",
"Type": "{string}",
"Message": "{string}"
}
]
}
],
"QuotaErrors": [
{
"Column": "{string}",
"Type": "{string}",
"Message": "{string}"
}
],
"QuotaCounts": [
{
"Id": "{integer,string}",
"Column": "{string}",
"Description": "{string}",
"Target": "{integer,string}",
"Type": "{string}",
"Count": "{integer,string}"
}
]
}
Copy

Get a respondent

Returns a single respondent record in a project.

Auth
Path Params
projectIdstring

Identifier of the project.

respondentIdstring

Identifier of the respondent.

GET /project/{projectId}/respondents/{respondentId}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/respondents/{respondentId}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

The requested respondent.

objectobject
Iduuid

Unique identifier of the respondent.

Groupstring

Group (grid tab) the respondent belongs to.

Namestring

Name of the respondent.

Emailstring

Email address of the respondent.

PhoneNumberstring

Phone number of the respondent in E.164 format.

Countrystring

Two letter ISO 3166-1 country code of the respondent.

Languagestring

Language of the respondent.

PanelIdstring?

The unique identifier of the respondent's panel record.

LastUpdateddate-time

When the respondent record was last modified.

Createddate-time

When the respondent was added to the project.

Dataobject

Answers given by the respondent, keyed by question identifier. Multiple choice answers are returned as an array of the selected options and numeric answers as numbers; see the project schema endpoint for the type of each question.

Status6 fieldsobject

Recruitment state of the respondent.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

The project or the respondent does not exist, or the project has no schema.

Response
{
"Id": "{uuid}",
"Group": "{string}",
"Name": "{string}",
"Email": "{string}",
"PhoneNumber": "{string}",
"Country": "{string}",
"Language": "{string}",
"PanelId": "{null,string}",
"LastUpdated": "{date-time}",
"Created": "{date-time}",
"Data": {},
"Status": {
"Disqualified": "{boolean}",
"Held": "{boolean}",
"Overridden": "{boolean}",
"Presence": "{string}",
"Staged": "{boolean}",
"Planned": "{boolean}"
}
}
Copy

Move respondents to another tab

Moves the given respondents into another tab within the project. Requires the write API to be enabled for the tenant.

Auth
Path Params
projectIdstring

Identifier of the project.

Request Body

Respondents to move and the group to move them into.

objectobject
RespondentIdsarray[string]

GUID identifiers of respondents to move.

TargetGroupstring

Name of the target group, as returned by the project schema endpoint.

POST /project/{projectId}/respondents/@move
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/{projectId}/respondents/@move' \
--header 'Authorization: Bearer {token}' \
--data '{
"RespondentIds": [
"{array[string]...}"
],
"TargetGroup": "{string}"
}'
Copy
Responses
204

The respondents were moved.

No response body
400

An empty respondent list, or 'invalid_target_group' when the group is not part of the project schema.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

403

The write API is disabled for this tenant.

404

No project exists with this identifier, or it has no schema.

Response
No response
Copy

Search projects

Returns the projects matching the filters. Every filter is optional and filters combine, so an empty body returns all open projects. Results are paged with StartRow and EndRow, and at most 1000 rows may be requested at a time.

Auth
Request Body

Filters and row window.

objectobject
Tagsarray[string]

Only return projects carrying at least one of these tags.

UpdatedBeforeDatestring?

Only return projects last modified before this instant.

UpdatedAfterDatestring?

Only return projects last modified after this instant.

ClientIdstring?

Only return projects belonging to this client.

Statestring

Which project states to include. Defaults to open projects only.

Enum: open,closed,both

Propertiesobject

Custom property values to match, keyed by property identifier. Values must match the type of the property as returned by the project properties endpoint; dates may be sent as ISO 8601 strings. Unknown identifiers are rejected.

PropertiesFilterobject

Comparison to use for each entry in Properties, keyed by the same property identifier. Properties without an entry here are matched for equality.

*string

Enum: eq,gt,gte,lt,lte,ne

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /project/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/project/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"Tags": [
"{array[string]...}"
],
"UpdatedBeforeDate": "{null,string}",
"UpdatedAfterDate": "{null,string}",
"ClientId": "{null,string}",
"State": "{string}",
"Properties": {},
"PropertiesFilter": {},
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching projects for the requested page.

arrayarray[object]
Iduuid

Unique identifier of the project.

Namestring

The internal name of the project as displayed to platform users.

ClientIdstring?

Client the project belongs to, if one is set.

ClientNamestring?

Name of the client the project belongs to, if one is set.

Createddate-time

When the project was created.

LastUpdatedstring?

When the project was last modified.

Tagsarray[string]

Tags applied to the project.

Counts3 fieldsobject

Recruitment progress across all groups in the project.

Propertiesobject

Custom project properties, keyed by property identifier. See the project properties endpoint for the identifiers and value types configured for this tenant.

Statestring

Lifecycle state of the project.

Enum: open,pending_close,closed

400

The row window is inverted or wider than 1000 rows, or a property filter uses an unknown identifier or a value of the wrong type.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"Name": "{string}",
"ClientId": "{null,string}",
"ClientName": "{null,string}",
"Created": "{date-time}",
"LastUpdated": "{null,string}",
"Tags": [
"{array[string]...}"
],
"Counts": {
"Required": "{integer,string}",
"Count": "{integer,string}",
"Held": "{integer,string}"
},
"Properties": {},
"State": "{string}"
}
]
Copy

Schedule

Operations related to calendar invitations

List scheduled sessions for a project

Returns every active session booked with a respondent in the project. Cancelled invitations are not included.

Auth
Path Params
projectIdstring

Identifier of the project.

GET /schedule/{projectId}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/schedule/{projectId}' \
--header 'Authorization: Bearer {token}'
Copy
Responses
200

Active sessions booked in the project.

arrayarray[object]
Iduuid

Unique identifier of the invitation.

RespondentNamestring

Name of the respondent.

RespondentGroupstring

The identifier of the group (tab) the respondent is in.

RespondentIduuid

The unique identifier of the respondent.

Subjectstring

Subject line of the calendar invitation.

AllDayboolean

True when the calendar invitation is an all day event.

SessionStartdate-time

Start time of the session.

SessionEnddate-time

End time of the session.

Locationstring

The location of the session as defined in the calendar invitation template.

TimeZonestring

IANA time zone of the invitation.

Confirmedstring?

When the respondent confirmed attendance. Null if the invitation is unconfirmed.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier.

Response
[
{
"Id": "{uuid}",
"RespondentName": "{string}",
"RespondentGroup": "{string}",
"RespondentId": "{uuid}",
"Subject": "{string}",
"AllDay": "{boolean}",
"SessionStart": "{date-time}",
"SessionEnd": "{date-time}",
"Location": "{string}",
"TimeZone": "{string}",
"Confirmed": "{null,string}"
}
]
Copy

Search scheduled sessions across projects

Returns active sessions booked with respondents across all open projects, ordered by start time. Every filter is optional and filters combine, so an empty body returns sessions from the start of today onwards. Results are paged with StartRow and EndRow, and at most 1000 rows may be requested at a time.

Auth
Request Body

Filters and row window.

objectobject
StartDatestring?

Only return sessions starting at or after this instant. Defaults to the start of today.

EndDatestring?

Only return sessions starting at or before this instant.

ClientIdstring?

Only return sessions in projects belonging to this client.

Confirmedboolean?

Set to true to only return confirmed sessions, or false to only return unconfirmed sessions. Omit to return both.

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /schedule/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/schedule/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"StartDate": "{null,string}",
"EndDate": "{null,string}",
"ClientId": "{null,string}",
"Confirmed": "{null,boolean}",
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching sessions for the requested page.

arrayarray[object]
Iduuid

Unique identifier of the invitation.

ProjectIduuid

The unique identifier of the project the session belongs to.

ProjectNamestring

Internal name of the project the session belongs to.

RespondentNamestring

Name of the respondent.

RespondentEmailstring

Email address of the respondent.

RespondentPhonestring

Phone number of the respondent in E.164 format.

RespondentCountrystring

Two letter ISO 3166-1 country code of the respondent.

RespondentLanguagestring

Language of the respondent.

RespondentGroupstring

The identifier of the group (tab) the respondent is in.

RespondentIduuid

The unique identifier of the respondent.

Subjectstring

Subject line of the calendar invitation.

AllDayboolean

True when the calendar invitation is an all day event.

SessionStartdate-time

Start time of the session.

SessionEnddate-time

End time of the session.

Locationstring

The location of the session as defined in the calendar invitation template.

TimeZonestring

IANA time zone of the invitation.

Confirmedstring?

When the respondent confirmed attendance. Null if the invitation is unconfirmed.

400

The row window is negative, inverted, or wider than 1000 rows, or StartDate is after EndDate.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Id": "{uuid}",
"ProjectId": "{uuid}",
"ProjectName": "{string}",
"RespondentName": "{string}",
"RespondentEmail": "{string}",
"RespondentPhone": "{string}",
"RespondentCountry": "{string}",
"RespondentLanguage": "{string}",
"RespondentGroup": "{string}",
"RespondentId": "{uuid}",
"Subject": "{string}",
"AllDay": "{boolean}",
"SessionStart": "{date-time}",
"SessionEnd": "{date-time}",
"Location": "{string}",
"TimeZone": "{string}",
"Confirmed": "{null,string}"
}
]
Copy

Search the mail suppression list

Returns the email addresses that are on the global email suppression list. Every filter is optional and filters combine. Results are paged with StartRow and EndRow, and at most 1000 rows may be requested at a time.

Auth
Request Body

Filters and row window.

objectobject
AddedDateBeforestring?

Only return entries added before this instant.

AddedDateAfterstring?

Only return entries added after this instant.

Emailstring?

Only return the entry for this exact email address.

Typestring

Only return entries suppressed for this reason. Defaults to all reasons.

Enum: all,unsub,bounce,complaint

StartRowinteger|string

Zero based index of the first row to return.

pattern: ^-?(?:0|[1-9]\d*)$

EndRowinteger|string

Exclusive index of the last row to return. At most 1000 rows may be requested at a time.

pattern: ^-?(?:0|[1-9]\d*)$

POST /system/suppressionList/@search
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/system/suppressionList/@search' \
--header 'Authorization: Bearer {token}' \
--data '{
"AddedDateBefore": "{null,string}",
"AddedDateAfter": "{null,string}",
"Email": "{null,string}",
"Type": "{string}",
"StartRow": "{integer,string}",
"EndRow": "{integer,string}"
}'
Copy
Responses
200

Matching suppression entries for the requested page.

arrayarray[object]
Emailstring

The suppressed email address.

Reasonstring

Why the address was suppressed - one of 'unsub', 'bounce' or 'complaint'.

Addeddate-time

When the address was added to the suppression list.

400

'start_row' when the row window is negative or inverted, 'end_row' when it is wider than 1000 rows.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
[
{
"Email": "{string}",
"Reason": "{string}",
"Added": "{date-time}"
}
]
Copy

Remove addresses from the mail suppression list

Removes the given email addresses from the global suppression list. Requires the write API to be enabled for the tenant.

Auth
Request Body

Addresses to release.

objectobject
Emailsarray[string]

Email addresses to remove from the global suppression list. Maximum 1000 per call.

POST /system/suppressionList/@remove
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/system/suppressionList/@remove' \
--header 'Authorization: Bearer {token}' \
--data '{
"Emails": [
"{array[string]...}"
]
}'
Copy
Responses
204

The addresses are no longer suppressed.

No response body
400

'email_count' when more than 1000 addresses are sent, 'email_format' when an entry is not a bare email address.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

403

The write API is disabled for this tenant.

Response
No response
Copy

Add addresses to the mail suppression list

Adds an email address to the global suppression list. Addresses that are already on the list are not affected.

Auth
Request Body

Addresses to suppress.

objectobject
Emailsarray[string]

Email addresses to suppress. Maximum 1000 per call.

POST /system/suppressionList
curl --request POST \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/system/suppressionList' \
--header 'Authorization: Bearer {token}' \
--data '{
"Emails": [
"{array[string]...}"
]
}'
Copy
Responses
204

The addresses are now suppressed.

No response body
400

'email_count' when more than 1000 addresses are sent, 'email_format' when an entry is not a bare email address.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

Response
No response
Copy

Voice

Operations related to voice calls

List calls for a project

Returns the completed (including missed) calls placed to or received from respondents in a project, ordered by most recent first. Results are returned 100 calls at a time.

Auth
Path Params
projectIdstring

Identifier of the project.

Query String
pageinteger|string

Zero based page number. Each page holds 100 calls.

pattern: ^-?(?:0|[1-9]\d*)$

GET /voice/callLog/{projectId}
curl --get \
--url 'https://{tenant_id}.service.respondentlink.app/-/api/v1/voice/callLog/{projectId}' \
--header 'Authorization: Bearer {token}' \
--data page={page}
Copy
Responses
200

The requested page of calls.

arrayarray[object]
Iduuid

Unique identifier of the call.

Descriptionstring

Free text description recorded against the call.

Directionstring

Whether the call was placed to ('out') or received from ('in') the respondent.

Enum: in,out

StartTimedate-time

When the call started.

EndedTimestring?

When the call ended. Null while the call is still in progress.

RespondentIduuid

Identifier of the respondent that was called.

Initiatorstring?

Email address of the user that placed or answered the call. Null for missed or unanswered calls.

Statusstring

Outcome of the call.

Enum: initiated,active,complete,failed,missed,unknown

Namestring

Name of the respondent at the time the log was read.

Groupstring

Grid tab the respondent currently belongs to.

401

The token is missing, unknown, disabled or expired, or the API is not enabled for the tenant.

404

No project exists with this identifier.

Response
[
{
"Id": "{uuid}",
"Description": "{string}",
"Direction": "{string}",
"StartTime": "{date-time}",
"EndedTime": "{null,string}",
"RespondentId": "{uuid}",
"Initiator": "{null,string}",
"Status": "{string}",
"Name": "{string}",
"Group": "{string}"
}
]
Copy