Skip to content

Depot sales

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.

GETcrm:readmsp facemspIdempotent

Source: [object Object]

List activities

NameInTypeRequiredDescription
assigneequerystringNo
clientquerystringNo
kindquerystringNo
limitquerystringNo
opportunityquerystringNo
prospectquerystringNo
quotequerystringNo
sortquerystring, one of due, occurredNoSort key.
StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

POSTcrm:writemsp facemsp

Source: [object Object]

Create activity

Required, sent as application/json.

FieldTypeDescription
assigneeUserPublicIdstring or null
bodystring or null
clientPublicIdstring or null
dueOnstring or null
kindstring or null
occurredAtstring or null
opportunityPublicIdstring or null
prospectPublicIdstring or null
quotePublicIdstring or null
StatusBodyDescription
201application/json, SalesActivityViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
assigneeNamestring or null
assigneeUserPublicIdstring or null
authorNamestring or null
authorUserPublicIdstring or null
bodyrequiredstring
clientPublicIdstring or null
completedAtstring (date-time) or null
createdAtrequiredstring (date-time)
dueOnstring or null
kindrequiredstring
occurredAtrequiredstring (date-time)
opportunityPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
quotePublicIdstring or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
assigneeUserPublicIdstring or null
bodystring or null
clientPublicIdstring or null
dueOnstring or null
kindstring or null
occurredAtstring or null
opportunityPublicIdstring or null
prospectPublicIdstring or null
quotePublicIdstring or null
StatusBodyDescription
200application/json, SalesActivityViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
assigneeNamestring or null
assigneeUserPublicIdstring or null
authorNamestring or null
authorUserPublicIdstring or null
bodyrequiredstring
clientPublicIdstring or null
completedAtstring (date-time) or null
createdAtrequiredstring (date-time)
dueOnstring or null
kindrequiredstring
occurredAtrequiredstring (date-time)
opportunityPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
quotePublicIdstring or null
Terminal window
# 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"
}'

DELETEcrm:writemsp facemspIdempotent

Source: [object Object]

Delete activity

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, SalesActivityViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
assigneeNamestring or null
assigneeUserPublicIdstring or null
authorNamestring or null
authorUserPublicIdstring or null
bodyrequiredstring
clientPublicIdstring or null
completedAtstring (date-time) or null
createdAtrequiredstring (date-time)
dueOnstring or null
kindrequiredstring
occurredAtrequiredstring (date-time)
opportunityPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
quotePublicIdstring or null
Terminal window
# 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>'

GETmsp facemspIdempotent

Source: [object Object]

List catalog items

NameInTypeRequiredDescription
kindquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
StatusBodyDescription
200application/json, PagedResultCatalogItemViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of CatalogItemView
items[].activerequiredboolean
items[].agreementLineKindstring or null
items[].billOnMilestonesrequiredboolean
items[].categoryrequiredstring
items[].createdAtrequiredstring (date-time)
items[].currencyCoderequiredstring
items[].descriptionrequiredstring
items[].fulfillablerequiredboolean
items[].includedMinutesrequiredinteger
items[].kindrequiredstring
items[].namerequiredstring
items[].projectTemplateFamilyPublicIdstring or null
items[].publicIdrequiredstring
items[].skurequiredstring
items[].sortOrderrequiredinteger
items[].stockItemIdstring or null
items[].taxablerequiredboolean
items[].unitrequiredstring
items[].unitCostCentsrequiredinteger

int64.

items[].unitPriceCentsrequiredinteger

int64.

items[].updatedAtrequiredstring (date-time)
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# 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>'

POSTpsa:adminmsp facemsp

Source: [object Object]

Create catalog item

Required, sent as application/json.

FieldTypeDescription
activeboolean or null
agreementLineKindstring or null
billOnMilestonesboolean or null
categorystring or null
descriptionstring or null
fulfillableboolean or null
includedMinutesinteger or null
kindstring or null
namestring or null
projectTemplateFamilyPublicIdstring or null
skurequiredstring
sortOrderinteger or null
stockItemIdstring or null
taxableboolean or null
unitstring or null
unitCostCentsinteger or null

int64.

unitPriceCentsinteger or null

int64.

StatusBodyDescription
201application/json, CatalogItemViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
activerequiredboolean
agreementLineKindstring or null
billOnMilestonesrequiredboolean
categoryrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
descriptionrequiredstring
fulfillablerequiredboolean
includedMinutesrequiredinteger
kindrequiredstring
namerequiredstring
projectTemplateFamilyPublicIdstring or null
publicIdrequiredstring
skurequiredstring
sortOrderrequiredinteger
stockItemIdstring or null
taxablerequiredboolean
unitrequiredstring
unitCostCentsrequiredinteger

