Create a portal
const url = 'https://api.pealboard.com/v1/portals';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"example","slug":"acme","description":"example","requestPrefix":"example","defaultRepositoryId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.pealboard.com/v1/portals \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "slug": "acme", "description": "example", "requestPrefix": "example", "defaultRepositoryId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }'The slug becomes a hostname, so the reserved list applies and it cannot be changed afterwards. The portal starts invite-only with private requests, which is the setting a workspace can safely leave alone while it decides.
defaultRepositoryId is where this portal’s request types send an issue when they name no repository of their own. Omit it and they fall back to the workspace’s default.
Access. Requires the admin role or above (admin, owner). A portal exposes the workspace’s work to people outside the company, so creating one is an administrative act. API-key scope: portals:write.
Billing. Refused with 402 while the workspace’s billing has lapsed. Reads continue and nothing is deleted.
Retries. Send Idempotency-Key and a retry with the same key within 24 hours returns the first answer rather than acting twice.
Authorizations
Section titled “Authorizations”Request Body
Section titled “Request Body”object
Lowercase letters, digits and hyphens.
Example
acmeDefaults to the first letters of the name.
A synced repository of this workspace. Where this portal’s request types send an issue when they name none. Falls back to the workspace’s default.
Responses
Section titled “Responses”The portal.
object
A UUID this API issued.
Lowercase letters, digits and hyphens.
Where customers reach this portal.
The ACME in ACME-42.
object
An attachment uploaded with POST /v1/attachments. Rendered through a signed URL.
A signed link to the logo, good for 30 days. Read only.
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.
Private: the requester and the workspace. company: everyone in the requester’s company. public: everyone in the portal. A manager sees every request in their company whatever this says.
When on, every comment on a shared issue is visible to this portal’s customers, including ones written before the setting was turned on. Off by default.
Where a request type sends an issue when it names no repository of its own. The portal’s own default, or the workspace’s when the portal has none.
object
A UUID this API issued.
True when this is the workspace’s default rather than the portal’s own. Clearing the portal’s default returns it to the workspace’s.
object
Example
{ "slug": "acme", "accessMode": "invite_only", "defaultVisibility": "private", "defaultRepository": { "fullName": "mersoft-corp/issues" }}No valid credentials.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}The workspace’s billing has lapsed, so writes are refused.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}Authenticated, but not permitted.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}No such resource, or it is not visible to you.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}The request conflicts with the current state.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}The request did not match the expected shape.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}Rate limited. Retry after the interval in the header.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
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.
object
object
A stable identifier for the kind of failure. Safe to branch on.
What went wrong, written for a person.
Structured particulars, when there are any.
object
What to do about it, when there is something to do.
Quote this when asking about a specific failure.
Examplegenerated
{ "error": { "code": "example", "message": "example", "detail": { "additionalProperty": "example" }, "remedy": "example", "requestId": "example" }}