curl --request POST \
--url https://hiresweep.com/api/openapi/applications/{id}/cover-letter \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"tone": "neutral"
}
'import requests
url = "https://hiresweep.com/api/openapi/applications/{id}/cover-letter"
payload = { "tone": "neutral" }
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({tone: 'neutral'})
};
fetch('https://hiresweep.com/api/openapi/applications/{id}/cover-letter', 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/applications/{id}/cover-letter",
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([
'tone' => 'neutral'
]),
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/applications/{id}/cover-letter"
payload := strings.NewReader("{\n \"tone\": \"neutral\"\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/applications/{id}/cover-letter")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tone\": \"neutral\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/applications/{id}/cover-letter")
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 \"tone\": \"neutral\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"clientId": "<string>",
"jobPostingId": "<string>",
"resumeId": "<string>",
"status": "saved",
"statusChangedAt": "2023-11-07T05:31:56Z",
"matchScore": 50,
"matchScorecard": {
"dimensions": [
{
"dimension": "<string>",
"score": 50,
"rationale": "<string>"
}
],
"missingKeywords": [
"<string>"
],
"strengths": [
"<string>"
],
"modelMeta": {
"provider": "<string>",
"model": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z",
"resume": {
"id": "<string>",
"name": "<string>"
}
},
"tailoredResumeId": "<string>",
"tailoring": {
"sourceResumeId": "<string>",
"changes": [
{
"kind": "headline",
"label": "<string>",
"before": "<string>",
"after": "<string>",
"reason": "<string>"
}
],
"refused": [
{
"kind": "headline",
"label": "<string>",
"reason": "<string>"
}
],
"match": {
"score": 50,
"dimensions": [
{
"dimension": "<string>",
"score": 50,
"rationale": "<string>"
}
]
},
"modelMeta": {
"provider": "<string>",
"model": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z",
"sourceScore": 50
},
"tailorError": "<string>",
"applySource": "tailored",
"notes": "<string>",
"coverLetter": "<string>",
"coverLetterTone": "neutral",
"coverLetterGeneratedAt": "2023-11-07T05:31:56Z",
"submittedVia": "manual",
"submittedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"posting": {
"id": "<string>",
"clientId": "<string>",
"source": "manual",
"externalId": "<string>",
"url": "<string>",
"title": "<string>",
"company": "<string>",
"location": "<string>",
"isRemote": true,
"employmentType": "full_time",
"salaryMin": -1,
"salaryMax": -1,
"salaryCurrency": "<string>",
"descriptionRaw": "<string>",
"descriptionParsed": {
"summary": "<string>",
"responsibilities": [
"<string>"
],
"requirements": [
"<string>"
],
"keywords": [
"<string>"
]
},
"postedAt": "2023-11-07T05:31:56Z",
"fetchedAt": "2023-11-07T05:31:56Z",
"reviewError": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"resume": {
"id": "<string>",
"name": "<string>"
}
}{
"defined": true,
"code": "BAD_GATEWAY",
"status": 502,
"message": "The AI provider could not write a cover letter. Try again.",
"data": "<unknown>"
}Write the application's cover letter
Writes a cover letter of about 250 words for the application, from the resume it sends (the tailored copy when it sends that) and the posting, and keeps it on the application in place of any earlier one. Tone is one of neutral, warm, formal, concise. It never states an employer, skill, number or claim about the company that the resume or posting does not; a letter that does is written again once, and refused if it still does. Requires a reviewed posting. Counts one AI action. Requires authentication.
curl --request POST \
--url https://hiresweep.com/api/openapi/applications/{id}/cover-letter \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"tone": "neutral"
}
'import requests
url = "https://hiresweep.com/api/openapi/applications/{id}/cover-letter"
payload = { "tone": "neutral" }
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({tone: 'neutral'})
};
fetch('https://hiresweep.com/api/openapi/applications/{id}/cover-letter', 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/applications/{id}/cover-letter",
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([
'tone' => 'neutral'
]),
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/applications/{id}/cover-letter"
payload := strings.NewReader("{\n \"tone\": \"neutral\"\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/applications/{id}/cover-letter")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"tone\": \"neutral\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://hiresweep.com/api/openapi/applications/{id}/cover-letter")
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 \"tone\": \"neutral\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"clientId": "<string>",
"jobPostingId": "<string>",
"resumeId": "<string>",
"status": "saved",
"statusChangedAt": "2023-11-07T05:31:56Z",
"matchScore": 50,
"matchScorecard": {
"dimensions": [
{
"dimension": "<string>",
"score": 50,
"rationale": "<string>"
}
],
"missingKeywords": [
"<string>"
],
"strengths": [
"<string>"
],
"modelMeta": {
"provider": "<string>",
"model": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z",
"resume": {
"id": "<string>",
"name": "<string>"
}
},
"tailoredResumeId": "<string>",
"tailoring": {
"sourceResumeId": "<string>",
"changes": [
{
"kind": "headline",
"label": "<string>",
"before": "<string>",
"after": "<string>",
"reason": "<string>"
}
],
"refused": [
{
"kind": "headline",
"label": "<string>",
"reason": "<string>"
}
],
"match": {
"score": 50,
"dimensions": [
{
"dimension": "<string>",
"score": 50,
"rationale": "<string>"
}
]
},
"modelMeta": {
"provider": "<string>",
"model": "<string>"
},
"updatedAt": "2023-11-07T05:31:56Z",
"sourceScore": 50
},
"tailorError": "<string>",
"applySource": "tailored",
"notes": "<string>",
"coverLetter": "<string>",
"coverLetterTone": "neutral",
"coverLetterGeneratedAt": "2023-11-07T05:31:56Z",
"submittedVia": "manual",
"submittedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"posting": {
"id": "<string>",
"clientId": "<string>",
"source": "manual",
"externalId": "<string>",
"url": "<string>",
"title": "<string>",
"company": "<string>",
"location": "<string>",
"isRemote": true,
"employmentType": "full_time",
"salaryMin": -1,
"salaryMax": -1,
"salaryCurrency": "<string>",
"descriptionRaw": "<string>",
"descriptionParsed": {
"summary": "<string>",
"responsibilities": [
"<string>"
],
"requirements": [
"<string>"
],
"keywords": [
"<string>"
]
},
"postedAt": "2023-11-07T05:31:56Z",
"fetchedAt": "2023-11-07T05:31:56Z",
"reviewError": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"resume": {
"id": "<string>",
"name": "<string>"
}
}{
"defined": true,
"code": "BAD_GATEWAY",
"status": 502,
"message": "The AI provider could not write a cover letter. Try again.",
"data": "<unknown>"
}Authorizations
An API key from Settings → Developers → API keys in Hiresweep.
Path Parameters
The ID of the application.
1Body
How the letter reads.
neutral, warm, formal, concise Response
The application with its new cover letter.
The ID of the application.
The client this application is for; null for your own.
Where the application stands in the pipeline.
saved, reviewing, reviewed, tailoring, ready, applying, needs_action, submitted, screening, interview, offer, rejected, withdrawn, ghosted How well the chosen resume answers the posting.
0 <= x <= 100The per-dimension breakdown behind the score.
Show child attributes
Show child attributes
The copy of the chosen resume tailored to this posting, if any.
What tailoring changed, what it refused, and how the copy scores.
Show child attributes
Show child attributes
Why the last tailoring failed, if it did.
Whether an apply run attaches the tailored copy or the resume itself.
tailored, original The user's own notes about this application.
The application's cover letter as plain text, once there is one.
The tone the cover letter was last written in.
neutral, warm, formal, concise When the cover letter was last written by AI.
Whether the application was sent by hand or assisted.
manual, assisted Show child attributes
Show child attributes
Show child attributes
Show child attributes