int64.

unitPriceCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
Terminal window
# 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
}'

GETmsp facemspIdempotent

Source: [object Object]

Get catalog item

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, CatalogItemViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
activerequiredboolean
agreementLineKindstring or null
billOnMilestonesrequiredboolean
categoryrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
descriptionrequiredstring
fulfillablerequiredboolean
includedMinutesrequiredinteger
kindrequiredstring
namerequiredstring
projectTemplateFamilyPublicIdstring or null
publicIdrequiredstring
skurequiredstring
sortOrderrequiredinteger
stockItemIdstring or null
taxablerequiredboolean
unitrequiredstring
unitCostCentsrequiredinteger

int64.

unitPriceCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
activeboolean or null
agreementLineKindstring or null
billOnMilestonesboolean or null
categorystring or null
descriptionstring or null
fulfillableboolean or null
includedMinutesinteger or null
kindstring or null
namestring or null
projectTemplateFamilyPublicIdstring or null
skurequiredstring
sortOrderinteger or null
stockItemIdstring or null
taxableboolean or null
unitstring or null
unitCostCentsinteger or null

int64.

unitPriceCentsinteger or null

int64.

StatusBodyDescription
200application/json, CatalogItemViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not update the catalog item.
501application/problem+json, ProblemDetailsThis server cannot mark catalog items fulfillable.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
activerequiredboolean
agreementLineKindstring or null
billOnMilestonesrequiredboolean
categoryrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
descriptionrequiredstring
fulfillablerequiredboolean
includedMinutesrequiredinteger
kindrequiredstring
namerequiredstring
projectTemplateFamilyPublicIdstring or null
publicIdrequiredstring
skurequiredstring
sortOrderrequiredinteger
stockItemIdstring or null
taxablerequiredboolean
unitrequiredstring
unitCostCentsrequiredinteger

int64.

unitPriceCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
Terminal window
# 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
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

StatusBodyDescription
200application/json, SalesDashboardViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
currencyCoderequiredstring
expiringWithin7Daysrequiredinteger
myOverdueTasksrequiredinteger
openOpportunitiesrequiredinteger
openPipelineValueCentsrequiredinteger

int64.

quotesAwaitingrequiredinteger
quotesAwaitingValueCentsrequiredinteger

int64.

wonThisQuarterCentsrequiredinteger

int64.

wonThisQuarterCountrequiredinteger
Terminal window
# 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>'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

List opportunities

NameInTypeRequiredDescription
clientquerystringNo
kindquerystringNo
outcomequerystringNo
ownerquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
prospectquerystringNo
qquerystringNoFree-text search term.
sortquerystring, one of expected, name, stage, updated, valueNoSort key.
stagequerystringNo
StatusBodyDescription
200application/json, PagedResultOpportunityViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of OpportunityView
items[].clientPublicIdstring or null
items[].closedAtstring (date-time) or null
items[].createdAtrequiredstring (date-time)
items[].currencyCoderequiredstring
items[].expectedCloseOnstring or null
items[].kindrequiredstring
items[].latestQuotePublicIdstring or null
items[].lostReasonstring or null
items[].namerequiredstring
items[].notesrequiredstring
items[].ownerNamestring or null
items[].ownerUserPublicIdstring or null
items[].partyNamerequiredstring
items[].probabilityrequiredinteger
items[].prospectPublicIdstring or null
items[].publicIdrequiredstring
items[].quoteCountrequiredinteger
items[].renewalOfAgreementPublicIdstring or null
items[].sourcerequiredstring
items[].stageEnteredAtrequiredstring (date-time)
items[].stageKindrequiredstring
items[].stageNamerequiredstring
items[].stagePublicIdrequiredstring
items[].updatedAtrequiredstring (date-time)
items[].valueCentsrequiredinteger

int64.

pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# 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>'

POSTcrm:writemsp facemsp

Source: [object Object]

Create opportunity

Required, sent as application/json.

FieldTypeDescription
clientPublicIdstring or null
expectedCloseOnstring or null
kindstring or null
namestring or null
notesstring or null
ownerUserPublicIdstring or null
probabilityinteger or null
prospectPublicIdstring or null
stagePublicIdstring or null
valueCentsinteger or null

int64.

