Calculate Proposal
curl --request POST \
--url https://api.example.com/proposals/calculate \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"requirements": [
{}
],
"hourlyRate": 123,
"settings": {}
}
'import requests
url = "https://api.example.com/proposals/calculate"
payload = {
"requirements": [{}],
"hourlyRate": 123,
"settings": {}
}
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({requirements: [{}], hourlyRate: 123, settings: {}})
};
fetch('https://api.example.com/proposals/calculate', 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.example.com/proposals/calculate",
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([
'requirements' => [
[
]
],
'hourlyRate' => 123,
'settings' => [
]
]),
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://api.example.com/proposals/calculate"
payload := strings.NewReader("{\n \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\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://api.example.com/proposals/calculate")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/proposals/calculate")
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 \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\n}"
response = http.request(request)
puts response.read_body{
"totalPoints": 123,
"totalHours": 123,
"estimatedDays": 123,
"baseCost": 123,
"techStackSurcharge": 123,
"urgencyModifier": 123,
"clientDiscount": 123,
"customDiscount": 123,
"subtotal": 123,
"tax": 123,
"total": 123,
"maintenanceMonthly": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Proposals
Calculate Proposal
Calculate proposal totals without saving.
Required scope: read
Supports all proposal types: technical, hour_bucket, tam, retainer,
staff_augmentation, milestone. Pass proposalType and type-specific
fields in settings (camelCase). For team-based types, include
proposalTeam and optionally rateCards.
POST
/
proposals
/
calculate
Calculate Proposal
curl --request POST \
--url https://api.example.com/proposals/calculate \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"requirements": [
{}
],
"hourlyRate": 123,
"settings": {}
}
'import requests
url = "https://api.example.com/proposals/calculate"
payload = {
"requirements": [{}],
"hourlyRate": 123,
"settings": {}
}
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({requirements: [{}], hourlyRate: 123, settings: {}})
};
fetch('https://api.example.com/proposals/calculate', 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.example.com/proposals/calculate",
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([
'requirements' => [
[
]
],
'hourlyRate' => 123,
'settings' => [
]
]),
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://api.example.com/proposals/calculate"
payload := strings.NewReader("{\n \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\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://api.example.com/proposals/calculate")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/proposals/calculate")
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 \"requirements\": [\n {}\n ],\n \"hourlyRate\": 123,\n \"settings\": {}\n}"
response = http.request(request)
puts response.read_body{
"totalPoints": 123,
"totalHours": 123,
"estimatedDays": 123,
"baseCost": 123,
"techStackSurcharge": 123,
"urgencyModifier": 123,
"clientDiscount": 123,
"customDiscount": 123,
"subtotal": 123,
"tax": 123,
"total": 123,
"maintenanceMonthly": 123
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Body
application/json
Request for proposal calculations.
Accepts a settings dict with the same camelCase keys the frontend
editor uses (techStackFee, urgency, clientType, etc.).
Falls back to simple legacy fields when settings is not provided.
Response
Successful Response
Response with calculated values.