curl --request POST \
--url https://hiresweep.com/api/openapi/discovery/matches/explain \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"matchIds": [
"<string>"
],
"clientId": "<string>"
}
'import requests
url = "https://hiresweep.com/api/openapi/discovery/matches/explain"
payload = {
"matchIds": ["<string>"],
"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({matchIds: ['<string>'], clientId: '<string>'})
};
fetch('https://hiresweep.com/api/openapi/discovery/matches/explain', 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/matches/explain",
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([
'matchIds' => [
'<string>'
],
'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/matches/explain"
payload := strings.NewReader("{\n \"matchIds\": [\n \"<string>\"\n ],\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/matches/explain")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"matchIds\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/discovery/matches/explain")
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 \"matchIds\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "<string>",
"runId": "<string>",
"clientId": "<string>",
"resumeId": "<string>",
"url": "<string>",
"originalUrl": "<string>",
"externalId": "<string>",
"board": "greenhouse",
"title": "<string>",
"company": "<string>",
"location": "<string>",
"isRemote": true,
"postedAt": "2023-11-07T05:31:56Z",
"snippet": "<string>",
"salary": "<string>",
"companyStage": "early",
"targetTitles": [
"<string>"
],
"score": 50,
"fitReason": "<string>",
"fitGap": "<string>",
"state": "new",
"applicationId": "<string>",
"foundAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]Explain why found jobs fit their resume
Writes the AI’s one-sentence reason each found job fits the resume it was found for (or its main gap), and returns the jobs. Jobs that already have a reason keep it; the rest are explained in one call that counts one AI action. Up to 20 jobs, all found for the same resume. Requires authentication.
curl --request POST \
--url https://hiresweep.com/api/openapi/discovery/matches/explain \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"matchIds": [
"<string>"
],
"clientId": "<string>"
}
'import requests
url = "https://hiresweep.com/api/openapi/discovery/matches/explain"
payload = {
"matchIds": ["<string>"],
"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({matchIds: ['<string>'], clientId: '<string>'})
};
fetch('https://hiresweep.com/api/openapi/discovery/matches/explain', 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/matches/explain",
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([
'matchIds' => [
'<string>'
],
'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/matches/explain"
payload := strings.NewReader("{\n \"matchIds\": [\n \"<string>\"\n ],\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/matches/explain")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"matchIds\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/discovery/matches/explain")
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 \"matchIds\": [\n \"<string>\"\n ],\n \"clientId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body[
{
"id": "<string>",
"runId": "<string>",
"clientId": "<string>",
"resumeId": "<string>",
"url": "<string>",
"originalUrl": "<string>",
"externalId": "<string>",
"board": "greenhouse",
"title": "<string>",
"company": "<string>",
"location": "<string>",
"isRemote": true,
"postedAt": "2023-11-07T05:31:56Z",
"snippet": "<string>",
"salary": "<string>",
"companyStage": "early",
"targetTitles": [
"<string>"
],
"score": 50,
"fitReason": "<string>",
"fitGap": "<string>",
"state": "new",
"applicationId": "<string>",
"foundAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]Authorizations
An API key from Settings → Developers → API keys in Hiresweep.
Body
The IDs of the Matches to explain; they must have been found for the same resume.
1 - 20 elements1The client whose data this is, for an operator applying on behalf of clients. Omit for your own.
1Response
The jobs, with their reasons.
The ID of the Match.
The client this Match is for; null for your own.
The link to the job, reduced to the job itself.
The company job board (the applicant tracking system) the job was found on, such as greenhouse, lever, ashby or workday; linkedin or indeed only for jobs found before those were retired.
greenhouse, lever, ashby, workday, smartrecruiters, workable, recruitee, personio, rippling, gem, bamboohr, breezy, pinpoint, teamtailor, jazzhr, jobvite, homerun, trakstar, polymer, comeet, hibob, remoteok, weworkremotely, himalayas, jobicy, arbeitnow, adzuna, usajobs, linkedin, indeed The pay the board lists, as it words it; null when it does not say.
How far along the company is: early (seed to Series B), growth, or public; null when unknown.
early, growth, public Every Target whose search found this job.
A rough fit from keyword overlap; the review scores accurately.
0 <= x <= 100The AI's one sentence on why the job fits the resume, once asked for; null until then.
The AI's line on the job's biggest gap against the resume, written with the reason; null if none.
New, added, tracked, dismissed, or expired.
new, added, tracked, dismissed, expired The Application Add job led to, if any.