StatusBodyDescription
201application/json, OpportunityViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
409application/problem+json, ProblemDetailsThis board has no open stage to put a deal in. Add one on the sales settings page.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
clientPublicIdstring or null
closedAtstring (date-time) or null
createdAtrequiredstring (date-time)
currencyCoderequiredstring
expectedCloseOnstring or null
kindrequiredstring
latestQuotePublicIdstring or null
lostReasonstring or null
namerequiredstring
notesrequiredstring
ownerNamestring or null
ownerUserPublicIdstring or null
partyNamerequiredstring
probabilityrequiredinteger
prospectPublicIdstring or null
publicIdrequiredstring
quoteCountrequiredinteger
renewalOfAgreementPublicIdstring or null
sourcerequiredstring
stageEnteredAtrequiredstring (date-time)
stageKindrequiredstring
stageNamerequiredstring
stagePublicIdrequiredstring
updatedAtrequiredstring (date-time)
valueCentsrequiredinteger

int64.

Terminal window
# 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
}'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

Get opportunity

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, OpportunityViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
clientPublicIdstring or null
closedAtstring (date-time) or null
createdAtrequiredstring (date-time)
currencyCoderequiredstring
expectedCloseOnstring or null
kindrequiredstring
latestQuotePublicIdstring or null
lostReasonstring or null
namerequiredstring
notesrequiredstring
ownerNamestring or null
ownerUserPublicIdstring or null
partyNamerequiredstring
probabilityrequiredinteger
prospectPublicIdstring or null
publicIdrequiredstring
quoteCountrequiredinteger
renewalOfAgreementPublicIdstring or null
sourcerequiredstring
stageEnteredAtrequiredstring (date-time)
stageKindrequiredstring
stageNamerequiredstring
stagePublicIdrequiredstring
updatedAtrequiredstring (date-time)
valueCentsrequiredinteger

int64.

Terminal window
# 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>'

PATCHcrm:writemsp facemsp

Source: [object Object]

Patch opportunity

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
clientPublicIdstring or null
expectedCloseOnstring or null
kindstring or null
namestring or null
notesstring or null
ownerUserPublicIdstring or null
probabilityinteger or null
prospectPublicIdstring or null
stagePublicIdstring or null
valueCentsinteger or null

int64.

StatusBodyDescription
200application/json, OpportunityViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
clientPublicIdstring or null
closedAtstring (date-time) or null
createdAtrequiredstring (date-time)
currencyCoderequiredstring
expectedCloseOnstring or null
kindrequiredstring
latestQuotePublicIdstring or null
lostReasonstring or null
namerequiredstring
notesrequiredstring
ownerNamestring or null
ownerUserPublicIdstring or null
partyNamerequiredstring
probabilityrequiredinteger
prospectPublicIdstring or null
publicIdrequiredstring
quoteCountrequiredinteger
renewalOfAgreementPublicIdstring or null
sourcerequiredstring
stageEnteredAtrequiredstring (date-time)
stageKindrequiredstring
stageNamerequiredstring
stagePublicIdrequiredstring
updatedAtrequiredstring (date-time)
valueCentsrequiredinteger

int64.

Terminal window
# 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
}'

DELETEcrm:writemsp facemspIdempotent

Source: [object Object]

Delete opportunity

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
lostReasonrequiredstring
stagePublicIdrequiredstring
StatusBodyDescription
200application/json, OpportunityViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
clientPublicIdstring or null
closedAtstring (date-time) or null
createdAtrequiredstring (date-time)
currencyCoderequiredstring
expectedCloseOnstring or null
kindrequiredstring
latestQuotePublicIdstring or null
lostReasonstring or null
namerequiredstring
notesrequiredstring
ownerNamestring or null
ownerUserPublicIdstring or null
partyNamerequiredstring
probabilityrequiredinteger
prospectPublicIdstring or null
publicIdrequiredstring
quoteCountrequiredinteger
renewalOfAgreementPublicIdstring or null
sourcerequiredstring
stageEnteredAtrequiredstring (date-time)
stageKindrequiredstring
stageNamerequiredstring
stagePublicIdrequiredstring
updatedAtrequiredstring (date-time)
valueCentsrequiredinteger

int64.

Terminal window
# 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"
}'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

List prospects

