Skip to content

The portal, before signing in

GET
/portal/site
curl --request GET \
--url https://api.pealboard.com/portal/site \
--header 'Authorization: Bearer <token>'

Resolved from the forwarded host. A host that names no portal answers 404 with the same envelope as anything else, so a scan of the wildcard learns nothing but which slugs are taken — which a browser learns anyway.

Access. No credential. Open to any caller. A portal’s sign-in screen has to render before anybody has signed in, and this is the branding, the name and the forms — never a repository, a label or a destination.

The portal.

Media typeapplication/json

Everything the portal’s sign-in screen needs, with no credential. It names no repository, no label and no project: a destination is the workspace’s business.

object
name
required
string
description
required
string | null
branding
required
object
logoAttachmentId
required

An attachment uploaded with POST /v1/attachments. Rendered through a signed URL.

string | null format: uuid
logoUrl
required

A signed link to the logo, good for 30 days. Read only.

string | null format: uri
accentColor
required
string | null
/^#[0-9a-fA-F]{6}$/
welcomeText
required
string | null
<= 2000 characters
accessMode
required

Invite_only: a member adds each customer, and an unknown address is refused before a code is sent. domain_allowlist: anyone whose verified email domain is listed joins the company that domain is mapped to. open: anyone may sign in, and a new customer’s first request waits in the hold queue.

string
Allowed values: invite_only domain_allowlist open
requestTypes
required
Array<object>
object
id
required

A UUID this API issued.

string format: uuid
name
required
string
description
required
string | null
form
required
Array<object>
object
key
required

The key a submission sends this field’s value under.

string
>= 1 characters <= 60 characters /^[a-z0-9_]+$/
label
required

The heading this field becomes in the issue body.

string
>= 1 characters <= 120 characters
type
required

Text is one line and textarea is many. select needs options; every other type ignores them.

string
Allowed values: text textarea select checkbox email url number date
required
boolean
options
Array<string>
<= 50 items
helpText
string
<= 300 characters
Example
{
"accessMode": "invite_only",
"requestTypes": [
{
"form": [
{
"type": "text",
"required": false
}
]
}
]
}

No valid credentials.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

Authenticated, but not permitted.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

No such resource, or it is not visible to you.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

The request conflicts with the current state.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

The request did not match the expected shape.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

Rate limited. Retry after the interval in the header.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}

GitHub or another dependency refused or did not answer. Nothing in the workspace changed.

Media typeapplication/json
object
error
required
object
code
required

A stable identifier for the kind of failure. Safe to branch on.

string
message
required

What went wrong, written for a person.

string
detail

Structured particulars, when there are any.

object
key
additional properties
remedy

What to do about it, when there is something to do.

string
requestId
required

Quote this when asking about a specific failure.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"detail": {
"additionalProperty": "example"
},
"remedy": "example",
"requestId": "example"
}
}