Depot portalwork
Registers the portal’s quote, project, approval and request routes (contract 8.2).
This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.
GET /api/portal/v1/orgs/{clientID}/approvals
Section titled “GET /api/portal/v1/orgs/{clientID}/approvals”GETportal:approvals:readportal facemspIdempotent
Source: [object Object]
listApprovals is the inbox: every source in one list, newest first.
status=open (default) | decided | closed | all; source=<source>; mine=true keeps the requests waiting on the caller.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
mine | query | string | No | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
source | query | string | No | |
status | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ApprovalList | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:approvals:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
countsrequired | ApprovalCounts | ApprovalCounts are the inbox badges. |
counts.approvalsrequired | integer | |
counts.awaitingMerequired | integer | |
counts.openrequired | integer | |
counts.openMilestonesrequired | integer | |
counts.openQuotesrequired | integer | |
itemsrequired | array of ApprovalView | |
items[].amountCents | integer or null | int64. |
items[].awaitingrequired | array of ApprovalAwaitingView | |
items[].awaiting[].memberIdrequired | string | |
items[].awaiting[].namerequired | string | |
items[].bodyrequired | string | |
items[].canDeciderequired | boolean | |
items[].canRespondrequired | boolean | |
items[].consentTextrequired | string | |
items[].consentVersionrequired | integer | |
items[].currency | string or null | |
items[].dueAt | string (date-time) or null | |
items[].idrequired | string | |
items[].kindrequired | string | |
items[].projectId | string or null | |
items[].quorumrequired | string | |
items[].raisedAtrequired | string (date-time) | |
items[].raisedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
items[].raisedBy.kindrequired | string | |
items[].raisedBy.label | string or null | |
items[].raisedBy.refrequired | string | |
items[].resolvedAt | string (date-time) or null | |
items[].responsesrequired | array of ApprovalResponseView | |
items[].responses[].comment | string or null | |
items[].responses[].decisionrequired | string | |
items[].responses[].idrequired | string | |
items[].responses[].memberIdrequired | string | |
items[].responses[].memberNamerequired | string | |
items[].responses[].respondedAtrequired | string (date-time) | |
items[].responses[].signatureMethodrequired | string | |
items[].responses[].signerNamerequired | string | |
items[].routerequired | ApprovalRouteView | ApprovalRouteView is who a request is routed to. |
items[].route.kindrequired | string | |
items[].route.memberIdsrequired | array of string | |
items[].route.roleId | string or null | |
items[].sourcerequired | string | |
items[].sourceError | string or null | |
items[].sourceLabel | string or null | |
items[].sourceRef | string or null | |
items[].statusrequired | string | |
items[].titlerequired | string | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/approvals?mine=<mine>&page=0&pageSize=0&source=<source>&status=<status>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals?mine=<mine>&page=0&pageSize=0&source=<source>&status=<status>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals"params = { "mine": "<mine>", "page": "0", "pageSize": "0", "source": "<source>", "status": "<status>",}headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals?mine=<mine>&page=0&pageSize=0&source=<source>&status=<status>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals");url.searchParams.set("mine", "<mine>");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");url.searchParams.set("source", "<source>");url.searchParams.set("status", "<status>");
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals?mine=<mine>&page=0&pageSize=0&source=<source>&status=<status>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/approvals/{approvalID}
Section titled “GET /api/portal/v1/orgs/{clientID}/approvals/{approvalID}”GETportal:approvals:readportal facemspIdempotent
Source: [object Object]
getApproval opens one request with its answers.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
approvalID | path | string | Yes | |
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ApprovalView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:approvals:read. |
404 | application/problem+json, ProblemDetails | Not found. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
amountCents | integer or null | int64. |
awaitingrequired | array of ApprovalAwaitingView | |
awaiting[].memberIdrequired | string | |
awaiting[].namerequired | string | |
bodyrequired | string | |
canDeciderequired | boolean | |
canRespondrequired | boolean | |
consentTextrequired | string | |
consentVersionrequired | integer | |
currency | string or null | |
dueAt | string (date-time) or null | |
idrequired | string | |
kindrequired | string | |
projectId | string or null | |
quorumrequired | string | |
raisedAtrequired | string (date-time) | |
raisedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
raisedBy.kindrequired | string | |
raisedBy.label | string or null | |
raisedBy.refrequired | string | |
resolvedAt | string (date-time) or null | |
responsesrequired | array of ApprovalResponseView | |
responses[].comment | string or null | |
responses[].decisionrequired | string | |
responses[].idrequired | string | |
responses[].memberIdrequired | string | |
responses[].memberNamerequired | string | |
responses[].respondedAtrequired | string (date-time) | |
responses[].signatureMethodrequired | string | |
responses[].signerNamerequired | string | |
routerequired | ApprovalRouteView | ApprovalRouteView is who a request is routed to. |
route.kindrequired | string | |
route.memberIdsrequired | array of string | |
route.roleId | string or null | |
sourcerequired | string | |
sourceError | string or null | |
sourceLabel | string or null | |
sourceRef | string or null | |
statusrequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/approvals/<approvalID>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>";
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/approvals/{approvalID}/respond
Section titled “POST /api/portal/v1/orgs/{clientID}/approvals/{approvalID}/respond”POSTportal:approvals:respondportal facemsp
Source: [object Object]
respondApproval records the member’s signed answer and, when it decides the request, applies the outcome to the source and posts it back.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
approvalID | path | string | Yes | |
clientID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, ApprovalView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:approvals:respond. |
404 | application/problem+json, ProblemDetails | Not found. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
amountCents | integer or null | int64. |
awaitingrequired | array of ApprovalAwaitingView | |
awaiting[].memberIdrequired | string | |
awaiting[].namerequired | string | |
bodyrequired | string | |
canDeciderequired | boolean | |
canRespondrequired | boolean | |
consentTextrequired | string | |
consentVersionrequired | integer | |
currency | string or null | |
dueAt | string (date-time) or null | |
idrequired | string | |
kindrequired | string | |
projectId | string or null | |
quorumrequired | string | |
raisedAtrequired | string (date-time) | |
raisedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
raisedBy.kindrequired | string | |
raisedBy.label | string or null | |
raisedBy.refrequired | string | |
resolvedAt | string (date-time) or null | |
responsesrequired | array of ApprovalResponseView | |
responses[].comment | string or null | |
responses[].decisionrequired | string | |
responses[].idrequired | string | |
responses[].memberIdrequired | string | |
responses[].memberNamerequired | string | |
responses[].respondedAtrequired | string (date-time) | |
responses[].signatureMethodrequired | string | |
responses[].signerNamerequired | string | |
routerequired | ApprovalRouteView | ApprovalRouteView is who a request is routed to. |
route.kindrequired | string | |
route.memberIdsrequired | array of string | |
route.roleId | string or null | |
sourcerequired | string | |
sourceError | string or null | |
sourceLabel | string or null | |
sourceRef | string or null | |
statusrequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/approvals/<approvalID>/respond");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/projects
Section titled “GET /api/portal/v1/orgs/{clientID}/projects”GETportal:projects:readportal facemspIdempotent
Source: [object Object]
listProjects lists the organization’s projects.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultPortalProjectSummary | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:projects:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of PortalProjectSummary | |
items[].healthrequired | string | |
items[].idrequired | string | |
items[].namerequired | string | |
items[].percentCompleterequired | integer | |
items[].plannedEndOn | string or null | |
items[].plannedStartOnrequired | string | |
items[].referencerequired | string | |
items[].statusrequired | string | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/projects?page=0&pageSize=0' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects?page=0&pageSize=0' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects"params = { "page": "0", "pageSize": "0",}headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects?page=0&pageSize=0", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/portal/v1/orgs/<clientID>/projects");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects?page=0&pageSize=0");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/projects/{projectID}
Section titled “GET /api/portal/v1/orgs/{clientID}/projects/{projectID}”GETportal:projects:readportal facemspIdempotent
Source: [object Object]
getProject opens one project’s status page.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
projectID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalProjectView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:projects:read. |
404 | application/problem+json, ProblemDetails | Not found. |
500 | application/problem+json, ProblemDetails | Could not open this project. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptance | PublicProjectAcceptance | publicProjectAcceptance is what the signer is shown back about their own signature. |
acceptance.certificateAvailablerequired | boolean | |
acceptance.signedAtrequired | string (date-time) | |
acceptance.signerNamerequired | string | |
acceptance.signerTitlerequired | string | |
awaitingAcceptancerequired | array of PublicAcceptanceMilestone | |
awaitingAcceptance[].amountCents | integer or null | int64. |
awaitingAcceptance[].currencyCoderequired | string | |
awaitingAcceptance[].deliverablesrequired | array of PublicProjectDeliverable | |
awaitingAcceptance[].deliverables[].completedAt | string (date-time) or null | |
awaitingAcceptance[].deliverables[].titlerequired | string | |
awaitingAcceptance[].descriptionrequired | string | |
awaitingAcceptance[].dueOnrequired | string | |
awaitingAcceptance[].namerequired | string | |
awaitingAcceptance[].phaseName | string or null | |
awaitingAcceptance[].publicIdrequired | string | |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canAcceptrequired | boolean | |
consentText | string | |
consentVersion | integer | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
expiresAt | string (date-time) or null | |
idrequired | string | |
kindrequired | string | |
milestone | PublicAcceptanceMilestone | |
milestone.amountCents | integer or null | int64. |
milestone.currencyCoderequired | string | |
milestone.deliverablesrequired | array of PublicProjectDeliverable | |
milestone.deliverables[].completedAt | string (date-time) or null | |
milestone.deliverables[].titlerequired | string | |
milestone.descriptionrequired | string | |
milestone.dueOnrequired | string | |
milestone.namerequired | string | |
milestone.phaseName | string or null | |
milestone.publicIdrequired | string | |
milestonesrequired | array of PublicProjectMilestone | |
milestones[].acceptedAt | string (date-time) or null | |
milestones[].amountCents | integer or null | int64. |
milestones[].completedAt | string (date-time) or null | |
milestones[].dueOnrequired | string | |
milestones[].namerequired | string | |
milestones[].publicIdrequired | string | |
milestones[].requiresAcceptancerequired | boolean | |
milestones[].statusrequired | string | |
notesrequired | array of PublicProjectNote | |
notes[].bodyrequired | string | |
notes[].createdAtrequired | string (date-time) | |
phasesrequired | array of PublicProjectPhase | |
phases[].namerequired | string | |
phases[].percentCompleterequired | integer | |
phases[].plannedEndOn | string or null | |
phases[].plannedStartOn | string or null | |
phases[].statusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
projectrequired | PublicProjectHeader | |
project.healthrequired | string | |
project.healthReasonrequired | string | |
project.namerequired | string | |
project.percentCompleterequired | integer | |
project.plannedEndOn | string or null | |
project.plannedStartOnrequired | string | |
project.referencerequired | string | |
project.statusrequired | string | |
recordIdrequired | string | |
tasksrequired | array of PublicProjectTask | |
tasks[].completedAt | string (date-time) or null | |
tasks[].phaseName | string or null | |
tasks[].plannedDueOn | string or null | |
tasks[].statusrequired | string | |
tasks[].titlerequired | string | |
timeZonerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/projects/<projectID>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>";
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/projects/{projectID}/milestones/{milestoneID}/accept
Section titled “POST /api/portal/v1/orgs/{clientID}/projects/{projectID}/milestones/{milestoneID}/accept”POSTportal:projects:acceptportal facemsp
Source: [object Object]
acceptMilestone signs the milestone off as the member.
The answer is the project page as it now stands.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
milestoneID | path | string | Yes | |
projectID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalProjectView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:projects:accept. |
404 | application/problem+json, ProblemDetails | Not found. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | Could not open this project. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptance | PublicProjectAcceptance | publicProjectAcceptance is what the signer is shown back about their own signature. |
acceptance.certificateAvailablerequired | boolean | |
acceptance.signedAtrequired | string (date-time) | |
acceptance.signerNamerequired | string | |
acceptance.signerTitlerequired | string | |
awaitingAcceptancerequired | array of PublicAcceptanceMilestone | |
awaitingAcceptance[].amountCents | integer or null | int64. |
awaitingAcceptance[].currencyCoderequired | string | |
awaitingAcceptance[].deliverablesrequired | array of PublicProjectDeliverable | |
awaitingAcceptance[].deliverables[].completedAt | string (date-time) or null | |
awaitingAcceptance[].deliverables[].titlerequired | string | |
awaitingAcceptance[].descriptionrequired | string | |
awaitingAcceptance[].dueOnrequired | string | |
awaitingAcceptance[].namerequired | string | |
awaitingAcceptance[].phaseName | string or null | |
awaitingAcceptance[].publicIdrequired | string | |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canAcceptrequired | boolean | |
consentText | string | |
consentVersion | integer | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
expiresAt | string (date-time) or null | |
idrequired | string | |
kindrequired | string | |
milestone | PublicAcceptanceMilestone | |
milestone.amountCents | integer or null | int64. |
milestone.currencyCoderequired | string | |
milestone.deliverablesrequired | array of PublicProjectDeliverable | |
milestone.deliverables[].completedAt | string (date-time) or null | |
milestone.deliverables[].titlerequired | string | |
milestone.descriptionrequired | string | |
milestone.dueOnrequired | string | |
milestone.namerequired | string | |
milestone.phaseName | string or null | |
milestone.publicIdrequired | string | |
milestonesrequired | array of PublicProjectMilestone | |
milestones[].acceptedAt | string (date-time) or null | |
milestones[].amountCents | integer or null | int64. |
milestones[].completedAt | string (date-time) or null | |
milestones[].dueOnrequired | string | |
milestones[].namerequired | string | |
milestones[].publicIdrequired | string | |
milestones[].requiresAcceptancerequired | boolean | |
milestones[].statusrequired | string | |
notesrequired | array of PublicProjectNote | |
notes[].bodyrequired | string | |
notes[].createdAtrequired | string (date-time) | |
phasesrequired | array of PublicProjectPhase | |
phases[].namerequired | string | |
phases[].percentCompleterequired | integer | |
phases[].plannedEndOn | string or null | |
phases[].plannedStartOn | string or null | |
phases[].statusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
projectrequired | PublicProjectHeader | |
project.healthrequired | string | |
project.healthReasonrequired | string | |
project.namerequired | string | |
project.percentCompleterequired | integer | |
project.plannedEndOn | string or null | |
project.plannedStartOnrequired | string | |
project.referencerequired | string | |
project.statusrequired | string | |
recordIdrequired | string | |
tasksrequired | array of PublicProjectTask | |
tasks[].completedAt | string (date-time) or null | |
tasks[].phaseName | string or null | |
tasks[].plannedDueOn | string or null | |
tasks[].statusrequired | string | |
tasks[].titlerequired | string | |
timeZonerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/accept");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/projects/{projectID}/milestones/{milestoneID}/decline
Section titled “POST /api/portal/v1/orgs/{clientID}/projects/{projectID}/milestones/{milestoneID}/decline”POSTportal:projects:acceptportal facemsp
Source: [object Object]
declineMilestone records the member’s no on the milestone; the reason reaches the project manager and is never echoed.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
milestoneID | path | string | Yes | |
projectID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalProjectView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:projects:accept. |
404 | application/problem+json, ProblemDetails | Not found. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | Could not open this project. |
200 response body
| Field | Type | Description |
|---|---|---|
acceptance | PublicProjectAcceptance | publicProjectAcceptance is what the signer is shown back about their own signature. |
acceptance.certificateAvailablerequired | boolean | |
acceptance.signedAtrequired | string (date-time) | |
acceptance.signerNamerequired | string | |
acceptance.signerTitlerequired | string | |
awaitingAcceptancerequired | array of PublicAcceptanceMilestone | |
awaitingAcceptance[].amountCents | integer or null | int64. |
awaitingAcceptance[].currencyCoderequired | string | |
awaitingAcceptance[].deliverablesrequired | array of PublicProjectDeliverable | |
awaitingAcceptance[].deliverables[].completedAt | string (date-time) or null | |
awaitingAcceptance[].deliverables[].titlerequired | string | |
awaitingAcceptance[].descriptionrequired | string | |
awaitingAcceptance[].dueOnrequired | string | |
awaitingAcceptance[].namerequired | string | |
awaitingAcceptance[].phaseName | string or null | |
awaitingAcceptance[].publicIdrequired | string | |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canAcceptrequired | boolean | |
consentText | string | |
consentVersion | integer | |
currencyCoderequired | string | |
declinedAt | string (date-time) or null | |
expiresAt | string (date-time) or null | |
idrequired | string | |
kindrequired | string | |
milestone | PublicAcceptanceMilestone | |
milestone.amountCents | integer or null | int64. |
milestone.currencyCoderequired | string | |
milestone.deliverablesrequired | array of PublicProjectDeliverable | |
milestone.deliverables[].completedAt | string (date-time) or null | |
milestone.deliverables[].titlerequired | string | |
milestone.descriptionrequired | string | |
milestone.dueOnrequired | string | |
milestone.namerequired | string | |
milestone.phaseName | string or null | |
milestone.publicIdrequired | string | |
milestonesrequired | array of PublicProjectMilestone | |
milestones[].acceptedAt | string (date-time) or null | |
milestones[].amountCents | integer or null | int64. |
milestones[].completedAt | string (date-time) or null | |
milestones[].dueOnrequired | string | |
milestones[].namerequired | string | |
milestones[].publicIdrequired | string | |
milestones[].requiresAcceptancerequired | boolean | |
milestones[].statusrequired | string | |
notesrequired | array of PublicProjectNote | |
notes[].bodyrequired | string | |
notes[].createdAtrequired | string (date-time) | |
phasesrequired | array of PublicProjectPhase | |
phases[].namerequired | string | |
phases[].percentCompleterequired | integer | |
phases[].plannedEndOn | string or null | |
phases[].plannedStartOn | string or null | |
phases[].statusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
projectrequired | PublicProjectHeader | |
project.healthrequired | string | |
project.healthReasonrequired | string | |
project.namerequired | string | |
project.percentCompleterequired | integer | |
project.plannedEndOn | string or null | |
project.plannedStartOnrequired | string | |
project.referencerequired | string | |
project.statusrequired | string | |
recordIdrequired | string | |
tasksrequired | array of PublicProjectTask | |
tasks[].completedAt | string (date-time) or null | |
tasks[].phaseName | string or null | |
tasks[].plannedDueOn | string or null | |
tasks[].statusrequired | string | |
tasks[].titlerequired | string | |
timeZonerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/projects/<projectID>/milestones/<milestoneID>/decline");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/quotes
Section titled “GET /api/portal/v1/orgs/{clientID}/quotes”GETportal:quotes:readportal facemspIdempotent
Source: [object Object]
listQuotes lists the organization’s quotes, newest first: only the revision in play, never a draft, and never a revision a newer one replaced.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
page | query | integer | No | One-based page number. Defaults to 1. |
pageSize | query | integer | No | Rows per page, 1 to 200. Defaults to 50. |
status | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PagedResultPortalQuoteSummary | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:quotes:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
itemsrequired | array of PortalQuoteSummary | |
items[].canDeciderequired | boolean | |
items[].currencyCoderequired | string | |
items[].decidedAt | string (date-time) or null | |
items[].dueOnAcceptanceCentsrequired | integer | int64. |
items[].expiresOnrequired | string | |
items[].idrequired | string | |
items[].monthlyRecurringCentsrequired | integer | int64. |
items[].numberrequired | string | |
items[].revisionrequired | integer | |
items[].sentAt | string (date-time) or null | |
items[].statusrequired | string | |
items[].titlerequired | string | |
pagerequired | integer | |
pageSizerequired | integer | |
totalrequired | integer |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/quotes?page=0&pageSize=0&status=<status>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes?page=0&pageSize=0&status=<status>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes"params = { "page": "0", "pageSize": "0", "status": "<status>",}headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes?page=0&pageSize=0&status=<status>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes");url.searchParams.set("page", "0");url.searchParams.set("pageSize", "0");url.searchParams.set("status", "<status>");
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes?page=0&pageSize=0&status=<status>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/quotes/{quoteID}
Section titled “GET /api/portal/v1/orgs/{clientID}/quotes/{quoteID}”GETportal:quotes:readportal facemspIdempotent
Source: [object Object]
getQuote opens one quote: the current revision, or a superseded one marked as such with a pointer to its replacement.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
quoteID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalQuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:quotes:read. |
404 | application/problem+json, ProblemDetails | Not found. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
billedOnMilestonesCentsrequired | integer | int64. |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canDeciderequired | boolean | |
consentTextrequired | string | |
consentVersionrequired | integer | |
contactNamerequired | string | |
coverLetterrequired | string | |
currencyCoderequired | string | |
currentId | string or null | |
declinedAt | string (date-time) or null | |
defaultTotalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
defaultTotals.contractValueCentsrequired | integer | int64. |
defaultTotals.discountOneTimeCentsrequired | integer | int64. |
defaultTotals.discountRecurringCentsrequired | integer | int64. |
defaultTotals.dueOnAcceptanceCentsrequired | integer | int64. |
defaultTotals.monthlyRecurringCentsrequired | integer | int64. |
defaultTotals.oneTimeSubtotalCentsrequired | integer | int64. |
defaultTotals.recurringSubtotalCentsrequired | integer | int64. |
defaultTotals.taxOneTimeCentsrequired | integer | int64. |
defaultTotals.taxRecurringCentsrequired | integer | int64. |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
documentsrequired | PublicQuoteDocuments | |
documents.currentrequired | string | |
expiresAtrequired | string (date-time) | |
expiresOnrequired | string | |
monthlyLabelrequired | string | |
numberrequired | string | |
pdfAvailablerequired | boolean | |
portalStatusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
recipientNamerequired | string | |
recordIdrequired | string | |
requireCountersignrequired | boolean | |
revisionrequired | integer | |
sectionsrequired | array of PublicQuoteSection | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of PublicQuoteLine | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
signature | PublicQuoteSignature | |
signature.countersignrequired | string | |
signature.countersignedAt | string (date-time) or null | |
signature.signedAtrequired | string (date-time) | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.totalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
signature.totals.contractValueCentsrequired | integer | int64. |
signature.totals.discountOneTimeCentsrequired | integer | int64. |
signature.totals.discountRecurringCentsrequired | integer | int64. |
signature.totals.dueOnAcceptanceCentsrequired | integer | int64. |
signature.totals.monthlyRecurringCentsrequired | integer | int64. |
signature.totals.oneTimeSubtotalCentsrequired | integer | int64. |
signature.totals.recurringSubtotalCentsrequired | integer | int64. |
signature.totals.taxOneTimeCentsrequired | integer | int64. |
signature.totals.taxRecurringCentsrequired | integer | int64. |
statusrequired | string | |
taxRateBasisPointsrequired | integer | |
termMonthsrequired | integer | |
termsrequired | string | |
timeZonerequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/quotes/<quoteID>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>";
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/accept
Section titled “POST /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/accept”POSTportal:quotes:approveportal facemsp
Source: [object Object]
acceptQuote signs the quote as the member: the same validation, pricing and record as the public link, with the member named on the signature.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
quoteID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalQuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:quotes:approve. |
404 | application/problem+json, ProblemDetails | Not found. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
billedOnMilestonesCentsrequired | integer | int64. |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canDeciderequired | boolean | |
consentTextrequired | string | |
consentVersionrequired | integer | |
contactNamerequired | string | |
coverLetterrequired | string | |
currencyCoderequired | string | |
currentId | string or null | |
declinedAt | string (date-time) or null | |
defaultTotalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
defaultTotals.contractValueCentsrequired | integer | int64. |
defaultTotals.discountOneTimeCentsrequired | integer | int64. |
defaultTotals.discountRecurringCentsrequired | integer | int64. |
defaultTotals.dueOnAcceptanceCentsrequired | integer | int64. |
defaultTotals.monthlyRecurringCentsrequired | integer | int64. |
defaultTotals.oneTimeSubtotalCentsrequired | integer | int64. |
defaultTotals.recurringSubtotalCentsrequired | integer | int64. |
defaultTotals.taxOneTimeCentsrequired | integer | int64. |
defaultTotals.taxRecurringCentsrequired | integer | int64. |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
documentsrequired | PublicQuoteDocuments | |
documents.currentrequired | string | |
expiresAtrequired | string (date-time) | |
expiresOnrequired | string | |
monthlyLabelrequired | string | |
numberrequired | string | |
pdfAvailablerequired | boolean | |
portalStatusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
recipientNamerequired | string | |
recordIdrequired | string | |
requireCountersignrequired | boolean | |
revisionrequired | integer | |
sectionsrequired | array of PublicQuoteSection | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of PublicQuoteLine | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
signature | PublicQuoteSignature | |
signature.countersignrequired | string | |
signature.countersignedAt | string (date-time) or null | |
signature.signedAtrequired | string (date-time) | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.totalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
signature.totals.contractValueCentsrequired | integer | int64. |
signature.totals.discountOneTimeCentsrequired | integer | int64. |
signature.totals.discountRecurringCentsrequired | integer | int64. |
signature.totals.dueOnAcceptanceCentsrequired | integer | int64. |
signature.totals.monthlyRecurringCentsrequired | integer | int64. |
signature.totals.oneTimeSubtotalCentsrequired | integer | int64. |
signature.totals.recurringSubtotalCentsrequired | integer | int64. |
signature.totals.taxOneTimeCentsrequired | integer | int64. |
signature.totals.taxRecurringCentsrequired | integer | int64. |
statusrequired | string | |
taxRateBasisPointsrequired | integer | |
termMonthsrequired | integer | |
termsrequired | string | |
timeZonerequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/accept");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/decline
Section titled “POST /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/decline”POSTportal:quotes:approveportal facemsp
Source: [object Object]
declineQuote records the member’s no.
The reason reaches the MSP and is never echoed back.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
quoteID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalQuoteView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:quotes:approve. |
404 | application/problem+json, ProblemDetails | Not found. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
billedOnMilestonesCentsrequired | integer | int64. |
brandingrequired | PublicQuoteBranding | |
branding.accentColorrequired | string | |
branding.displayNamerequired | string | |
branding.logoUrl | string or null | |
canDeciderequired | boolean | |
consentTextrequired | string | |
consentVersionrequired | integer | |
contactNamerequired | string | |
coverLetterrequired | string | |
currencyCoderequired | string | |
currentId | string or null | |
declinedAt | string (date-time) or null | |
defaultTotalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
defaultTotals.contractValueCentsrequired | integer | int64. |
defaultTotals.discountOneTimeCentsrequired | integer | int64. |
defaultTotals.discountRecurringCentsrequired | integer | int64. |
defaultTotals.dueOnAcceptanceCentsrequired | integer | int64. |
defaultTotals.monthlyRecurringCentsrequired | integer | int64. |
defaultTotals.oneTimeSubtotalCentsrequired | integer | int64. |
defaultTotals.recurringSubtotalCentsrequired | integer | int64. |
defaultTotals.taxOneTimeCentsrequired | integer | int64. |
defaultTotals.taxRecurringCentsrequired | integer | int64. |
deposit | QuoteDepositView | quoteDepositView is what an on_delivery quote with a deposit charges on acceptance (e2e B33): the deposit PRE-TAX, the tax on it, and everything raised on acceptance, tax included (the lines that do not ship plus the deposit). |
deposit.depositCentsrequired | integer | int64. |
deposit.depositTaxCentsrequired | integer | int64. |
deposit.dueOnAcceptanceCentsrequired | integer | int64. |
documentsrequired | PublicQuoteDocuments | |
documents.currentrequired | string | |
expiresAtrequired | string (date-time) | |
expiresOnrequired | string | |
monthlyLabelrequired | string | |
numberrequired | string | |
pdfAvailablerequired | boolean | |
portalStatusrequired | string | |
practicerequired | PublicQuotePractice | |
practice.contactEmail | string or null | |
recipientNamerequired | string | |
recordIdrequired | string | |
requireCountersignrequired | boolean | |
revisionrequired | integer | |
sectionsrequired | array of PublicQuoteSection | |
sections[].descriptionrequired | string | |
sections[].kindrequired | string | |
sections[].linesrequired | array of PublicQuoteLine | |
sections[].lines[].acceptedQuantity | string or null | |
sections[].lines[].adjustablerequired | boolean | |
sections[].lines[].billOnMilestonesrequired | boolean | |
sections[].lines[].defaultSelectedrequired | boolean | |
sections[].lines[].descriptionrequired | string | |
sections[].lines[].discountBprequired | integer | |
sections[].lines[].includedMinutesrequired | integer | |
sections[].lines[].kindrequired | string | |
sections[].lines[].maxQuantity | string or null | |
sections[].lines[].minQuantity | string or null | |
sections[].lines[].optionalrequired | boolean | |
sections[].lines[].publicIdrequired | string | |
sections[].lines[].quantityrequired | string | |
sections[].lines[].selected | boolean or null | |
sections[].lines[].taxablerequired | boolean | |
sections[].lines[].unitrequired | string | |
sections[].lines[].unitPriceCentsrequired | integer | int64. |
sections[].publicIdrequired | string | |
sections[].titlerequired | string | |
signature | PublicQuoteSignature | |
signature.countersignrequired | string | |
signature.countersignedAt | string (date-time) or null | |
signature.signedAtrequired | string (date-time) | |
signature.signerNamerequired | string | |
signature.signerTitlerequired | string | |
signature.totalsrequired | PublicQuoteTotals | publicQuoteTotals is store.QuoteTotals WITHOUT CostCents and MarginBasisPoints. |
signature.totals.contractValueCentsrequired | integer | int64. |
signature.totals.discountOneTimeCentsrequired | integer | int64. |
signature.totals.discountRecurringCentsrequired | integer | int64. |
signature.totals.dueOnAcceptanceCentsrequired | integer | int64. |
signature.totals.monthlyRecurringCentsrequired | integer | int64. |
signature.totals.oneTimeSubtotalCentsrequired | integer | int64. |
signature.totals.recurringSubtotalCentsrequired | integer | int64. |
signature.totals.taxOneTimeCentsrequired | integer | int64. |
signature.totals.taxRecurringCentsrequired | integer | int64. |
statusrequired | string | |
taxRateBasisPointsrequired | integer | |
termMonthsrequired | integer | |
termsrequired | string | |
timeZonerequired | string | |
titlerequired | string |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/decline");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/pdf
Section titled “GET /api/portal/v1/orgs/{clientID}/quotes/{quoteID}/pdf”GETportal:quotes:readportal 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]
getQuotePdf serves the quote’s current document: the executed copy, else the signed one, else the one that was sent.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
quoteID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/octet-stream, string (binary) | Success. The body shape was not resolved; see x-outpost-unresolved. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:quotes:read. |
404 | application/problem+json, ProblemDetails | Not found. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf";
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/quotes/<quoteID>/pdf");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/requests
Section titled “GET /api/portal/v1/orgs/{clientID}/requests”GETportal:requests:readportal facemspIdempotent
Source: [object Object]
listRequests lists the organization’s requests, newest first.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
kind | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, array of PortalRequestView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:requests:read. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
[].accessEndsAt | string (date-time) or null | |
[].completedAt | string (date-time) or null | |
[].effectiveAt | string (date-time) or null | |
[].formrequired | RequestForm | RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes). |
[].form.devices | array of RequestDevice | |
[].form.devices[].actionrequired | string | |
[].form.devices[].agentId | string | |
[].form.devices[].descriptionrequired | string | |
[].form.emailrequired | string | |
[].form.endDate | string | |
[].form.namerequired | string | |
[].form.notes | string | |
[].form.startDate | string | |
[].idrequired | string | |
[].kindrequired | string | |
[].rowVersionrequired | integer | int64. |
[].statusrequired | string | |
[].submittedAtrequired | string (date-time) | |
[].submittedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
[].submittedBy.kindrequired | string | |
[].submittedBy.label | string or null | |
[].submittedBy.refrequired | string | |
[].targetMemberId | string or null | |
[].targetNamedUserId | string or null | |
[].ticketId | string or null |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/requests?kind=<kind>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/requests?kind=<kind>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests"params = { "kind": "<kind>",}headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, params=params, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests?kind=<kind>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = new URL("https://depot.example.com/api/portal/v1/orgs/<clientID>/requests");url.searchParams.set("kind", "<kind>");
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests?kind=<kind>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/portal/v1/orgs/{clientID}/requests
Section titled “POST /api/portal/v1/orgs/{clientID}/requests”POSTportal facemsp
Source: [object Object]
createRequest submits an onboarding or offboarding request and opens its ticket.
The kind decides the permission: portal:requests:onboard, or portal:requests:offboard (sensitive: it ends somebody’s access).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
The body is any.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
201 | application/json, PortalRequestView | Created. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
404 | application/problem+json, ProblemDetails | No resource matches that id. |
413 | application/problem+json, ProblemDetails | That submission is too large. |
500 | application/problem+json, ProblemDetails | The request failed. |
201 response body
| Field | Type | Description |
|---|---|---|
accessEndsAt | string (date-time) or null | |
completedAt | string (date-time) or null | |
effectiveAt | string (date-time) or null | |
formrequired | RequestForm | RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes). |
form.devices | array of RequestDevice | |
form.devices[].actionrequired | string | |
form.devices[].agentId | string | |
form.devices[].descriptionrequired | string | |
form.emailrequired | string | |
form.endDate | string | |
form.namerequired | string | |
form.notes | string | |
form.startDate | string | |
idrequired | string | |
kindrequired | string | |
rowVersionrequired | integer | int64. |
statusrequired | string | |
submittedAtrequired | string (date-time) | |
submittedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
submittedBy.kindrequired | string | |
submittedBy.label | string or null | |
submittedBy.refrequired | string | |
targetMemberId | string or null | |
targetNamedUserId | string or null | |
ticketId | string or null |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/requests' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b '__Host-portal_session=<portal-session>' \ --data '"string"'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$body = @'"string"'@
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/requests' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}payload = "string"
response = requests.post(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`"string"`)
req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests";
const response = await fetch(url, { method: "POST", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify("string"),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """"string"""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/orgs/{clientID}/requests/{requestID}
Section titled “GET /api/portal/v1/orgs/{clientID}/requests/{requestID}”GETportal:requests:readportal facemspIdempotent
Source: [object Object]
getRequest opens one request.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes | |
requestID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalRequestView | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold portal:requests:read. |
404 | application/problem+json, ProblemDetails | Not found. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
accessEndsAt | string (date-time) or null | |
completedAt | string (date-time) or null | |
effectiveAt | string (date-time) or null | |
formrequired | RequestForm | RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes). |
form.devices | array of RequestDevice | |
form.devices[].actionrequired | string | |
form.devices[].agentId | string | |
form.devices[].descriptionrequired | string | |
form.emailrequired | string | |
form.endDate | string | |
form.namerequired | string | |
form.notes | string | |
form.startDate | string | |
idrequired | string | |
kindrequired | string | |
rowVersionrequired | integer | int64. |
statusrequired | string | |
submittedAtrequired | string (date-time) | |
submittedByrequired | ApprovalActorView | ApprovalActorView is who raised a request. |
submittedBy.kindrequired | string | |
submittedBy.label | string or null | |
submittedBy.refrequired | string | |
targetMemberId | string or null | |
targetNamedUserId | string or null | |
ticketId | string or null |
Request samples
Section titled “Request samples”# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/requests/<requestID>' \ -H 'X-Csrf-Token: <portal-csrf>' \ -H 'Accept: application/json' \ -b '__Host-portal_session=<portal-session>'# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'X-Csrf-Token' = '<portal-csrf>' 'Accept' = 'application/json' 'Cookie' = '__Host-portal_session=<portal-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/orgs/<clientID>/requests/<requestID>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. __Host-portal_session is a session cookie, so send it with every request.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests/<requestID>"headers = { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json",}cookies = { "__Host-portal_session": "<portal-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests/<requestID>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-Csrf-Token", "<portal-csrf>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "__Host-portal_session", Value: "<portal-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests/<requestID>";
const response = await fetch(url, { method: "GET", headers: { "X-Csrf-Token": "<portal-csrf>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. __Host-portal_session is a session cookie, so send it with every request.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/orgs/<clientID>/requests/<requestID>");request.Headers.TryAddWithoutValidation("X-Csrf-Token", "<portal-csrf>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "__Host-portal_session=<portal-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.