NameInTypeRequiredDescription
ownerquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
sortquerystring, one of created, name, updatedNoSort key.
StatusBodyDescription
200application/json, PagedResultProspectViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of ProspectView
items[].addressLine1requiredstring
items[].addressLine2requiredstring
items[].cityrequiredstring
items[].clientPublicIdstring or null
items[].contactsarray of ProspectContactView
items[].contacts[].createdAtrequiredstring (date-time)
items[].contacts[].emailrequiredstring
items[].contacts[].namerequiredstring
items[].contacts[].phonerequiredstring
items[].contacts[].primaryrequiredboolean
items[].contacts[].prospectPublicIdrequiredstring
items[].contacts[].publicIdrequiredstring
items[].contacts[].titlerequiredstring
items[].convertedAtstring (date-time) or null
items[].countryrequiredstring
items[].createdAtrequiredstring (date-time)
items[].industryrequiredstring
items[].namerequiredstring
items[].notesrequiredstring
items[].openOpportunitiesrequiredinteger
items[].ownerNamestring or null
items[].ownerUserPublicIdstring or null
items[].phonerequiredstring
items[].postalCoderequiredstring
items[].primaryContactProspectContactView
items[].primaryContact.createdAtrequiredstring (date-time)
items[].primaryContact.emailrequiredstring
items[].primaryContact.namerequiredstring
items[].primaryContact.phonerequiredstring
items[].primaryContact.primaryrequiredboolean
items[].primaryContact.prospectPublicIdrequiredstring
items[].primaryContact.publicIdrequiredstring
items[].primaryContact.titlerequiredstring
items[].publicIdrequiredstring
items[].regionrequiredstring
items[].sourcerequiredstring
items[].statusrequiredstring
items[].updatedAtrequiredstring (date-time)
items[].websiterequiredstring
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# 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>'

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.

Required, sent as application/json.

FieldTypeDescription
addressLine1string or null
addressLine2string or null
citystring or null
countrystring or null
industrystring or null
namestring or null
notesstring or null
ownerUserPublicIdstring or null
phonestring or null
postalCodestring or null
regionstring or null
sourcestring or null
websitestring or null
StatusBodyDescription
201application/json, ProspectViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
addressLine1requiredstring
addressLine2requiredstring
cityrequiredstring
clientPublicIdstring or null
contactsarray of ProspectContactView
contacts[].createdAtrequiredstring (date-time)
contacts[].emailrequiredstring
contacts[].namerequiredstring
contacts[].phonerequiredstring
contacts[].primaryrequiredboolean
contacts[].prospectPublicIdrequiredstring
contacts[].publicIdrequiredstring
contacts[].titlerequiredstring
convertedAtstring (date-time) or null
countryrequiredstring
createdAtrequiredstring (date-time)
industryrequiredstring
namerequiredstring
notesrequiredstring
openOpportunitiesrequiredinteger
ownerNamestring or null
ownerUserPublicIdstring or null
phonerequiredstring
postalCoderequiredstring
primaryContactProspectContactView
primaryContact.createdAtrequiredstring (date-time)
primaryContact.emailrequiredstring
primaryContact.namerequiredstring
primaryContact.phonerequiredstring
primaryContact.primaryrequiredboolean
primaryContact.prospectPublicIdrequiredstring
primaryContact.publicIdrequiredstring
primaryContact.titlerequiredstring
publicIdrequiredstring
regionrequiredstring
sourcerequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
websiterequiredstring
Terminal window
# 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"
}'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

Get prospect

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, ProspectViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
addressLine1requiredstring
addressLine2requiredstring
cityrequiredstring
clientPublicIdstring or null
contactsarray of ProspectContactView
contacts[].createdAtrequiredstring (date-time)
contacts[].emailrequiredstring
contacts[].namerequiredstring
contacts[].phonerequiredstring
contacts[].primaryrequiredboolean
contacts[].prospectPublicIdrequiredstring
contacts[].publicIdrequiredstring
contacts[].titlerequiredstring
convertedAtstring (date-time) or null
countryrequiredstring
createdAtrequiredstring (date-time)
industryrequiredstring
namerequiredstring
notesrequiredstring
openOpportunitiesrequiredinteger
ownerNamestring or null
ownerUserPublicIdstring or null
phonerequiredstring
postalCoderequiredstring
primaryContactProspectContactView
primaryContact.createdAtrequiredstring (date-time)
primaryContact.emailrequiredstring
primaryContact.namerequiredstring
primaryContact.phonerequiredstring
primaryContact.primaryrequiredboolean
primaryContact.prospectPublicIdrequiredstring
primaryContact.publicIdrequiredstring
primaryContact.titlerequiredstring
publicIdrequiredstring
regionrequiredstring
sourcerequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
websiterequiredstring
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
addressLine1string or null
addressLine2string or null
citystring or null
countrystring or null
industrystring or null
namestring or null
notesstring or null
ownerUserPublicIdstring or null
phonestring or null
postalCodestring or null
regionstring or null
sourcestring or null
websitestring or null
StatusBodyDescription
200application/json, ProspectViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
addressLine1requiredstring
addressLine2requiredstring
cityrequiredstring
clientPublicIdstring or null
contactsarray of ProspectContactView
contacts[].createdAtrequiredstring (date-time)
contacts[].emailrequiredstring
contacts[].namerequiredstring
contacts[].phonerequiredstring
contacts[].primaryrequiredboolean
contacts[].prospectPublicIdrequiredstring
contacts[].publicIdrequiredstring
contacts[].titlerequiredstring
convertedAtstring (date-time) or null
countryrequiredstring
createdAtrequiredstring (date-time)
industryrequiredstring
namerequiredstring
notesrequiredstring
openOpportunitiesrequiredinteger
ownerNamestring or null
ownerUserPublicIdstring or null
phonerequiredstring
postalCoderequiredstring
primaryContactProspectContactView
primaryContact.createdAtrequiredstring (date-time)
primaryContact.emailrequiredstring
primaryContact.namerequiredstring
primaryContact.phonerequiredstring
primaryContact.primaryrequiredboolean
primaryContact.prospectPublicIdrequiredstring
primaryContact.publicIdrequiredstring
primaryContact.titlerequiredstring
publicIdrequiredstring
regionrequiredstring
sourcerequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
websiterequiredstring
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

