{"_id":"569e609bebbadc0d0079bed3","isReference":false,"parentDoc":null,"hidden":false,"link_external":false,"link_url":"","slug":"getting-started","type":"basic","api":{"params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"code":"{}","name":"","status":400,"language":"json"}]},"settings":"","url":"","auth":"required"},"createdAt":"2016-01-19T16:13:15.595Z","project":"569e6099ebbadc0d0079becd","title":"Getting Started with RolePoint Connect","updates":[],"user":"569e6058ffccd10d00a05b49","body":"## Connect Overview\n\nIntegrate once and connect directly to the leading Applicant Tracking Systems (ATSs). \n\nGet [jobs straight from the ATS](doc:job-webhooks) and [create your own application process](doc:get-jobs-and-insert-applications). [Search for candidates](doc:find-candidates) and build your own CRM or simply [get your candidates into the ATS with the correct source](doc:send-candidate).\n\nThe root URL for the API is https://api.rolepoint-connect.com/v1\nAll data is sent and received as JSON over HTTPS, using the Unicode UTF-8 text encoding.\nWe won’t rename or remove fields without a version bump.\n\n[Skip the overview and create your first Sandbox Connector](doc:sandbox-connector)","excerpt":"Get to know the features of Connect","category":"569e609aebbadc0d0079bed1","githubsync":"","order":0,"sync_unique":"","version":"569e609aebbadc0d0079bed0","__v":67,"childrenPages":[]}

Getting Started with RolePoint Connect

Get to know the features of Connect

## Connect Overview
Integrate once and connect directly to the leading Applicant Tracking Systems (ATSs).
Get [jobs straight from the ATS](doc:job-webhooks) and [create your own application process](doc:get-jobs-and-insert-applications). [Search for candidates](doc:find-candidates) and build your own CRM or simply [get your candidates into the ATS with the correct source](doc:send-candidate).
The root URL for the API is https://api.rolepoint-connect.com/v1
All data is sent and received as JSON over HTTPS, using the Unicode UTF-8 text encoding.
We won’t rename or remove fields without a version bump.
[Skip the overview and create your first Sandbox Connector](doc:sandbox-connector)

## Connect Overview
Integrate once and connect directly to the leading Applicant Tracking Systems (ATSs).
Get [jobs straight from the ATS](doc:job-webhooks) and [create your own application process](doc:get-jobs-and-insert-applications). [Search for candidates](doc:find-candidates) and build your own CRM or simply [get your candidates into the ATS with the correct source](doc:send-candidate).
The root URL for the API is https://api.rolepoint-connect.com/v1
All data is sent and received as JSON over HTTPS, using the Unicode UTF-8 text encoding.
We won’t rename or remove fields without a version bump.
[Skip the overview and create your first Sandbox Connector](doc:sandbox-connector)

{"_id":"56e4a86fca77c62900ee4154","createdAt":"2016-03-12T23:38:23.836Z","hidden":false,"order":1,"slug":"features","title":"Features","version":"569e609aebbadc0d0079bed0","__v":2,"link_url":"","parentDoc":null,"project":"569e6099ebbadc0d0079becd","isReference":false,"body":"### Apply\nCreate candidates and applications in the ATS.\n\n### Candidate Status\nGet updates on a candidate as they move through the application process.\n\n### Jobs\nGet notified when a job is created, updated or deleted.\n\n### Candidate Search\nSearch for candidates by email, creation date or modified date.\n\n### Candidate Detail\nGet details on a candidate like the application source or their phone number.","githubsync":"","link_external":false,"sync_unique":"","user":"56d846d5b20d260b0026570b","category":"569e609aebbadc0d0079bed1","excerpt":"","type":"basic","updates":[],"api":{"auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":""},"childrenPages":[]}

Features

### Apply
Create candidates and applications in the ATS.
### Candidate Status
Get updates on a candidate as they move through the application process.
### Jobs
Get notified when a job is created, updated or deleted.
### Candidate Search
Search for candidates by email, creation date or modified date.
### Candidate Detail
Get details on a candidate like the application source or their phone number.

### Apply
Create candidates and applications in the ATS.
### Candidate Status
Get updates on a candidate as they move through the application process.
### Jobs
Get notified when a job is created, updated or deleted.
### Candidate Search
Search for candidates by email, creation date or modified date.
### Candidate Detail
Get details on a candidate like the application source or their phone number.

{"_id":"56ddc5890cfa331700f4d002","isReference":false,"link_url":"","slug":"authentication","sync_unique":"","category":"56d730d436dd840b00cef0f7","hidden":false,"parentDoc":null,"type":"basic","user":"543d38fea10ab32000b3aa8f","version":"569e609aebbadc0d0079bed0","api":{"auth":"required","params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":""},"excerpt":"","githubsync":"","title":"Authentication","updates":[],"__v":4,"createdAt":"2016-03-07T18:16:41.304Z","order":0,"project":"569e6099ebbadc0d0079becd","body":"You should issue all requests with Basic Authentication parameters using the credentials you were provided with.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"curl -u username:password https://api.rolepoint-connect.com\",\n \"language\": \"curl\"\n }\n ]\n}\n[/block]\nRequests that require authentication may return a `404 Not Found` instead of a `401 Authorization Required` or `403 Forbidden` response to avoid leaking private URLs.\n\n### Failed login limit\n\nAuthenticating with invalid credentials will return `401 Unauthorized`. After detecting several requests with invalid credentials within a short period, the API will temporarily reject all authentication attempts for that user (including ones with valid credentials) with a `403 Forbidden` response.","link_external":false,"childrenPages":[]}

Authentication

You should issue all requests with Basic Authentication parameters using the credentials you were provided with.
[block:code]
{
"codes": [
{
"code": "curl -u username:password https://api.rolepoint-connect.com",
"language": "curl"
}
]
}
[/block]
Requests that require authentication may return a `404 Not Found` instead of a `401 Authorization Required` or `403 Forbidden` response to avoid leaking private URLs.
### Failed login limit
Authenticating with invalid credentials will return `401 Unauthorized`. After detecting several requests with invalid credentials within a short period, the API will temporarily reject all authentication attempts for that user (including ones with valid credentials) with a `403 Forbidden` response.

You should issue all requests with Basic Authentication parameters using the credentials you were provided with.
[block:code]
{
"codes": [
{
"code": "curl -u username:password https://api.rolepoint-connect.com",
"language": "curl"
}
]
}
[/block]
Requests that require authentication may return a `404 Not Found` instead of a `401 Authorization Required` or `403 Forbidden` response to avoid leaking private URLs.
### Failed login limit
Authenticating with invalid credentials will return `401 Unauthorized`. After detecting several requests with invalid credentials within a short period, the API will temporarily reject all authentication attempts for that user (including ones with valid credentials) with a `403 Forbidden` response.

{"_id":"56ddbcda5771a520003923b0","api":{"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"language":"json","code":"{}","name":"","status":400}]},"settings":"","url":"","auth":"required","params":[]},"project":"569e6099ebbadc0d0079becd","slug":"version","type":"basic","updates":[],"githubsync":"","isReference":false,"user":"543d38fea10ab32000b3aa8f","body":"By default, all requests currently use v2 of the API. We encourage you to explicitly request this version via the `Accept` header.\n\n Accept: application/rolepoint.v2+json\n \nSee [Media Types](media-types/) for more information.","createdAt":"2016-03-07T17:39:38.008Z","excerpt":"","link_url":"","parentDoc":null,"sync_unique":"","title":"Version","__v":2,"category":"56d730d436dd840b00cef0f7","hidden":false,"link_external":false,"order":1,"version":"569e609aebbadc0d0079bed0","childrenPages":[]}

Version

By default, all requests currently use v2 of the API. We encourage you to explicitly request this version via the `Accept` header.
Accept: application/rolepoint.v2+json
See [Media Types](media-types/) for more information.

By default, all requests currently use v2 of the API. We encourage you to explicitly request this version via the `Accept` header.
Accept: application/rolepoint.v2+json
See [Media Types](media-types/) for more information.

{"_id":"56ddbd530e801d2900c2e408","createdAt":"2016-03-07T17:41:39.516Z","hidden":false,"sync_unique":"","title":"Schema","version":"569e609aebbadc0d0079bed0","__v":4,"isReference":false,"parentDoc":null,"project":"569e6099ebbadc0d0079becd","type":"basic","user":"543d38fea10ab32000b3aa8f","api":{"params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"language":"json","code":"{}","name":"","status":400}]},"settings":"","url":"","auth":"required"},"category":"56d730d436dd840b00cef0f7","link_external":false,"updates":[],"githubsync":"","link_url":"","order":2,"slug":"schema","body":"All API access is over HTTPS and accessed from the `api.rolepoint-connect.com` domain. All data is sent and received as JSON.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \" curl --user user:pass https://api.rolepoint-connect.com/endpoint\\n\\n > {'connected': True}\",\n \"language\": \"curl\"\n }\n ]\n}\n[/block]\nOptional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.\n\nAll timestamps are returned in ISO 8601 format:\n\n YYYY-MM-DDTHH:MM:SSZ","excerpt":"","childrenPages":[]}

Schema

All API access is over HTTPS and accessed from the `api.rolepoint-connect.com` domain. All data is sent and received as JSON.
[block:code]
{
"codes": [
{
"code": " curl --user user:pass https://api.rolepoint-connect.com/endpoint\n\n > {'connected': True}",
"language": "curl"
}
]
}
[/block]
Optional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.
All timestamps are returned in ISO 8601 format:
YYYY-MM-DDTHH:MM:SSZ

All API access is over HTTPS and accessed from the `api.rolepoint-connect.com` domain. All data is sent and received as JSON.
[block:code]
{
"codes": [
{
"code": " curl --user user:pass https://api.rolepoint-connect.com/endpoint\n\n > {'connected': True}",
"language": "curl"
}
]
}
[/block]
Optional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.
All timestamps are returned in ISO 8601 format:
YYYY-MM-DDTHH:MM:SSZ

{"_id":"56ddbb9350dd421700424b7e","sync_unique":"","title":"Asynchronous Requests","api":{"params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"language":"json","code":"{}","name":"","status":400}]},"settings":"","url":"","auth":"required"},"hidden":false,"order":4,"project":"569e6099ebbadc0d0079becd","category":"56d730d436dd840b00cef0f7","isReference":false,"updates":[],"slug":"asynchronous-requests","version":"569e609aebbadc0d0079bed0","createdAt":"2016-03-07T17:34:11.319Z","excerpt":"","githubsync":"","link_external":false,"parentDoc":null,"__v":15,"body":"The API has some endpoints that process requests asynchronously. Each request to Connect can map to one or more requests to the ATS, which could potentially take a long time to process due to request times to the ATS or rate limiting requirements. Working asynchronously will help hide this from your users and allow Connect to stay within the limits imposed by the ATS.\n\n### Callbacks\n\nEach asynchronous endpoint will accept a `X-RolePoint-Callback-Url` HTTP header that we will post a JSON status report to upon completion of the task. The data POSTed to the callback url will follow the [completed](#section-completed) or [failed](#section-failed) status reports below.\n\n### Completed\n\nIf the task has completed, the status report will be of the format:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"status\\\": \\\"complete\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": \\\"https://api.rolepoint-connect.com/:endpoint/:request_id/result\\\",\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": null\\n}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nWhere the `url` can be used to get the result of the task (e.g. the results of a [Find Candidates](doc:find-candidates) query) and the `ttl` refers to the time until the result expires.\n\n### Failed\n\nIf the task failed, the response will have the form:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"status\\\": \\\"failed\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": \\\"https://api.rolepoint-connect.com/:endpoint/:request_id/result\\\",\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": {\\n \\\"message\\\": \\\"Message describing the error that occured\\\",\\n \\\"code\\\": 123\\n }\\n}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nWhere the `code` is one of the defined [Error Codes](doc:error-codes) and the `message` describes why the task failed.\n\n### Polling request status\n\nAsynchronous endpoints will also return a status URL that you can poll for status updates and success reports. This is useful when working in an environment where accepting a callback POST is not possible.\n[block:callout]\n{\n \"type\": \"warning\",\n \"body\": \"We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback we reduce the need to make several needless connections over what could be an extended period of time.\",\n \"title\": \"Polling not recommended\"\n}\n[/block]\n[Async Request Status](doc:get-async-request-status) can be used to check the status of an synchronous task.\n\nThe [completed](#section-completed) and [failed](#section-failed) status reports are the same as for callbacks above.","link_url":"","type":"basic","user":"543d38fea10ab32000b3aa8f","childrenPages":[]}

Asynchronous Requests

The API has some endpoints that process requests asynchronously. Each request to Connect can map to one or more requests to the ATS, which could potentially take a long time to process due to request times to the ATS or rate limiting requirements. Working asynchronously will help hide this from your users and allow Connect to stay within the limits imposed by the ATS.
### Callbacks
Each asynchronous endpoint will accept a `X-RolePoint-Callback-Url` HTTP header that we will post a JSON status report to upon completion of the task. The data POSTed to the callback url will follow the [completed](#section-completed) or [failed](#section-failed) status reports below.
### Completed
If the task has completed, the status report will be of the format:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/:endpoint/:request_id/result\",\n \"ttl\": 123\n },\n \"error_info\": null\n}",
"language": "json"
}
]
}
[/block]
Where the `url` can be used to get the result of the task (e.g. the results of a [Find Candidates](doc:find-candidates) query) and the `ttl` refers to the time until the result expires.
### Failed
If the task failed, the response will have the form:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/:endpoint/:request_id/result\",\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}",
"language": "json"
}
]
}
[/block]
Where the `code` is one of the defined [Error Codes](doc:error-codes) and the `message` describes why the task failed.
### Polling request status
Asynchronous endpoints will also return a status URL that you can poll for status updates and success reports. This is useful when working in an environment where accepting a callback POST is not possible.
[block:callout]
{
"type": "warning",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback we reduce the need to make several needless connections over what could be an extended period of time.",
"title": "Polling not recommended"
}
[/block]
[Async Request Status](doc:get-async-request-status) can be used to check the status of an synchronous task.
The [completed](#section-completed) and [failed](#section-failed) status reports are the same as for callbacks above.

The API has some endpoints that process requests asynchronously. Each request to Connect can map to one or more requests to the ATS, which could potentially take a long time to process due to request times to the ATS or rate limiting requirements. Working asynchronously will help hide this from your users and allow Connect to stay within the limits imposed by the ATS.
### Callbacks
Each asynchronous endpoint will accept a `X-RolePoint-Callback-Url` HTTP header that we will post a JSON status report to upon completion of the task. The data POSTed to the callback url will follow the [completed](#section-completed) or [failed](#section-failed) status reports below.
### Completed
If the task has completed, the status report will be of the format:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/:endpoint/:request_id/result\",\n \"ttl\": 123\n },\n \"error_info\": null\n}",
"language": "json"
}
]
}
[/block]
Where the `url` can be used to get the result of the task (e.g. the results of a [Find Candidates](doc:find-candidates) query) and the `ttl` refers to the time until the result expires.
### Failed
If the task failed, the response will have the form:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/:endpoint/:request_id/result\",\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}",
"language": "json"
}
]
}
[/block]
Where the `code` is one of the defined [Error Codes](doc:error-codes) and the `message` describes why the task failed.
### Polling request status
Asynchronous endpoints will also return a status URL that you can poll for status updates and success reports. This is useful when working in an environment where accepting a callback POST is not possible.
[block:callout]
{
"type": "warning",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback we reduce the need to make several needless connections over what could be an extended period of time.",
"title": "Polling not recommended"
}
[/block]
[Async Request Status](doc:get-async-request-status) can be used to check the status of an synchronous task.
The [completed](#section-completed) and [failed](#section-failed) status reports are the same as for callbacks above.

{"_id":"56ddc57225a3dd1700e5c758","hidden":false,"excerpt":"","link_external":false,"order":6,"slug":"error-codes","title":"Error Codes","isReference":false,"parentDoc":null,"project":"569e6099ebbadc0d0079becd","__v":3,"body":"### 100 - ATS Unauthorized Error\n\n100 is the error code Connect sends when there's an authorization problem connecting to the ATS. If there's a problem authorizing with the ATS, Connect will shut down any future attempts to connect to the ATS until we can confirm the credentials work. This is to prevent the ATS account being locked for multiple invalid authorization requests.\n\n### 999 - General Purpose Error\n\nThis is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error, this code would be returned with a message indicating what went wrong.","category":"56d730d436dd840b00cef0f7","createdAt":"2016-03-07T18:16:18.539Z","updates":[],"user":"543d38fea10ab32000b3aa8f","version":"569e609aebbadc0d0079bed0","api":{"params":[],"results":{"codes":[{"code":"{}","name":"","status":200,"language":"json"},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":"","auth":"required"},"githubsync":"","link_url":"","sync_unique":"","type":"basic","childrenPages":[]}

Error Codes

### 100 - ATS Unauthorized Error
100 is the error code Connect sends when there's an authorization problem connecting to the ATS. If there's a problem authorizing with the ATS, Connect will shut down any future attempts to connect to the ATS until we can confirm the credentials work. This is to prevent the ATS account being locked for multiple invalid authorization requests.
### 999 - General Purpose Error
This is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error, this code would be returned with a message indicating what went wrong.

### 100 - ATS Unauthorized Error
100 is the error code Connect sends when there's an authorization problem connecting to the ATS. If there's a problem authorizing with the ATS, Connect will shut down any future attempts to connect to the ATS until we can confirm the credentials work. This is to prevent the ATS account being locked for multiple invalid authorization requests.
### 999 - General Purpose Error
This is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error, this code would be returned with a message indicating what went wrong.

{"_id":"56e453c0f0150e1700ce67fc","category":"56d730d436dd840b00cef0f7","githubsync":"","isReference":false,"order":7,"parentDoc":null,"slug":"billing-limits","type":"basic","createdAt":"2016-03-12T17:37:04.922Z","hidden":false,"body":"The API has credit limits, defined on a per-connector basis.\n\nYou can check the returned HTTP headers of any API request to see your current credit limit status:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"curl -i https://api.rolepoint-connect.com/whatever\\n\\nHTTP/1.1 200 OK\\nStatus: 200 OK\\nX-CreditLimit-Limit: 60\\nX-CreditLimit-Remaining: 56\\nX-CreditLimit_Reset: 1372700873\",\n \"language\": \"curl\"\n }\n ]\n}\n[/block]\nThe headers tell you everything you need to know about your current credit limit status:\n\n* X-CreditLimit-Limit - The maximum number of requests that the consumer is permitted to make per hour.\n* X-CreditLimit-Remaining - The number of requests remaining in the current credit window.\n* X-CreditLimit-Reset - The time at which the current credit window resets in UTC epoch seconds.\n\nOnce you go over your credit limit you will receive an error response:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 429 Too Many Requests\\nStatus: 429 Too Many Requests\\nX-CreditLimit-Limit: 60\\nX-CreditLimit-Remaining: 0\\nX-CreditLimit-Reset: 1372700873\\n\\n{\\\"message\\\": \\\"Rate limit exceeded\\\", \\\"rate-limit-reset\\\": 1372700873}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]","excerpt":"","link_url":"","sync_unique":"","title":"Billing limits","version":"569e609aebbadc0d0079bed0","__v":4,"api":{"auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":""},"link_external":false,"project":"569e6099ebbadc0d0079becd","updates":[],"user":"56d846d5b20d260b0026570b","childrenPages":[]}

Billing limits

The API has credit limits, defined on a per-connector basis.
You can check the returned HTTP headers of any API request to see your current credit limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-CreditLimit-Limit: 60\nX-CreditLimit-Remaining: 56\nX-CreditLimit_Reset: 1372700873",
"language": "curl"
}
]
}
[/block]
The headers tell you everything you need to know about your current credit limit status:
* X-CreditLimit-Limit - The maximum number of requests that the consumer is permitted to make per hour.
* X-CreditLimit-Remaining - The number of requests remaining in the current credit window.
* X-CreditLimit-Reset - The time at which the current credit window resets in UTC epoch seconds.
Once you go over your credit limit you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-CreditLimit-Limit: 60\nX-CreditLimit-Remaining: 0\nX-CreditLimit-Reset: 1372700873\n\n{\"message\": \"Rate limit exceeded\", \"rate-limit-reset\": 1372700873}",
"language": "http"
}
]
}
[/block]

The API has credit limits, defined on a per-connector basis.
You can check the returned HTTP headers of any API request to see your current credit limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-CreditLimit-Limit: 60\nX-CreditLimit-Remaining: 56\nX-CreditLimit_Reset: 1372700873",
"language": "curl"
}
]
}
[/block]
The headers tell you everything you need to know about your current credit limit status:
* X-CreditLimit-Limit - The maximum number of requests that the consumer is permitted to make per hour.
* X-CreditLimit-Remaining - The number of requests remaining in the current credit window.
* X-CreditLimit-Reset - The time at which the current credit window resets in UTC epoch seconds.
Once you go over your credit limit you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-CreditLimit-Limit: 60\nX-CreditLimit-Remaining: 0\nX-CreditLimit-Reset: 1372700873\n\n{\"message\": \"Rate limit exceeded\", \"rate-limit-reset\": 1372700873}",
"language": "http"
}
]
}
[/block]

