cURL
curl --fail-with-body https://api.pre.dev/vet-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"specId": "507f1f77bcf86cd799439011",
"proposalId": "507f1f77bcf86cd799439012"
}'import requests
url = "https://api.pre.dev/vet-proposal"
payload = {
"specId": "<string>",
"proposalId": "<string>",
"proposalName": "<string>",
"text": "<string>",
"file": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
specId: '<string>',
proposalId: '<string>',
proposalName: '<string>',
text: '<string>',
file: '<string>'
})
};
fetch('https://api.pre.dev/vet-proposal', 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://api.pre.dev/vet-proposal",
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([
'specId' => '<string>',
'proposalId' => '<string>',
'proposalName' => '<string>',
'text' => '<string>',
'file' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.pre.dev/vet-proposal"
payload := strings.NewReader("{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.pre.dev/vet-proposal")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pre.dev/vet-proposal")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"vettedProposal": {
"_id": "<string>",
"specId": "<string>",
"proposalId": "<string>",
"shouldAccept": true,
"acceptanceConfidence": 50,
"overallAlignment": 50,
"strengths": [
"<string>"
],
"weaknesses": [
"<string>"
],
"criticalGaps": [
"<string>"
],
"recommendations": [
"<string>"
],
"executiveSummary": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"proposal": {
"_id": "<string>",
"proposalName": "<string>",
"proposalContent": "<string>",
"proposalFile": {
"fileName": "<string>",
"fileUrl": "<string>",
"fileType": "<string>",
"fileSize": 123,
"uploadedAt": "2023-11-07T05:31:56Z"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}Proposals
Vet a proposal
Compare a proposal with a completed specification and return the assessment.
POST
/
vet-proposal
cURL
curl --fail-with-body https://api.pre.dev/vet-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"specId": "507f1f77bcf86cd799439011",
"proposalId": "507f1f77bcf86cd799439012"
}'import requests
url = "https://api.pre.dev/vet-proposal"
payload = {
"specId": "<string>",
"proposalId": "<string>",
"proposalName": "<string>",
"text": "<string>",
"file": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
specId: '<string>',
proposalId: '<string>',
proposalName: '<string>',
text: '<string>',
file: '<string>'
})
};
fetch('https://api.pre.dev/vet-proposal', 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://api.pre.dev/vet-proposal",
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([
'specId' => '<string>',
'proposalId' => '<string>',
'proposalName' => '<string>',
'text' => '<string>',
'file' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.pre.dev/vet-proposal"
payload := strings.NewReader("{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.pre.dev/vet-proposal")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pre.dev/vet-proposal")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"specId\": \"<string>\",\n \"proposalId\": \"<string>\",\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"vettedProposal": {
"_id": "<string>",
"specId": "<string>",
"proposalId": "<string>",
"shouldAccept": true,
"acceptanceConfidence": 50,
"overallAlignment": 50,
"strengths": [
"<string>"
],
"weaknesses": [
"<string>"
],
"criticalGaps": [
"<string>"
],
"recommendations": [
"<string>"
],
"executiveSummary": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"proposal": {
"_id": "<string>",
"proposalName": "<string>",
"proposalContent": "<string>",
"proposalFile": {
"fileName": "<string>",
"fileUrl": "<string>",
"fileType": "<string>",
"fileSize": 123,
"uploadedAt": "2023-11-07T05:31:56Z"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"actionUrl": "<string>",
"requiresSubscription": true,
"trialsUsed": 123,
"maxTrials": 123
}Provide
Replace the example ID with an actual completed specification ID. The HTTP
specId and either an existing proposalId, or a new proposalName with text or file. An existing proposalId takes precedence over file/text fields.
curl --fail-with-body https://api.pre.dev/vet-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"specId": "507f1f77bcf86cd799439011",
"proposalName": "Reporting dashboard implementation",
"text": "We propose organization-scoped reports, CSV export, and audit logging delivered in three milestones."
}'
200 response contains success, vettedProposal, and proposal. The assessment’s _id is used to retrieve it later.
Billing behavior
This operation charges 100 credits before later proposal validation and analysis. Check the specification, proposal ID, name, and content before calling it. There is no documented idempotency key, async mode, or automatic refund guarantee for validation/analysis failures. Check existing assessments before retrying a request whose outcome is uncertain. Insufficient credits returns402. Input or ID validation can return 400; a missing proposal can return 404. Read the proposal workflow for assessment fields.Authorizations
apiKeyAuthxApiKey
Use a pre.dev API key from https://pre.dev/projects/key.
Body
application/jsonmultipart/form-data
- Option 1
- Option 2
- Option 3
24-character record ID.
Pattern:
^[a-fA-F0-9]{24}$Existing proposal ID. When supplied, file, text, and proposalName are ignored.
Pattern:
^[a-fA-F0-9]{24}$Minimum string length:
1Minimum string length:
1New proposal file, at most 20 MiB, with a supported MIME type.
Was this page helpful?