List contacts

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

POST /api/v1/sales/prospects/{id}/contacts

Section titled “POST /api/v1/sales/prospects/{id}/contacts”

POSTcrm:writemsp facemsp

Source: [object Object]

Create contact

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
emailstring or null
namestring or null
phonestring or null
primaryboolean or null
titlestring or null
StatusBodyDescription
201application/json, ProspectContactViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
emailrequiredstring
namerequiredstring
phonerequiredstring
primaryrequiredboolean
prospectPublicIdrequiredstring
publicIdrequiredstring
titlerequiredstring
Terminal window
# 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"
}'

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

NameInTypeRequiredDescription
cidpathstringYesA uuid.
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
emailstring or null
namestring or null
phonestring or null
primaryboolean or null
titlestring or null
StatusBodyDescription
200application/json, ProspectContactViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
createdAtrequiredstring (date-time)
emailrequiredstring
namerequiredstring
phonerequiredstring
primaryrequiredboolean
prospectPublicIdrequiredstring
publicIdrequiredstring
titlerequiredstring
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
cidpathstringYesA uuid.
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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).

NameInTypeRequiredDescription
clientquerystringNo
isTemplatequerystringNo
opportunityquerystringNo
ownerquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
prospectquerystringNo
qquerystringNoFree-text search term.
sortquerystring, one of expires, number, requested, total, updatedNoSort key.
StatusBodyDescription
200application/json, PagedResultQuoteSummaryViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of QuoteSummaryView
items[].acceptedAtstring (date-time) or null
items[].clientPublicIdstring or null
items[].contactEmailrequiredstring
items[].contactNamerequiredstring
items[].contactPublicIdstring or null
items[].createdAtrequiredstring (date-time)
items[].currencyCoderequiredstring
items[].displayNumberrequiredstring
items[].expiresOnstring or null
items[].isTemplaterequiredboolean
items[].needsApprovalrequiredboolean
items[].numberrequiredstring
items[].opportunityPublicIdstring or null
items[].ownerNamestring or null
items[].ownerUserPublicIdstring or null
items[].prospectPublicIdstring or null
items[].publicIdrequiredstring
items[].recipientNamerequiredstring
items[].revisionrequiredinteger
items[].sentAtstring (date-time) or null
items[].statusrequiredstring
items[].templateNamerequiredstring
items[].titlerequiredstring
items[].totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

items[].totals.contractValueCentsrequiredinteger

int64.

items[].totals.costCentsrequiredinteger

int64.

items[].totals.discountOneTimeCentsrequiredinteger

int64.

items[].totals.discountRecurringCentsrequiredinteger

int64.

items[].totals.dueOnAcceptanceCentsrequiredinteger

int64.

items[].totals.marginBpinteger or null
items[].totals.monthlyRecurringCentsrequiredinteger

int64.

items[].totals.oneTimeSubtotalCentsrequiredinteger

int64.

items[].totals.recurringSubtotalCentsrequiredinteger

int64.

items[].totals.taxOneTimeCentsrequiredinteger

int64.

items[].totals.taxRecurringCentsrequiredinteger

int64.

items[].updatedAtrequiredstring (date-time)
items[].viewedAtstring (date-time) or null
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# 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>'

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

Required, sent as application/json.

FieldTypeDescription
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
billingDayinteger or null
clientPublicIdstring or null
contactPublicIdstring or null
coverLetterstring or null
depositBasisPointsrequiredany

Arbitrary JSON.

expiresOnstring or null
invoiceModerequiredany

Arbitrary JSON.

isTemplaterequiredboolean
opportunityPublicIdstring or null
ownerUserPublicIdstring or null
prospectPublicIdstring or null
sectionsrequiredarray of QuoteSectionDraft
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineDraft
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].publicIdrequiredstring
sections[].titlerequiredstring
taxRateBasisPointsinteger or null
templateNamerequiredstring
termMonthsinteger or null
termsstring or null
timeCoveragestring or null
titlerequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
billingDayinteger or null
clientPublicIdstring or null
contactPublicIdstring or null
coverLetterstring or null
depositBasisPointsrequiredany