{"_id":"56ddc61490559a2900a3a4ae","title":"Rate Limits","version":"569e609aebbadc0d0079bed0","category":"56d730d436dd840b00cef0f7","githubsync":"","link_external":false,"parentDoc":null,"type":"basic","updates":[],"excerpt":"","isReference":false,"project":"569e6099ebbadc0d0079becd","slug":"rate-limits","sync_unique":"","api":{"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"language":"json","code":"{}","name":"","status":400}]},"settings":"","url":"","auth":"required","params":[]},"createdAt":"2016-03-07T18:19:00.819Z","user":"543d38fea10ab32000b3aa8f","__v":4,"body":"The connector API has rate limits, which vary by ATS. These are separate from the billing-based credit limits described above. These are in place to ensure that we don't exceed the rate limits imposed by the underlying ATS.\n\nThese rate limits are implemented using a sliding window that should allow you to burst at a higher rate than the ATS usually allows, but will not allow you to maintain that level indefinitely.\n\nYou can check the returned HTTP headers of any API request to see your current rate limit status:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"curl -i https://api.rolepoint-connect.com/whatever\\n\\nHTTP/1.1 200 OK\\nStatus: 200 OK\\nX-RateLimit-Remaining: 1\",\n \"language\": \"curl\"\n }\n ]\n}\n[/block]\nThese limiters are implemented as a sliding window, so do not provide reset information.\n\nOnce you go over your rate limit, you will receive an error response:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 429 Too Many Requests\\nStatus: 429 Too Many Requests\\nX-CreditLimit-Remaining: 0\\n\\n{\\\"message\\\": \\\"Rate limit exceeded\\\"}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]","hidden":false,"link_url":"","order":8,"childrenPages":[]}

Rate Limits

The connector API has rate limits, which vary by ATS. These are separate from the billing-based credit limits described above. These are in place to ensure that we don't exceed the rate limits imposed by the underlying ATS.
These rate limits are implemented using a sliding window that should allow you to burst at a higher rate than the ATS usually allows, but will not allow you to maintain that level indefinitely.
You can check the returned HTTP headers of any API request to see your current rate limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-RateLimit-Remaining: 1",
"language": "curl"
}
]
}
[/block]
These limiters are implemented as a sliding window, so do not provide reset information.
Once you go over your rate limit, you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-CreditLimit-Remaining: 0\n\n{\"message\": \"Rate limit exceeded\"}",
"language": "http"
}
]
}
[/block]

The connector API has rate limits, which vary by ATS. These are separate from the billing-based credit limits described above. These are in place to ensure that we don't exceed the rate limits imposed by the underlying ATS.
These rate limits are implemented using a sliding window that should allow you to burst at a higher rate than the ATS usually allows, but will not allow you to maintain that level indefinitely.
You can check the returned HTTP headers of any API request to see your current rate limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-RateLimit-Remaining: 1",
"language": "curl"
}
]
}
[/block]
These limiters are implemented as a sliding window, so do not provide reset information.
Once you go over your rate limit, you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-CreditLimit-Remaining: 0\n\n{\"message\": \"Rate limit exceeded\"}",
"language": "http"
}
]
}
[/block]

{"_id":"56e18912686c7d20008606d0","createdAt":"2016-03-10T14:47:46.450Z","excerpt":"Get the result of calling POST candidate","isReference":true,"link_url":"","parentDoc":null,"slug":"send-candidate-result","sync_unique":"","api":{"auth":"required","examples":{"codes":[{"language":"http","code":"GET /123/applications/f586c5aa-842d-4e49-bcca-876a11e82ede/result HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx"},{"language":"python","code":"import json\nimport requests\n\nconnector_id = '123'\nusername = 'username'\npassword = 'password'\nrequest_id = ''\n\nurl = \"https://api.rolepoint-connect.com/v1/{}/applications/{}/result\".format(\n connector_id, request_id\n)\n\nresponse = requests.get(\n url, auth=(username, password)\n)\n\nprint(response.text)"}]},"method":"get","params":[{"ref":"","required":false,"desc":"The ID of your connector","default":"","type":"string","name":"connector_id","in":"query","_id":"56e18912686c7d20008606d2"},{"type":"string","name":"request_id","in":"path","_id":"56e18912686c7d20008606d1","ref":"","required":false,"desc":"The ID of the asynchronous request as returned in the initial request.","default":""}],"results":{"codes":[{"name":"Success Result","status":200,"language":"json","code":"{\n \"candidate_id\": 1234,\n \"candidate_created\": True\n \"application_ids\": {\n \"1234\": 4675\n }\n}"}]},"settings":"","url":"/applications/:request_id/result"},"type":"get","title":"Send Candidate Result","category":"56d8457a9d27560b00a4cc17","githubsync":"","order":1,"version":"569e609aebbadc0d0079bed0","editedParams2":true,"hidden":false,"project":"569e6099ebbadc0d0079becd","editedParams":true,"body":"Once application creation is finished, you can get the result using the\n`result_info.url` field returned in the status (either from a callback or the complete status). You should issue a `GET` request to that URL.\n\nThe result will contain `candidate_id` and `candidate_created` fields, with an `application_ids` object:\n\n* `candidate_id` - The ID of the candidate that was created.\n* `candidate_created` - True/False relating to whether the candidate was\n created within the ATS. True indicates the candidate was created as a\n result of this request. False indicates the candidate already existed in\n the ATS.\n* `application_ids` - An object that maps the ID of the job that the\n application was created for to the ID of the application itself. This will\n be null if no applications were provided in the initial request.\n\nDepending on data provided by the underlying ATS, both ID & application IDs may\nbe null.","link_external":false,"updates":[],"user":"56cc98fcb4cbcf0b004a6009","__v":0,"childrenPages":[]}

getSend Candidate Result

Get the result of calling POST candidate

Path Params

request_id:

string

The ID of the asynchronous request as returned in the initial request.

Query Params

connector_id:

string

The ID of your connector

Once application creation is finished, you can get the result using the
`result_info.url` field returned in the status (either from a callback or the complete status). You should issue a `GET` request to that URL.
The result will contain `candidate_id` and `candidate_created` fields, with an `application_ids` object:
* `candidate_id` - The ID of the candidate that was created.
* `candidate_created` - True/False relating to whether the candidate was
created within the ATS. True indicates the candidate was created as a
result of this request. False indicates the candidate already existed in
the ATS.
* `application_ids` - An object that maps the ID of the job that the
application was created for to the ID of the application itself. This will
be null if no applications were provided in the initial request.
Depending on data provided by the underlying ATS, both ID & application IDs may
be null.

Definition

{{ api_url }}{{ page_api_url }}

Examples

Result Format

Once application creation is finished, you can get the result using the
`result_info.url` field returned in the status (either from a callback or the complete status). You should issue a `GET` request to that URL.
The result will contain `candidate_id` and `candidate_created` fields, with an `application_ids` object:
* `candidate_id` - The ID of the candidate that was created.
* `candidate_created` - True/False relating to whether the candidate was
created within the ATS. True indicates the candidate was created as a
result of this request. False indicates the candidate already existed in
the ATS.
* `application_ids` - An object that maps the ID of the job that the
application was created for to the ID of the application itself. This will
be null if no applications were provided in the initial request.
Depending on data provided by the underlying ATS, both ID & application IDs may
be null.

getFind Candidates Result

Path Params

request_id:

string

The ID of the request as returned from the Find Candidates endpoint

Query Params

connector_id:

string

The ID of your connector

The result will be of the form:
[block:code]
{
"codes": [
{
"code": "{\"candidate_ids\": [\"1\", \"2\"]}",
"language": "json"
}
]
}
[/block]
The list of `candidate_ids` are RolePoint Connect id's for
candidates found, which can be used in [get candidate](doc:get-candidate) requests, detailed below

Definition

{{ api_url }}{{ page_api_url }}

Examples

Result Format

The result will be of the form:
[block:code]
{
"codes": [
{
"code": "{\"candidate_ids\": [\"1\", \"2\"]}",
"language": "json"
}
]
}
[/block]
The list of `candidate_ids` are RolePoint Connect id's for
candidates found, which can be used in [get candidate](doc:get-candidate) requests, detailed below

getGet Candidate

Path Params

candidate_id:

string

The ID of the candidate, as returned by "Find Candidate" or "Send Candidate"

Query Params

connector_id:

string

The ID of your connector

An asynchronous request to get the details of a candidate.
[block:callout]
{
"type": "info",
"body": "This endpoint is asynchronous. See the [Asynchronous Requests](doc:asynchronous-requests) documentation for more details.",
"title": "Asynchronous Endpoint"
}
[/block]

Definition

{{ api_url }}{{ page_api_url }}

Examples

Result Format

An asynchronous request to get the details of a candidate.
[block:callout]
{
"type": "info",
"body": "This endpoint is asynchronous. See the [Asynchronous Requests](doc:asynchronous-requests) documentation for more details.",
"title": "Asynchronous Endpoint"
}
[/block]

{"_id":"56e1c36936b3bb3400cd0b08","excerpt":"","isReference":true,"link_url":"","createdAt":"2016-03-10T18:56:41.703Z","githubsync":"","project":"569e6099ebbadc0d0079becd","api":{"url":"/get_candidate/:request_id/result","auth":"required","examples":{"codes":[{"language":"http","code":"GET /v1/123/get_candidate/f586c5aa-842d-4e49-bcca-876a11e82ede/result HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx"},{"language":"python","code":"import json\nimport requests\n\nconnector_id = '123'\nusername = 'username'\npassword = 'password'\nrequest_id = ''\n\nurl = \"https://api.rolepoint-connect.com/v1/{}/get_candidate/{}/result\".format(\n connector_id, request_id\n)\n\nresponse = requests.get(url, auth=(username, password))\n\nprint(response.text)"}]},"method":"get","params":[{"_id":"56e1c36936b3bb3400cd0b0a","default":"","desc":"The ID of your connector","name":"connector_id","ref":"","required":false,"type":"string","in":"query"},{"in":"path","_id":"56e1c36936b3bb3400cd0b09","default":"","desc":"The ID of the request that was returned from the Get Candidate endpoint.","name":"request_id","ref":"","required":false,"type":"string"}],"results":{"codes":[{"language":"json","status":200,"name":"","code":"{\n \"candidate\": {\n \"email\": \"test+candidate@test.com\",\n \"first_name\": \"Test\",\n \"last_name\": \"Candidate\",\n \"last_updated\": \"\",\n \"phone\": \"+447999 999 999\",\n \"source\": \"RolePoint Careers\"\n }\n}"}]},"settings":""},"body":"The form of the result of the Get Candidate task is dependent on the ATS and\nthe Connector Configuration. The only guaranteed fields are `first_name`,\n'last_name`, 'last_updated` and `email`.\n\nThe entirety of the possible response is as documented below, for a description of required/response_optional see [schema](#schema):\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"candidate\\\": {\\n \\\"email\\\": required - <string>\\n \\\"first_name\\\": required - <string>,\\n \\\"last_name\\\": required - <string>,\\n \\\"last_updated\\\": required - <string>,\\n \\\"phone\\\": optional - <string>,\\n \\\"referrer\\\": optional - <string>,\\n \\\"source\\\": optional - <string>\\n }\\n}\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nWhere:\n\n* `email` - The email of the candidate\n* `first_name` - The first name of the candidate\n* `last_name` - The last name of the candidate\n* `last_updated` - The last time that the candidate was updated, formatted in a\n string according to [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)\n* `phone` - The contact phone number of the candidate\n* `referrer` - The referrer that referred the candidate\n* `source` - The source that was in the session when the candidate was created","link_external":false,"order":5,"parentDoc":null,"sync_unique":"","title":"Get Candidate Result","editedParams":true,"editedParams2":true,"hidden":false,"type":"get","updates":[],"user":"56cc98fcb4cbcf0b004a6009","version":"569e609aebbadc0d0079bed0","__v":0,"category":"56d8457a9d27560b00a4cc17","slug":"get-candidate-result","childrenPages":[]}

getGet Candidate Result

Path Params

request_id:

string

The ID of the request that was returned from the Get Candidate endpoint.

Query Params

connector_id:

string

The ID of your connector

