cURL
curl --fail-with-body https://api.pre.dev/upload-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proposalName": "Task manager implementation",
"text": "Projects, assignees, and due dates delivered in three milestones."
}'import requests
url = "https://api.pre.dev/upload-proposal"
payload = {
"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({proposalName: '<string>', text: '<string>', file: '<string>'})
};
fetch('https://api.pre.dev/upload-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/upload-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([
'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/upload-proposal"
payload := strings.NewReader("{\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/upload-proposal")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pre.dev/upload-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 \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"proposalId": "<string>"
}{
"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
Upload a proposal
Store proposal text or a document for later comparison with a specification.
POST
/
upload-proposal
cURL
curl --fail-with-body https://api.pre.dev/upload-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proposalName": "Task manager implementation",
"text": "Projects, assignees, and due dates delivered in three milestones."
}'import requests
url = "https://api.pre.dev/upload-proposal"
payload = {
"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({proposalName: '<string>', text: '<string>', file: '<string>'})
};
fetch('https://api.pre.dev/upload-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/upload-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([
'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/upload-proposal"
payload := strings.NewReader("{\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/upload-proposal")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pre.dev/upload-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 \"proposalName\": \"<string>\",\n \"text\": \"<string>\",\n \"file\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"proposalId": "<string>"
}{
"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
The HTTP
proposalName and at least one of text or file. Text-only requests can use JSON; files use multipart form data.
curl --fail-with-body https://api.pre.dev/upload-proposal \
-H "Authorization: Bearer $PREDEV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"proposalName": "Reporting dashboard implementation",
"text": "We propose organization-scoped reports, CSV export, and audit logging delivered in three milestones."
}'
200 response contains success: true and proposalId. Save that ID to retrieve or vet the proposal.
For file uploads, use the same formats and 20 MiB limit as specification uploads. Missing proposalName, or missing both file and text, returns 400.Authorizations
apiKeyAuthxApiKey
Use a pre.dev API key from https://pre.dev/projects/key.
Body
application/jsonmultipart/form-data
Was this page helpful?