Arbitrary JSON.

expiresOnstring or null
invoiceModerequiredany

Arbitrary JSON.

isTemplaterequiredboolean
opportunityPublicIdstring or null
ownerUserPublicIdstring or null
prospectPublicIdstring or null
sectionsrequiredarray of QuoteSectionDraft
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineDraft
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].publicIdrequiredstring
sections[].titlerequiredstring
taxRateBasisPointsinteger or null
templateNamerequiredstring
termMonthsinteger or null
termsstring or null
timeCoveragestring or null
titlerequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, AcceptLinkViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
expiresAtstring (date-time) or null
urlrequiredstring
Terminal window
# 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>'

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

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
noterequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
consentTextrequiredstring
consentVersionrequiredinteger
methodrequiredstring
signatureImagerequiredstring
signerNamerequiredstring
signerTitlerequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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

NameInTypeRequiredDescription
idpathstringYesA uuid.
variantpathstringYes
StatusBodyDescription
200application/octet-stream, string (binary)Success. The body shape was not resolved; see x-outpost-unresolved.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
noterequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'
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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
expiresOnrequiredstring
torequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:send.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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>'

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.

Required, sent as application/json.

FieldTypeDescription
agreementPublicIdrequiredstring
clientPublicIdrequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

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.

Required, sent as application/json.

FieldTypeDescription
agreementPublicIdrequiredstring
clientPublicIdrequiredstring
StatusBodyDescription
200application/json, QuoteViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:write.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
acceptanceFinishedAtstring (date-time) or null
acceptedAtstring (date-time) or null
agreementStartsOnstring or null
agreementTemplatePublicIdstring or null
approvalQuoteApprovalView
approval.decidedAtstring (date-time) or null
approval.decidedByNamestring or null
approval.decisionstring or null
approval.noterequiredstring
approval.reasonsrequiredarray of string
approval.requestedAtrequiredstring (date-time)
approval.requestedByNamestring or null
artifactErrorstring or null
billedOnMilestonesCentsrequiredinteger

int64.

billingDayrequiredinteger
clientPublicIdstring or null
consentVersionrequiredinteger
contactEmailrequiredstring
contactNamerequiredstring
contactPublicIdstring or null
conversionQuoteConversionView
conversion.agreementPublicIdstring or null
conversion.attemptsrequiredinteger
conversion.clientPublicIdstring or null
conversion.completedAtstring (date-time) or null
conversion.errorstring or null
conversion.invoicePublicIdstring or null
conversion.statusrequiredstring
conversion.ticketPublicIdstring or null
convertedSalesOrderIdstring or null
countersignConsentTextrequiredstring
countersignatureQuoteSignatureView
countersignature.consentTextrequiredstring
countersignature.consentVersionrequiredinteger
countersignature.documentSha256requiredstring
countersignature.hasImagerequiredboolean
countersignature.iprequiredstring
countersignature.methodrequiredstring
countersignature.signedAtrequiredstring (date-time)
countersignature.signerEmailrequiredstring
countersignature.signerNamerequiredstring
countersignature.signerTitlerequiredstring
countersignature.timeZonerequiredstring
countersignature.userAgentrequiredstring
countersignedAtstring (date-time) or null
coverLetterrequiredstring
createdAtrequiredstring (date-time)
currencyCoderequiredstring
declinedAtstring (date-time) or null
depositQuoteDepositView

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.depositCentsrequiredinteger

int64.

deposit.depositTaxCentsrequiredinteger

int64.

deposit.dueOnAcceptanceCentsrequiredinteger

int64.