The form of the result of the Get Candidate task is dependent on the ATS and
the Connector Configuration. The only guaranteed fields are `first_name`,
'last_name`, 'last_updated` and `email`.
The entirety of the possible response is as documented below, for a description of required/response_optional see [schema](#schema):
[block:code]
{
"codes": [
{
"code": "{\n \"candidate\": {\n \"email\": required - <string>\n \"first_name\": required - <string>,\n \"last_name\": required - <string>,\n \"last_updated\": required - <string>,\n \"phone\": optional - <string>,\n \"referrer\": optional - <string>,\n \"source\": optional - <string>\n }\n}",
"language": "python"
}
]
}
[/block]
Where:
* `email` - The email of the candidate
* `first_name` - The first name of the candidate
* `last_name` - The last name of the candidate
* `last_updated` - The last time that the candidate was updated, formatted in a
string according to [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
* `phone` - The contact phone number of the candidate
* `referrer` - The referrer that referred the candidate
* `source` - The source that was in the session when the candidate was created

Definition

{{ api_url }}{{ page_api_url }}

Examples

Result Format

The form of the result of the Get Candidate task is dependent on the ATS and
the Connector Configuration. The only guaranteed fields are `first_name`,
'last_name`, 'last_updated` and `email`.
The entirety of the possible response is as documented below, for a description of required/response_optional see [schema](#schema):
[block:code]
{
"codes": [
{
"code": "{\n \"candidate\": {\n \"email\": required - <string>\n \"first_name\": required - <string>,\n \"last_name\": required - <string>,\n \"last_updated\": required - <string>,\n \"phone\": optional - <string>,\n \"referrer\": optional - <string>,\n \"source\": optional - <string>\n }\n}",
"language": "python"
}
]
}
[/block]
Where:
* `email` - The email of the candidate
* `first_name` - The first name of the candidate
* `last_name` - The last name of the candidate
* `last_updated` - The last time that the candidate was updated, formatted in a
string according to [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
* `phone` - The contact phone number of the candidate
* `referrer` - The referrer that referred the candidate
* `source` - The source that was in the session when the candidate was created

{"_id":"56e1647e7e3fc43600cad433","project":"569e6099ebbadc0d0079becd","title":"Async Request Status","__v":0,"createdAt":"2016-03-10T12:11:42.867Z","editedParams":true,"hidden":false,"isReference":true,"category":"56d8457a9d27560b00a4cc17","editedParams2":true,"githubsync":"","link_external":false,"type":"get","parentDoc":null,"slug":"get-async-request-status","user":"56cc98fcb4cbcf0b004a6009","body":"[block:callout]\n{\n \"type\": \"warning\",\n \"body\": \"We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback, we reduce the need to make several needless connections over what could be an extended period of time.\",\n \"title\": \"Polling not recommended\"\n}\n[/block]\nTo get the status of creation of an asynchronous request, you can query the\n`request_status_url` provided when the request was created.\n\nAs part of the response, we include an `X-Poll-Interval` header which specifies how long (in seconds) until you are allowed to make another request.\n\nFor example:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"GET /v1/123/requests/f586c5aa-842d-4e49-bcca-876a11e82ede/status HTTP/1.1\\nHost: api.rolepoint-connect.com\\nAccept: application/rolepoint.v2+json\\nAuthorization: xxxxx\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nIf the request is still in progress, this will respond:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 200 OK\\nStatus: 200 OK\\nContent-Type: application/rolepoint.v2+json\\n\\n{\\n \\\"status\\\": \\\"in_progress\\\",\\n \\\"result_info\\\": null,\\n \\\"error_info\\\": null\\n}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nIf the request is finished, this will respond:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 200 OK\\nStatus: 200 OK\\nContent-Type: application/rolepoint.v2+json\\n\\n{\\n \\\"status\\\": \\\"complete\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": \\\"https://api.rolepoint-connect.com/\\\",\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": null\\n}\\n\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\n`result_info` contains 2 fields:\n\n* `url` - This is the URL you can query to get the result of the application\n creation.\n* `ttl` - This is the time that the application result will remain available\n for in seconds.\n\nA failed response will contain the following fields:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 200 OK\\nStatus: 200 OK\\nContent-Type: application/rolepoint.v2+json\\n\\n{\\n \\\"status\\\": \\\"failed\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": null,\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": {\\n \\\"message\\\": \\\"Message describing the error that occured\\\",\\n \\\"code\\\": 123\\n }\\n}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\n`error_info` contains 2 fields:\n\n* `message` - This is the error message relating to the reason the request\n failed.\n* `code` - This is the error code relating to the reason the request failed.","excerpt":"Endpoint for getting the status of an asynchronous request","link_url":"","order":6,"api":{"auth":"required","examples":{"codes":[{"language":"http","code":"GET /v1/123/requests/f586c5aa-842d-4e49-bcca-876a11e82ede/status HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx"},{"language":"python","code":"import json\nimport requests\n\nconnector_id = '123'\nusername = 'username'\npassword = 'password'\nrequest_id = ''\n\nurl = \"https://api.rolepoint-connect.com/v1/{}/requests/{}/status\".format(\n connector_id, request_id\n)\n\nresponse = requests.get(url, auth=(username, password))\n\nprint(response.text)"}]},"method":"get","params":[{"name":"connector_id","ref":"","required":false,"type":"string","in":"query","_id":"56e1647e7e3fc43600cad435","default":"","desc":"The ID of your connector."},{"name":"request_id","in":"path","_id":"56e1647e7e3fc43600cad434","ref":"","required":false,"desc":"The ID of the asynchronous request as returned in the initial request.","default":"","type":"string"}],"results":{"codes":[{"name":"In progress","code":"{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n}","language":"json","status":200},{"name":null,"code":"{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/\",\n \"ttl\": 123\n },\n \"error_info\": null\n}","language":"json","status":200},{"language":"json","status":200,"name":"Failed","code":"{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": null,\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}"}]},"settings":"","url":"/requests/:request_id/status"},"sync_unique":"","updates":[],"version":"569e609aebbadc0d0079bed0","childrenPages":[]}

getAsync Request Status

Endpoint for getting the status of an asynchronous request

Path Params

request_id:

string

The ID of the asynchronous request as returned in the initial request.

Query Params

connector_id:

string

The ID of your connector.

[block:callout]
{
"type": "warning",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback, we reduce the need to make several needless connections over what could be an extended period of time.",
"title": "Polling not recommended"
}
[/block]
To get the status of creation of an asynchronous request, you can query the
`request_status_url` provided when the request was created.
As part of the response, we include an `X-Poll-Interval` header which specifies how long (in seconds) until you are allowed to make another request.
For example:
[block:code]
{
"codes": [
{
"code": "GET /v1/123/requests/f586c5aa-842d-4e49-bcca-876a11e82ede/status HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx",
"language": "http"
}
]
}
[/block]
If the request is still in progress, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n}",
"language": "http"
}
]
}
[/block]
If the request is finished, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/\",\n \"ttl\": 123\n },\n \"error_info\": null\n}\n",
"language": "http"
}
]
}
[/block]
`result_info` contains 2 fields:
* `url` - This is the URL you can query to get the result of the application
creation.
* `ttl` - This is the time that the application result will remain available
for in seconds.
A failed response will contain the following fields:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": null,\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}",
"language": "http"
}
]
}
[/block]
`error_info` contains 2 fields:
* `message` - This is the error message relating to the reason the request
failed.
* `code` - This is the error code relating to the reason the request failed.

Definition

{{ api_url }}{{ page_api_url }}

Examples

Result Format

[block:callout]
{
"type": "warning",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could potentially take a while to process. By sending a callback, we reduce the need to make several needless connections over what could be an extended period of time.",
"title": "Polling not recommended"
}
[/block]
To get the status of creation of an asynchronous request, you can query the
`request_status_url` provided when the request was created.
As part of the response, we include an `X-Poll-Interval` header which specifies how long (in seconds) until you are allowed to make another request.
For example:
[block:code]
{
"codes": [
{
"code": "GET /v1/123/requests/f586c5aa-842d-4e49-bcca-876a11e82ede/status HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx",
"language": "http"
}
]
}
[/block]
If the request is still in progress, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n}",
"language": "http"
}
]
}
[/block]
If the request is finished, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/\",\n \"ttl\": 123\n },\n \"error_info\": null\n}\n",
"language": "http"
}
]
}
[/block]
`result_info` contains 2 fields:
* `url` - This is the URL you can query to get the result of the application
creation.
* `ttl` - This is the time that the application result will remain available
for in seconds.
A failed response will contain the following fields:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": null,\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}",
"language": "http"
}
]
}
[/block]
`error_info` contains 2 fields:
* `message` - This is the error message relating to the reason the request
failed.
* `code` - This is the error code relating to the reason the request failed.

