curl --request POST \
--url https://hiresweep.com/api/openapi/discovery/runs/{id}/search \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"clientId": "<string>"
}
'import requests
url = "https://hiresweep.com/api/openapi/discovery/runs/{id}/search"
payload = { "clientId": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({clientId: '<string>'})
};
fetch('https://hiresweep.com/api/openapi/discovery/runs/{id}/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hiresweep.com/api/openapi/discovery/runs/{id}/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'clientId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hiresweep.com/api/openapi/discovery/runs/{id}/search"
payload := strings.NewReader("{\n \"clientId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hiresweep.com/api/openapi/discovery/runs/{id}/search")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"clientId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/discovery/runs/{id}/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"clientId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"clientId": "<string>",
"resumeId": "<string>",
"requestedTargetCount": 0,
"targets": [
{
"title": "<string>",
"keywords": [
"<string>"
],
"selected": true
}
],
"targetsGeneratingSince": "2023-11-07T05:31:56Z",
"filters": {
"locations": [
"<string>"
],
"remoteOnly": true,
"postedWithinDays": 1,
"companyStages": [
"early"
]
},
"status": "drafting",
"statusChangedAt": "2023-11-07T05:31:56Z",
"failureReason": "<string>",
"boardOutcomes": [
{
"board": "greenhouse",
"outcome": "ok",
"reason": "<string>"
}
],
"events": [
{
"at": "<string>",
"kind": "tool",
"label": "<string>",
"text": "<string>",
"error": true
}
],
"lastProgressAt": "2023-11-07T05:31:56Z",
"scheduleId": "<string>",
"scheduled": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"defined": true,
"code": "DISCOVERY_LIMIT_REACHED",
"status": 402,
"message": "You have used all the job searches in your plan. Upgrade to keep searching.",
"data": {
"reason": "not_included",
"resetsAt": 123
}
}Search companies' job boards for a drafting run's ticked Targets
Moves a drafting run with at least one ticked Target to searching and starts a search of the public ATS job boards (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and more) of every company in Hiresweep’s directory for the ticked Targets, under the run’s filters. LinkedIn and Indeed are never searched. Returns once the search has started; jobs arrive as Matches while it runs. Only one search per resume runs at a time. Holds one discoveries credit, spent only if the search finds a job; refused with DISCOVERY_LIMIT_REACHED (the reason and when it refills) when the plan has none left, today’s cap is reached, or too many searches run at once. Requires authentication.
curl --request POST \
--url https://hiresweep.com/api/openapi/discovery/runs/{id}/search \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"clientId": "<string>"
}
'import requests
url = "https://hiresweep.com/api/openapi/discovery/runs/{id}/search"
payload = { "clientId": "<string>" }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({clientId: '<string>'})
};
fetch('https://hiresweep.com/api/openapi/discovery/runs/{id}/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://hiresweep.com/api/openapi/discovery/runs/{id}/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'clientId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://hiresweep.com/api/openapi/discovery/runs/{id}/search"
payload := strings.NewReader("{\n \"clientId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://hiresweep.com/api/openapi/discovery/runs/{id}/search")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"clientId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/discovery/runs/{id}/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"clientId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"clientId": "<string>",
"resumeId": "<string>",
"requestedTargetCount": 0,
"targets": [
{
"title": "<string>",
"keywords": [
"<string>"
],
"selected": true
}
],
"targetsGeneratingSince": "2023-11-07T05:31:56Z",
"filters": {
"locations": [
"<string>"
],
"remoteOnly": true,
"postedWithinDays": 1,
"companyStages": [
"early"
]
},
"status": "drafting",
"statusChangedAt": "2023-11-07T05:31:56Z",
"failureReason": "<string>",
"boardOutcomes": [
{
"board": "greenhouse",
"outcome": "ok",
"reason": "<string>"
}
],
"events": [
{
"at": "<string>",
"kind": "tool",
"label": "<string>",
"text": "<string>",
"error": true
}
],
"lastProgressAt": "2023-11-07T05:31:56Z",
"scheduleId": "<string>",
"scheduled": true,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"defined": true,
"code": "DISCOVERY_LIMIT_REACHED",
"status": 402,
"message": "You have used all the job searches in your plan. Upgrade to keep searching.",
"data": {
"reason": "not_included",
"resetsAt": 123
}
}Authorizations
An API key from Settings → Developers → API keys in Hiresweep.
Path Parameters
The ID of the Discovery run.
1Body
The client whose data this is, for an operator applying on behalf of clients. Omit for your own.
1Response
The run, now searching (or failed, with the reason, when the search could not start).
The ID of the Discovery run.
The client this run is for; null for your own.
The resume the run searches from; null once that resume is deleted.
How many Targets the recruiter prompt was asked for.
-9007199254740991 <= x <= 9007199254740991The job titles and ATS keywords, as the user edited them; ticked ones are searched.
Show child attributes
Show child attributes
When the recruiter prompt started writing this draft's Targets, which arrive one by one; null once it has finished or failed. A draft cannot be edited or searched while it is set.
The locations, remote-only, recency and company-stage filters this run searches under.
Show child attributes
Show child attributes
Drafting, searching, done, failed, or cancelled.
drafting, searching, done, failed, cancelled Why the run stopped, if it did: generating Targets while drafting, or the search once it failed.
What each board's search came to: it ran, the board blocked it, or it was cut short.
Show child attributes
Show child attributes
What the search did, line by line, latest last.
Show child attributes
Show child attributes
The latest sign of life from the search.
The repeating search that started this run, while it exists; null for a run started by hand.
Whether a repeating search started this run, rather than you.