depositBasisPointsinteger or null
displayNumberrequiredstring
expiresOnstring or null
externalNumberstring or null
externalToolstring or null
firstViewedAtstring (date-time) or null
invoiceModestring or null
isTemplaterequiredboolean
lastViewedAtstring (date-time) or null
needsApprovalrequiredboolean
numberrequiredstring
opportunityPublicIdstring or null
ownerNamestring or null
ownerUserPublicIdstring or null
pdfrequiredobject
previousRevisionPublicIdstring or null
prospectPublicIdstring or null
publicIdrequiredstring
recipientNamerequiredstring
revisionrequiredinteger
revisionsrequiredarray of QuoteRevisionRefView
revisions[].createdAtrequiredstring (date-time)
revisions[].publicIdrequiredstring
revisions[].revisionrequiredinteger
revisions[].statusrequiredstring
sectionsrequiredarray of QuoteSectionView
sections[].descriptionrequiredstring
sections[].kindrequiredstring
sections[].linesrequiredarray of QuoteLineView
sections[].lines[].acceptedQuantitystring or null
sections[].lines[].adjustablerequiredboolean
sections[].lines[].agreementLineKindstring or null
sections[].lines[].billOnMilestonesrequiredboolean
sections[].lines[].catalogItemPublicIdstring or null
sections[].lines[].defaultSelectedrequiredboolean
sections[].lines[].descriptionrequiredstring
sections[].lines[].discountBprequiredinteger
sections[].lines[].includedMinutesrequiredinteger
sections[].lines[].kindrequiredstring
sections[].lines[].maxQuantitystring or null
sections[].lines[].minQuantitystring or null
sections[].lines[].optionalrequiredboolean
sections[].lines[].positionrequiredinteger
sections[].lines[].publicIdrequiredstring
sections[].lines[].quantityrequiredstring
sections[].lines[].selectedboolean or null
sections[].lines[].taxablerequiredboolean
sections[].lines[].unitrequiredstring
sections[].lines[].unitCostCentsrequiredinteger

int64.

sections[].lines[].unitPriceCentsrequiredinteger

int64.

sections[].positionrequiredinteger
sections[].publicIdrequiredstring
sections[].titlerequiredstring
sentAtstring (date-time) or null
signatureQuoteSignatureView
signature.consentTextrequiredstring
signature.consentVersionrequiredinteger
signature.documentSha256requiredstring
signature.hasImagerequiredboolean
signature.iprequiredstring
signature.methodrequiredstring
signature.signedAtrequiredstring (date-time)
signature.signerEmailrequiredstring
signature.signerNamerequiredstring
signature.signerTitlerequiredstring
signature.timeZonerequiredstring
signature.userAgentrequiredstring
sourcerequiredstring, one of external, native
statusrequiredstring
supersededByPublicIdstring or null
taxRateBasisPointsrequiredinteger
templateNamerequiredstring
termMonthsrequiredinteger
termsrequiredstring
timeCoveragerequiredstring
titlerequiredstring
totalsrequiredQuoteTotalsView

quoteTotalsView is the ten figures, in the one shape every surface reads.

totals.contractValueCentsrequiredinteger

int64.

totals.costCentsrequiredinteger

int64.

totals.discountOneTimeCentsrequiredinteger

int64.

totals.discountRecurringCentsrequiredinteger

int64.

totals.dueOnAcceptanceCentsrequiredinteger

int64.

totals.marginBpinteger or null
totals.monthlyRecurringCentsrequiredinteger

int64.

totals.oneTimeSubtotalCentsrequiredinteger

int64.

totals.recurringSubtotalCentsrequiredinteger

int64.

totals.taxOneTimeCentsrequiredinteger

int64.

totals.taxRecurringCentsrequiredinteger

int64.

updatedAtrequiredstring (date-time)
viewCountrequiredinteger
viewedAtstring (date-time) or null
withdrawnAtstring (date-time) or null
Terminal window
# 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"
}'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

Get sales settings

StatusBodyDescription
200application/json, SalesSettingsViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
approvalsrequiredSalesApprovalsView
approvals.lineDiscountAboveBprequiredinteger
approvals.marginBelowBprequiredinteger
approvals.totalAboveCentsrequiredinteger

int64.

automationrequiredSalesAutomationView
automation.expiringReminderDaysrequiredinteger
automation.renewalLeadDaysrequiredinteger
automation.requireCountersignrequiredboolean
automation.unviewedNudgeDaysrequiredinteger
brandingrequiredSalesBrandingView
branding.accentColorrequiredstring
branding.displayNamerequiredstring
branding.logoUrlstring or null
branding.replyTorequiredstring
ordersrequiredSalesOrderSettingsView
orders.defaultDepositBasisPointsrequiredinteger
orders.defaultInvoiceModerequiredstring
orders.salesOrderPrefixrequiredstring
quotesrequiredSalesQuoteDefaultsView
quotes.defaultCoverLetterrequiredstring
quotes.defaultTermsrequiredstring
quotes.numberPrefixrequiredstring
quotes.validDaysrequiredinteger
Terminal window
# 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>'

PUTcrm:approvemsp facemspIdempotent

Source: [object Object]

Put sales settings

Required, sent as application/json.

FieldTypeDescription
approvalsrequiredSalesApprovalsView
approvals.lineDiscountAboveBprequiredinteger
approvals.marginBelowBprequiredinteger
approvals.totalAboveCentsrequiredinteger

int64.