{"_id":"56df08b4b9d68f0e0073d7c2","api":{"auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"name":"","status":400,"language":"json","code":"{}"}]},"settings":"","url":""},"sync_unique":"","version":"569e609aebbadc0d0079bed0","parentDoc":null,"project":"569e6099ebbadc0d0079becd","category":"56df07cc0201330e0070f15b","createdAt":"2016-03-08T17:15:32.760Z","link_external":false,"link_url":"","order":0,"slug":"get-jobs-and-insert-candidates","title":"Get Jobs and Insert Candidate","type":"basic","updates":[],"__v":46,"excerpt":"","githubsync":"","hidden":false,"next":{"pages":[],"description":""},"user":"543d38fea10ab32000b3aa8f","body":"With Connect, it's simple to get job listings from the remote ATS then use those job details to insert candidate applications. \n\n## Getting Jobs \n\nJob listings are provided through Connect sending job details to a preconfigured [webhook](doc:webhooks). This is done periodically to ensure you always have the most up to date job postings from the ATS. First you need to setup an endpoint to receive the webhook events, as shown below.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('random_webhook_url')\\ndef jobs_webhook_handler():\\n for event in request.get_json(force=True):\\n if event['event'] == 'job_add':\\n # handle the job add event, for instance adding it to your database\\n \\n\\t\\t# We return an empty response to Connect as it will retry callbacks otherwise.\\n return '', 200\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nThis data can then be used to create an application form for current job postings. \n\n## Inserting Candidates\n\nWhen a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.\n\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/make_application', methods=['POST'])\\ndef make_application():\\n\\n # Build our payload to include our candidate and the job they are applying\\n # for.\\n payload = {\\n \\t'applications': [{'job_id': request.form['job_id']}],\\n \\t'candidate': {\\n 'first_name': request.form['first_name'],\\n 'last_name': request.form['last_name'],\\n 'email': request.form['email']\\n }\\n \\t}\\n\\n # We can choose to either include a callback header with our\\n # request, or to poll until the application is complete. Here\\n # we use the callback funtionality.\\n headers = {\\n 'content-type': 'application/rolepoint.v2+json',\\n 'x-rolepoint-callback-url': url_for(\\n 'application_processed_callback', app_id=1, _external=True\\n )\\n }\\n # Send the candidate to Connect for processing.\\n requests.post(CONNECT_URL + '/candidate',\\n json=payload, auth=AUTH, headers=headers)\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nAs inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.\n[block:callout]\n{\n \"type\": \"info\",\n \"body\": \"We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \\n\\nDon't worry, we'll let you know when it's done! :smile:\",\n \"title\": \"Use Callbacks\"\n}\n[/block]\n## Candidate Application Complete Callback\n\nWe define this callback endpoint as below.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\\ndef application_processed_callback(app_id):\\n status = request.json['status']\\n JOB_APPLICATIONS[app_id]['status'] = status\\n\\n if status == 'complete':\\n # The application has been processed and made it into the ATS.\\n # As part of the response we are given a URL from where we can \\n # request the details of the processed candidate.\\n url = request.json['result_info']['url']\\n # Now we request the final details of the processed candidate\\n result = requests.get(url, auth=AUTH)\\n json = result.json()\\n # Save the processed candidate details \\n\\n # We return an empty response to Connect as it will retry callbacks otherwise.\\n return '', 200\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nThe candidate has now been inserted into the ATS.\n[block:api-header]\n{\n \"type\": \"basic\",\n \"title\": \"Example Code\",\n \"sidebar\": true\n}\n[/block]\n\n[block:textarea]\n{\n \"text\": \"For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.\",\n \"sidebar\": true\n}\n[/block]\n\n[block:embed]\n{\n \"html\": false,\n \"url\": \"https://github.com/rolepoint/connect-examples/tree/master/get-jobs-and-insert-candidates\",\n \"title\": \"rolepoint/connect-examples\",\n \"favicon\": \"https://assets-cdn.github.com/favicon.ico\",\n \"image\": \"https://avatars3.githubusercontent.com/u/2790791?v=3&s=400\",\n \"sidebar\": true\n}\n[/block]","isReference":false,"childrenPages":[]}

Get Jobs and Insert Candidate

With Connect, it's simple to get job listings from the remote ATS then use those job details to insert candidate applications.
## Getting Jobs
Job listings are provided through Connect sending job details to a preconfigured [webhook](doc:webhooks). This is done periodically to ensure you always have the most up to date job postings from the ATS. First you need to setup an endpoint to receive the webhook events, as shown below.
[block:code]
{
"codes": [
{
"code": "@app.route('random_webhook_url')\ndef jobs_webhook_handler():\n for event in request.get_json(force=True):\n if event['event'] == 'job_add':\n # handle the job add event, for instance adding it to your database\n \n\t\t# We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
This data can then be used to create an application form for current job postings.
## Inserting Candidates
When a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.
[block:code]
{
"codes": [
{
"code": "@app.route('/make_application', methods=['POST'])\ndef make_application():\n\n # Build our payload to include our candidate and the job they are applying\n # for.\n payload = {\n \t'applications': [{'job_id': request.form['job_id']}],\n \t'candidate': {\n 'first_name': request.form['first_name'],\n 'last_name': request.form['last_name'],\n 'email': request.form['email']\n }\n \t}\n\n # We can choose to either include a callback header with our\n # request, or to poll until the application is complete. Here\n # we use the callback funtionality.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'application_processed_callback', app_id=1, _external=True\n )\n }\n # Send the candidate to Connect for processing.\n requests.post(CONNECT_URL + '/candidate',\n json=payload, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
As inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.
[block:callout]
{
"type": "info",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:",
"title": "Use Callbacks"
}
[/block]
## Candidate Application Complete Callback
We define this callback endpoint as below.
[block:code]
{
"codes": [
{
"code": "@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\ndef application_processed_callback(app_id):\n status = request.json['status']\n JOB_APPLICATIONS[app_id]['status'] = status\n\n if status == 'complete':\n # The application has been processed and made it into the ATS.\n # As part of the response we are given a URL from where we can \n # request the details of the processed candidate.\n url = request.json['result_info']['url']\n # Now we request the final details of the processed candidate\n result = requests.get(url, auth=AUTH)\n json = result.json()\n # Save the processed candidate details \n\n # We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
The candidate has now been inserted into the ATS.
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/get-jobs-and-insert-candidates",
"title": "rolepoint/connect-examples",
"favicon": "https://assets-cdn.github.com/favicon.ico",
"image": "https://avatars3.githubusercontent.com/u/2790791?v=3&s=400",
"sidebar": true
}
[/block]

With Connect, it's simple to get job listings from the remote ATS then use those job details to insert candidate applications.
## Getting Jobs
Job listings are provided through Connect sending job details to a preconfigured [webhook](doc:webhooks). This is done periodically to ensure you always have the most up to date job postings from the ATS. First you need to setup an endpoint to receive the webhook events, as shown below.
[block:code]
{
"codes": [
{
"code": "@app.route('random_webhook_url')\ndef jobs_webhook_handler():\n for event in request.get_json(force=True):\n if event['event'] == 'job_add':\n # handle the job add event, for instance adding it to your database\n \n\t\t# We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
This data can then be used to create an application form for current job postings.
## Inserting Candidates
When a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.
[block:code]
{
"codes": [
{
"code": "@app.route('/make_application', methods=['POST'])\ndef make_application():\n\n # Build our payload to include our candidate and the job they are applying\n # for.\n payload = {\n \t'applications': [{'job_id': request.form['job_id']}],\n \t'candidate': {\n 'first_name': request.form['first_name'],\n 'last_name': request.form['last_name'],\n 'email': request.form['email']\n }\n \t}\n\n # We can choose to either include a callback header with our\n # request, or to poll until the application is complete. Here\n # we use the callback funtionality.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'application_processed_callback', app_id=1, _external=True\n )\n }\n # Send the candidate to Connect for processing.\n requests.post(CONNECT_URL + '/candidate',\n json=payload, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
As inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.
[block:callout]
{
"type": "info",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:",
"title": "Use Callbacks"
}
[/block]
## Candidate Application Complete Callback
We define this callback endpoint as below.
[block:code]
{
"codes": [
{
"code": "@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\ndef application_processed_callback(app_id):\n status = request.json['status']\n JOB_APPLICATIONS[app_id]['status'] = status\n\n if status == 'complete':\n # The application has been processed and made it into the ATS.\n # As part of the response we are given a URL from where we can \n # request the details of the processed candidate.\n url = request.json['result_info']['url']\n # Now we request the final details of the processed candidate\n result = requests.get(url, auth=AUTH)\n json = result.json()\n # Save the processed candidate details \n\n # We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
The candidate has now been inserted into the ATS.
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/get-jobs-and-insert-candidates",
"title": "rolepoint/connect-examples",
"favicon": "https://assets-cdn.github.com/favicon.ico",
"image": "https://avatars3.githubusercontent.com/u/2790791?v=3&s=400",
"sidebar": true
}
[/block]

{"_id":"56e5addb4594f71700fcccbb","createdAt":"2016-03-13T18:13:47.953Z","link_url":"","order":1,"slug":"find-candidates-and-retrieve-their-details","updates":[],"api":{"auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"code":"{}","name":"","status":400,"language":"json"}]},"settings":"","url":""},"category":"56df07cc0201330e0070f15b","hidden":false,"__v":19,"body":"Connect makes it easy to search for candidates in your ATS and retrieve their details. In this example, we show how to search for a candidate using their email address, then get the details of any candidates found.\n\n[block:callout]\n{\n \"type\": \"info\",\n \"title\": \"Use Callbacks\",\n \"body\": \"Both searching for candidates and retrieving their details are [asynchronous endpoints](doc:asynchronous-requests). When using these, we recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback, we reduce the need to make several needless connections over an extended period of time. \\n\\nDon't worry, we'll let you know when it's done! :smile:\"\n}\n[/block]\n## Searching for Candidates\n\nTo search for a candidate using Connect we need to issue a `POST` request to the [Find Candidates](doc:find-candidates) endpoint. As this is an [asynchronous endpoint](doc:asynchronous-requests) we recommend using the callback functionality of Connect.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"def search_connect_by_email(email, search_id):\\n # First we need to build our filter in the format Connect expects\\n query = {'filters': [{'operator': '==', 'field': 'email', 'value': email}]}\\n \\n # Next setup the headers, including a callback header so Connect\\n # can notify you when it finishes processing.\\n headers = {\\n 'content-type': 'application/rolepoint.v2+json',\\n 'x-rolepoint-callback-url': url_for(\\n 'search_complete_callback',\\n search_id=search_id, _external=True\\n )\\n }\\n \\n # Finally issue a post request to Connect\\n requests.post(\\n CONNECT_URL + '/v1/{}/find_candidates'.format(CONFIG['connector_id']),\\n json=query, auth=AUTH, headers=headers\\n )\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nNext we need to setup an endpoint to process the callback from Connect.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/search_complete_callback/<int:search_id>', methods=['POST'])\\ndef search_complete_callback(search_id):\\n \\\"\\\"\\\"\\n An endpoint for handling Connect find_candidates callbacks.\\n Here we update our Search with the status or the search, and the found\\n candidate_ids.\\n \\\"\\\"\\\"\\n # We get the result of the search\\n if request.json['status'] == 'complete':\\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\\n candidate_ids = result.json()['candidate_ids']\\n # We now have a list of strings which correspond to candidate ID's\\n # in Connect. We can use these ID's to then query for the candidate\\n # details, as shown below.\\n\\n # Return an empty response to Connect as it will retry callbacks\\n # otherwise.\\n return '', 200\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\n## Retrieving Candidate Details\n\nWe can use the candidate IDs found using the search shown above to then query Connect for the candidate details. This is done using the [Get Candidate](doc:get-candidate) endpoint. Once again, this is an asynchronous endpoint and we recommend using the callback functionality. The endpoint is a simple `GET` request, as shown below.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"def get_candidate(candidate_id):\\n\\t # Setup headers, including a callback header so Connect\\n \\t# can notify you when it finishes processing.\\n headers = {\\n 'content-type': 'application/rolepoint.v2+json',\\n 'x-rolepoint-callback-url': url_for(\\n 'get_candidate_complete_callback',\\n candidate_id=candidate_id, _external=True\\n )\\n }\\n\\n url = '/v1/{}/candidate/{}'.format(CONFIG['connector_id'], candidate_id)\\n requests.get(CONNECT_URL + url, auth=AUTH, headers=headers)\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nWe then need to setup a callback URL and retrieve the [final result](doc:get-candidate-result) of the `Get Candidate` query containing the candidates details. \n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/get_candidate_complete_callback/<int:candidate_id>', methods=['POST'])\\ndef get_candidate_complete_callback(candidate_id):\\n # Get the result of the get_candidate call.\\n if status = request.json['status'] == 'complete':\\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\\n candidate_details = result.json()\\n # You now have the candidate details.\\n\\n # Return an empty response to Connect as it will retry callbacks\\n # otherwise.\\n return '', 200\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nWe have now retrieved the candidate details.\n\n[block:api-header]\n{\n \"type\": \"basic\",\n \"title\": \"Example Code\",\n \"sidebar\": true\n}\n[/block]\n\n[block:textarea]\n{\n \"text\": \"For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.\",\n \"sidebar\": true\n}\n[/block]\n\n[block:embed]\n{\n \"html\": false,\n \"url\": \"https://github.com/rolepoint/connect-examples/tree/master/find-candidates-and-retrieve-their-details\",\n \"title\": \"Find Candidates Example\",\n \"favicon\": \"https://github.com/favicon.ico\",\n \"sidebar\": true\n}\n[/block]","parentDoc":null,"project":"569e6099ebbadc0d0079becd","sync_unique":"","type":"basic","excerpt":"","githubsync":"","isReference":false,"link_external":false,"title":"Find Candidates and Retrieve Their Details","user":"543d38fea10ab32000b3aa8f","version":"569e609aebbadc0d0079bed0","childrenPages":[]}

Find Candidates and Retrieve Their Details

Connect makes it easy to search for candidates in your ATS and retrieve their details. In this example, we show how to search for a candidate using their email address, then get the details of any candidates found.
[block:callout]
{
"type": "info",
"title": "Use Callbacks",
"body": "Both searching for candidates and retrieving their details are [asynchronous endpoints](doc:asynchronous-requests). When using these, we recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback, we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:"
}
[/block]
## Searching for Candidates
To search for a candidate using Connect we need to issue a `POST` request to the [Find Candidates](doc:find-candidates) endpoint. As this is an [asynchronous endpoint](doc:asynchronous-requests) we recommend using the callback functionality of Connect.
[block:code]
{
"codes": [
{
"code": "def search_connect_by_email(email, search_id):\n # First we need to build our filter in the format Connect expects\n query = {'filters': [{'operator': '==', 'field': 'email', 'value': email}]}\n \n # Next setup the headers, including a callback header so Connect\n # can notify you when it finishes processing.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'search_complete_callback',\n search_id=search_id, _external=True\n )\n }\n \n # Finally issue a post request to Connect\n requests.post(\n CONNECT_URL + '/v1/{}/find_candidates'.format(CONFIG['connector_id']),\n json=query, auth=AUTH, headers=headers\n )",
"language": "python"
}
]
}
[/block]
Next we need to setup an endpoint to process the callback from Connect.
[block:code]
{
"codes": [
{
"code": "@app.route('/search_complete_callback/<int:search_id>', methods=['POST'])\ndef search_complete_callback(search_id):\n \"\"\"\n An endpoint for handling Connect find_candidates callbacks.\n Here we update our Search with the status or the search, and the found\n candidate_ids.\n \"\"\"\n # We get the result of the search\n if request.json['status'] == 'complete':\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\n candidate_ids = result.json()['candidate_ids']\n # We now have a list of strings which correspond to candidate ID's\n # in Connect. We can use these ID's to then query for the candidate\n # details, as shown below.\n\n # Return an empty response to Connect as it will retry callbacks\n # otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
## Retrieving Candidate Details
We can use the candidate IDs found using the search shown above to then query Connect for the candidate details. This is done using the [Get Candidate](doc:get-candidate) endpoint. Once again, this is an asynchronous endpoint and we recommend using the callback functionality. The endpoint is a simple `GET` request, as shown below.
[block:code]
{
"codes": [
{
"code": "def get_candidate(candidate_id):\n\t # Setup headers, including a callback header so Connect\n \t# can notify you when it finishes processing.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'get_candidate_complete_callback',\n candidate_id=candidate_id, _external=True\n )\n }\n\n url = '/v1/{}/candidate/{}'.format(CONFIG['connector_id'], candidate_id)\n requests.get(CONNECT_URL + url, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
We then need to setup a callback URL and retrieve the [final result](doc:get-candidate-result) of the `Get Candidate` query containing the candidates details.
[block:code]
{
"codes": [
{
"code": "@app.route('/get_candidate_complete_callback/<int:candidate_id>', methods=['POST'])\ndef get_candidate_complete_callback(candidate_id):\n # Get the result of the get_candidate call.\n if status = request.json['status'] == 'complete':\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\n candidate_details = result.json()\n # You now have the candidate details.\n\n # Return an empty response to Connect as it will retry callbacks\n # otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
We have now retrieved the candidate details.
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/find-candidates-and-retrieve-their-details",
"title": "Find Candidates Example",
"favicon": "https://github.com/favicon.ico",
"sidebar": true
}
[/block]

Connect makes it easy to search for candidates in your ATS and retrieve their details. In this example, we show how to search for a candidate using their email address, then get the details of any candidates found.
[block:callout]
{
"type": "info",
"title": "Use Callbacks",
"body": "Both searching for candidates and retrieving their details are [asynchronous endpoints](doc:asynchronous-requests). When using these, we recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback, we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:"
}
[/block]
## Searching for Candidates
To search for a candidate using Connect we need to issue a `POST` request to the [Find Candidates](doc:find-candidates) endpoint. As this is an [asynchronous endpoint](doc:asynchronous-requests) we recommend using the callback functionality of Connect.
[block:code]
{
"codes": [
{
"code": "def search_connect_by_email(email, search_id):\n # First we need to build our filter in the format Connect expects\n query = {'filters': [{'operator': '==', 'field': 'email', 'value': email}]}\n \n # Next setup the headers, including a callback header so Connect\n # can notify you when it finishes processing.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'search_complete_callback',\n search_id=search_id, _external=True\n )\n }\n \n # Finally issue a post request to Connect\n requests.post(\n CONNECT_URL + '/v1/{}/find_candidates'.format(CONFIG['connector_id']),\n json=query, auth=AUTH, headers=headers\n )",
"language": "python"
}
]
}
[/block]
Next we need to setup an endpoint to process the callback from Connect.
[block:code]
{
"codes": [
{
"code": "@app.route('/search_complete_callback/<int:search_id>', methods=['POST'])\ndef search_complete_callback(search_id):\n \"\"\"\n An endpoint for handling Connect find_candidates callbacks.\n Here we update our Search with the status or the search, and the found\n candidate_ids.\n \"\"\"\n # We get the result of the search\n if request.json['status'] == 'complete':\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\n candidate_ids = result.json()['candidate_ids']\n # We now have a list of strings which correspond to candidate ID's\n # in Connect. We can use these ID's to then query for the candidate\n # details, as shown below.\n\n # Return an empty response to Connect as it will retry callbacks\n # otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
## Retrieving Candidate Details
We can use the candidate IDs found using the search shown above to then query Connect for the candidate details. This is done using the [Get Candidate](doc:get-candidate) endpoint. Once again, this is an asynchronous endpoint and we recommend using the callback functionality. The endpoint is a simple `GET` request, as shown below.
[block:code]
{
"codes": [
{
"code": "def get_candidate(candidate_id):\n\t # Setup headers, including a callback header so Connect\n \t# can notify you when it finishes processing.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'get_candidate_complete_callback',\n candidate_id=candidate_id, _external=True\n )\n }\n\n url = '/v1/{}/candidate/{}'.format(CONFIG['connector_id'], candidate_id)\n requests.get(CONNECT_URL + url, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
We then need to setup a callback URL and retrieve the [final result](doc:get-candidate-result) of the `Get Candidate` query containing the candidates details.
[block:code]
{
"codes": [
{
"code": "@app.route('/get_candidate_complete_callback/<int:candidate_id>', methods=['POST'])\ndef get_candidate_complete_callback(candidate_id):\n # Get the result of the get_candidate call.\n if status = request.json['status'] == 'complete':\n result = requests.get(request.json['result_info']['url'], auth=AUTH)\n candidate_details = result.json()\n # You now have the candidate details.\n\n # Return an empty response to Connect as it will retry callbacks\n # otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
We have now retrieved the candidate details.
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/find-candidates-and-retrieve-their-details",
"title": "Find Candidates Example",
"favicon": "https://github.com/favicon.ico",
"sidebar": true
}
[/block]

{"_id":"56e82082bfb2023600f61323","api":{"settings":"","url":"","auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"status":400,"language":"json","code":"{}","name":""}]}},"parentDoc":null,"version":"569e609aebbadc0d0079bed0","link_url":"","title":"Insert Candidates and Track Status","__v":11,"body":"Connect makes it easy to insert candidates to your ATS, then get notifications whenever their status changes.\n\n## Inserting Candidates\n\nWhen a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.\n\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/make_application', methods=['POST'])\\ndef make_application():\\n\\n # Build our payload to include our candidate and the job they are applying\\n # for.\\n payload = {\\n \\t'applications': [{'job_id': request.form['job_id']}],\\n \\t'candidate': {\\n 'first_name': request.form['first_name'],\\n 'last_name': request.form['last_name'],\\n 'email': request.form['email']\\n }\\n \\t}\\n\\n # We can choose to either include a callback header with our\\n # request, or to poll until the application is complete. Here\\n # we use the callback funtionality.\\n headers = {\\n 'content-type': 'application/rolepoint.v2+json',\\n 'x-rolepoint-callback-url': url_for(\\n 'application_processed_callback', app_id=1, _external=True\\n )\\n }\\n # Send the candidate to Connect for processing.\\n requests.post(CONNECT_URL + '/candidate',\\n json=payload, auth=AUTH, headers=headers)\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nAs inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.\n[block:callout]\n{\n \"type\": \"info\",\n \"body\": \"We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \\n\\nDon't worry, we'll let you know when it's done! :smile:\",\n \"title\": \"Use Callbacks\"\n}\n[/block]\n## Candidate Application Complete Callback\n\nWe define this callback endpoint as below.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\\ndef application_processed_callback(app_id):\\n status = request.json['status']\\n JOB_APPLICATIONS[app_id]['status'] = status\\n\\n if status == 'complete':\\n # The application has been processed and made it into the ATS.\\n # As part of the response we are given a URL from where we can \\n # request the details of the processed candidate.\\n url = request.json['result_info']['url']\\n # Now we request the final details of the processed candidate\\n result = requests.get(url, auth=AUTH)\\n json = result.json()\\n candidate_id = json['candidate_id']\\n # Save the processed candidate details, paying special attention \\n # to store the candidate_id, as this is what we use to track our \\n # candidate status.\\n\\n # We return an empty response to Connect as it will retry callbacks otherwise.\\n return '', 200\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\nThe candidate has now been inserted into the ATS, and we have the ID of the candidate so we can track their status.\n\n## Track Candidate Status\n\nTracking candidate status works through the Connect [webhook](doc:candidate-application-status-webhooks) functionality. Updates to candidate statuses are sent periodically to ensure you always have an up to date status for your candidates. All you need is an endpoint to receive these status events.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"@app.route('/webhook_url', methods=['POST'])\\ndef status_webhook_handler():\\n for event in request.get_json(force=True):\\n event_type = event['event']\\n if event_type == 'candidate_status_update':\\n candidate_id = event['data']['entity_id']\\n # We can now update our candidate with the `candidate_id`\\n # with the value of `event['data']['status']`.\",\n \"language\": \"python\"\n }\n ]\n}\n[/block]\n\n[block:api-header]\n{\n \"type\": \"basic\",\n \"title\": \"Example Code\",\n \"sidebar\": true\n}\n[/block]\n\n[block:textarea]\n{\n \"text\": \"For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.\",\n \"sidebar\": true\n}\n[/block]\n\n[block:embed]\n{\n \"html\": false,\n \"url\": \"https://github.com/rolepoint/connect-examples/tree/master/insert-candidate-and-track-status\",\n \"title\": \"Track Status Example\",\n \"favicon\": \"https://assets-cdn.github.com/favicon.ico\",\n \"image\": \"https://avatars3.githubusercontent.com/u/2790791?v=3&s=400\",\n \"sidebar\": true\n}\n[/block]","excerpt":"","githubsync":"","hidden":false,"sync_unique":"","user":"543d38fea10ab32000b3aa8f","category":"56df07cc0201330e0070f15b","isReference":false,"link_external":false,"order":2,"project":"569e6099ebbadc0d0079becd","slug":"insert-candidates-and-track-status","createdAt":"2016-03-15T14:47:30.237Z","type":"basic","updates":[],"childrenPages":[]}

Insert Candidates and Track Status

Connect makes it easy to insert candidates to your ATS, then get notifications whenever their status changes.
## Inserting Candidates
When a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.
[block:code]
{
"codes": [
{
"code": "@app.route('/make_application', methods=['POST'])\ndef make_application():\n\n # Build our payload to include our candidate and the job they are applying\n # for.\n payload = {\n \t'applications': [{'job_id': request.form['job_id']}],\n \t'candidate': {\n 'first_name': request.form['first_name'],\n 'last_name': request.form['last_name'],\n 'email': request.form['email']\n }\n \t}\n\n # We can choose to either include a callback header with our\n # request, or to poll until the application is complete. Here\n # we use the callback funtionality.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'application_processed_callback', app_id=1, _external=True\n )\n }\n # Send the candidate to Connect for processing.\n requests.post(CONNECT_URL + '/candidate',\n json=payload, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
As inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.
[block:callout]
{
"type": "info",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:",
"title": "Use Callbacks"
}
[/block]
## Candidate Application Complete Callback
We define this callback endpoint as below.
[block:code]
{
"codes": [
{
"code": "@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\ndef application_processed_callback(app_id):\n status = request.json['status']\n JOB_APPLICATIONS[app_id]['status'] = status\n\n if status == 'complete':\n # The application has been processed and made it into the ATS.\n # As part of the response we are given a URL from where we can \n # request the details of the processed candidate.\n url = request.json['result_info']['url']\n # Now we request the final details of the processed candidate\n result = requests.get(url, auth=AUTH)\n json = result.json()\n candidate_id = json['candidate_id']\n # Save the processed candidate details, paying special attention \n # to store the candidate_id, as this is what we use to track our \n # candidate status.\n\n # We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
The candidate has now been inserted into the ATS, and we have the ID of the candidate so we can track their status.
## Track Candidate Status
Tracking candidate status works through the Connect [webhook](doc:candidate-application-status-webhooks) functionality. Updates to candidate statuses are sent periodically to ensure you always have an up to date status for your candidates. All you need is an endpoint to receive these status events.
[block:code]
{
"codes": [
{
"code": "@app.route('/webhook_url', methods=['POST'])\ndef status_webhook_handler():\n for event in request.get_json(force=True):\n event_type = event['event']\n if event_type == 'candidate_status_update':\n candidate_id = event['data']['entity_id']\n # We can now update our candidate with the `candidate_id`\n # with the value of `event['data']['status']`.",
"language": "python"
}
]
}
[/block]
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/insert-candidate-and-track-status",
"title": "Track Status Example",
"favicon": "https://assets-cdn.github.com/favicon.ico",
"image": "https://avatars3.githubusercontent.com/u/2790791?v=3&s=400",
"sidebar": true
}
[/block]

Connect makes it easy to insert candidates to your ATS, then get notifications whenever their status changes.
## Inserting Candidates
When a candidate completes your job application form, we can now send their information to Connect with a simple `POST` request.
[block:code]
{
"codes": [
{
"code": "@app.route('/make_application', methods=['POST'])\ndef make_application():\n\n # Build our payload to include our candidate and the job they are applying\n # for.\n payload = {\n \t'applications': [{'job_id': request.form['job_id']}],\n \t'candidate': {\n 'first_name': request.form['first_name'],\n 'last_name': request.form['last_name'],\n 'email': request.form['email']\n }\n \t}\n\n # We can choose to either include a callback header with our\n # request, or to poll until the application is complete. Here\n # we use the callback funtionality.\n headers = {\n 'content-type': 'application/rolepoint.v2+json',\n 'x-rolepoint-callback-url': url_for(\n 'application_processed_callback', app_id=1, _external=True\n )\n }\n # Send the candidate to Connect for processing.\n requests.post(CONNECT_URL + '/candidate',\n json=payload, auth=AUTH, headers=headers)",
"language": "python"
}
]
}
[/block]
As inserting candidates into Connect is an [asynchronous endpoint](doc:asynchronous-requests), we have passed a callback URL as part of our `POST` request. Once Connect has processed the candidate, it will send a request to this URL to notify us that the processing is complete.
[block:callout]
{
"type": "info",
"body": "We recommend using the callback functionality rather than polling Connect. Each request to Connect can map to one or more requests to the ATS, which could take longer to process. By sending a callback we reduce the need to make several needless connections over an extended period of time. \n\nDon't worry, we'll let you know when it's done! :smile:",
"title": "Use Callbacks"
}
[/block]
## Candidate Application Complete Callback
We define this callback endpoint as below.
[block:code]
{
"codes": [
{
"code": "@app.route('/application_processed_callback/<int:app_id>', methods=['POST'])\ndef application_processed_callback(app_id):\n status = request.json['status']\n JOB_APPLICATIONS[app_id]['status'] = status\n\n if status == 'complete':\n # The application has been processed and made it into the ATS.\n # As part of the response we are given a URL from where we can \n # request the details of the processed candidate.\n url = request.json['result_info']['url']\n # Now we request the final details of the processed candidate\n result = requests.get(url, auth=AUTH)\n json = result.json()\n candidate_id = json['candidate_id']\n # Save the processed candidate details, paying special attention \n # to store the candidate_id, as this is what we use to track our \n # candidate status.\n\n # We return an empty response to Connect as it will retry callbacks otherwise.\n return '', 200",
"language": "python"
}
]
}
[/block]
The candidate has now been inserted into the ATS, and we have the ID of the candidate so we can track their status.
## Track Candidate Status
Tracking candidate status works through the Connect [webhook](doc:candidate-application-status-webhooks) functionality. Updates to candidate statuses are sent periodically to ensure you always have an up to date status for your candidates. All you need is an endpoint to receive these status events.
[block:code]
{
"codes": [
{
"code": "@app.route('/webhook_url', methods=['POST'])\ndef status_webhook_handler():\n for event in request.get_json(force=True):\n event_type = event['event']\n if event_type == 'candidate_status_update':\n candidate_id = event['data']['entity_id']\n # We can now update our candidate with the `candidate_id`\n # with the value of `event['data']['status']`.",
"language": "python"
}
]
}
[/block]
[block:api-header]
{
"type": "basic",
"title": "Example Code",
"sidebar": true
}
[/block]
[block:textarea]
{
"text": "For the full example shown here, with instructions on how to run it locally in your desired programming language, please see the link below.",
"sidebar": true
}
[/block]
[block:embed]
{
"html": false,
"url": "https://github.com/rolepoint/connect-examples/tree/master/insert-candidate-and-track-status",
"title": "Track Status Example",
"favicon": "https://assets-cdn.github.com/favicon.ico",
"image": "https://avatars3.githubusercontent.com/u/2790791?v=3&s=400",
"sidebar": true
}
[/block]

{"_id":"56e5cac6d1303329002ea76c","link_url":"","slug":"sandbox-connector","title":"Sandbox Connectors","category":"56df07cc0201330e0070f15b","githubsync":"","hidden":false,"isReference":false,"excerpt":"","order":3,"parentDoc":null,"project":"569e6099ebbadc0d0079becd","api":{"auth":"required","params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":""},"body":"Sandbox Connectors allow you to use Connect as if you were integrating with an ATS, before you have the required credentials. They behave exactly as production Connectors – including [Rate Limits](doc:rate-limits) and [Billing limits](doc:billing-limits).\n\nCandidate and application results are stored in the sandbox (so you can query for them later) and there is a default set of jobs that can be sent as webhook events, all through the same services as you will use in production.\n[block:callout]\n{\n \"type\": \"warning\",\n \"body\": \"Sandbox Connectors (including all the data you've created) will be deleted if they aren't used for 14 days.\"\n}\n[/block]\nYou'll need to create a sandbox connector before starting the example applications. \n\n### Creating a Sandbox Connector\n\nNo authorisation is required, though the endpoint is rate limited.\n\nThe only required parameter:\n* `email` - an email address for the creator of the sandbox. This address will receive updates on the connector and will of course never be given to anyone else.\n\nTo receive [webhooks](doc:webhooks) for your sandbox connector, you can optionally include a webhook_url parameter:\n* `webhook_url` - the webhook URL that [webhook events](doc:webhooks) will be sent to\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"curl -X POST -H \\\"Content-Type: application/json\\\" -d '{\\n \\\"email\\\": \\\"developer@rolepoint.com\\\",\\n \\\"webhook_url\\\": \\\"<webhook_url>\\\"\\n}' \\\"https://api.rolepoint-connect.com/examples/sandbox-connector\\\"\",\n \"language\": \"curl\"\n },\n {\n \"code\": \"import requests\\n\\npayload = {\\n 'webhook_url': '<webhook_url>',\\n 'email':'developer@ro1epoint.com'\\n}\\n\\nresponse = requests.post(\\n 'https://api.rolepoint-connect.com/examples/sandbox-connector',\\n json=payload\\n)\\n\\nprint(response.text)\",\n \"language\": \"python\"\n },\n {\n \"code\": \"require 'uri'\\nrequire 'net/http'\\nrequire 'json'\\n\\nurl = URI(\\\"https://api.rolepoint-connect.com/examples/sandbox-connector\\\")\\n\\nhttp = Net::HTTP.new(url.host, url.port)\\nhttp.use_ssl = true\\n\\npayload = {:email => \\\"developer@rolepoint.com\\\", :webhook_url => \\\"<webhook_url>\\\"}\\n\\nrequest = Net::HTTP::Post.new(url)\\nrequest[\\\"content-type\\\"] = 'application/json'\\nrequest.body = payload.to_json\\n\\nresponse = http.request(request)\\nputs response.read_body\",\n \"language\": \"ruby\"\n },\n {\n \"code\": \"invoke-restmethod -uri \\\"https://api.rolepoint-connect.com/examples/sandbox-connector\\\" -contenttype \\\"application/json\\\" -method Post -body '{\\n \\\"email\\\": \\\"developer@rolepoint.com\\\",\\n \\\"webhook_url\\\": \\\"<webhook_url>\\\"\\n}'\",\n \"language\": \"shell\",\n \"name\": \"PowerShell\"\n }\n ]\n}\n[/block]\nThe endpoint will respond with the `username`, `password` and `connector_id` of the connector, which are required to access it. You can now use the Connector for any of our documented [examples](doc:get-jobs-and-insert-applications) and [endpoints](doc:send-candidate).\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"connector_id\\\": \\\"4\\\",\\n \\\"password\\\": \\\"TZtyELZhweVyaTLt\\\",\\n \\\"username\\\": \\\"example_taleo_enterpise_SMNfyy\\\",\\n \\\"email\\\": \\\"developer@ro1epoint.com\\\",\\n \\\"webhook_url\\\": \\\"http://3b86a003.ngrok.io/webhook_url\\\"\\n}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nIf there are too many requests for Sandbox Connectors, you'll see this message:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\\"errors\\\": \\\"There are currently too many example requests. Try again in 60 seconds\\\"}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]","createdAt":"2016-03-13T20:17:10.402Z","sync_unique":"","type":"basic","updates":[],"version":"569e609aebbadc0d0079bed0","__v":13,"link_external":false,"user":"56d846d5b20d260b0026570b","childrenPages":[]}

Sandbox Connectors

Sandbox Connectors allow you to use Connect as if you were integrating with an ATS, before you have the required credentials. They behave exactly as production Connectors – including [Rate Limits](doc:rate-limits) and [Billing limits](doc:billing-limits).
Candidate and application results are stored in the sandbox (so you can query for them later) and there is a default set of jobs that can be sent as webhook events, all through the same services as you will use in production.
[block:callout]
{
"type": "warning",
"body": "Sandbox Connectors (including all the data you've created) will be deleted if they aren't used for 14 days."
}
[/block]
You'll need to create a sandbox connector before starting the example applications.
### Creating a Sandbox Connector
No authorisation is required, though the endpoint is rate limited.
The only required parameter:
* `email` - an email address for the creator of the sandbox. This address will receive updates on the connector and will of course never be given to anyone else.
To receive [webhooks](doc:webhooks) for your sandbox connector, you can optionally include a webhook_url parameter:
* `webhook_url` - the webhook URL that [webhook events](doc:webhooks) will be sent to
[block:code]
{
"codes": [
{
"code": "curl -X POST -H \"Content-Type: application/json\" -d '{\n \"email\": \"developer@rolepoint.com\",\n \"webhook_url\": \"<webhook_url>\"\n}' \"https://api.rolepoint-connect.com/examples/sandbox-connector\"",
"language": "curl"
},
{
"code": "import requests\n\npayload = {\n 'webhook_url': '<webhook_url>',\n 'email':'developer@ro1epoint.com'\n}\n\nresponse = requests.post(\n 'https://api.rolepoint-connect.com/examples/sandbox-connector',\n json=payload\n)\n\nprint(response.text)",
"language": "python"
},
{
"code": "require 'uri'\nrequire 'net/http'\nrequire 'json'\n\nurl = URI(\"https://api.rolepoint-connect.com/examples/sandbox-connector\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\n\npayload = {:email => \"developer@rolepoint.com\", :webhook_url => \"<webhook_url>\"}\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"content-type\"] = 'application/json'\nrequest.body = payload.to_json\n\nresponse = http.request(request)\nputs response.read_body",
"language": "ruby"
},
{
"code": "invoke-restmethod -uri \"https://api.rolepoint-connect.com/examples/sandbox-connector\" -contenttype \"application/json\" -method Post -body '{\n \"email\": \"developer@rolepoint.com\",\n \"webhook_url\": \"<webhook_url>\"\n}'",
"language": "shell",
"name": "PowerShell"
}
]
}
[/block]
The endpoint will respond with the `username`, `password` and `connector_id` of the connector, which are required to access it. You can now use the Connector for any of our documented [examples](doc:get-jobs-and-insert-applications) and [endpoints](doc:send-candidate).
[block:code]
{
"codes": [
{
"code": "{\n \"connector_id\": \"4\",\n \"password\": \"TZtyELZhweVyaTLt\",\n \"username\": \"example_taleo_enterpise_SMNfyy\",\n \"email\": \"developer@ro1epoint.com\",\n \"webhook_url\": \"http://3b86a003.ngrok.io/webhook_url\"\n}",
"language": "json"
}
]
}
[/block]
If there are too many requests for Sandbox Connectors, you'll see this message:
[block:code]
{
"codes": [
{
"code": "{\"errors\": \"There are currently too many example requests. Try again in 60 seconds\"}",
"language": "json"
}
]
}
[/block]

Sandbox Connectors allow you to use Connect as if you were integrating with an ATS, before you have the required credentials. They behave exactly as production Connectors – including [Rate Limits](doc:rate-limits) and [Billing limits](doc:billing-limits).
Candidate and application results are stored in the sandbox (so you can query for them later) and there is a default set of jobs that can be sent as webhook events, all through the same services as you will use in production.
[block:callout]
{
"type": "warning",
"body": "Sandbox Connectors (including all the data you've created) will be deleted if they aren't used for 14 days."
}
[/block]
You'll need to create a sandbox connector before starting the example applications.
### Creating a Sandbox Connector
No authorisation is required, though the endpoint is rate limited.
The only required parameter:
* `email` - an email address for the creator of the sandbox. This address will receive updates on the connector and will of course never be given to anyone else.
To receive [webhooks](doc:webhooks) for your sandbox connector, you can optionally include a webhook_url parameter:
* `webhook_url` - the webhook URL that [webhook events](doc:webhooks) will be sent to
[block:code]
{
"codes": [
{
"code": "curl -X POST -H \"Content-Type: application/json\" -d '{\n \"email\": \"developer@rolepoint.com\",\n \"webhook_url\": \"<webhook_url>\"\n}' \"https://api.rolepoint-connect.com/examples/sandbox-connector\"",
"language": "curl"
},
{
"code": "import requests\n\npayload = {\n 'webhook_url': '<webhook_url>',\n 'email':'developer@ro1epoint.com'\n}\n\nresponse = requests.post(\n 'https://api.rolepoint-connect.com/examples/sandbox-connector',\n json=payload\n)\n\nprint(response.text)",
"language": "python"
},
{
"code": "require 'uri'\nrequire 'net/http'\nrequire 'json'\n\nurl = URI(\"https://api.rolepoint-connect.com/examples/sandbox-connector\")\n\nhttp = Net::HTTP.new(url.host, url.port)\nhttp.use_ssl = true\n\npayload = {:email => \"developer@rolepoint.com\", :webhook_url => \"<webhook_url>\"}\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"content-type\"] = 'application/json'\nrequest.body = payload.to_json\n\nresponse = http.request(request)\nputs response.read_body",
"language": "ruby"
},
{
"code": "invoke-restmethod -uri \"https://api.rolepoint-connect.com/examples/sandbox-connector\" -contenttype \"application/json\" -method Post -body '{\n \"email\": \"developer@rolepoint.com\",\n \"webhook_url\": \"<webhook_url>\"\n}'",
"language": "shell",
"name": "PowerShell"
}
]
}
[/block]
The endpoint will respond with the `username`, `password` and `connector_id` of the connector, which are required to access it. You can now use the Connector for any of our documented [examples](doc:get-jobs-and-insert-applications) and [endpoints](doc:send-candidate).
[block:code]
{
"codes": [
{
"code": "{\n \"connector_id\": \"4\",\n \"password\": \"TZtyELZhweVyaTLt\",\n \"username\": \"example_taleo_enterpise_SMNfyy\",\n \"email\": \"developer@ro1epoint.com\",\n \"webhook_url\": \"http://3b86a003.ngrok.io/webhook_url\"\n}",
"language": "json"
}
]
}
[/block]
If there are too many requests for Sandbox Connectors, you'll see this message:
[block:code]
{
"codes": [
{
"code": "{\"errors\": \"There are currently too many example requests. Try again in 60 seconds\"}",
"language": "json"
}
]
}
[/block]

{"_id":"56df09ee0201330e0070f161","category":"56e43a6e7e2c0220000312db","isReference":true,"next":{"description":"","pages":[]},"project":"569e6099ebbadc0d0079becd","body":"By registering a webhook with RolePoint Connect, you can receive updates on various resources within an ATS.\n\nConnect uses webhooks to send updates on resources that change relatively infrequently. Many APIs do not provide this functionality - to get updates on a job you would have to periodically make a request for that job. The job may change infrequently, but you would still have to poll to ensure you have up to date information. Connect handles this for you - you just need to handle the webhooks when they are sent.\n\nConnect currently sends webhooks on:\n\n- Job adds, deletes or updates.\n- Job updates completion.\n- Candidate status changes.\n- Job application status changes.\n\nNote: This features may not all be available for all ATS integrations.\n\n### Choosing a webhook URL.\n\nConnect webhooks do not currently support authentication, so it's recommended that your incoming webhook URL contain some sort of random element (e.g. a UUID) to help secure against people guessing your URL. Webhooks will **not** follow redirects.\n\n### Receiving updates from a webhook\n\nRolePoint Connect will receive regular updates of data from the ATS. It will batch these updates together into groups of no more than 100 and HTTP POST them to the registered webhook URL. For example:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"POST /application/status\\nHost: webhooks.example.com\\nContent-Type: application/rolepoint.v1+json\\n\\n[\\n {\\n \\t\\\"event\\\": \\\"candidate_status_update\\\",\\n \\t\\t\\\"event_time\\\": \\\"2015-05-12T11:44:20.559473\\\",\\n \\t\\t\\\"data\\\": {\\n \\t\\\"entity_id\\\": \\\"123\\\",\\n \\t\\t\\t\\t\\\"status\\\": {\\n \\t\\\"id\\\": 21, \\n \\t\\\"value\\\": \\\"contacted\\\"\\n }\\n }\\n },\\n {\\n \\t\\\"event\\\": \\\"application_status_update\\\",\\n \\t\\t\\\"event_time\\\": \\\"2015-05-12T11:49:05.796921\\\",\\n \\t\\t\\\"data\\\": {\\n \\t\\\"entity_id\\\": \\\"456\\\",\\n \\t\\t\\t\\t\\\"status\\\": {\\n \\t\\\"id\\\": 22, \\n \\t\\\"value\\\": \\\"hired\\\"\\n }\\n }\\n }\\n]\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nEach entry in the list should have the following fields:\n\n- `event` - Will indicate the type of webhook event. See the pages under [Event\n Types](#section-event-types) below for details.\n- `event_time` - will indicate the time that the event occurred at. This\n should be in [ISO 8601 format](http://en.wikipedia.org/wiki/ISO_8601).\n- `data` - some event specific data. See the pages under [Event\n Types](#section-event-types) below.\n\n### Event Types\n\n- [Job events](doc:job-webhooks)\n- [Candidate & Application status updates](doc:candidate-application-status-webhooks)\n\n### Webhook notification timeouts & error handling\n\nIf your webhook endpoint returns a non-200 HTTP status code or takes longer than 30 seconds to reply, then we will retry sending the webhook after 10 seconds. If that request fails, then we will try again after 20 seconds. The time between retries will continue to double until the request is successful or 24 hours has passed.\n\n**All future status updates will be queued behind this one until it is either successful or we finish retrying.**\n\nWhen connect has retried for 24 hours without success, that request and all the webhook events contained within will be dropped. Other queued status updates will not be affected, but any data contained in the dropped message will not be re-sent.\n\nYou should be careful not to perform any heavy processing in the webhook endpoint itself - if this is required, you should send it to a background processing task to avoid triggering our 30 second timeout.\n[block:callout]\n{\n \"type\": \"warning\",\n \"title\": \"Multiple Webhooks for Same Event\",\n \"body\": \"It is possible for the same Webhook to be sent multiple times, for example receiving a `job_add` event for the same job more than once. Ensure your system is configured to handle this possibility.\"\n}\n[/block]","link_external":false,"link_url":"","parentDoc":null,"sync_unique":"","title":"Webhooks","__v":16,"api":{"settings":"","url":"","auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"code":"{}","name":"","status":400,"language":"json"}]}},"createdAt":"2016-03-08T17:20:46.128Z","excerpt":"","hidden":false,"user":"543d38fea10ab32000b3aa8f","version":"569e609aebbadc0d0079bed0","githubsync":"","order":0,"slug":"webhooks","type":"basic","updates":[],"childrenPages":[]}

Webhooks

By registering a webhook with RolePoint Connect, you can receive updates on various resources within an ATS.
Connect uses webhooks to send updates on resources that change relatively infrequently. Many APIs do not provide this functionality - to get updates on a job you would have to periodically make a request for that job. The job may change infrequently, but you would still have to poll to ensure you have up to date information. Connect handles this for you - you just need to handle the webhooks when they are sent.
Connect currently sends webhooks on:
- Job adds, deletes or updates.
- Job updates completion.
- Candidate status changes.
- Job application status changes.
Note: This features may not all be available for all ATS integrations.
### Choosing a webhook URL.
Connect webhooks do not currently support authentication, so it's recommended that your incoming webhook URL contain some sort of random element (e.g. a UUID) to help secure against people guessing your URL. Webhooks will **not** follow redirects.
### Receiving updates from a webhook
RolePoint Connect will receive regular updates of data from the ATS. It will batch these updates together into groups of no more than 100 and HTTP POST them to the registered webhook URL. For example:
[block:code]
{
"codes": [
{
"code": "POST /application/status\nHost: webhooks.example.com\nContent-Type: application/rolepoint.v1+json\n\n[\n {\n \t\"event\": \"candidate_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:44:20.559473\",\n \t\t\"data\": {\n \t\"entity_id\": \"123\",\n \t\t\t\t\"status\": {\n \t\"id\": 21, \n \t\"value\": \"contacted\"\n }\n }\n },\n {\n \t\"event\": \"application_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:49:05.796921\",\n \t\t\"data\": {\n \t\"entity_id\": \"456\",\n \t\t\t\t\"status\": {\n \t\"id\": 22, \n \t\"value\": \"hired\"\n }\n }\n }\n]",
"language": "http"
}
]
}
[/block]
Each entry in the list should have the following fields:
- `event` - Will indicate the type of webhook event. See the pages under [Event
Types](#section-event-types) below for details.
- `event_time` - will indicate the time that the event occurred at. This
should be in [ISO 8601 format](http://en.wikipedia.org/wiki/ISO_8601).
- `data` - some event specific data. See the pages under [Event
Types](#section-event-types) below.
### Event Types
- [Job events](doc:job-webhooks)
- [Candidate & Application status updates](doc:candidate-application-status-webhooks)
### Webhook notification timeouts & error handling
If your webhook endpoint returns a non-200 HTTP status code or takes longer than 30 seconds to reply, then we will retry sending the webhook after 10 seconds. If that request fails, then we will try again after 20 seconds. The time between retries will continue to double until the request is successful or 24 hours has passed.
**All future status updates will be queued behind this one until it is either successful or we finish retrying.**
When connect has retried for 24 hours without success, that request and all the webhook events contained within will be dropped. Other queued status updates will not be affected, but any data contained in the dropped message will not be re-sent.
You should be careful not to perform any heavy processing in the webhook endpoint itself - if this is required, you should send it to a background processing task to avoid triggering our 30 second timeout.
[block:callout]
{
"type": "warning",
"title": "Multiple Webhooks for Same Event",
"body": "It is possible for the same Webhook to be sent multiple times, for example receiving a `job_add` event for the same job more than once. Ensure your system is configured to handle this possibility."
}
[/block]

By registering a webhook with RolePoint Connect, you can receive updates on various resources within an ATS.
Connect uses webhooks to send updates on resources that change relatively infrequently. Many APIs do not provide this functionality - to get updates on a job you would have to periodically make a request for that job. The job may change infrequently, but you would still have to poll to ensure you have up to date information. Connect handles this for you - you just need to handle the webhooks when they are sent.
Connect currently sends webhooks on:
- Job adds, deletes or updates.
- Job updates completion.
- Candidate status changes.
- Job application status changes.
Note: This features may not all be available for all ATS integrations.
### Choosing a webhook URL.
Connect webhooks do not currently support authentication, so it's recommended that your incoming webhook URL contain some sort of random element (e.g. a UUID) to help secure against people guessing your URL. Webhooks will **not** follow redirects.
### Receiving updates from a webhook
RolePoint Connect will receive regular updates of data from the ATS. It will batch these updates together into groups of no more than 100 and HTTP POST them to the registered webhook URL. For example:
[block:code]
{
"codes": [
{
"code": "POST /application/status\nHost: webhooks.example.com\nContent-Type: application/rolepoint.v1+json\n\n[\n {\n \t\"event\": \"candidate_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:44:20.559473\",\n \t\t\"data\": {\n \t\"entity_id\": \"123\",\n \t\t\t\t\"status\": {\n \t\"id\": 21, \n \t\"value\": \"contacted\"\n }\n }\n },\n {\n \t\"event\": \"application_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:49:05.796921\",\n \t\t\"data\": {\n \t\"entity_id\": \"456\",\n \t\t\t\t\"status\": {\n \t\"id\": 22, \n \t\"value\": \"hired\"\n }\n }\n }\n]",
"language": "http"
}
]
}
[/block]
Each entry in the list should have the following fields:
- `event` - Will indicate the type of webhook event. See the pages under [Event
Types](#section-event-types) below for details.
- `event_time` - will indicate the time that the event occurred at. This
should be in [ISO 8601 format](http://en.wikipedia.org/wiki/ISO_8601).
- `data` - some event specific data. See the pages under [Event
Types](#section-event-types) below.
### Event Types
- [Job events](doc:job-webhooks)
- [Candidate & Application status updates](doc:candidate-application-status-webhooks)
### Webhook notification timeouts & error handling
If your webhook endpoint returns a non-200 HTTP status code or takes longer than 30 seconds to reply, then we will retry sending the webhook after 10 seconds. If that request fails, then we will try again after 20 seconds. The time between retries will continue to double until the request is successful or 24 hours has passed.
**All future status updates will be queued behind this one until it is either successful or we finish retrying.**
When connect has retried for 24 hours without success, that request and all the webhook events contained within will be dropped. Other queued status updates will not be affected, but any data contained in the dropped message will not be re-sent.
You should be careful not to perform any heavy processing in the webhook endpoint itself - if this is required, you should send it to a background processing task to avoid triggering our 30 second timeout.
[block:callout]
{
"type": "warning",
"title": "Multiple Webhooks for Same Event",
"body": "It is possible for the same Webhook to be sent multiple times, for example receiving a `job_add` event for the same job more than once. Ensure your system is configured to handle this possibility."
}
[/block]

{"_id":"56e44ffdf0150e1700ce67f8","link_url":"","parentDoc":null,"sync_unique":"","type":"basic","updates":[],"user":"56d846d5b20d260b0026570b","api":{"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":"","auth":"required","params":[]},"body":"RolePoint Connect can provide details of jobs that are contained within an ATS. This automatically happens for all ATSs with job support, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [Webhooks page](doc:webhooks).\n\nThere are four types of job related webhooks:\n\n- `job_add` - sent when connect finds an active job it has not encountered before. When a connector is new, all current active jobs will be sent through as `job_add` events.\n- `job_update` - sent when the data for a job has changed in some way.\n- `job_remove` - sent when a job is no longer active, or has otherwise been deleted.\n- `job_updates_complete` - Sent when the process which updates the jobs for your connector has completed. Note that this _should_ usually arrive after the `job_add`, `job_update` and `job_remove` events, however this is not guaranteed. It will also be sent if we ran a process to update the jobs, but no changes occurred.\n\nThese values will be filled in the `event` field of any webhooks that come through.\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"[\\n {\\n \\\"event\\\": \\\"job_add\\\",\\n \\\"event_time\\\": \\\"2015-05-12T11:44:20.559473\\\",\\n \\\"data\\\": {\\n \\\"department_name\\\": \\\"Pet Management\\\",\\n \\\"qualifications\\\": null,\\n \\\"creation_date\\\": null,\\n \\\"title\\\": \\\"Dog Butler\\\",\\n \\\"status\\\": \\\"Sourcing\\\",\\n \\\"location\\\": {\\n \\\"country\\\": \\\"United States\\\",\\n \\\"state\\\": \\\"California\\\",\\n \\\"city\\\": \\\"Irvine\\\"\\n },\\n \\\"salary\\\": {\\n \\\"upper\\\": null,\\n \\\"lower\\\": null,\\n \\\"currency\\\": \\\"USD\\\"\\n },\\n \\\"hiring_manager\\\": {\\n \\\"last_name\\\": \\\"Bond\\\",\\n \\\"first_name\\\": \\\"James\\\",\\n \\\"email\\\": \\\"james@example.com\\\"\\n },\\n \\\"opening_date\\\": null,\\n \\\"closing_date\\\": null,\\n \\\"ats_id\\\": \\\"9384843\\\",\\n \\\"description\\\": \\\"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\\\",\\n \\\"contract_type\\\": null\\n }\\n },\\n {\\n \\\"event\\\": \\\"job_update\\\",\\n \\\"event_time\\\": \\\"2015-05-12T11:49:05.796921\\\",\\n \\\"data\\\": {\\n \\\"department_name\\\": \\\"Pet Management\\\",\\n \\\"qualifications\\\": null,\\n \\\"creation_date\\\": null,\\n \\\"title\\\": \\\"Dog Butler\\\",\\n \\\"status\\\": \\\"Sourcing\\\",\\n \\\"location\\\": {\\n \\\"country\\\": \\\"United States\\\",\\n \\\"state\\\": \\\"California\\\",\\n \\\"city\\\": \\\"Irvine\\\"\\n },\\n \\\"salary\\\": {\\n \\\"upper\\\": null,\\n \\\"lower\\\": null,\\n \\\"currency\\\": \\\"USD\\\"\\n },\\n \\\"hiring_manager\\\": {\\n \\\"last_name\\\": \\\"Bond\\\",\\n \\\"first_name\\\": \\\"James\\\",\\n \\\"email\\\": \\\"james@example.com\\\"\\n },\\n \\\"opening_date\\\": null,\\n \\\"closing_date\\\": null,\\n \\\"ats_id\\\": \\\"12345F\\\",\\n \\\"description\\\": \\\"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\\\",\\n \\\"contract_type\\\": null\\n }\\n },\\n {\\n \\\"event\\\": \\\"job_remove\\\",\\n \\\"event_time\\\": \\\"2015-05-12T11:53:08.128675\\\",\\n \\\"data\\\": {\\n \\\"ats_id\\\": \\\"123BR\\\"\\n }\\n },\\n {\\n \\\"event\\\": \\\"job_updates_complete\\\",\\n \\\"event_time\\\": \\\"2015-05-12T11:53:10.128675\\\",\\n \\\"data\\\": {}\\n }\\n]\",\n \"language\": \"json\"\n }\n ],\n \"sidebar\": true\n}\n[/block]\n## Job Payloads\n\n### Add & Update Payloads\n\nThe `data` field for the `job_add` & `job_update` events will contain the compete JSON representation of the job. Which fields this contains can vary slightly from ATS to ATS - an example payload for a taleo enterprise edition job is presented to the right. Most other ATSs should follow the same format, though there may be slight variations in which fields are returned or precisely which format certain fields are presented in.\n\nThe `ats_id` field is always returned - this is the ID of the job in the ATS, and can be used to relate `job_add` events to their corresponding `job_update` & `job_remove` events, as well as being sent when [sending a candidate](doc:send-candidate).\n\nIt may be the case that the default job payload for an ATS doesn't contain a field that you are interested in - perhaps there's a custom field you're interested in or even just a bit of data we don't currently get. Connects job fetching code is designed to be flexible - contact someone on the connect slack channel and we can add those fields to the payload for your connector.\n\n### Remove Payloads\n\nThe `data` field of a `job_remove` event will only ever contain the `ats_id` of that job. This can be used to mark the job as deleted in your system.","createdAt":"2016-03-12T17:21:01.887Z","githubsync":"","link_external":false,"title":"Job Events","version":"569e609aebbadc0d0079bed0","category":"56e43a6e7e2c0220000312db","excerpt":"","hidden":false,"project":"569e6099ebbadc0d0079becd","__v":13,"isReference":true,"order":1,"slug":"job-webhooks","next":{"description":"","pages":[]},"childrenPages":[]}

Job Events

RolePoint Connect can provide details of jobs that are contained within an ATS. This automatically happens for all ATSs with job support, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [Webhooks page](doc:webhooks).
There are four types of job related webhooks:
- `job_add` - sent when connect finds an active job it has not encountered before. When a connector is new, all current active jobs will be sent through as `job_add` events.
- `job_update` - sent when the data for a job has changed in some way.
- `job_remove` - sent when a job is no longer active, or has otherwise been deleted.
- `job_updates_complete` - Sent when the process which updates the jobs for your connector has completed. Note that this _should_ usually arrive after the `job_add`, `job_update` and `job_remove` events, however this is not guaranteed. It will also be sent if we ran a process to update the jobs, but no changes occurred.
These values will be filled in the `event` field of any webhooks that come through.
[block:code]
{
"codes": [
{
"code": "[\n {\n \"event\": \"job_add\",\n \"event_time\": \"2015-05-12T11:44:20.559473\",\n \"data\": {\n \"department_name\": \"Pet Management\",\n \"qualifications\": null,\n \"creation_date\": null,\n \"title\": \"Dog Butler\",\n \"status\": \"Sourcing\",\n \"location\": {\n \"country\": \"United States\",\n \"state\": \"California\",\n \"city\": \"Irvine\"\n },\n \"salary\": {\n \"upper\": null,\n \"lower\": null,\n \"currency\": \"USD\"\n },\n \"hiring_manager\": {\n \"last_name\": \"Bond\",\n \"first_name\": \"James\",\n \"email\": \"james@example.com\"\n },\n \"opening_date\": null,\n \"closing_date\": null,\n \"ats_id\": \"9384843\",\n \"description\": \"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\",\n \"contract_type\": null\n }\n },\n {\n \"event\": \"job_update\",\n \"event_time\": \"2015-05-12T11:49:05.796921\",\n \"data\": {\n \"department_name\": \"Pet Management\",\n \"qualifications\": null,\n \"creation_date\": null,\n \"title\": \"Dog Butler\",\n \"status\": \"Sourcing\",\n \"location\": {\n \"country\": \"United States\",\n \"state\": \"California\",\n \"city\": \"Irvine\"\n },\n \"salary\": {\n \"upper\": null,\n \"lower\": null,\n \"currency\": \"USD\"\n },\n \"hiring_manager\": {\n \"last_name\": \"Bond\",\n \"first_name\": \"James\",\n \"email\": \"james@example.com\"\n },\n \"opening_date\": null,\n \"closing_date\": null,\n \"ats_id\": \"12345F\",\n \"description\": \"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\",\n \"contract_type\": null\n }\n },\n {\n \"event\": \"job_remove\",\n \"event_time\": \"2015-05-12T11:53:08.128675\",\n \"data\": {\n \"ats_id\": \"123BR\"\n }\n },\n {\n \"event\": \"job_updates_complete\",\n \"event_time\": \"2015-05-12T11:53:10.128675\",\n \"data\": {}\n }\n]",
"language": "json"
}
],
"sidebar": true
}
[/block]
## Job Payloads
### Add & Update Payloads
The `data` field for the `job_add` & `job_update` events will contain the compete JSON representation of the job. Which fields this contains can vary slightly from ATS to ATS - an example payload for a taleo enterprise edition job is presented to the right. Most other ATSs should follow the same format, though there may be slight variations in which fields are returned or precisely which format certain fields are presented in.
The `ats_id` field is always returned - this is the ID of the job in the ATS, and can be used to relate `job_add` events to their corresponding `job_update` & `job_remove` events, as well as being sent when [sending a candidate](doc:send-candidate).
It may be the case that the default job payload for an ATS doesn't contain a field that you are interested in - perhaps there's a custom field you're interested in or even just a bit of data we don't currently get. Connects job fetching code is designed to be flexible - contact someone on the connect slack channel and we can add those fields to the payload for your connector.
### Remove Payloads
The `data` field of a `job_remove` event will only ever contain the `ats_id` of that job. This can be used to mark the job as deleted in your system.

RolePoint Connect can provide details of jobs that are contained within an ATS. This automatically happens for all ATSs with job support, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [Webhooks page](doc:webhooks).
There are four types of job related webhooks:
- `job_add` - sent when connect finds an active job it has not encountered before. When a connector is new, all current active jobs will be sent through as `job_add` events.
- `job_update` - sent when the data for a job has changed in some way.
- `job_remove` - sent when a job is no longer active, or has otherwise been deleted.
- `job_updates_complete` - Sent when the process which updates the jobs for your connector has completed. Note that this _should_ usually arrive after the `job_add`, `job_update` and `job_remove` events, however this is not guaranteed. It will also be sent if we ran a process to update the jobs, but no changes occurred.
These values will be filled in the `event` field of any webhooks that come through.
[block:code]
{
"codes": [
{
"code": "[\n {\n \"event\": \"job_add\",\n \"event_time\": \"2015-05-12T11:44:20.559473\",\n \"data\": {\n \"department_name\": \"Pet Management\",\n \"qualifications\": null,\n \"creation_date\": null,\n \"title\": \"Dog Butler\",\n \"status\": \"Sourcing\",\n \"location\": {\n \"country\": \"United States\",\n \"state\": \"California\",\n \"city\": \"Irvine\"\n },\n \"salary\": {\n \"upper\": null,\n \"lower\": null,\n \"currency\": \"USD\"\n },\n \"hiring_manager\": {\n \"last_name\": \"Bond\",\n \"first_name\": \"James\",\n \"email\": \"james@example.com\"\n },\n \"opening_date\": null,\n \"closing_date\": null,\n \"ats_id\": \"9384843\",\n \"description\": \"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\",\n \"contract_type\": null\n }\n },\n {\n \"event\": \"job_update\",\n \"event_time\": \"2015-05-12T11:49:05.796921\",\n \"data\": {\n \"department_name\": \"Pet Management\",\n \"qualifications\": null,\n \"creation_date\": null,\n \"title\": \"Dog Butler\",\n \"status\": \"Sourcing\",\n \"location\": {\n \"country\": \"United States\",\n \"state\": \"California\",\n \"city\": \"Irvine\"\n },\n \"salary\": {\n \"upper\": null,\n \"lower\": null,\n \"currency\": \"USD\"\n },\n \"hiring_manager\": {\n \"last_name\": \"Bond\",\n \"first_name\": \"James\",\n \"email\": \"james@example.com\"\n },\n \"opening_date\": null,\n \"closing_date\": null,\n \"ats_id\": \"12345F\",\n \"description\": \"<p>Here at The Dog Butler, Inc. we are dedicated to educate every dog owner to make every dog the best dog they ever owned. Offering customized training programs to train your dog for the world you live in, we are focused on results that work in your everyday life.</p>\",\n \"contract_type\": null\n }\n },\n {\n \"event\": \"job_remove\",\n \"event_time\": \"2015-05-12T11:53:08.128675\",\n \"data\": {\n \"ats_id\": \"123BR\"\n }\n },\n {\n \"event\": \"job_updates_complete\",\n \"event_time\": \"2015-05-12T11:53:10.128675\",\n \"data\": {}\n }\n]",
"language": "json"
}
],
"sidebar": true
}
[/block]
## Job Payloads
### Add & Update Payloads
The `data` field for the `job_add` & `job_update` events will contain the compete JSON representation of the job. Which fields this contains can vary slightly from ATS to ATS - an example payload for a taleo enterprise edition job is presented to the right. Most other ATSs should follow the same format, though there may be slight variations in which fields are returned or precisely which format certain fields are presented in.
The `ats_id` field is always returned - this is the ID of the job in the ATS, and can be used to relate `job_add` events to their corresponding `job_update` & `job_remove` events, as well as being sent when [sending a candidate](doc:send-candidate).
It may be the case that the default job payload for an ATS doesn't contain a field that you are interested in - perhaps there's a custom field you're interested in or even just a bit of data we don't currently get. Connects job fetching code is designed to be flexible - contact someone on the connect slack channel and we can add those fields to the payload for your connector.
### Remove Payloads
The `data` field of a `job_remove` event will only ever contain the `ats_id` of that job. This can be used to mark the job as deleted in your system.

{"_id":"56e44fd5f0150e1700ce67f6","category":"56e43a6e7e2c0220000312db","excerpt":"","sync_unique":"","isReference":false,"parentDoc":null,"project":"569e6099ebbadc0d0079becd","title":"Candidate Status Events","updates":[],"hidden":false,"link_external":false,"link_url":"","order":2,"type":"basic","user":"56d846d5b20d260b0026570b","version":"569e609aebbadc0d0079bed0","__v":8,"api":{"params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"language":"json","code":"{}","name":"","status":400}]},"settings":"","url":"","auth":"required"},"body":"RolePoint Connect can provide status details of applications and candidates that have been put into a supported remote ATS. This automatically happens for any candidates that have been put into the ATS via RolePoint Connect, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [webhooks page](webhooks/).\n\nThe webhooks for candidate & application status come in two different webhook types:\n\n- `candidate_status_update`\n- `application_status_update`.\n\nThese values will be filled in the `event` field of any webhooks that come through.\n\nThe `data` parameters for these 2 webhook types are the same. They will contain the following fields:\n\n- `entity_id` will contain the id of the application/candidate that the\n update pertains to.\n- `status.id` will contain the ID of the status as returned by the ATS.\n- `status.value` will contain the text value of the status as returned by the\n ATS.\n[block:callout]\n{\n \"type\": \"info\",\n \"body\": \"Depending on the ATS, either `status.id` or `status.value` may be returned as null.\"\n}\n[/block]\n\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"[\\n {\\n \\t\\\"event\\\": \\\"candidate_status_update\\\",\\n \\t\\t\\\"event_time\\\": \\\"2015-05-12T11:44:20.559473\\\",\\n \\t\\t\\\"data\\\": {\\n \\t\\\"entity_id\\\": \\\"123\\\",\\n \\t\\t\\t\\t\\\"status\\\": {\\n \\t\\\"id\\\": 21, \\n \\t\\\"value\\\": \\\"contacted\\\"\\n }\\n }\\n },\\n {\\n \\t\\\"event\\\": \\\"application_status_update\\\",\\n \\t\\t\\\"event_time\\\": \\\"2015-05-12T11:49:05.796921\\\",\\n \\t\\t\\\"data\\\": {\\n \\t\\\"entity_id\\\": \\\"456\\\",\\n \\t\\t\\t\\t\\\"status\\\": {\\n \\t\\\"id\\\": 22, \\n \\t\\\"value\\\": \\\"hired\\\"\\n }\\n }\\n }\\n]\",\n \"language\": \"json\"\n }\n ],\n \"sidebar\": true\n}\n[/block]","createdAt":"2016-03-12T17:20:21.138Z","githubsync":"","slug":"candidate-application-status-webhooks","childrenPages":[]}

Candidate Status Events

RolePoint Connect can provide status details of applications and candidates that have been put into a supported remote ATS. This automatically happens for any candidates that have been put into the ATS via RolePoint Connect, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [webhooks page](webhooks/).
The webhooks for candidate & application status come in two different webhook types:
- `candidate_status_update`
- `application_status_update`.
These values will be filled in the `event` field of any webhooks that come through.
The `data` parameters for these 2 webhook types are the same. They will contain the following fields:
- `entity_id` will contain the id of the application/candidate that the
update pertains to.
- `status.id` will contain the ID of the status as returned by the ATS.
- `status.value` will contain the text value of the status as returned by the
ATS.
[block:callout]
{
"type": "info",
"body": "Depending on the ATS, either `status.id` or `status.value` may be returned as null."
}
[/block]
[block:code]
{
"codes": [
{
"code": "[\n {\n \t\"event\": \"candidate_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:44:20.559473\",\n \t\t\"data\": {\n \t\"entity_id\": \"123\",\n \t\t\t\t\"status\": {\n \t\"id\": 21, \n \t\"value\": \"contacted\"\n }\n }\n },\n {\n \t\"event\": \"application_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:49:05.796921\",\n \t\t\"data\": {\n \t\"entity_id\": \"456\",\n \t\t\t\t\"status\": {\n \t\"id\": 22, \n \t\"value\": \"hired\"\n }\n }\n }\n]",
"language": "json"
}
],
"sidebar": true
}
[/block]

RolePoint Connect can provide status details of applications and candidates that have been put into a supported remote ATS. This automatically happens for any candidates that have been put into the ATS via RolePoint Connect, provided your integration is setup with a webhook URL. For more details on setting up a webhook URL, see the [webhooks page](webhooks/).
The webhooks for candidate & application status come in two different webhook types:
- `candidate_status_update`
- `application_status_update`.
These values will be filled in the `event` field of any webhooks that come through.
The `data` parameters for these 2 webhook types are the same. They will contain the following fields:
- `entity_id` will contain the id of the application/candidate that the
update pertains to.
- `status.id` will contain the ID of the status as returned by the ATS.
- `status.value` will contain the text value of the status as returned by the
ATS.
[block:callout]
{
"type": "info",
"body": "Depending on the ATS, either `status.id` or `status.value` may be returned as null."
}
[/block]
[block:code]
{
"codes": [
{
"code": "[\n {\n \t\"event\": \"candidate_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:44:20.559473\",\n \t\t\"data\": {\n \t\"entity_id\": \"123\",\n \t\t\t\t\"status\": {\n \t\"id\": 21, \n \t\"value\": \"contacted\"\n }\n }\n },\n {\n \t\"event\": \"application_status_update\",\n \t\t\"event_time\": \"2015-05-12T11:49:05.796921\",\n \t\t\"data\": {\n \t\"entity_id\": \"456\",\n \t\t\t\t\"status\": {\n \t\"id\": 22, \n \t\"value\": \"hired\"\n }\n }\n }\n]",
"language": "json"
}
],
"sidebar": true
}
[/block]

{"_id":"579a1c26c0c50c22008d6f85","order":0,"project":"569e6099ebbadc0d0079becd","slug":"sandbox-api-overview","sync_unique":"","createdAt":"2016-07-28T14:52:22.308Z","excerpt":"","githubsync":"","isReference":true,"parentDoc":null,"title":"Sandbox API Overview","type":"basic","__v":0,"hidden":false,"link_external":false,"link_url":"","updates":[],"version":"569e609aebbadc0d0079bed0","api":{"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"code":"{}","name":"","status":400,"language":"json"}]},"settings":"","auth":"required","params":[],"url":""},"category":"579a1b68b0898a290010a7f6","body":"The connect sandbox API provides some additional functionality for developing & testing sandbox connectors.\n\nIt is currently under development and should be considered experimental. Changes may happen without much notice, and there might be bugs.","user":"56cc98fcb4cbcf0b004a6009","childrenPages":[]}

Sandbox API Overview

The connect sandbox API provides some additional functionality for developing & testing sandbox connectors.
It is currently under development and should be considered experimental. Changes may happen without much notice, and there might be bugs.

The connect sandbox API provides some additional functionality for developing & testing sandbox connectors.
It is currently under development and should be considered experimental. Changes may happen without much notice, and there might be bugs.

{"_id":"579a20ddfd9f3c0e008e4f1f","hidden":false,"isReference":true,"type":"post","user":"56cc98fcb4cbcf0b004a6009","api":{"url":"/sandbox/trigger/job_update","auth":"required","examples":{"codes":[]},"method":"post","params":[],"results":{"codes":[{"name":"","status":200,"language":"json","code":"{\n \"status\": \"ok\",\n \"request_id\": \"87d82a3f-4434-48a5-b211-dd77d685bd2a\"\n}"}]},"settings":""},"category":"579a1b68b0898a290010a7f6","githubsync":"","project":"569e6099ebbadc0d0079becd","title":"Trigger Job Update","createdAt":"2016-07-28T15:12:29.574Z","excerpt":"","link_url":"","parentDoc":null,"slug":"trigger-job-update","updates":[],"version":"569e609aebbadc0d0079bed0","__v":0,"body":"Hitting this endpoint will trigger a job update on the sandbox connector. This will cause webhooks to be fired for any new, updated or deleted jobs.\n\nThe returned `request_id` can be used to query the status of the ongoing update.","link_external":false,"order":1,"sync_unique":"","childrenPages":[]}

postTrigger Job Update

Hitting this endpoint will trigger a job update on the sandbox connector. This will cause webhooks to be fired for any new, updated or deleted jobs.
The returned `request_id` can be used to query the status of the ongoing update.

Definition

{{ api_url }}{{ page_api_url }}

Result Format

Hitting this endpoint will trigger a job update on the sandbox connector. This will cause webhooks to be fired for any new, updated or deleted jobs.
The returned `request_id` can be used to query the status of the ongoing update.

{"_id":"57bde24a342bcf0e00d5b051","api":{"examples":{"codes":[]},"method":"post","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{\n \"status\": \"ok\",\n}","name":""}]},"settings":"","url":"/sandbox/trigger/candidate_update","auth":"required"},"githubsync":"","link_external":false,"parentDoc":null,"updates":[],"title":"Trigger Candidate Status Update","hidden":false,"isReference":true,"link_url":"","body":"Hitting this endpoint will trigger a candidate status update on the sandbox connector. This will cause webhooks to be fired for any candidates that have changed status since the last update.","category":"579a1b68b0898a290010a7f6","createdAt":"2016-08-24T18:07:06.046Z","excerpt":"","order":2,"slug":"trigger-candidate-status-update","user":"56cc98fcb4cbcf0b004a6009","__v":0,"project":"569e6099ebbadc0d0079becd","sync_unique":"","type":"post","version":"569e609aebbadc0d0079bed0","childrenPages":[]}

postTrigger Candidate Status Update

Hitting this endpoint will trigger a candidate status update on the sandbox connector. This will cause webhooks to be fired for any candidates that have changed status since the last update.

Definition

Examples

Result Format

To get the status of creation of an asynchronous request, you can query the
`request_status_url` provided when the request was created.
As part of the response, we include an `X-Poll-Interval` header which specifies how long (in seconds) until you are allowed to make another request.
For example:
[block:code]
{
"codes": [
{
"code": "GET /v1/123/requests/f586c5aa-842d-4e49-bcca-876a11e82ede/status HTTP/1.1\nHost: api.rolepoint-connect.com\nAccept: application/rolepoint.v2+json\nAuthorization: xxxxx",
"language": "http"
}
]
}
[/block]
If the request is still in progress, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n}",
"language": "http"
}
]
}
[/block]
If the request is finished, this will respond:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": \"https://api.rolepoint-connect.com/a_result/1234\",\n \"ttl\": 123\n },\n \"error_info\": null\n}\n",
"language": "http"
}
]
}
[/block]
`result_info` contains 2 fields:
* `url` - This is the URL you can query to get the result of the operation.
* `ttl` - This is the time that the application result will remain available
for in seconds.
A failed response will contain the following fields:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 200 OK\nStatus: 200 OK\nContent-Type: application/rolepoint.v2+json\n\n{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": null\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n}",
"language": "http"
}
]
}
[/block]
`error_info` contains 2 fields:
* `message` - This is the error message relating to the reason the request
failed.
* `code` - This is the error code relating to the reason the request failed.

{"_id":"56f412e30f1f970e006e2484","githubsync":"","link_external":false,"project":"569e6099ebbadc0d0079becd","title":"Reseller API","type":"basic","updates":[],"user":"56d846d5b20d260b0026570b","__v":1,"body":"You can use your reseller API credentials to create [Connectors](doc:connectors) on demand to integrate with your customer's ATSs.\n\n## RolePoint Reseller API\n\nThe RolePoint Reseller API follows the conventions laid out in [jsonapi](http://jsonapi.org/).\n\n## Schema\n\nAll API access is over HTTPS, and accessed from the `api.rolepoint-connect.com/reseller` domain. All data is sent and received as JSON.\n\nOptional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.\n\nAll timestamps are returned in ISO 8601 format:\n\n YYYY-MM-DDTHH:MM:SSZ\n\n## Client Errors\n\nThere are six possible types of client errors on API calls:\n\n1. Sending a request with missing credentials will result in a `401 Unauthorized` response\n\n ```\n HTTP/1.1 401 Unauthorized\n ```\n\n2. Sending a request with invalid or insufficient credentials will result in a `401 Unauthorized` response.\n\n ```\n HTTP/1.1 401 Unauthorized\n ```\n\n3. Sending a request to an endpoint that does not exist will result in a `404 Not Found` response.\n\n ```\n HTTP/1.1 404 Not Found\n ```\n\n4. Sending malformed JSON bodies will result in a `400 Bad Request` response.\n\n ```\n HTTP/1.1 400 Bad Request\n ```\n\n5. Sending JSON bodies with missing fields or unexpected fields will result in a `422 Unprocessable Entity` response.\n\n ```\n HTTP/1.1 422 Unprocessable Entity\n ```\n\n6. Sending a `PATCH` or `DELETE` request without a etag will result in a `428 Precondition Required` response.\n\n ```\n HTTP/1.1 428 Precondition Required\n ```\n\n7. Sending a `PATCH` or `DELETE` request with an invalid etag will result in a `412 Precondition Failed` response.\n\n ```\n HTTP/1.1 412 Precondition Failed\n ```\n\nIf endpoints have custom validation errors, they will be documented with the endpoint.\n\n## Other Errors\n\nIf an unexpected error occurs during an API call, the server will return a `500 Internal Server Error`\n\n HTTP/1.1 500 Internal Server Error\n\nYou should assume that these requests failed and attempt them again later.\n\n## HTTP Redirects\n\nThe API uses HTTP redirection where appropriate. Clients should assume that any request may result in a redirection. Receiving an HTTP redirection is not an error and clients should follow that redirect. Redirect responses will have a `Location` header field which contains the URI of the resource to which the client should repeat the requests.\n\nRedirection status codes will be used in accordance with the HTTP 1.1 spec.\n\n## Asynchronous Requests\n\nThe API has some endpoints that process requests asynchronously. They will return a status URL that you can poll for status updates and success reports. They can also accept a `X-RolePoint-Callback-Url` HTTP header that we will post a status report back to upon completion. The data POSTed and returned from the status endpoint will follow the same format.\n\nAs part of the response we include an “X-Poll-Interval” header which specifies how long (in seconds) until you are allowed to make another request.\n\nThe status report will be of the following format if the task has not yet completed:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"status\\\": \\\"in_progress\\\",\\n \\\"result_info\\\": null,\\n \\\"error_info\\\": null\\n} \",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nIf the task has completed the status report will be of the format:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"status\\\": \\\"complete\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": 'https://api.rolepoint-connect.com/',\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": null\\n}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nWhere the `url` is dependent on the task, and the `ttl` refers to the time until the result expires.\n\nIf the task failed, the response will have the form:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"status\\\": \\\"failed\\\",\\n \\\"result_info\\\": {\\n \\\"url\\\": 'https://api.rolepoint-connect.com/',\\n \\\"ttl\\\": 123\\n },\\n \\\"error_info\\\": {\\n \\\"message\\\": \\\"Message describing the error that occured\\\",\\n \\\"code\\\": 123\\n }\\n }\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nWhere the `code` is one of the defined (error codes)[#error-codes], and the `message` describes why the task failed.\n\n## Error Codes\n\n### 999 - General Purpose Error\n\nThis is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error this code would be returned, with a message indicating what went wrong.\n\n## Authentication\n\nYou should issue all requests with the API key you were issue with.\n\n $ curl https://api.rolepoint-connect.com/reseller/<endpoint> -H \"Authorization: Bearer <my api key>\"\n\nRequests that require authentication may return a `404 Not Found` instead of a\n`401 Authorization Required` or `403 Forbidden` response to avoid leaking\nprivate URLs.\n\n## Rate Limits\n\nThe API has a rate limit of 30 requests per 30 seconds.\n\nYou can check the returned HTTP headers of any API request to see your current\nrate limit status:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"curl -i https://api.rolepoint-connect.com/reseller/whatever\\n\\nHTTP/1.1 200 OK\\nStatus: 200 OK\\nX-RateLimit-Limit: 30\\nX-RateLimit-Remaining: 24\\nX-RateLimit_Reset: 1372700873\",\n \"language\": \"curl\"\n }\n ]\n}\n[/block]\nThe headers tell you everything you need to know about your current rate limit status:\n\n* X-RateLimit-Limit - The maximum number of requests that the consumer is\n permitted to make per hour.\n* X-RateLimit-Remaining - The number of requests remaining in the current rate\n limit window.\n* X-RateLimit-Reset - The time at which the current rate limit window resets in\n UTC epoch seconds.\n\nOnce you go over your rate limit you will receive an error response:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"HTTP/1.1 429 Too Many Requests\\nStatus: 429 Too Many Requests\\nX-RateLimit-Limit: 30\\nX-RateLimit-Remaining: 0\\nX-RateLimit-Reset: 1372700873\\n\\n{\\\"message\\\": \\\"Rate limit exceeded\\\", \\\"rate-limit-reset\\\": 1372700873}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\n## Concurrency Control\n\nThe RolePoint Reseller API uses the HTTP `Etag` and `If-Match` headers for concurrency control. On creation and retrieval of a Connector, an `Etag` header will be sent as part of the response. This `Etag` will be updated every time a Connector is updated. \n\nIn order to update or delete a Connector, you must provide the current `Etag` in the `If-Match` request header. For this reason we recommend that before making any update or deletion requests, you first retrieve the current `Etag` of the Connector.","createdAt":"2016-03-24T16:16:35.559Z","sync_unique":"","api":{"auth":"required","params":[],"results":{"codes":[{"status":200,"language":"json","code":"{}","name":""},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","url":""},"category":"56f40b08167d070e0091a609","excerpt":"Create Connectors on demand","link_url":"","slug":"reseller-api","hidden":false,"isReference":false,"order":0,"parentDoc":null,"version":"569e609aebbadc0d0079bed0","childrenPages":[]}

Reseller API

Create Connectors on demand

You can use your reseller API credentials to create [Connectors](doc:connectors) on demand to integrate with your customer's ATSs.
## RolePoint Reseller API
The RolePoint Reseller API follows the conventions laid out in [jsonapi](http://jsonapi.org/).
## Schema
All API access is over HTTPS, and accessed from the `api.rolepoint-connect.com/reseller` domain. All data is sent and received as JSON.
Optional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.
All timestamps are returned in ISO 8601 format:
YYYY-MM-DDTHH:MM:SSZ
## Client Errors
There are six possible types of client errors on API calls:
1. Sending a request with missing credentials will result in a `401 Unauthorized` response
```
HTTP/1.1 401 Unauthorized
```
2. Sending a request with invalid or insufficient credentials will result in a `401 Unauthorized` response.
```
HTTP/1.1 401 Unauthorized
```
3. Sending a request to an endpoint that does not exist will result in a `404 Not Found` response.
```
HTTP/1.1 404 Not Found
```
4. Sending malformed JSON bodies will result in a `400 Bad Request` response.
```
HTTP/1.1 400 Bad Request
```
5. Sending JSON bodies with missing fields or unexpected fields will result in a `422 Unprocessable Entity` response.
```
HTTP/1.1 422 Unprocessable Entity
```
6. Sending a `PATCH` or `DELETE` request without a etag will result in a `428 Precondition Required` response.
```
HTTP/1.1 428 Precondition Required
```
7. Sending a `PATCH` or `DELETE` request with an invalid etag will result in a `412 Precondition Failed` response.
```
HTTP/1.1 412 Precondition Failed
```
If endpoints have custom validation errors, they will be documented with the endpoint.
## Other Errors
If an unexpected error occurs during an API call, the server will return a `500 Internal Server Error`
HTTP/1.1 500 Internal Server Error
You should assume that these requests failed and attempt them again later.
## HTTP Redirects
The API uses HTTP redirection where appropriate. Clients should assume that any request may result in a redirection. Receiving an HTTP redirection is not an error and clients should follow that redirect. Redirect responses will have a `Location` header field which contains the URI of the resource to which the client should repeat the requests.
Redirection status codes will be used in accordance with the HTTP 1.1 spec.
## Asynchronous Requests
The API has some endpoints that process requests asynchronously. They will return a status URL that you can poll for status updates and success reports. They can also accept a `X-RolePoint-Callback-Url` HTTP header that we will post a status report back to upon completion. The data POSTed and returned from the status endpoint will follow the same format.
As part of the response we include an “X-Poll-Interval” header which specifies how long (in seconds) until you are allowed to make another request.
The status report will be of the following format if the task has not yet completed:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n} ",
"language": "json"
}
]
}
[/block]
If the task has completed the status report will be of the format:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": 'https://api.rolepoint-connect.com/',\n \"ttl\": 123\n },\n \"error_info\": null\n}",
"language": "json"
}
]
}
[/block]
Where the `url` is dependent on the task, and the `ttl` refers to the time until the result expires.
If the task failed, the response will have the form:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": 'https://api.rolepoint-connect.com/',\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n }",
"language": "json"
}
]
}
[/block]
Where the `code` is one of the defined (error codes)[#error-codes], and the `message` describes why the task failed.
## Error Codes
### 999 - General Purpose Error
This is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error this code would be returned, with a message indicating what went wrong.
## Authentication
You should issue all requests with the API key you were issue with.
$ curl https://api.rolepoint-connect.com/reseller/<endpoint> -H "Authorization: Bearer <my api key>"
Requests that require authentication may return a `404 Not Found` instead of a
`401 Authorization Required` or `403 Forbidden` response to avoid leaking
private URLs.
## Rate Limits
The API has a rate limit of 30 requests per 30 seconds.
You can check the returned HTTP headers of any API request to see your current
rate limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/reseller/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-RateLimit-Limit: 30\nX-RateLimit-Remaining: 24\nX-RateLimit_Reset: 1372700873",
"language": "curl"
}
]
}
[/block]
The headers tell you everything you need to know about your current rate limit status:
* X-RateLimit-Limit - The maximum number of requests that the consumer is
permitted to make per hour.
* X-RateLimit-Remaining - The number of requests remaining in the current rate
limit window.
* X-RateLimit-Reset - The time at which the current rate limit window resets in
UTC epoch seconds.
Once you go over your rate limit you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-RateLimit-Limit: 30\nX-RateLimit-Remaining: 0\nX-RateLimit-Reset: 1372700873\n\n{\"message\": \"Rate limit exceeded\", \"rate-limit-reset\": 1372700873}",
"language": "http"
}
]
}
[/block]
## Concurrency Control
The RolePoint Reseller API uses the HTTP `Etag` and `If-Match` headers for concurrency control. On creation and retrieval of a Connector, an `Etag` header will be sent as part of the response. This `Etag` will be updated every time a Connector is updated.
In order to update or delete a Connector, you must provide the current `Etag` in the `If-Match` request header. For this reason we recommend that before making any update or deletion requests, you first retrieve the current `Etag` of the Connector.

You can use your reseller API credentials to create [Connectors](doc:connectors) on demand to integrate with your customer's ATSs.
## RolePoint Reseller API
The RolePoint Reseller API follows the conventions laid out in [jsonapi](http://jsonapi.org/).
## Schema
All API access is over HTTPS, and accessed from the `api.rolepoint-connect.com/reseller` domain. All data is sent and received as JSON.
Optional fields can be sent in as `null` or omitted. Optional fields in responses will not be omitted - instead they will be returned as `null` or empty.
All timestamps are returned in ISO 8601 format:
YYYY-MM-DDTHH:MM:SSZ
## Client Errors
There are six possible types of client errors on API calls:
1. Sending a request with missing credentials will result in a `401 Unauthorized` response
```
HTTP/1.1 401 Unauthorized
```
2. Sending a request with invalid or insufficient credentials will result in a `401 Unauthorized` response.
```
HTTP/1.1 401 Unauthorized
```
3. Sending a request to an endpoint that does not exist will result in a `404 Not Found` response.
```
HTTP/1.1 404 Not Found
```
4. Sending malformed JSON bodies will result in a `400 Bad Request` response.
```
HTTP/1.1 400 Bad Request
```
5. Sending JSON bodies with missing fields or unexpected fields will result in a `422 Unprocessable Entity` response.
```
HTTP/1.1 422 Unprocessable Entity
```
6. Sending a `PATCH` or `DELETE` request without a etag will result in a `428 Precondition Required` response.
```
HTTP/1.1 428 Precondition Required
```
7. Sending a `PATCH` or `DELETE` request with an invalid etag will result in a `412 Precondition Failed` response.
```
HTTP/1.1 412 Precondition Failed
```
If endpoints have custom validation errors, they will be documented with the endpoint.
## Other Errors
If an unexpected error occurs during an API call, the server will return a `500 Internal Server Error`
HTTP/1.1 500 Internal Server Error
You should assume that these requests failed and attempt them again later.
## HTTP Redirects
The API uses HTTP redirection where appropriate. Clients should assume that any request may result in a redirection. Receiving an HTTP redirection is not an error and clients should follow that redirect. Redirect responses will have a `Location` header field which contains the URI of the resource to which the client should repeat the requests.
Redirection status codes will be used in accordance with the HTTP 1.1 spec.
## Asynchronous Requests
The API has some endpoints that process requests asynchronously. They will return a status URL that you can poll for status updates and success reports. They can also accept a `X-RolePoint-Callback-Url` HTTP header that we will post a status report back to upon completion. The data POSTed and returned from the status endpoint will follow the same format.
As part of the response we include an “X-Poll-Interval” header which specifies how long (in seconds) until you are allowed to make another request.
The status report will be of the following format if the task has not yet completed:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"in_progress\",\n \"result_info\": null,\n \"error_info\": null\n} ",
"language": "json"
}
]
}
[/block]
If the task has completed the status report will be of the format:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"complete\",\n \"result_info\": {\n \"url\": 'https://api.rolepoint-connect.com/',\n \"ttl\": 123\n },\n \"error_info\": null\n}",
"language": "json"
}
]
}
[/block]
Where the `url` is dependent on the task, and the `ttl` refers to the time until the result expires.
If the task failed, the response will have the form:
[block:code]
{
"codes": [
{
"code": "{\n \"status\": \"failed\",\n \"result_info\": {\n \"url\": 'https://api.rolepoint-connect.com/',\n \"ttl\": 123\n },\n \"error_info\": {\n \"message\": \"Message describing the error that occured\",\n \"code\": 123\n }\n }",
"language": "json"
}
]
}
[/block]
Where the `code` is one of the defined (error codes)[#error-codes], and the `message` describes why the task failed.
## Error Codes
### 999 - General Purpose Error
This is a general purpose error code. This will be returned as a 'catch-all', so if there is an unexpected error this code would be returned, with a message indicating what went wrong.
## Authentication
You should issue all requests with the API key you were issue with.
$ curl https://api.rolepoint-connect.com/reseller/<endpoint> -H "Authorization: Bearer <my api key>"
Requests that require authentication may return a `404 Not Found` instead of a
`401 Authorization Required` or `403 Forbidden` response to avoid leaking
private URLs.
## Rate Limits
The API has a rate limit of 30 requests per 30 seconds.
You can check the returned HTTP headers of any API request to see your current
rate limit status:
[block:code]
{
"codes": [
{
"code": "curl -i https://api.rolepoint-connect.com/reseller/whatever\n\nHTTP/1.1 200 OK\nStatus: 200 OK\nX-RateLimit-Limit: 30\nX-RateLimit-Remaining: 24\nX-RateLimit_Reset: 1372700873",
"language": "curl"
}
]
}
[/block]
The headers tell you everything you need to know about your current rate limit status:
* X-RateLimit-Limit - The maximum number of requests that the consumer is
permitted to make per hour.
* X-RateLimit-Remaining - The number of requests remaining in the current rate
limit window.
* X-RateLimit-Reset - The time at which the current rate limit window resets in
UTC epoch seconds.
Once you go over your rate limit you will receive an error response:
[block:code]
{
"codes": [
{
"code": "HTTP/1.1 429 Too Many Requests\nStatus: 429 Too Many Requests\nX-RateLimit-Limit: 30\nX-RateLimit-Remaining: 0\nX-RateLimit-Reset: 1372700873\n\n{\"message\": \"Rate limit exceeded\", \"rate-limit-reset\": 1372700873}",
"language": "http"
}
]
}
[/block]
## Concurrency Control
The RolePoint Reseller API uses the HTTP `Etag` and `If-Match` headers for concurrency control. On creation and retrieval of a Connector, an `Etag` header will be sent as part of the response. This `Etag` will be updated every time a Connector is updated.
In order to update or delete a Connector, you must provide the current `Etag` in the `If-Match` request header. For this reason we recommend that before making any update or deletion requests, you first retrieve the current `Etag` of the Connector.

{"_id":"5799ff71d5decc2b00eefed0","slug":"connector-webhooks","user":"56cc98fcb4cbcf0b004a6009","body":"The reseller API allows you to activate & deactivate [Webhooks](doc:webhooks) for a connector. By default, job & candidate status webhooks are deactivated. This allows you to control when webhooks will start being sent to your application, avoiding any potential race conditions between connector creation and receiving some initial webhooks. It also allows you to only select which webhooks you are interested in receiving.\n\n# Activating Webhooks For A Connector\n\nTo activate webhooks can send a POST request to the webhook endpoint. The URL for webhooks looks like:\n\n POST <Reseller ID>/connector/<Connector ID>/webhook\n\nFor example, to activate job webhooks for the connector `1518` with reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` you could make the following request:\n\n\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"POST /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook HTTP/1.1\\nAuthorization: Bearer abcd\\nContent-Type: application/vnd.api+json\\n\\n{\\n \\\"data\\\": {\\n \\\"attributes\\\": {\\n \\\"active\\\": True,\\n \\\"webhook_type\\\": \\\"jobs\\\"\\n },\\n \\\"type\\\": \\\"webhook\\\"\\n }\\n}\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nWhere `webhook_type` is one of:\n\n- `jobs` which controls `job_add`, `job_remove` and `job_update` events.\n- `candidate_status` which controls the `candidate_status_update` and `application_status_update` events.\n\n# Checking Webhook Status For A Connector\n\nTo list all the webhooks for a connector you should send a GET request to:\n\n GET <Reseller ID>/connector/<Connector ID>/webhook\n\nFor example, to get all webhooks for connector `1518` and reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` we could make this request:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"GET /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\\nAuthorization: Bearer abcd\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nWhich will respond with some JSON, like this:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"{\\n \\\"data\\\": {\\n \\\"attributes\\\": {\\n \\\"active\\\": true,\\n \\\"webhook_type\\\": \\\"jobs\\\"\\n },\\n \\\"id\\\": \\\"1\\\",\\n \\\"meta\\\": {\\n \\\"etag\\\": \\\"e56b209f-4fd0-4597-b842-df6a17490e92\\\"\\n },\\n \\\"type\\\": \\\"webhook\\\"\\n },\\n \\\"links\\\": {\\n \\\"self\\\": \\\"https://api.rolepoint-connect.com/reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1\\\"\\n }\\n}\",\n \"language\": \"json\"\n }\n ]\n}\n[/block]\nAny webhooks listed as `active: true` are currently active, and any missing webhooks or those listed as `active: false` are currently inactive.\n\n# Deactivating Webhooks For A Connector\n\nTo deactivate webhooks for a connector you should delete the webhook record you created. This can be done by sending an HTTP delete to a webhook.\n\n DELETE <Reseller ID>/connector/<Connector ID>/webhook/<Webhook ID>\n \nFor example, to delete the webhook in the GET example above you could send the following request:\n[block:code]\n{\n \"codes\": [\n {\n \"code\": \"DELETE /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\\nAuthorization: Bearer 1234\\nIf-Match: e56b209f-4fd0-4597-b842-df6a17490e92\",\n \"language\": \"http\"\n }\n ]\n}\n[/block]\nIf the delete is succesful, this will return a `204 No Content` with an empty body.","createdAt":"2016-07-28T12:49:53.311Z","isReference":false,"project":"569e6099ebbadc0d0079becd","type":"basic","version":"569e609aebbadc0d0079bed0","order":3,"sync_unique":"","title":"Connector Webhooks","githubsync":"","link_external":false,"link_url":"","parentDoc":null,"hidden":false,"updates":[],"__v":0,"api":{"results":{"codes":[{"name":"","status":200,"language":"json","code":"{}"},{"status":400,"language":"json","code":"{}","name":""}]},"settings":"","auth":"required","params":[],"url":""},"category":"56f40b08167d070e0091a609","excerpt":"Controlling webhooks for a connector","childrenPages":[]}

Connector Webhooks

Controlling webhooks for a connector

The reseller API allows you to activate & deactivate [Webhooks](doc:webhooks) for a connector. By default, job & candidate status webhooks are deactivated. This allows you to control when webhooks will start being sent to your application, avoiding any potential race conditions between connector creation and receiving some initial webhooks. It also allows you to only select which webhooks you are interested in receiving.
# Activating Webhooks For A Connector
To activate webhooks can send a POST request to the webhook endpoint. The URL for webhooks looks like:
POST <Reseller ID>/connector/<Connector ID>/webhook
For example, to activate job webhooks for the connector `1518` with reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` you could make the following request:
[block:code]
{
"codes": [
{
"code": "POST /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook HTTP/1.1\nAuthorization: Bearer abcd\nContent-Type: application/vnd.api+json\n\n{\n \"data\": {\n \"attributes\": {\n \"active\": True,\n \"webhook_type\": \"jobs\"\n },\n \"type\": \"webhook\"\n }\n}",
"language": "http"
}
]
}
[/block]
Where `webhook_type` is one of:
- `jobs` which controls `job_add`, `job_remove` and `job_update` events.
- `candidate_status` which controls the `candidate_status_update` and `application_status_update` events.
# Checking Webhook Status For A Connector
To list all the webhooks for a connector you should send a GET request to:
GET <Reseller ID>/connector/<Connector ID>/webhook
For example, to get all webhooks for connector `1518` and reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` we could make this request:
[block:code]
{
"codes": [
{
"code": "GET /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\nAuthorization: Bearer abcd",
"language": "http"
}
]
}
[/block]
Which will respond with some JSON, like this:
[block:code]
{
"codes": [
{
"code": "{\n \"data\": {\n \"attributes\": {\n \"active\": true,\n \"webhook_type\": \"jobs\"\n },\n \"id\": \"1\",\n \"meta\": {\n \"etag\": \"e56b209f-4fd0-4597-b842-df6a17490e92\"\n },\n \"type\": \"webhook\"\n },\n \"links\": {\n \"self\": \"https://api.rolepoint-connect.com/reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1\"\n }\n}",
"language": "json"
}
]
}
[/block]
Any webhooks listed as `active: true` are currently active, and any missing webhooks or those listed as `active: false` are currently inactive.
# Deactivating Webhooks For A Connector
To deactivate webhooks for a connector you should delete the webhook record you created. This can be done by sending an HTTP delete to a webhook.
DELETE <Reseller ID>/connector/<Connector ID>/webhook/<Webhook ID>
For example, to delete the webhook in the GET example above you could send the following request:
[block:code]
{
"codes": [
{
"code": "DELETE /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\nAuthorization: Bearer 1234\nIf-Match: e56b209f-4fd0-4597-b842-df6a17490e92",
"language": "http"
}
]
}
[/block]
If the delete is succesful, this will return a `204 No Content` with an empty body.

The reseller API allows you to activate & deactivate [Webhooks](doc:webhooks) for a connector. By default, job & candidate status webhooks are deactivated. This allows you to control when webhooks will start being sent to your application, avoiding any potential race conditions between connector creation and receiving some initial webhooks. It also allows you to only select which webhooks you are interested in receiving.
# Activating Webhooks For A Connector
To activate webhooks can send a POST request to the webhook endpoint. The URL for webhooks looks like:
POST <Reseller ID>/connector/<Connector ID>/webhook
For example, to activate job webhooks for the connector `1518` with reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` you could make the following request:
[block:code]
{
"codes": [
{
"code": "POST /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook HTTP/1.1\nAuthorization: Bearer abcd\nContent-Type: application/vnd.api+json\n\n{\n \"data\": {\n \"attributes\": {\n \"active\": True,\n \"webhook_type\": \"jobs\"\n },\n \"type\": \"webhook\"\n }\n}",
"language": "http"
}
]
}
[/block]
Where `webhook_type` is one of:
- `jobs` which controls `job_add`, `job_remove` and `job_update` events.
- `candidate_status` which controls the `candidate_status_update` and `application_status_update` events.
# Checking Webhook Status For A Connector
To list all the webhooks for a connector you should send a GET request to:
GET <Reseller ID>/connector/<Connector ID>/webhook
For example, to get all webhooks for connector `1518` and reseller `32994ffb-286c-4c7f-91ff-0dd023d7b94d` we could make this request:
[block:code]
{
"codes": [
{
"code": "GET /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\nAuthorization: Bearer abcd",
"language": "http"
}
]
}
[/block]
Which will respond with some JSON, like this:
[block:code]
{
"codes": [
{
"code": "{\n \"data\": {\n \"attributes\": {\n \"active\": true,\n \"webhook_type\": \"jobs\"\n },\n \"id\": \"1\",\n \"meta\": {\n \"etag\": \"e56b209f-4fd0-4597-b842-df6a17490e92\"\n },\n \"type\": \"webhook\"\n },\n \"links\": {\n \"self\": \"https://api.rolepoint-connect.com/reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1\"\n }\n}",
"language": "json"
}
]
}
[/block]
Any webhooks listed as `active: true` are currently active, and any missing webhooks or those listed as `active: false` are currently inactive.
# Deactivating Webhooks For A Connector
To deactivate webhooks for a connector you should delete the webhook record you created. This can be done by sending an HTTP delete to a webhook.
DELETE <Reseller ID>/connector/<Connector ID>/webhook/<Webhook ID>
For example, to delete the webhook in the GET example above you could send the following request:
[block:code]
{
"codes": [
{
"code": "DELETE /reseller/32994ffb-286c-4c7f-91ff-0dd023d7b94d/connector/1518/webhook/1 HTTP/1.1\nAuthorization: Bearer 1234\nIf-Match: e56b209f-4fd0-4597-b842-df6a17490e92",
"language": "http"
}
]
}
[/block]
If the delete is succesful, this will return a `204 No Content` with an empty body.