Registers the whole authenticated sales surface.
This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.
GET /api/v1/sales/activities
Section titled “GET /api/v1/sales/activities”GETcrm:readmsp facemspIdempotent
Source: [object Object]
List activities
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
assignee | query | string | No | |
client | query | string | No | |
kind | query | string | No | |
limit | query | string | No | |
opportunity | query | string | No | |
prospect | query | string | No | |
quote | query | string | No | |
sort | query | string, one of due, occurred | No | Sort key. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/activities?assignee=<assignee>&client=<client>&kind=<kind>&limit=<limit>&opportunity=<opportunity>&prospect=<prospect>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/activities?assignee=<assignee>&client=<client>&kind=<kind>&limit=<limit>&opportunity=<opportunity>&prospect=<prospect>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/activities"params = { "assignee": "<assignee>", "client": "<client>", "kind": "<kind>", "limit": "<limit>", "opportunity": "<opportunity>", "prospect": "<prospect>",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/activities?assignee=<assignee>&client=<client>&kind=<kind>&limit=<limit>&opportunity=<opportunity>&prospect=<prospect>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/activities");url.searchParams.set("assignee", "<assignee>");url.searchParams.set("client", "<client>");url.searchParams.set("kind", "<kind>");url.searchParams.set("limit", "<limit>");url.searchParams.set("opportunity", "<opportunity>");url.searchParams.set("prospect", "<prospect>");
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/activities?assignee=<assignee>&client=<client>&kind=<kind>&limit=<limit>&opportunity=<opportunity>&prospect=<prospect>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/activities
Section titled “POST /api/v1/sales/activities”POSTcrm:writemsp facemsp
Source: [object Object]
Create activity
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
assigneeUserPublicId | string or null | |
body | string or null | |
clientPublicId | string or null | |
dueOn | string or null | |
kind | string or null | |
occurredAt | string or null | |
opportunityPublicId | string or null | |
prospectPublicId | string or null | |
quotePublicId | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, SalesActivityView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
assigneeName | string or null | |
assigneeUserPublicId | string or null | |
authorName | string or null | |
authorUserPublicId | string or null | |
bodyrequired | string | |
clientPublicId | string or null | |
completedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
dueOn | string or null | |
kindrequired | string | |
occurredAtrequired | string (date-time) | |
opportunityPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quotePublicId | string or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/activities' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/activities' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/activities"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/activities", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/activities";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/activities");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/activities/{id}
Section titled “PATCH /api/v1/sales/activities/{id}”PATCHcrm:writemsp facemsp
Source: [object Object]
patchActivity edits what was written, when it happened, when it is due and who it is for.
It does NOT move the activity to another subject: a note written about one deal is a note about that deal.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
assigneeUserPublicId | string or null | |
body | string or null | |
clientPublicId | string or null | |
dueOn | string or null | |
kind | string or null | |
occurredAt | string or null | |
opportunityPublicId | string or null | |
prospectPublicId | string or null | |
quotePublicId | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesActivityView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
assigneeName | string or null | |
assigneeUserPublicId | string or null | |
authorName | string or null | |
authorUserPublicId | string or null | |
bodyrequired | string | |
clientPublicId | string or null | |
completedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
dueOn | string or null | |
kindrequired | string | |
occurredAtrequired | string (date-time) | |
opportunityPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quotePublicId | string or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/activities/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/activities/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/activities/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string",}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/activities/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/activities/<id>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "assigneeUserPublicId": "string", "body": "string", "clientPublicId": "string", "dueOn": "string", "kind": "string", "occurredAt": "string", "opportunityPublicId": "string", "prospectPublicId": "string", "quotePublicId": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/activities/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/activities/{id}
Section titled “DELETE /api/v1/sales/activities/{id}”DELETEcrm:writemsp facemspIdempotent
Source: [object Object]
Delete activity
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/activities/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/activities/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/activities/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/activities/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/activities/<id>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/activities/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/activities/{id}/complete
Section titled “POST /api/v1/sales/activities/{id}/complete”POSTcrm:writemsp facemsp
Source: [object Object]
completeActivity ticks a follow-up off.
Only a TASK can be completed, because nothing else has anything to be done about it, and the store says so rather than this handler guessing from a kind it would have to read first.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesActivityView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
assigneeName | string or null | |
assigneeUserPublicId | string or null | |
authorName | string or null | |
authorUserPublicId | string or null | |
bodyrequired | string | |
clientPublicId | string or null | |
completedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
dueOn | string or null | |
kindrequired | string | |
occurredAtrequired | string (date-time) | |
opportunityPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quotePublicId | string or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/activities/<id>/complete' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/activities/<id>/complete' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/activities/<id>/complete"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/activities/<id>/complete", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/activities/<id>/complete";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/activities/<id>/complete");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/catalog-items
Section titled “GET /api/v1/sales/catalog-items”GETmsp facemspIdempotent
Source: [object Object]
List catalog items
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
kind | query | string | No | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
q | query | string | No | Free-text search term. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultCatalogItemView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of CatalogItemView | |
items[].activerequired | boolean | |
items[].agreementLineKind | string or null | |
items[].billOnMilestonesrequired | boolean | |
items[].categoryrequired | string | |
items[].createdAtrequired | string (date-time) | |
items[].currencyCoderequired | string | |
items[].descriptionrequired | string | |
items[].fulfillablerequired | boolean | |
items[].includedMinutesrequired | integer | |
items[].kindrequired | string | |
items[].namerequired | string | |
items[].projectTemplateFamilyPublicId | string or null | |
items[].publicIdrequired | string | |
items[].skurequired | string | |
items[].sortOrderrequired | integer | |
items[].stockItemId | string or null | |
items[].taxablerequired | boolean | |
items[].unitrequired | string | |
items[].unitCostCentsrequired | integer | int64. |
items[].unitPriceCentsrequired | integer | int64. |
items[].updatedAtrequired | string (date-time) | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/catalog-items?kind=<kind>&page=0&pageSize=0&q=<q>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/catalog-items?kind=<kind>&page=0&pageSize=0&q=<q>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/catalog-items"params = { "kind": "<kind>", "page": "0", "pageSize": "0", "q": "<q>",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/catalog-items?kind=<kind>&page=0&pageSize=0&q=<q>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/catalog-items");url.searchParams.set("kind", "<kind>");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");url.searchParams.set("q", "<q>");
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/catalog-items?kind=<kind>&page=0&pageSize=0&q=<q>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/catalog-items
Section titled “POST /api/v1/sales/catalog-items”POSTpsa:adminmsp facemsp
Source: [object Object]
Create catalog item
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
active | boolean or null | |
agreementLineKind | string or null | |
billOnMilestones | boolean or null | |
category | string or null | |
description | string or null | |
fulfillable | boolean or null | |
includedMinutes | integer or null | |
kind | string or null | |
name | string or null | |
projectTemplateFamilyPublicId | string or null | |
skurequired | string | |
sortOrder | integer or null | |
stockItemId | string or null | |
taxable | boolean or null | |
unit | string or null | |
unitCostCents | integer or null | int64. |
unitPriceCents | integer or null | int64. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, CatalogItemView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold psa:admin. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
activerequired | boolean | |
agreementLineKind | string or null | |
billOnMilestonesrequired | boolean | |
categoryrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
descriptionrequired | string | |
fulfillablerequired | boolean | |
includedMinutesrequired | integer | |
kindrequired | string | |
namerequired | string | |
projectTemplateFamilyPublicId | string or null | |
publicIdrequired | string | |
skurequired | string | |
sortOrderrequired | integer | |
stockItemId | string or null | |
taxablerequired | boolean | |
unitrequired | string | |
unitCostCentsrequired | integer | int64. |
unitPriceCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/catalog-items' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/catalog-items' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/catalog-items"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "active": False, "agreementLineKind": "string", "billOnMilestones": False, "category": "string", "description": "string", "fulfillable": False, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": False, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0,}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/catalog-items", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/catalog-items";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/catalog-items");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/catalog-items/{id}
Section titled “GET /api/v1/sales/catalog-items/{id}”GETmsp facemspIdempotent
Source: [object Object]
Get catalog item
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, CatalogItemView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
activerequired | boolean | |
agreementLineKind | string or null | |
billOnMilestonesrequired | boolean | |
categoryrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
descriptionrequired | string | |
fulfillablerequired | boolean | |
includedMinutesrequired | integer | |
kindrequired | string | |
namerequired | string | |
projectTemplateFamilyPublicId | string or null | |
publicIdrequired | string | |
skurequired | string | |
sortOrderrequired | integer | |
stockItemId | string or null | |
taxablerequired | boolean | |
unitrequired | string | |
unitCostCentsrequired | integer | int64. |
unitPriceCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/catalog-items/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/catalog-items/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/catalog-items/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/catalog-items/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/catalog-items/<id>";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/catalog-items/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/catalog-items/{id}
Section titled “PATCH /api/v1/sales/catalog-items/{id}”PATCHpsa:adminmsp facemsp
Source: [object Object]
patchCatalogItem edits one item.
The SKU is absent from the update deliberately: changing it would orphan every quote line that names the item under its old code.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
active | boolean or null | |
agreementLineKind | string or null | |
billOnMilestones | boolean or null | |
category | string or null | |
description | string or null | |
fulfillable | boolean or null | |
includedMinutes | integer or null | |
kind | string or null | |
name | string or null | |
projectTemplateFamilyPublicId | string or null | |
skurequired | string | |
sortOrder | integer or null | |
stockItemId | string or null | |
taxable | boolean or null | |
unit | string or null | |
unitCostCents | integer or null | int64. |
unitPriceCents | integer or null | int64. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, CatalogItemView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold psa:admin. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | Could not update the catalog item. |
501 | application/problem+json, ProblemDetails | This server cannot mark catalog items fulfillable. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
activerequired | boolean | |
agreementLineKind | string or null | |
billOnMilestonesrequired | boolean | |
categoryrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
descriptionrequired | string | |
fulfillablerequired | boolean | |
includedMinutesrequired | integer | |
kindrequired | string | |
namerequired | string | |
projectTemplateFamilyPublicId | string or null | |
publicIdrequired | string | |
skurequired | string | |
sortOrderrequired | integer | |
stockItemId | string or null | |
taxablerequired | boolean | |
unitrequired | string | |
unitCostCentsrequired | integer | int64. |
unitPriceCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/catalog-items/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/catalog-items/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/catalog-items/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "active": False, "agreementLineKind": "string", "billOnMilestones": False, "category": "string", "description": "string", "fulfillable": False, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": False, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0,}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/catalog-items/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/catalog-items/<id>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "active": false, "agreementLineKind": "string", "billOnMilestones": false, "category": "string", "description": "string", "fulfillable": false, "includedMinutes": 0, "kind": "string", "name": "string", "projectTemplateFamilyPublicId": "string", "sku": "string", "sortOrder": 0, "stockItemId": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/catalog-items/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/catalog-items/{id}
Section titled “DELETE /api/v1/sales/catalog-items/{id}”DELETEpsa:adminmsp facemspIdempotent
Source: [object Object]
deleteCatalogItem RETIRES an item.
There is no delete, deliberately: a quote line names its item for provenance and a year-old quote has to keep resolving, so the row stays and Active goes false. The verb is DELETE because that is what the console’s button means.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold psa:admin. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/catalog-items/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/catalog-items/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/catalog-items/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/catalog-items/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/catalog-items/<id>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/catalog-items/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/dashboard
Section titled “GET /api/v1/sales/dashboard”GETcrm:readmsp facemspIdempotent
Source: [object Object]
getDashboard answers the tiles for THE CALLER, which is what makes myOverdueTasks mean anything: “my follow-ups” resolved for whoever is asking, not a practice-wide count of everybody’s.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesDashboardView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
currencyCoderequired | string | |
expiringWithin7Daysrequired | integer | |
myOverdueTasksrequired | integer | |
openOpportunitiesrequired | integer | |
openPipelineValueCentsrequired | integer | int64. |
quotesAwaitingrequired | integer | |
quotesAwaitingValueCentsrequired | integer | int64. |
wonThisQuarterCentsrequired | integer | int64. |
wonThisQuarterCountrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/dashboard' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/dashboard' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/dashboard"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/dashboard", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/dashboard";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/dashboard");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/opportunities
Section titled “GET /api/v1/sales/opportunities”GETcrm:readmsp facemspIdempotent
Source: [object Object]
List opportunities
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
kind | query | string | No | |
outcome | query | string | No | |
owner | query | string | No | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
prospect | query | string | No | |
q | query | string | No | Free-text search term. |
sort | query | string, one of expected, name, stage, updated, value | No | Sort key. |
stage | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultOpportunityView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of OpportunityView | |
items[].clientPublicId | string or null | |
items[].closedAt | string (date-time) or null | |
items[].createdAtrequired | string (date-time) | |
items[].currencyCoderequired | string | |
items[].expectedCloseOn | string or null | |
items[].kindrequired | string | |
items[].latestQuotePublicId | string or null | |
items[].lostReason | string or null | |
items[].namerequired | string | |
items[].notesrequired | string | |
items[].ownerName | string or null | |
items[].ownerUserPublicId | string or null | |
items[].partyNamerequired | string | |
items[].probabilityrequired | integer | |
items[].prospectPublicId | string or null | |
items[].publicIdrequired | string | |
items[].quoteCountrequired | integer | |
items[].renewalOfAgreementPublicId | string or null | |
items[].sourcerequired | string | |
items[].stageEnteredAtrequired | string (date-time) | |
items[].stageKindrequired | string | |
items[].stageNamerequired | string | |
items[].stagePublicIdrequired | string | |
items[].updatedAtrequired | string (date-time) | |
items[].valueCentsrequired | integer | int64. |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/opportunities?client=<client>&kind=<kind>&outcome=<outcome>&owner=<owner>&page=0&pageSize=0' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/opportunities?client=<client>&kind=<kind>&outcome=<outcome>&owner=<owner>&page=0&pageSize=0' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities"params = { "client": "<client>", "kind": "<kind>", "outcome": "<outcome>", "owner": "<owner>", "page": "0", "pageSize": "0",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/opportunities?client=<client>&kind=<kind>&outcome=<outcome>&owner=<owner>&page=0&pageSize=0", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/opportunities");url.searchParams.set("client", "<client>");url.searchParams.set("kind", "<kind>");url.searchParams.set("outcome", "<outcome>");url.searchParams.set("owner", "<owner>");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/opportunities?client=<client>&kind=<kind>&outcome=<outcome>&owner=<owner>&page=0&pageSize=0");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/opportunities
Section titled “POST /api/v1/sales/opportunities”POSTcrm:writemsp facemsp
Source: [object Object]
Create opportunity
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
expectedCloseOn | string or null | |
kind | string or null | |
name | string or null | |
notes | string or null | |
ownerUserPublicId | string or null | |
probability | integer or null | |
prospectPublicId | string or null | |
stagePublicId | string or null | |
valueCents | integer or null | int64. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, OpportunityView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
409 | application/problem+json, ProblemDetails | This board has no open stage to put a deal in. Add one on the sales settings page. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
closedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
expectedCloseOn | string or null | |
kindrequired | string | |
latestQuotePublicId | string or null | |
lostReason | string or null | |
namerequired | string | |
notesrequired | string | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
partyNamerequired | string | |
probabilityrequired | integer | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quoteCountrequired | integer | |
renewalOfAgreementPublicId | string or null | |
sourcerequired | string | |
stageEnteredAtrequired | string (date-time) | |
stageKindrequired | string | |
stageNamerequired | string | |
stagePublicIdrequired | string | |
updatedAtrequired | string (date-time) | |
valueCentsrequired | integer | int64. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/opportunities' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/opportunities' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0,}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/opportunities", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/opportunities";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/opportunities");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/opportunities/{id}
Section titled “GET /api/v1/sales/opportunities/{id}”GETcrm:readmsp facemspIdempotent
Source: [object Object]
Get opportunity
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, OpportunityView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
closedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
expectedCloseOn | string or null | |
kindrequired | string | |
latestQuotePublicId | string or null | |
lostReason | string or null | |
namerequired | string | |
notesrequired | string | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
partyNamerequired | string | |
probabilityrequired | integer | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quoteCountrequired | integer | |
renewalOfAgreementPublicId | string or null | |
sourcerequired | string | |
stageEnteredAtrequired | string (date-time) | |
stageKindrequired | string | |
stageNamerequired | string | |
stagePublicIdrequired | string | |
updatedAtrequired | string (date-time) | |
valueCentsrequired | integer | int64. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/opportunities/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/opportunities/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/opportunities/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/opportunities/<id>";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/opportunities/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/opportunities/{id}
Section titled “PATCH /api/v1/sales/opportunities/{id}”PATCHcrm:writemsp facemsp
Source: [object Object]
Patch opportunity
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
expectedCloseOn | string or null | |
kind | string or null | |
name | string or null | |
notes | string or null | |
ownerUserPublicId | string or null | |
probability | integer or null | |
prospectPublicId | string or null | |
stagePublicId | string or null | |
valueCents | integer or null | int64. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, OpportunityView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
closedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
expectedCloseOn | string or null | |
kindrequired | string | |
latestQuotePublicId | string or null | |
lostReason | string or null | |
namerequired | string | |
notesrequired | string | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
partyNamerequired | string | |
probabilityrequired | integer | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quoteCountrequired | integer | |
renewalOfAgreementPublicId | string or null | |
sourcerequired | string | |
stageEnteredAtrequired | string (date-time) | |
stageKindrequired | string | |
stageNamerequired | string | |
stagePublicIdrequired | string | |
updatedAtrequired | string (date-time) | |
valueCentsrequired | integer | int64. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/opportunities/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/opportunities/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0,}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/opportunities/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/opportunities/<id>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "clientPublicId": "string", "expectedCloseOn": "string", "kind": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "probability": 0, "prospectPublicId": "string", "stagePublicId": "string", "valueCents": 0}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/opportunities/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/opportunities/{id}
Section titled “DELETE /api/v1/sales/opportunities/{id}”DELETEcrm:writemsp facemspIdempotent
Source: [object Object]
Delete opportunity
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/opportunities/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/opportunities/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/opportunities/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/opportunities/<id>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/opportunities/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/opportunities/{id}/move
Section titled “POST /api/v1/sales/opportunities/{id}/move”POSTcrm:writemsp facemsp
Source: [object Object]
moveOpportunity is the board’s drop and the detail page’s “mark won” and “mark lost”, which are the same act: entering the won stage stamps WonAt, entering the lost stage stamps LostAt and the reason, and entering an open stage clears both.
THERE IS NO SEPARATE WIN OR LOSE ROUTE, and there is no quote “lose” route either: marking a deal lost is moving it to the lost column.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
lostReasonrequired | string | |
stagePublicIdrequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, OpportunityView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
clientPublicId | string or null | |
closedAt | string (date-time) or null | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
expectedCloseOn | string or null | |
kindrequired | string | |
latestQuotePublicId | string or null | |
lostReason | string or null | |
namerequired | string | |
notesrequired | string | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
partyNamerequired | string | |
probabilityrequired | integer | |
prospectPublicId | string or null | |
publicIdrequired | string | |
quoteCountrequired | integer | |
renewalOfAgreementPublicId | string or null | |
sourcerequired | string | |
stageEnteredAtrequired | string (date-time) | |
stageKindrequired | string | |
stageNamerequired | string | |
stagePublicIdrequired | string | |
updatedAtrequired | string (date-time) | |
valueCentsrequired | integer | int64. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/opportunities/<id>/move' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "lostReason": "string", "stagePublicId": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "lostReason": "string", "stagePublicId": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/opportunities/<id>/move' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/opportunities/<id>/move"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "lostReason": "string", "stagePublicId": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "lostReason": "string", "stagePublicId": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/opportunities/<id>/move", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/opportunities/<id>/move";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "lostReason": "string", "stagePublicId": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "lostReason": "string", "stagePublicId": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/opportunities/<id>/move");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/prospects
Section titled “GET /api/v1/sales/prospects”GETcrm:readmsp facemspIdempotent
Source: [object Object]
List prospects
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
owner | query | string | No | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
q | query | string | No | Free-text search term. |
sort | query | string, one of created, name, updated | No | Sort key. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultProspectView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of ProspectView | |
items[].addressLine1required | string | |
items[].addressLine2required | string | |
items[].cityrequired | string | |
items[].clientPublicId | string or null | |
items[].contacts | array of ProspectContactView | |
items[].contacts[].createdAtrequired | string (date-time) | |
items[].contacts[].emailrequired | string | |
items[].contacts[].namerequired | string | |
items[].contacts[].phonerequired | string | |
items[].contacts[].primaryrequired | boolean | |
items[].contacts[].prospectPublicIdrequired | string | |
items[].contacts[].publicIdrequired | string | |
items[].contacts[].titlerequired | string | |
items[].convertedAt | string (date-time) or null | |
items[].countryrequired | string | |
items[].createdAtrequired | string (date-time) | |
items[].industryrequired | string | |
items[].namerequired | string | |
items[].notesrequired | string | |
items[].openOpportunitiesrequired | integer | |
items[].ownerName | string or null | |
items[].ownerUserPublicId | string or null | |
items[].phonerequired | string | |
items[].postalCoderequired | string | |
items[].primaryContact | ProspectContactView | |
items[].primaryContact.createdAtrequired | string (date-time) | |
items[].primaryContact.emailrequired | string | |
items[].primaryContact.namerequired | string | |
items[].primaryContact.phonerequired | string | |
items[].primaryContact.primaryrequired | boolean | |
items[].primaryContact.prospectPublicIdrequired | string | |
items[].primaryContact.publicIdrequired | string | |
items[].primaryContact.titlerequired | string | |
items[].publicIdrequired | string | |
items[].regionrequired | string | |
items[].sourcerequired | string | |
items[].statusrequired | string | |
items[].updatedAtrequired | string (date-time) | |
items[].websiterequired | string | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/prospects?owner=<owner>&page=0&pageSize=0&q=<q>&sort=created' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/prospects?owner=<owner>&page=0&pageSize=0&q=<q>&sort=created' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/prospects"params = { "owner": "<owner>", "page": "0", "pageSize": "0", "q": "<q>", "sort": "created",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/prospects?owner=<owner>&page=0&pageSize=0&q=<q>&sort=created", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/prospects");url.searchParams.set("owner", "<owner>");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");url.searchParams.set("q", "<q>");url.searchParams.set("sort", "created");
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/prospects?owner=<owner>&page=0&pageSize=0&q=<q>&sort=created");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/prospects
Section titled “POST /api/v1/sales/prospects”POSTcrm:writemsp facemsp
Source: [object Object]
createProspect writes a new one, owned by whoever created it unless they said otherwise.
The default matters: a pipeline of unowned rows is a pipeline nobody chases, and the person typing a company in is the person who just spoke to them.
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
addressLine1 | string or null | |
addressLine2 | string or null | |
city | string or null | |
country | string or null | |
industry | string or null | |
name | string or null | |
notes | string or null | |
ownerUserPublicId | string or null | |
phone | string or null | |
postalCode | string or null | |
region | string or null | |
source | string or null | |
website | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, ProspectView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
addressLine1required | string | |
addressLine2required | string | |
cityrequired | string | |
clientPublicId | string or null | |
contacts | array of ProspectContactView | |
contacts[].createdAtrequired | string (date-time) | |
contacts[].emailrequired | string | |
contacts[].namerequired | string | |
contacts[].phonerequired | string | |
contacts[].primaryrequired | boolean | |
contacts[].prospectPublicIdrequired | string | |
contacts[].publicIdrequired | string | |
contacts[].titlerequired | string | |
convertedAt | string (date-time) or null | |
countryrequired | string | |
createdAtrequired | string (date-time) | |
industryrequired | string | |
namerequired | string | |
notesrequired | string | |
openOpportunitiesrequired | integer | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
phonerequired | string | |
postalCoderequired | string | |
primaryContact | ProspectContactView | |
primaryContact.createdAtrequired | string (date-time) | |
primaryContact.emailrequired | string | |
primaryContact.namerequired | string | |
primaryContact.phonerequired | string | |
primaryContact.primaryrequired | boolean | |
primaryContact.prospectPublicIdrequired | string | |
primaryContact.publicIdrequired | string | |
primaryContact.titlerequired | string | |
publicIdrequired | string | |
regionrequired | string | |
sourcerequired | string | |
statusrequired | string | |
updatedAtrequired | string (date-time) | |
websiterequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/prospects' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/prospects' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/prospects"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/prospects", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/prospects");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/prospects/{id}
Section titled “GET /api/v1/sales/prospects/{id}”GETcrm:readmsp facemspIdempotent
Source: [object Object]
Get prospect
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ProspectView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
addressLine1required | string | |
addressLine2required | string | |
cityrequired | string | |
clientPublicId | string or null | |
contacts | array of ProspectContactView | |
contacts[].createdAtrequired | string (date-time) | |
contacts[].emailrequired | string | |
contacts[].namerequired | string | |
contacts[].phonerequired | string | |
contacts[].primaryrequired | boolean | |
contacts[].prospectPublicIdrequired | string | |
contacts[].publicIdrequired | string | |
contacts[].titlerequired | string | |
convertedAt | string (date-time) or null | |
countryrequired | string | |
createdAtrequired | string (date-time) | |
industryrequired | string | |
namerequired | string | |
notesrequired | string | |
openOpportunitiesrequired | integer | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
phonerequired | string | |
postalCoderequired | string | |
primaryContact | ProspectContactView | |
primaryContact.createdAtrequired | string (date-time) | |
primaryContact.emailrequired | string | |
primaryContact.namerequired | string | |
primaryContact.phonerequired | string | |
primaryContact.primaryrequired | boolean | |
primaryContact.prospectPublicIdrequired | string | |
primaryContact.publicIdrequired | string | |
primaryContact.titlerequired | string | |
publicIdrequired | string | |
regionrequired | string | |
sourcerequired | string | |
statusrequired | string | |
updatedAtrequired | string (date-time) | |
websiterequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/prospects/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/prospects/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/prospects/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/prospects/{id}
Section titled “PATCH /api/v1/sales/prospects/{id}”PATCHcrm:writemsp facemsp
Source: [object Object]
patchProspect edits the fields a salesperson types.
It CANNOT change the status: conversion and archiving each have their own preconditions and their own route, and a PATCH that could write “converted” would let a console mark a prospect as a customer that does not exist.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
addressLine1 | string or null | |
addressLine2 | string or null | |
city | string or null | |
country | string or null | |
industry | string or null | |
name | string or null | |
notes | string or null | |
ownerUserPublicId | string or null | |
phone | string or null | |
postalCode | string or null | |
region | string or null | |
source | string or null | |
website | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ProspectView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
addressLine1required | string | |
addressLine2required | string | |
cityrequired | string | |
clientPublicId | string or null | |
contacts | array of ProspectContactView | |
contacts[].createdAtrequired | string (date-time) | |
contacts[].emailrequired | string | |
contacts[].namerequired | string | |
contacts[].phonerequired | string | |
contacts[].primaryrequired | boolean | |
contacts[].prospectPublicIdrequired | string | |
contacts[].publicIdrequired | string | |
contacts[].titlerequired | string | |
convertedAt | string (date-time) or null | |
countryrequired | string | |
createdAtrequired | string (date-time) | |
industryrequired | string | |
namerequired | string | |
notesrequired | string | |
openOpportunitiesrequired | integer | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
phonerequired | string | |
postalCoderequired | string | |
primaryContact | ProspectContactView | |
primaryContact.createdAtrequired | string (date-time) | |
primaryContact.emailrequired | string | |
primaryContact.namerequired | string | |
primaryContact.phonerequired | string | |
primaryContact.primaryrequired | boolean | |
primaryContact.prospectPublicIdrequired | string | |
primaryContact.publicIdrequired | string | |
primaryContact.titlerequired | string | |
publicIdrequired | string | |
regionrequired | string | |
sourcerequired | string | |
statusrequired | string | |
updatedAtrequired | string (date-time) | |
websiterequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/prospects/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string",}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/prospects/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "addressLine1": "string", "addressLine2": "string", "city": "string", "country": "string", "industry": "string", "name": "string", "notes": "string", "ownerUserPublicId": "string", "phone": "string", "postalCode": "string", "region": "string", "source": "string", "website": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/prospects/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/prospects/{id}/archive
Section titled “POST /api/v1/sales/prospects/{id}/archive”POSTcrm:writemsp facemsp
Source: [object Object]
archiveProspect hides a row.
It is a SOFT DELETE and not a fourth status: “we lost this deal” and “hide this row” are different facts, and one column holding both would make the pipeline report answer a question nobody asked.
A converted prospect refuses: that row is the provenance of a live customer.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/prospects/<id>/archive' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>/archive' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>/archive"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/prospects/<id>/archive", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>/archive";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/prospects/<id>/archive");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/prospects/{id}/contacts
Section titled “GET /api/v1/sales/prospects/{id}/contacts”GETcrm:readmsp facemspIdempotent
Source: [object Object]
List contacts
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/prospects/{id}/contacts
Section titled “POST /api/v1/sales/prospects/{id}/contacts”POSTcrm:writemsp facemsp
Source: [object Object]
Create contact
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
email | string or null | |
name | string or null | |
phone | string or null | |
primary | boolean or null | |
title | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, ProspectContactView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
createdAtrequired | string (date-time) | |
emailrequired | string | |
namerequired | string | |
phonerequired | string | |
primaryrequired | boolean | |
prospectPublicIdrequired | string | |
publicIdrequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "email": "string", "name": "string", "phone": "string", "primary": False, "title": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/prospects/{id}/contacts/{cid}
Section titled “PATCH /api/v1/sales/prospects/{id}/contacts/{cid}”PATCHcrm:writemsp facemsp
Source: [object Object]
Patch contact
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
cid | path | string | Yes | A uuid. |
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
email | string or null | |
name | string or null | |
phone | string or null | |
primary | boolean or null | |
title | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ProspectContactView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
createdAtrequired | string (date-time) | |
emailrequired | string | |
namerequired | string | |
phonerequired | string | |
primaryrequired | boolean | |
prospectPublicIdrequired | string | |
publicIdrequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "email": "string", "name": "string", "phone": "string", "primary": False, "title": "string",}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "email": "string", "name": "string", "phone": "string", "primary": false, "title": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/prospects/{id}/contacts/{cid}
Section titled “DELETE /api/v1/sales/prospects/{id}/contacts/{cid}”DELETEcrm:writemsp facemspIdempotent
Source: [object Object]
deleteContact soft-deletes a person.
A quote already sent SNAPSHOTTED the address it went to, so removing the contact cannot orphan a record.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
cid | path | string | Yes | A uuid. |
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/prospects/<id>/contacts/<cid>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes
Section titled “GET /api/v1/sales/quotes”GETcrm:readmsp facemspIdempotent
Source: [object Object]
listQuotes answers one page WITHOUT lines, and it is what the approvals badge polls: ?status=pending_approval&pageSize=1 is an index-only count on IX_Quote_Status, which is why the total is a separate COUNT under the same predicate rather than len(items).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
isTemplate | query | string | No | |
opportunity | query | string | No | |
owner | query | string | No | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
prospect | query | string | No | |
q | query | string | No | Free-text search term. |
sort | query | string, one of expires, number, requested, total, updated | No | Sort key. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultQuoteSummaryView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of QuoteSummaryView | |
items[].acceptedAt | string (date-time) or null | |
items[].clientPublicId | string or null | |
items[].contactEmailrequired | string | |
items[].contactNamerequired | string | |
items[].contactPublicId | string or null | |
items[].createdAtrequired | string (date-time) | |
items[].currencyCoderequired | string | |
items[].displayNumberrequired | string | |
items[].expiresOn | string or null | |
items[].isTemplaterequired | boolean | |
items[].needsApprovalrequired | boolean | |
items[].numberrequired | string | |
items[].opportunityPublicId | string or null | |
items[].ownerName | string or null | |
items[].ownerUserPublicId | string or null | |
items[].prospectPublicId | string or null | |
items[].publicIdrequired | string | |
items[].recipientNamerequired | string | |
items[].revisionrequired | integer | |
items[].sentAt | string (date-time) or null | |
items[].statusrequired | string | |
items[].templateNamerequired | string | |
items[].titlerequired | string | |
items[].totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
items[].totals.contractValueCentsrequired | integer | int64. |
items[].totals.costCentsrequired | integer | int64. |
items[].totals.discountOneTimeCentsrequired | integer | int64. |
items[].totals.discountRecurringCentsrequired | integer | int64. |
items[].totals.dueOnAcceptanceCentsrequired | integer | int64. |
items[].totals.marginBp | integer or null | |
items[].totals.monthlyRecurringCentsrequired | integer | int64. |
items[].totals.oneTimeSubtotalCentsrequired | integer | int64. |
items[].totals.recurringSubtotalCentsrequired | integer | int64. |
items[].totals.taxOneTimeCentsrequired | integer | int64. |
items[].totals.taxRecurringCentsrequired | integer | int64. |
items[].updatedAtrequired | string (date-time) | |
items[].viewedAt | string (date-time) or null | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes?client=<client>&isTemplate=<isTemplate>&opportunity=<opportunity>&owner=<owner>&page=0&pageSize=0' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes?client=<client>&isTemplate=<isTemplate>&opportunity=<opportunity>&owner=<owner>&page=0&pageSize=0' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes"params = { "client": "<client>", "isTemplate": "<isTemplate>", "opportunity": "<opportunity>", "owner": "<owner>", "page": "0", "pageSize": "0",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes?client=<client>&isTemplate=<isTemplate>&opportunity=<opportunity>&owner=<owner>&page=0&pageSize=0", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/quotes");url.searchParams.set("client", "<client>");url.searchParams.set("isTemplate", "<isTemplate>");url.searchParams.set("opportunity", "<opportunity>");url.searchParams.set("owner", "<owner>");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes?client=<client>&isTemplate=<isTemplate>&opportunity=<opportunity>&owner=<owner>&page=0&pageSize=0");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes
Section titled “POST /api/v1/sales/quotes”POSTcrm:writemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Create quote
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
billingDay | integer or null | |
clientPublicId | string or null | |
contactPublicId | string or null | |
coverLetter | string or null | |
depositBasisPointsrequired | any | Arbitrary JSON. |
expiresOn | string or null | |
invoiceModerequired | any | Arbitrary JSON. |
isTemplaterequired | boolean | |
opportunityPublicId | string or null | |
ownerUserPublicId | string or null | |
prospectPublicId | string or null | |
sectionsrequired | array of QuoteSectionDraft | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineDraft | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
taxRateBasisPoints | integer or null | |
templateNamerequired | string | |
termMonths | integer or null | |
terms | string or null | |
timeCoverage | string or null | |
titlerequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": False, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": False, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": False, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": False, "publicId": "string", "quantity": "string", "taxable": False, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0, }, ], "publicId": "string", "title": "string", }, ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes/{id}
Section titled “GET /api/v1/sales/quotes/{id}”GETcrm:readmsp facemspIdempotentNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Get quote
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/sales/quotes/{id}
Section titled “PUT /api/v1/sales/quotes/{id}”PUTcrm:writemsp facemspIdempotentNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
putQuote replaces the WHOLE document.
The 409 past the three pre-send statuses is the STORE’s, decided inside the transaction that takes the row FOR UPDATE, and not a status check here: a check here would race a concurrent send and let an edit land on a document that had already been frozen, numbered and mailed.
An edit to an APPROVED quote drops it back to draft and clears the approval. An approver said yes to a document, not to a number, and an edit after approval is a different document.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
billingDay | integer or null | |
clientPublicId | string or null | |
contactPublicId | string or null | |
coverLetter | string or null | |
depositBasisPointsrequired | any | Arbitrary JSON. |
expiresOn | string or null | |
invoiceModerequired | any | Arbitrary JSON. |
isTemplaterequired | boolean | |
opportunityPublicId | string or null | |
ownerUserPublicId | string or null | |
prospectPublicId | string or null | |
sectionsrequired | array of QuoteSectionDraft | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineDraft | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
taxRateBasisPoints | integer or null | |
templateNamerequired | string | |
termMonths | integer or null | |
terms | string or null | |
timeCoverage | string or null | |
titlerequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X PUT 'https://depot.example.com/api/v1/sales/quotes/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}'@
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": False, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": False, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": False, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": False, "publicId": "string", "quantity": "string", "taxable": False, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0, }, ], "publicId": "string", "title": "string", }, ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string",}
response = requests.put(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}`)
req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/sales/quotes/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "agreementStartsOn": "string", "agreementTemplatePublicId": "string", "billingDay": 0, "clientPublicId": "string", "contactPublicId": "string", "coverLetter": "string", "depositBasisPoints": "string", "expiresOn": "string", "invoiceMode": "string", "isTemplate": false, "opportunityPublicId": "string", "ownerUserPublicId": "string", "prospectPublicId": "string", "sections": [ { "description": "string", "kind": "string", "lines": [ { "adjustable": false, "agreementLineKind": "string", "catalogItemPublicId": "string", "defaultSelected": false, "description": "string", "discountBp": 0, "includedMinutes": 0, "kind": "string", "maxQuantity": "string", "minQuantity": "string", "optional": false, "publicId": "string", "quantity": "string", "taxable": false, "unit": "string", "unitCostCents": 0, "unitPriceCents": 0 } ], "publicId": "string", "title": "string" } ], "taxRateBasisPoints": 0, "templateName": "string", "termMonths": 0, "terms": "string", "timeCoverage": "string", "title": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/sales/quotes/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/quotes/{id}
Section titled “DELETE /api/v1/sales/quotes/{id}”DELETEcrm:writemsp facemspIdempotent
Source: [object Object]
deleteQuote HARD-DELETES a quote that was never sent.
A quote is an OFFER, not an accounting record, and an offer that was never made leaves no hole anybody asks about. That is the deliberate difference from an invoice number, where a gap is what an auditor asks about. A revision that was sent and then withdrawn is not a draft and is not deletable.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/quotes/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/quotes/<id>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/quotes/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes/{id}/accept-link
Section titled “GET /api/v1/sales/quotes/{id}/accept-link”GETcrm:sendmsp facemspIdempotent
Source: [object Object]
getAcceptLink opens the sealed token, and it is the ONLY read path for the plaintext besides the mail composers.
crm:send and not crm:read, because a link is a bearer credential for a document: whoever may hand one out is whoever may send the quote. It appears in no list, detail, event, audit body or log.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, AcceptLinkView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
expiresAt | string (date-time) or null | |
urlrequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes/<id>/accept-link' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/accept-link' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/accept-link"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes/<id>/accept-link", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/accept-link";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes/<id>/accept-link");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/approve
Section titled “POST /api/v1/sales/quotes/{id}/approve”POSTcrm:approvemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Approve quote
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
noterequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/approve' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "note": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "note": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/approve' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/approve"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "note": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "note": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/approve", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/approve";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "note": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "note": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/approve");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/convert
Section titled “POST /api/v1/sales/quotes/{id}/convert”POSTcrm:writemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
retryConversion puts a FAILED conversion back in the queue.
crm:write and not crm:approve: retrying is asking the worker to try again at building what an accepted quote already entitles the customer to, which is pipeline work rather than a decision about money. The 409 on anything but failed is the guard that matters: retrying a conversion that is still running would put two workers on one quote.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/convert' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/convert' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/convert"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/convert", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/convert";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/convert");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/countersign
Section titled “POST /api/v1/sales/quotes/{id}/countersign”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
countersignQuote records the practice’s own signature on an accepted quote.
The executed PDF and the two emails are the POST-COMMIT TAIL, as acceptance’s are, and for the same reason: a render inside the transaction holding the row would deadlock, and a crash between the commit and the render has to leave a record that can be completed rather than a countersignature that failed.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
consentTextrequired | string | |
consentVersionrequired | integer | |
methodrequired | string | |
signatureImagerequired | string | |
signerNamerequired | string | |
signerTitlerequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/countersign' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/countersign' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/countersign"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/countersign", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/countersign";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "consentText": "string", "consentVersion": 0, "method": "string", "signatureImage": "string", "signerName": "string", "signerTitle": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/countersign");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes/{id}/events
Section titled “GET /api/v1/sales/quotes/{id}/events”GETcrm:readmsp facemspIdempotent
Source: [object Object]
listQuoteEvents answers the timeline.
IP AND USER AGENT ARE RENDERED FROM THE SIGNATURE ROW, not stored on an event: the one place holding a signer’s address is the one place that is sealed. They appear on accepted, declined and countersigned and are null everywhere else.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes/<id>/events' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/events' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/events"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes/<id>/events", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/events";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes/<id>/events");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes/{id}/mail
Section titled “GET /api/v1/sales/quotes/{id}/mail”GETcrm:readmsp facemspIdempotent
Source: [object Object]
listQuoteMail answers “what was sent about this quote, and did it arrive”.
The outbox row is the delivery record, which is why there is no MarkQuoteSent: SentAt on the quote is stamped by the send, and whether the message reached anybody is this list’s answer and not that column’s.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes/<id>/mail' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/mail' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/mail"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes/<id>/mail", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/mail";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes/<id>/mail");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/quotes/{id}/pdf/{variant}
Section titled “GET /api/v1/sales/quotes/{id}/pdf/{variant}”GETcrm:readmsp facemspIdempotentdownloadNot fully resolved
What this page does not know
- response
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Get quote pdf
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
variant | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/octet-stream, string (binary) | Success. The body shape was not resolved; see x-outpost-unresolved. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/quotes/<id>/pdf/<variant>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/reject
Section titled “POST /api/v1/sales/quotes/{id}/reject”POSTcrm:approvemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Reject quote
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
noterequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/reject' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "note": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "note": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/reject' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/reject"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "note": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "note": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/reject", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/reject";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "note": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "note": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/reject");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/request-approval
Section titled “POST /api/v1/sales/quotes/{id}/request-approval”POSTcrm:writemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
requestApproval moves a draft to pending_approval and mails every holder of crm:approve.
The APPROVER LIST IS RBAC’s and not a settings field. A SalesSettings.ApproverEmails list would be simpler and would drift from the roles the first time somebody changed one, which is the sort of drift nobody notices until an approval request goes to a person who left.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/request-approval' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/request-approval' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/request-approval"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/request-approval", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/request-approval";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/request-approval");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/resend
Section titled “POST /api/v1/sales/quotes/{id}/resend”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
resendQuote re-mails THE SAME LINK and keeps the status.
It mints nothing, and that is the whole point: a resend that quietly rotated would kill the link already sitting in the customer’s inbox, so the customer who finally clicks the first email would find it dead. Rotating is a separate, explicit action.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/resend' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/resend' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/resend"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/resend", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/resend";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/resend");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/revise
Section titled “POST /api/v1/sales/quotes/{id}/revise”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
reviseQuote writes the NEXT REVISION and supersedes the old row.
It never edits the old one. That row is what a recipient may already have signed, it has a rendered PDF whose hash is printed on a certificate, and “what exactly did we offer them in August” is a question a contract dispute turns on. The response is the NEW draft, which is what the console opens.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/revise' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/revise' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/revise"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/revise", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/revise";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/revise");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/rotate-link
Section titled “POST /api/v1/sales/quotes/{id}/rotate-link”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
rotateLink kills the old link and mints a new one IN ONE UPDATE, so the old link dies at the same instant the new one is born.
The new link is mailed, so rotating is never a silent way to lock a customer out.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/rotate-link");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/send
Section titled “POST /api/v1/sales/quotes/{id}/send”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
sendQuote freezes the document, mints the link and queues the mail.
THE ORDER BELOW IS THE CONTRACT’S AND MIRRORS finalizeInvoice. Everything the store’s transaction needs is read first, because the render closure runs inside that transaction and a database call from it would deadlock against the row it is rendering:
sales settings -> billing settings -> logo -> recipient -> agreement template -> Price(default selections) -> Approval (409 unless approved) -> link base (422) -> NewToken -> compose the mail -> render closure -> SendQuote -> SetOpportunityValue
THE TWO REFUSALS COME BEFORE THE TOKEN IS MINTED, deliberately. A quote held for approval and a Depot with no configured link base must both fail before the document is frozen, so a misconfigured practice never accumulates sent quotes nobody can open.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
expiresOnrequired | string | |
torequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/send' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "expiresOn": "string", "to": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "expiresOn": "string", "to": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/send' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/send"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "expiresOn": "string", "to": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "expiresOn": "string", "to": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/send", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/send";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "expiresOn": "string", "to": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "expiresOn": "string", "to": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/send");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/{id}/withdraw
Section titled “POST /api/v1/sales/quotes/{id}/withdraw”POSTcrm:sendmsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
withdrawQuote pulls a sent quote and NULLs both token columns, so the link dies with the offer.
Terminal: nothing leaves withdrawn except by revising, which writes a new row.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:send. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/<id>/withdraw' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/<id>/withdraw' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/<id>/withdraw"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/<id>/withdraw", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/<id>/withdraw";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/<id>/withdraw");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/from-agreement
Section titled “POST /api/v1/sales/quotes/from-agreement”POSTcrm:writemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
quoteFromAgreement drafts the successor to a running agreement.
MOUNTED TWICE, at /quotes/renewal and /quotes/from-agreement, and it is one handler: the console plan and the lead’s ruling named different paths and both are frozen, so neither reader is wrong and a second implementation would be a second thing to keep in step.
It produces a DRAFT and nothing else. The renewals worker produces one on a cadence and this route is what an operator uses when a crash left an opportunity with no quote, or when they want to renew early; in both cases the answer is a document somebody opens, edits and sends, because renewing a contract without anybody reading it is not a feature.
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
agreementPublicIdrequired | string | |
clientPublicIdrequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/from-agreement' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "agreementPublicId": "string", "clientPublicId": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "agreementPublicId": "string", "clientPublicId": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/from-agreement' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/from-agreement"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "agreementPublicId": "string", "clientPublicId": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "agreementPublicId": "string", "clientPublicId": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/from-agreement", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/from-agreement";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "agreementPublicId": "string", "clientPublicId": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "agreementPublicId": "string", "clientPublicId": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/from-agreement");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/quotes/renewal
Section titled “POST /api/v1/sales/quotes/renewal”POSTcrm:writemsp facemspNot fully resolved
What this page does not know
- response-status
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
quoteFromAgreement drafts the successor to a running agreement.
MOUNTED TWICE, at /quotes/renewal and /quotes/from-agreement, and it is one handler: the console plan and the lead’s ruling named different paths and both are frozen, so neither reader is wrong and a second implementation would be a second thing to keep in step.
It produces a DRAFT and nothing else. The renewals worker produces one on a cadence and this route is what an operator uses when a crash left an opportunity with no quote, or when they want to renew early; in both cases the answer is a document somebody opens, edits and sends, because renewing a contract without anybody reading it is not a feature.
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
agreementPublicIdrequired | string | |
clientPublicIdrequired | string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, QuoteView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:write. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptanceFinishedAt | string (date-time) or null | |
acceptedAt | string (date-time) or null | |
agreementStartsOn | string or null | |
agreementTemplatePublicId | string or null | |
approval | QuoteApprovalView | |
approval.decidedAt | string (date-time) or null | |
approval.decidedByName | string or null | |
approval.decision | string or null | |
approval.noterequired | string | |
approval.reasonsrequired | array of string | |
approval.requestedAtrequired | string (date-time) | |
approval.requestedByName | string or null | |
artifactError | string or null | |
billedOnMilestonesCentsrequired | integer | int64. |
billingDayrequired | integer | |
clientPublicId | string or null | |
consentVersionrequired | integer | |
contactEmailrequired | string | |
contactNamerequired | string | |
contactPublicId | string or null | |
conversion | QuoteConversionView | |
conversion.agreementPublicId | string or null | |
conversion.attemptsrequired | integer | |
conversion.clientPublicId | string or null | |
conversion.completedAt | string (date-time) or null | |
conversion.error | string or null | |
conversion.invoicePublicId | string or null | |
conversion.statusrequired | string | |
conversion.ticketPublicId | string or null | |
convertedSalesOrderId | string or null | |
countersignConsentTextrequired | string | |
countersignature | QuoteSignatureView | |
countersignature.consentTextrequired | string | |
countersignature.consentVersionrequired | integer | |
countersignature.documentSha256required | string | |
countersignature.hasImagerequired | boolean | |
countersignature.iprequired | string | |
countersignature.methodrequired | string | |
countersignature.signedAtrequired | string (date-time) | |
countersignature.signerEmailrequired | string | |
countersignature.signerNamerequired | string | |
countersignature.signerTitlerequired | string | |
countersignature.timeZonerequired | string | |
countersignature.userAgentrequired | string | |
countersignedAt | string (date-time) or null | |
coverLetterrequired | string | |
createdAtrequired | string (date-time) | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
depositBasisPoints | integer or null | |
displayNumberrequired | string | |
expiresOn | string or null | |
externalNumber | string or null | |
externalTool | string or null | |
firstViewedAt | string (date-time) or null | |
invoiceMode | string or null | |
isTemplaterequired | boolean | |
lastViewedAt | string (date-time) or null | |
needsApprovalrequired | boolean | |
numberrequired | string | |
opportunityPublicId | string or null | |
ownerName | string or null | |
ownerUserPublicId | string or null | |
pdfrequired | object | |
previousRevisionPublicId | string or null | |
prospectPublicId | string or null | |
publicIdrequired | string | |
recipientNamerequired | string | |
revisionrequired | integer | |
revisionsrequired | array of QuoteRevisionRefView | |
revisions[].createdAtrequired | string (date-time) | |
revisions[].publicIdrequired | string | |
revisions[].revisionrequired | integer | |
revisions[].statusrequired | string | |
sectionsrequired | array of QuoteSectionView | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of QuoteLineView | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].agreementLineKind | string or null | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].catalogItemPublicId | string or null | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].positionrequired | integer | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitCostCentsrequired | integer | int64. |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].positionrequired | integer | |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
sentAt | string (date-time) or null | |
signature | QuoteSignatureView | |
signature.consentTextrequired | string | |
signature.consentVersionrequired | integer | |
signature.documentSha256required | string | |
signature.hasImagerequired | boolean | |
signature.iprequired | string | |
signature.methodrequired | string | |
signature.signedAtrequired | string (date-time) | |
signature.signerEmailrequired | string | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.timeZonerequired | string | |
signature.userAgentrequired | string | |
sourcerequired | string, one of external, native | |
statusrequired | string | |
supersededByPublicId | string or null | |
taxRateBasisPointsrequired | integer | |
templateNamerequired | string | |
termMonthsrequired | integer | |
termsrequired | string | |
timeCoveragerequired | string | |
titlerequired | string | |
totalsrequired | QuoteTotalsView | quoteTotalsView is the ten figures, in the one shape every surface reads. |
totals.contractValueCentsrequired | integer | int64. |
totals.costCentsrequired | integer | int64. |
totals.discountOneTimeCentsrequired | integer | int64. |
totals.discountRecurringCentsrequired | integer | int64. |
totals.dueOnAcceptanceCentsrequired | integer | int64. |
totals.marginBp | integer or null | |
totals.monthlyRecurringCentsrequired | integer | int64. |
totals.oneTimeSubtotalCentsrequired | integer | int64. |
totals.recurringSubtotalCentsrequired | integer | int64. |
totals.taxOneTimeCentsrequired | integer | int64. |
totals.taxRecurringCentsrequired | integer | int64. |
updatedAtrequired | string (date-time) | |
viewCountrequired | integer | |
viewedAt | string (date-time) or null | |
withdrawnAt | string (date-time) or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/quotes/renewal' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "agreementPublicId": "string", "clientPublicId": "string"}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "agreementPublicId": "string", "clientPublicId": "string"}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/quotes/renewal' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/quotes/renewal"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "agreementPublicId": "string", "clientPublicId": "string",}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "agreementPublicId": "string", "clientPublicId": "string"}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/quotes/renewal", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/quotes/renewal";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "agreementPublicId": "string", "clientPublicId": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "agreementPublicId": "string", "clientPublicId": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/quotes/renewal");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/settings
Section titled “GET /api/v1/sales/settings”GETcrm:readmsp facemspIdempotent
Source: [object Object]
Get sales settings
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesSettingsView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
approvalsrequired | SalesApprovalsView | |
approvals.lineDiscountAboveBprequired | integer | |
approvals.marginBelowBprequired | integer | |
approvals.totalAboveCentsrequired | integer | int64. |
automationrequired | SalesAutomationView | |
automation.expiringReminderDaysrequired | integer | |
automation.renewalLeadDaysrequired | integer | |
automation.requireCountersignrequired | boolean | |
automation.unviewedNudgeDaysrequired | integer | |
brandingrequired | SalesBrandingView | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
branding.replyTorequired | string | |
ordersrequired | SalesOrderSettingsView | |
orders.defaultDepositBasisPointsrequired | integer | |
orders.defaultInvoiceModerequired | string | |
orders.salesOrderPrefixrequired | string | |
quotesrequired | SalesQuoteDefaultsView | |
quotes.defaultCoverLetterrequired | string | |
quotes.defaultTermsrequired | string | |
quotes.numberPrefixrequired | string | |
quotes.validDaysrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/settings' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/settings' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/settings"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/settings", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/settings";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/settings");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/sales/settings
Section titled “PUT /api/v1/sales/settings”PUTcrm:approvemsp facemspIdempotent
Source: [object Object]
Put sales settings
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
approvalsrequired | SalesApprovalsView | |
approvals.lineDiscountAboveBprequired | integer | |
approvals.marginBelowBprequired | integer | |
approvals.totalAboveCentsrequired | integer | int64. |
automationrequired | SalesAutomationView | |
automation.expiringReminderDaysrequired | integer | |
automation.renewalLeadDaysrequired | integer | |
automation.requireCountersignrequired | boolean | |
automation.unviewedNudgeDaysrequired | integer | |
brandingrequired | object | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.replyTorequired | string | |
orders | SalesOrderSettingsView | |
orders.defaultDepositBasisPointsrequired | integer | |
orders.defaultInvoiceModerequired | string | |
orders.salesOrderPrefixrequired | string | |
quotesrequired | SalesQuoteDefaultsView | |
quotes.defaultCoverLetterrequired | string | |
quotes.defaultTermsrequired | string | |
quotes.numberPrefixrequired | string | |
quotes.validDaysrequired | integer |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesSettingsView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
approvalsrequired | SalesApprovalsView | |
approvals.lineDiscountAboveBprequired | integer | |
approvals.marginBelowBprequired | integer | |
approvals.totalAboveCentsrequired | integer | int64. |
automationrequired | SalesAutomationView | |
automation.expiringReminderDaysrequired | integer | |
automation.renewalLeadDaysrequired | integer | |
automation.requireCountersignrequired | boolean | |
automation.unviewedNudgeDaysrequired | integer | |
brandingrequired | SalesBrandingView | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
branding.replyTorequired | string | |
ordersrequired | SalesOrderSettingsView | |
orders.defaultDepositBasisPointsrequired | integer | |
orders.defaultInvoiceModerequired | string | |
orders.salesOrderPrefixrequired | string | |
quotesrequired | SalesQuoteDefaultsView | |
quotes.defaultCoverLetterrequired | string | |
quotes.defaultTermsrequired | string | |
quotes.numberPrefixrequired | string | |
quotes.validDaysrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X PUT 'https://depot.example.com/api/v1/sales/settings' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0 }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": false, "unviewedNudgeDays": 0 }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string" }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string" }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0 }}'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0 }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": false, "unviewedNudgeDays": 0 }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string" }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string" }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0 }}'@
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/sales/settings' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/settings"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0, }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": False, "unviewedNudgeDays": 0, }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string", }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string", }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0, },}
response = requests.put(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0 }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": false, "unviewedNudgeDays": 0 }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string" }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string" }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0 }}`)
req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/sales/settings", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/settings";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0 }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": false, "unviewedNudgeDays": 0 }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string" }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string" }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0 } }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "approvals": { "lineDiscountAboveBp": 0, "marginBelowBp": 0, "totalAboveCents": 0 }, "automation": { "expiringReminderDays": 0, "renewalLeadDays": 0, "requireCountersign": false, "unviewedNudgeDays": 0 }, "branding": { "accentColor": "string", "displayName": "string", "replyTo": "string" }, "orders": { "defaultDepositBasisPoints": 0, "defaultInvoiceMode": "string", "salesOrderPrefix": "string" }, "quotes": { "defaultCoverLetter": "string", "defaultTerms": "string", "numberPrefix": "string", "validDays": 0 }}""";
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/sales/settings");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/settings/logo
Section titled “GET /api/v1/sales/settings/logo”GETcrm:readmsp facemspIdempotentdownloadNot fully resolved
What this page does not know
- response
These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.
Source: [object Object]
Get sales logo
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/octet-stream, string (binary) | Success. The body shape was not resolved; see x-outpost-unresolved. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/settings/logo' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/settings/logo' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/settings/logo"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/settings/logo", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/settings/logo";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/settings/logo");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/sales/settings/logo
Section titled “PUT /api/v1/sales/settings/logo”PUTcrm:approvemsp facemspIdempotent
Source: [object Object]
putSalesLogo takes one image as the RAW request body.
Raw body rather than multipart, following branding.go’s uploadLogo: there is one file and no other fields, so multipart would add a parser, a spool and its own limits to carry no information. The type travels in Content-Type, which is where an HTTP client already puts it.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, SalesSettingsView | Success. |
400 | application/problem+json, ProblemDetails | The request body could not be read. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches. |
413 | application/problem+json, ProblemDetails | The request was refused. |
415 | application/problem+json, ProblemDetails | A logo must be a PNG or JPEG image. SVG is not accepted, because it can carry script, and WebP is not accepted, because it cannot be embedded in the quote PDF. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
approvalsrequired | SalesApprovalsView | |
approvals.lineDiscountAboveBprequired | integer | |
approvals.marginBelowBprequired | integer | |
approvals.totalAboveCentsrequired | integer | int64. |
automationrequired | SalesAutomationView | |
automation.expiringReminderDaysrequired | integer | |
automation.renewalLeadDaysrequired | integer | |
automation.requireCountersignrequired | boolean | |
automation.unviewedNudgeDaysrequired | integer | |
brandingrequired | SalesBrandingView | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
branding.replyTorequired | string | |
ordersrequired | SalesOrderSettingsView | |
orders.defaultDepositBasisPointsrequired | integer | |
orders.defaultInvoiceModerequired | string | |
orders.salesOrderPrefixrequired | string | |
quotesrequired | SalesQuoteDefaultsView | |
quotes.defaultCoverLetterrequired | string | |
quotes.defaultTermsrequired | string | |
quotes.numberPrefixrequired | string | |
quotes.validDaysrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X PUT 'https://depot.example.com/api/v1/sales/settings/logo' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/sales/settings/logo' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/settings/logo"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.put(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/sales/settings/logo", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/settings/logo";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/sales/settings/logo");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/settings/logo
Section titled “DELETE /api/v1/sales/settings/logo”DELETEcrm:approvemsp facemspIdempotent
Source: [object Object]
Delete sales logo
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/settings/logo' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/settings/logo' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/settings/logo"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/settings/logo", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/settings/logo";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/settings/logo");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/sales/stages
Section titled “GET /api/v1/sales/stages”GETcrm:readmsp facemspIdempotent
Source: [object Object]
List stages
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:read. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X GET 'https://depot.example.com/api/v1/sales/stages' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/sales/stages' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/stages"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/sales/stages", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/stages";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/sales/stages");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/sales/stages
Section titled “POST /api/v1/sales/stages”POSTcrm:approvemsp facemsp
Source: [object Object]
Create stage
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
kind | string or null | |
name | string or null | |
probability | integer or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, PipelineStageView | Created. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
201 response body
| Field | Type | Description |
|---|---|---|
kindrequired | string | |
namerequired | string | |
positionrequired | integer | |
probabilityrequired | integer | |
publicIdrequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/sales/stages' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "kind": "string", "name": "string", "probability": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "kind": "string", "name": "string", "probability": 0}'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/sales/stages' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/stages"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "kind": "string", "name": "string", "probability": 0,}
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "kind": "string", "name": "string", "probability": 0}`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/sales/stages", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/stages";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "kind": "string", "name": "string", "probability": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "kind": "string", "name": "string", "probability": 0}""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/sales/stages");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PATCH /api/v1/sales/stages/{id}
Section titled “PATCH /api/v1/sales/stages/{id}”PATCHcrm:approvemsp facemsp
Source: [object Object]
patchStage renames a stage or changes its probability.
THE KIND IS NOT PATCHABLE and its absence from the request type is the whole statement: “mark won” resolves the terminal stage by kind, so turning an open column into the won one would move where every future win lands and leave the old won column holding deals nobody would find again.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
kind | string or null | |
name | string or null | |
probability | integer or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PipelineStageView | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
200 response body
| Field | Type | Description |
|---|---|---|
kindrequired | string | |
namerequired | string | |
positionrequired | integer | |
probabilityrequired | integer | |
publicIdrequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X PATCH 'https://depot.example.com/api/v1/sales/stages/<id>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "kind": "string", "name": "string", "probability": 0}'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "kind": "string", "name": "string", "probability": 0}'@
$response = Invoke-RestMethod ` -Method Patch ` -Uri 'https://depot.example.com/api/v1/sales/stages/<id>' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/sales/stages/<id>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "kind": "string", "name": "string", "probability": 0,}
response = requests.patch(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "kind": "string", "name": "string", "probability": 0}`)
req, err := http.NewRequest(http.MethodPatch, "https://depot.example.com/api/v1/sales/stages/<id>", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/stages/<id>";
const response = await fetch(url, { method: "PATCH", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "kind": "string", "name": "string", "probability": 0 }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "kind": "string", "name": "string", "probability": 0}""";
var request = new HttpRequestMessage(HttpMethod.Patch, "https://depot.example.com/api/v1/sales/stages/<id>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/sales/stages/{id}
Section titled “DELETE /api/v1/sales/stages/{id}”DELETEcrm:approvemsp facemspIdempotent
Source: [object Object]
deleteStage soft-deletes a stage and moves its open opportunities elsewhere.
?moveTo= is REQUIRED when the stage holds anything, and the store does the move in the same transaction as the delete: a two-call version would leave deals in a column that no longer exists if the second call failed.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes | A uuid. |
moveTo | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X DELETE 'https://depot.example.com/api/v1/sales/stages/<id>?moveTo=<moveTo>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/sales/stages/<id>?moveTo=<moveTo>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/stages/<id>"params = { "moveTo": "<moveTo>",}headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/sales/stages/<id>?moveTo=<moveTo>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/v1/sales/stages/<id>");url.searchParams.set("moveTo", "<moveTo>");
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/sales/stages/<id>?moveTo=<moveTo>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/sales/stages/order
Section titled “PUT /api/v1/sales/stages/order”PUTcrm:approvemsp facemspIdempotent
Source: [object Object]
reorderStages renumbers the board.
The body is the WHOLE live set in the new order; the store refuses anything else, because a reorder that silently dropped a stage would leave it at its old position, interleaved.
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
publicIdsrequired | array of string |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, object | Success. |
400 | application/problem+json, ProblemDetails | The request body is not valid JSON. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold crm:approve. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
503 | application/problem+json, ProblemDetails | Sales is not available on this server. |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.curl -X PUT 'https://depot.example.com/api/v1/sales/stages/order' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "publicIds": [ "string" ]}'# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "publicIds": [ "string" ]}'@
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/sales/stages/order' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/v1/sales/stages/order"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "publicIds": [ "string", ],}
response = requests.put(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "publicIds": [ "string" ]}`)
req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/sales/stages/order", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/sales/stages/order";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "publicIds": [ "string" ] }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "publicIds": [ "string" ]}""";
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/sales/stages/order");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.