automationrequiredSalesAutomationView
automation.expiringReminderDaysrequiredinteger
automation.renewalLeadDaysrequiredinteger
automation.requireCountersignrequiredboolean
automation.unviewedNudgeDaysrequiredinteger
brandingrequiredobject
branding.accentColorrequiredstring
branding.displayNamerequiredstring
branding.replyTorequiredstring
ordersSalesOrderSettingsView
orders.defaultDepositBasisPointsrequiredinteger
orders.defaultInvoiceModerequiredstring
orders.salesOrderPrefixrequiredstring
quotesrequiredSalesQuoteDefaultsView
quotes.defaultCoverLetterrequiredstring
quotes.defaultTermsrequiredstring
quotes.numberPrefixrequiredstring
quotes.validDaysrequiredinteger
StatusBodyDescription
200application/json, SalesSettingsViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
approvalsrequiredSalesApprovalsView
approvals.lineDiscountAboveBprequiredinteger
approvals.marginBelowBprequiredinteger
approvals.totalAboveCentsrequiredinteger

int64.

automationrequiredSalesAutomationView
automation.expiringReminderDaysrequiredinteger
automation.renewalLeadDaysrequiredinteger
automation.requireCountersignrequiredboolean
automation.unviewedNudgeDaysrequiredinteger
brandingrequiredSalesBrandingView
branding.accentColorrequiredstring
branding.displayNamerequiredstring
branding.logoUrlstring or null
branding.replyTorequiredstring
ordersrequiredSalesOrderSettingsView
orders.defaultDepositBasisPointsrequiredinteger
orders.defaultInvoiceModerequiredstring
orders.salesOrderPrefixrequiredstring
quotesrequiredSalesQuoteDefaultsView
quotes.defaultCoverLetterrequiredstring
quotes.defaultTermsrequiredstring
quotes.numberPrefixrequiredstring
quotes.validDaysrequiredinteger
Terminal window
# 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
}
}'

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

StatusBodyDescription
200application/octet-stream, string (binary)Success. The body shape was not resolved; see x-outpost-unresolved.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

StatusBodyDescription
200application/json, SalesSettingsViewSuccess.
400application/problem+json, ProblemDetailsThe request body could not be read.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches.
413application/problem+json, ProblemDetailsThe request was refused.
415application/problem+json, ProblemDetailsA 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.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
approvalsrequiredSalesApprovalsView
approvals.lineDiscountAboveBprequiredinteger
approvals.marginBelowBprequiredinteger
approvals.totalAboveCentsrequiredinteger

int64.

automationrequiredSalesAutomationView
automation.expiringReminderDaysrequiredinteger
automation.renewalLeadDaysrequiredinteger
automation.requireCountersignrequiredboolean
automation.unviewedNudgeDaysrequiredinteger
brandingrequiredSalesBrandingView
branding.accentColorrequiredstring
branding.displayNamerequiredstring
branding.logoUrlstring or null
branding.replyTorequiredstring
ordersrequiredSalesOrderSettingsView
orders.defaultDepositBasisPointsrequiredinteger
orders.defaultInvoiceModerequiredstring
orders.salesOrderPrefixrequiredstring
quotesrequiredSalesQuoteDefaultsView
quotes.defaultCoverLetterrequiredstring
quotes.defaultTermsrequiredstring
quotes.numberPrefixrequiredstring
quotes.validDaysrequiredinteger
Terminal window
# 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>'

DELETEcrm:approvemsp facemspIdempotent

Source: [object Object]

Delete sales logo

StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

GETcrm:readmsp facemspIdempotent

Source: [object Object]

List stages

StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:read.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

POSTcrm:approvemsp facemsp

Source: [object Object]

Create stage

Required, sent as application/json.

FieldTypeDescription
kindstring or null
namestring or null
probabilityinteger or null
StatusBodyDescription
201application/json, PipelineStageViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

201 response body

FieldTypeDescription
kindrequiredstring
namerequiredstring
positionrequiredinteger
probabilityrequiredinteger
publicIdrequiredstring
Terminal window
# 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
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
kindstring or null
namestring or null
probabilityinteger or null
StatusBodyDescription
200application/json, PipelineStageViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.

200 response body

FieldTypeDescription
kindrequiredstring
namerequiredstring
positionrequiredinteger
probabilityrequiredinteger
publicIdrequiredstring
Terminal window
# 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
}'

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.

NameInTypeRequiredDescription
idpathstringYesA uuid.
moveToquerystringNo
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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>'

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.

Required, sent as application/json.

FieldTypeDescription
publicIdsrequiredarray of string
StatusBodyDescription
200application/json, objectSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold crm:approve.
404application/problem+json, ProblemDetailsNo resource matches.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsSales is not available on this server.
Terminal window
# 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"
]
}'

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.