Chambers AppDeveloper documentation

Capabilities

Every capability in the registry: kind, access, input and refusals.

Every capability in the registry (packages/core/src/registry.ts), generated from the registry itself: 180 in all, 97 commands, 77 queries and 6 jobs; 154 are offered on the JSON API. Each is run through platform().run(name, actor, input, operationId); see the executor for what happens around it.

Each entry shows who may run it, its input as rendered from its zod schema (z.toJSONSchema, input side), and the refusal codes found by reading its definition and the helpers it calls. That list is a static reading of the code: it can include a code from a shared helper that this capability never reaches, and a refusal built some other way may be missing. The messages are the English catalogue's.

Refusals any capability can return

CodeWhenShown as
operation_id_requiredA command or job was run without an operation id of 8 to 128 characters.Send a new Idempotency-Key header with this action, then try again.
invalid_inputThe input did not match the capability's schema; the message is the first issue zod reported.Check what you entered and try again.
unauthenticatedThe capability is not public and no one is signed in.Sign in to continue.
forbiddenThe actor does not hold the permission over the target unit, the target does not exist (answered the same way, so nothing is revealed), or the capability is for platform operators.You are not allowed to do this.
operation_conflictThe operation id was already used by a different capability, actor or input.This Idempotency-Key was already used for a different request. Send a new one with these details.
operation_already_completedA command whose result holds a secret was repeated under the same operation id.This was already done, and its result is not kept. Start again.

Domains

180 in all

Sign-in and sessions

auth.requestCode

command public

Anyone, signed in or not.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted; guarded like the sign-in page. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
emailstring
locale"zh" | "en"
host optionalstringat most 300 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    },
    "host": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "email",
    "locale"
  ]
}

auth.verifyCode

command public secret result

Anyone, signed in or not.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted; guarded like the sign-in page. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
emailstring
codestringpattern ^\d{6}$

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "code": {
      "type": "string",
      "pattern": "^\\d{6}$"
    }
  },
  "required": [
    "email",
    "code"
  ]
}

auth.whoami

query public

Anyone, signed in or not.

On the JSON API: POST, with no Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
tokenstring1 to 256 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [
    "token"
  ]
}

auth.rotateSession

command public secret result

Anyone, signed in or not.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
tokenstring1 to 256 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [
    "token"
  ]
}

auth.signOut

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
everywhereboolean

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "everywhere": {
      "type": "boolean"
    }
  },
  "required": [
    "everywhere"
  ]
}

consent.accept

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/auth.ts.

FieldTypeRules
noticeVersionstring1 to 32 characters
locale"zh" | "en"

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "noticeVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 32
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "noticeVersion",
    "locale"
  ]
}

Chambers

chamber.create

command platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/chambers.ts.

FieldTypeRules
namestring1 to 160 characters
slugstringpattern ^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])$

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "slug": {
      "type": "string",
      "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])$"
    }
  },
  "required": [
    "name",
    "slug"
  ]
}

chamber.list

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/chambers.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Structure and admins

chamber.listMine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

unit.createBranch

command unit.createBranch

Permission unit.createBranch, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
chamberIdstringnot empty
namestring1 to 160 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    }
  },
  "required": [
    "chamberId",
    "name"
  ]
}

unit.createCommittee

command unit.createCommittee

Permission unit.createCommittee, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from parentUnitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
parentUnitIdstringnot empty
namestring1 to 160 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "parentUnitId": {
      "type": "string",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    }
  },
  "required": [
    "parentUnitId",
    "name"
  ]
}

unit.rename

command unit.rename

Permission unit.rename, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
unitIdstringnot empty
namestring1 to 160 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    }
  },
  "required": [
    "unitId",
    "name"
  ]
}

unit.tree

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

unit.detail

query unit.view

Permission unit.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
unitIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "unitId"
  ]
}

admin.appoint

command admin.manage

Permission admin.manage, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
unitIdstringnot empty
emailstring
reasonstring1 to 500 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "email": {
      "type": "string"
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "unitId",
    "email",
    "reason"
  ]
}

admin.revoke

command admin.manage

Permission admin.manage, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from grantId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
grantIdstringnot empty
reasonstring1 to 500 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "grantId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "grantId",
    "reason"
  ]
}

admin.list

query admin.view

Permission admin.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/structure.ts.

FieldTypeRules
unitIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "unitId"
  ]
}

System

audit.list

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/system.ts.

FieldTypeRules
limit optionalinteger≥ 1, ≤ 200, default 100, whole number

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "default": 100,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  }
}

system.health

query public

Anyone, signed in or not.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/system.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Applications and membership

committee.listOpen

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

application.submit

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
committeeIdstringnot empty
branchId optionalstringnot empty
fullNamestring1 to 160 characters
phonestring6 to 32 characters
companystring1 to 160 characters
positionstring1 to 120 characters
industrystring1 to 120 characters
referrerEmail optionalstring | ""
locale"zh" | "en"
Refusal codeShown as
already_appliedYou already have an application waiting for this committee.
already_memberYou already belong to this committee.
branch_requiredChoose the branch you belong to.
membership_suspendedThis membership is suspended.
other_branchYou are a member of another branch, so you can only join committees in your own branch or national committees.
pending_other_branchYou already have an application waiting in another branch. Your first approval decides your branch, so wait for that decision or withdraw it first.
unknown_committeeThat committee no longer exists.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "committeeId": {
      "type": "string",
      "minLength": 1
    },
    "branchId": {
      "type": "string",
      "minLength": 1
    },
    "fullName": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "phone": {
      "type": "string",
      "minLength": 6,
      "maxLength": 32
    },
    "company": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "position": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "industry": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "referrerEmail": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "string",
          "const": ""
        }
      ]
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "committeeId",
    "fullName",
    "phone",
    "company",
    "position",
    "industry",
    "locale"
  ]
}

application.withdraw

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
applicationIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
not_openThis application has already been decided.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "applicationId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "applicationId"
  ]
}

application.listMine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

application.queue

query application.view

Permission application.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
unitIdstringnot empty
include optional"waiting" | "decided"default "waiting"

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "include": {
      "default": "waiting",
      "type": "string",
      "enum": [
        "waiting",
        "decided"
      ]
    }
  },
  "required": [
    "unitId"
  ]
}

application.approve

command application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from applicationId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
applicationIdstringnot empty
note optionalstringat most 500 characters
Refusal codeShown as
applicant_branch_missingThis application does not say which branch the person belongs to. Decline it and ask them to apply again.
applicant_in_committeeThis person already belongs to this committee, so there is nothing to approve. Decline it with a note.
applicant_other_branchThis person has since become a member of another branch, so they cannot join this committee. Decline it with a note.
applicant_suspendedThis person's membership is suspended. Reinstate them before approving.
not_foundThat could not be found.
not_openThis application has already been decided.
own_applicationAnother admin must decide your own application.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "applicationId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "applicationId"
  ]
}

application.decline

command application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from applicationId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
applicationIdstringnot empty
note optionalstringat most 500 characters
Refusal codeShown as
applicant_branch_missingThis application does not say which branch the person belongs to. Decline it and ask them to apply again.
applicant_in_committeeThis person already belongs to this committee, so there is nothing to approve. Decline it with a note.
applicant_other_branchThis person has since become a member of another branch, so they cannot join this committee. Decline it with a note.
applicant_suspendedThis person's membership is suspended. Reinstate them before approving.
not_foundThat could not be found.
not_openThis application has already been decided.
own_applicationAnother admin must decide your own application.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "applicationId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "applicationId"
  ]
}

membership.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

inbox.list

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
limit optionalinteger≥ 1, ≤ 200, default 50, whole number

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "default": 50,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  }
}

inbox.markRead

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/membership.ts.

FieldTypeRules
notificationIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "notificationId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "notificationId"
  ]
}

outbox.deliver

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/membership.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Members

member.list

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/members.ts.

FieldTypeRules
unitIdstringnot empty
include optional"current" | "former"default "current"

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "include": {
      "default": "current",
      "type": "string",
      "enum": [
        "current",
        "former"
      ]
    }
  },
  "required": [
    "unitId"
  ]
}

member.detail

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/members.ts.

FieldTypeRules
membershipIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "membershipId"
  ]
}

Chamber log and support access

audit.listChamber

query audit.view

Permission audit.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/audit.ts.

FieldTypeRules
unitIdstringnot empty
limit optionalinteger≥ 1, ≤ 200, default 100, whole number

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "limit": {
      "default": 100,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  },
  "required": [
    "unitId"
  ]
}

support.viewChamber

command platform-operator secret result not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/audit.ts.

FieldTypeRules
chamberIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
chamber_not_foundThat chamber does not exist. Reload the list of chambers and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "chamberId",
    "reason"
  ]
}

Positions

position.record

command position.manage

Permission position.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from committeeId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/positions.ts.

FieldTypeRules
membershipIdstringnot empty
committeeIdstringnot empty
titlestring1 to 80 characters
startsOnstringpattern ^\d{4}-\d{2}-\d{2}$
endsOn optionalstring | ""pattern ^\d{4}-\d{2}-\d{2}$
Refusal codeShown as
end_before_startThe end date must come after the start date.
holder_not_activeThis person's membership is not active, so they cannot be given a position.
not_a_committeePositions are held in a committee. Choose a committee, not a branch or the chamber.
not_in_committeeThis person is not an active member of that committee. They need to join it before they can hold a position there.
own_membershipAnother admin must make changes to your own membership.
position_overlapsThis member already holds that title in this committee for part of that time. End the earlier term first, or start the new one after it ends.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "committeeId": {
      "type": "string",
      "minLength": 1
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "startsOn": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "endsOn": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        {
          "type": "string",
          "const": ""
        }
      ]
    }
  },
  "required": [
    "membershipId",
    "committeeId",
    "title",
    "startsOn"
  ]
}

position.end

command position.manage

Permission position.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from positionId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/positions.ts.

FieldTypeRules
positionIdstringnot empty
reasonstring1 to 500 characters
endsOn optionalstring | ""pattern ^\d{4}-\d{2}-\d{2}$
Refusal codeShown as
end_date_invalidThe end date must fall between the start date and today.
not_foundThat could not be found.
own_membershipAnother admin must make changes to your own membership.
position_endedThis position has already ended.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "positionId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    },
    "endsOn": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        {
          "type": "string",
          "const": ""
        }
      ]
    }
  },
  "required": [
    "positionId",
    "reason"
  ]
}

position.listCommittee

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from committeeId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/positions.ts.

FieldTypeRules
committeeIdstringnot empty
Refusal codeShown as
not_a_committeePositions are held in a committee. Choose a committee, not a branch or the chamber.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "committeeId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "committeeId"
  ]
}

position.listMember

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/positions.ts.

FieldTypeRules
membershipIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "membershipId"
  ]
}

position.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/positions.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Membership lifecycle

committee.leave

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
committeeIdstringnot empty
Refusal codeShown as
last_committeeEvery member belongs to at least one committee, so this one cannot be left. Resign from the chamber, or as an admin end the membership, instead.
not_foundThat could not be found.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "committeeId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "committeeId"
  ]
}

membership.resign

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
chamberIdstringnot empty
reason optionalstringat most 500 characters
Refusal codeShown as
last_committeeEvery member belongs to at least one committee, so this one cannot be left. Resign from the chamber, or as an admin end the membership, instead.
not_foundThat could not be found.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "chamberId"
  ]
}

committee.removeMember

command committee.manageMembers

Permission committee.manageMembers, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId and committeeId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
membershipIdstringnot empty
committeeIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
higher_adminThis member is an admin at your level or above. Only an admin above them can change their membership or committee places, or their admin right can be removed first.
last_committeeEvery member belongs to at least one committee, so this one cannot be left. Resign from the chamber, or as an admin end the membership, instead.
not_foundThat could not be found.
own_membershipAnother admin must make changes to your own membership.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "committeeId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "committeeId",
    "reason"
  ]
}

membership.suspend

command membership.manage

Permission membership.manage, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
membershipIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
higher_adminThis member is an admin at your level or above. Only an admin above them can change their membership or committee places, or their admin right can be removed first.
membership_endedThis membership has already ended. A new membership needs a new application.
membership_not_activeThis membership is not active, so it cannot be suspended.
not_foundThat could not be found.
not_suspendedThis membership is not suspended, so there is nothing to reinstate.
own_membershipAnother admin must make changes to your own membership.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "reason"
  ]
}

membership.reinstate

command membership.manage

Permission membership.manage, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
membershipIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
higher_adminThis member is an admin at your level or above. Only an admin above them can change their membership or committee places, or their admin right can be removed first.
membership_endedThis membership has already ended. A new membership needs a new application.
membership_not_activeThis membership is not active, so it cannot be suspended.
not_foundThat could not be found.
not_suspendedThis membership is not suspended, so there is nothing to reinstate.
own_membershipAnother admin must make changes to your own membership.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "reason"
  ]
}

membership.terminate

command membership.manage

Permission membership.manage, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
membershipIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
higher_adminThis member is an admin at your level or above. Only an admin above them can change their membership or committee places, or their admin right can be removed first.
membership_endedThis membership has already ended. A new membership needs a new application.
membership_not_activeThis membership is not active, so it cannot be suspended.
not_foundThat could not be found.
not_suspendedThis membership is not suspended, so there is nothing to reinstate.
own_membershipAnother admin must make changes to your own membership.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "reason"
  ]
}

membership.allowedChanges

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/lifecycle.ts.

FieldTypeRules
membershipIdstringnot empty
Refusal codeShown as
membership_endedThis membership has already ended. A new membership needs a new application.
membership_not_activeThis membership is not active, so it cannot be suspended.
not_suspendedThis membership is not suspended, so there is nothing to reinstate.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "membershipId"
  ]
}

Points and tiers

tier.ladder

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

tier.configure

command tier.configure

Permission tier.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
chamberIdstringnot empty
tiersobject[]at least 1 items, at most 12 items
tiers[].id optionalstringnot empty
tiers[].nameZhstring1 to 60 characters
tiers[].nameEnstring1 to 60 characters
tiers[].thresholdinteger≥ 0, ≤ 1000000, whole number
Refusal codeShown as
lowest_tier_not_zeroThe lowest tier must start at 0 points.
thresholds_not_increasingEach tier must need more points than the one below it.
tier_heldMembers hold a tier you took off the ladder. Move them to another tier first.
try_againSomething changed at the same moment. Please try again.
unknown_tierThat tier is no longer on the ladder. Reload the page and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "tiers": {
      "minItems": 1,
      "maxItems": 12,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1
          },
          "nameZh": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "nameEn": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "threshold": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1000000
          }
        },
        "required": [
          "nameZh",
          "nameEn",
          "threshold"
        ]
      }
    }
  },
  "required": [
    "chamberId",
    "tiers"
  ]
}

tier.set

command tier.configure

Permission tier.configure, held by chamber_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
membershipIdstringnot empty
tierIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
below_earned_tierTheir points earn a higher tier. Correct their points first if the tier should be lower.
member_not_activePoints can only be given to an active member.
own_membershipAnother admin must make changes to your own membership.
same_tierThe member already holds that tier.
try_againSomething changed at the same moment. Please try again.
unknown_tierThat tier is no longer on the ladder. Reload the page and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "tierId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "tierId",
    "reason"
  ]
}

points.settings

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

points.configure

command tier.configure

Permission tier.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
chamberIdstringnot empty
attendanceinteger≥ 0, ≤ 100000, whole number
organisinginteger≥ 0, ≤ 100000, whole number
referralinteger≥ 0, ≤ 100000, whole number

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "attendance": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "organising": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "referral": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    }
  },
  "required": [
    "chamberId",
    "attendance",
    "organising",
    "referral"
  ]
}

points.award

command points.award

Permission points.award, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
membershipIdstringnot empty
source"manual" | "contribution"
amountinteger≥ 1, ≤ 100000, whole number
reasonstring1 to 500 characters
Refusal codeShown as
below_earned_tierTheir points earn a higher tier. Correct their points first if the tier should be lower.
member_not_activePoints can only be given to an active member.
own_membershipAnother admin must make changes to your own membership.
same_tierThe member already holds that tier.
try_againSomething changed at the same moment. Please try again.
unknown_tierThat tier is no longer on the ladder. Reload the page and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    },
    "source": {
      "type": "string",
      "enum": [
        "manual",
        "contribution"
      ]
    },
    "amount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "membershipId",
    "source",
    "amount",
    "reason"
  ]
}

points.correct

command points.award

Permission points.award, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from entryId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
entryIdstringnot empty
amountinteger≥ -100000, ≤ 100000, whole number
reasonstring1 to 500 characters
Refusal codeShown as
below_earned_tierTheir points earn a higher tier. Correct their points first if the tier should be lower.
member_not_activePoints can only be given to an active member.
own_membershipAnother admin must make changes to your own membership.
points_below_zeroA member's total cannot fall below zero. Use a smaller correction.
same_tierThe member already holds that tier.
try_againSomething changed at the same moment. Please try again.
unknown_tierThat tier is no longer on the ladder. Reload the page and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entryId": {
      "type": "string",
      "minLength": 1
    },
    "amount": {
      "type": "integer",
      "minimum": -100000,
      "maximum": 100000
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "entryId",
    "amount",
    "reason"
  ]
}

points.history

query member.view

Permission member.view, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from membershipId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

FieldTypeRules
membershipIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "membershipId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "membershipId"
  ]
}

points.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/points.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Operations

operations.health

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/operations.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

News sources

news.sources

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

news.addSource

command platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news.ts.

FieldTypeRules
namestring1 to 120 characters
feedUrlstringat most 2000 characters
kind"rss" | "atom" | "json_api"
language"zh" | "en" | "ms"
terms"headline_link" | "summary_allowed"
permissionNotestring10 to 2000 characters
active optionalbooleandefault true
minIntervalMinutes optionalinteger≥ 15, ≤ 1440, default 30, whole number
Refusal codeShown as
feed_takenAnother source already uses this feed address.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "feedUrl": {
      "type": "string",
      "maxLength": 2000
    },
    "kind": {
      "type": "string",
      "enum": [
        "rss",
        "atom",
        "json_api"
      ]
    },
    "language": {
      "type": "string",
      "enum": [
        "zh",
        "en",
        "ms"
      ]
    },
    "terms": {
      "type": "string",
      "enum": [
        "headline_link",
        "summary_allowed"
      ]
    },
    "permissionNote": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "active": {
      "default": true,
      "type": "boolean"
    },
    "minIntervalMinutes": {
      "default": 30,
      "type": "integer",
      "minimum": 15,
      "maximum": 1440
    }
  },
  "required": [
    "name",
    "feedUrl",
    "kind",
    "language",
    "terms",
    "permissionNote"
  ]
}

news.updateSource

command platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news.ts.

FieldTypeRules
sourceIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
namestring1 to 120 characters
feedUrlstringat most 2000 characters
kind"rss" | "atom" | "json_api"
language"zh" | "en" | "ms"
terms"headline_link" | "summary_allowed"
permissionNotestring10 to 2000 characters
activeboolean
minIntervalMinutesinteger≥ 15, ≤ 1440, whole number
Refusal codeShown as
feed_takenAnother source already uses this feed address.
not_foundThat could not be found.
source_changedSomeone changed this source after you opened it. Reload the page and make your change again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "sourceId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "feedUrl": {
      "type": "string",
      "maxLength": 2000
    },
    "kind": {
      "type": "string",
      "enum": [
        "rss",
        "atom",
        "json_api"
      ]
    },
    "language": {
      "type": "string",
      "enum": [
        "zh",
        "en",
        "ms"
      ]
    },
    "terms": {
      "type": "string",
      "enum": [
        "headline_link",
        "summary_allowed"
      ]
    },
    "permissionNote": {
      "type": "string",
      "minLength": 10,
      "maxLength": 2000
    },
    "active": {
      "type": "boolean"
    },
    "minIntervalMinutes": {
      "type": "integer",
      "minimum": 15,
      "maximum": 1440
    }
  },
  "required": [
    "sourceId",
    "version",
    "name",
    "feedUrl",
    "kind",
    "language",
    "terms",
    "permissionNote",
    "active",
    "minIntervalMinutes"
  ]
}

news.recentItems

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news.ts.

FieldTypeRules
limit optionalinteger≥ 1, ≤ 200, default 30, whole number

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "limit": {
      "default": 30,
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    }
  }
}

news.fetch

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Member import

import.targets

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/member-import.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

import.prepare

command application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from committeeId.

On the JSON API: POST with an Idempotency-Key; draws on the upload allowance. Defined in packages/core/src/capabilities/member-import.ts.

FieldTypeRules
committeeIdstringnot empty
branchId optionalstring
csvstring1 to 1000000 characters
mapping optionalobject
mapping.email optionalinteger | null≥ 0, ≤ 199, whole number
mapping.fullName optionalinteger | null≥ 0, ≤ 199, whole number
mapping.phone optionalinteger | null≥ 0, ≤ 199, whole number
mapping.company optionalinteger | null≥ 0, ≤ 199, whole number
mapping.position optionalinteger | null≥ 0, ≤ 199, whole number
mapping.industry optionalinteger | null≥ 0, ≤ 199, whole number
mapping.committee optionalinteger | null≥ 0, ≤ 199, whole number
mapping.positionTitle optionalinteger | null≥ 0, ≤ 199, whole number
mapping.positionStart optionalinteger | null≥ 0, ≤ 199, whole number
mapping.tier optionalinteger | null≥ 0, ≤ 199, whole number
mapping.language optionalinteger | null≥ 0, ≤ 199, whole number
Refusal codeShown as
import_branch_requiredChoose the branch these members belong to.
import_column_unknownThat column is not in the file. Check the file again.
import_column_used_twiceEach column can hold only one detail. Choose a different column for one of them.
import_committee_other_branchThat committee belongs to another branch. Choose its own branch, or another committee.
import_emptyThe file has no rows under its heading row. Check that the first row holds the headings.
import_not_committeeChoose a committee to import into.
import_too_largeThe file has more than 2,000 rows. Split it into smaller files and import each.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "committeeId": {
      "type": "string",
      "minLength": 1
    },
    "branchId": {
      "type": "string"
    },
    "csv": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1000000
    },
    "mapping": {
      "type": "object",
      "properties": {
        "email": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "fullName": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "phone": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "company": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "position": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "industry": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "committee": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "positionTitle": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "positionStart": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "tier": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "language": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        }
      }
    }
  },
  "required": [
    "committeeId",
    "csv"
  ]
}

import.remap

command application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from importId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/member-import.ts.

FieldTypeRules
importIdstringnot empty
mappingobject
mapping.email optionalinteger | null≥ 0, ≤ 199, whole number
mapping.fullName optionalinteger | null≥ 0, ≤ 199, whole number
mapping.phone optionalinteger | null≥ 0, ≤ 199, whole number
mapping.company optionalinteger | null≥ 0, ≤ 199, whole number
mapping.position optionalinteger | null≥ 0, ≤ 199, whole number
mapping.industry optionalinteger | null≥ 0, ≤ 199, whole number
mapping.committee optionalinteger | null≥ 0, ≤ 199, whole number
mapping.positionTitle optionalinteger | null≥ 0, ≤ 199, whole number
mapping.positionStart optionalinteger | null≥ 0, ≤ 199, whole number
mapping.tier optionalinteger | null≥ 0, ≤ 199, whole number
mapping.language optionalinteger | null≥ 0, ≤ 199, whole number
Refusal codeShown as
import_column_unknownThat column is not in the file. Check the file again.
import_column_used_twiceEach column can hold only one detail. Choose a different column for one of them.
import_expiredThis check has expired. Upload the file again.
import_startedSome rows are already imported, so the columns can no longer change.
not_foundThat could not be found.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "importId": {
      "type": "string",
      "minLength": 1
    },
    "mapping": {
      "type": "object",
      "properties": {
        "email": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "fullName": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "phone": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "company": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "position": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "industry": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "committee": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "positionTitle": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "positionStart": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "tier": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        },
        "language": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 199
            },
            {
              "type": "null"
            }
          ]
        }
      }
    }
  },
  "required": [
    "importId",
    "mapping"
  ]
}

import.view

query application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from importId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/member-import.ts.

FieldTypeRules
importIdstringnot empty
Refusal codeShown as
import_expiredThis check has expired. Upload the file again.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "importId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "importId"
  ]
}

import.run

command application.decide

Permission application.decide, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from importId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/member-import.ts.

FieldTypeRules
importIdstringnot empty
host optionalstringat most 260 characters
Refusal codeShown as
import_expiredThis check has expired. Upload the file again.
import_finishedEvery row of this file has been imported or skipped.
not_foundThat could not be found.
try_againSomething changed at the same moment. Please try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "importId": {
      "type": "string",
      "minLength": 1
    },
    "host": {
      "type": "string",
      "maxLength": 260
    }
  },
  "required": [
    "importId"
  ]
}

Visibility

visibility.table

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/visibility.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

visibility.configure

command visibility.configure

Permission visibility.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/visibility.ts.

FieldTypeRules
chamberIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
itemsobject[]at least 7 items, at most 7 items
items[].item"member_directory" | "member_card" | "committee_exco" | "past_events" | "event_gallery" | "news_digest" | "matching"
items[].publicboolean
items[].friendboolean
items[].officeHolderboolean
items[].tiersrecord of boolean
Refusal codeShown as
visibility_changedThe table or the tiers changed since you opened this page. Reload it and make your changes again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "items": {
      "minItems": 7,
      "maxItems": 7,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "item": {
            "type": "string",
            "enum": [
              "member_directory",
              "member_card",
              "committee_exco",
              "past_events",
              "event_gallery",
              "news_digest",
              "matching"
            ]
          },
          "public": {
            "type": "boolean"
          },
          "friend": {
            "type": "boolean"
          },
          "officeHolder": {
            "type": "boolean"
          },
          "tiers": {
            "type": "object",
            "propertyNames": {
              "type": "string",
              "minLength": 1
            },
            "additionalProperties": {
              "type": "boolean"
            }
          }
        },
        "required": [
          "item",
          "public",
          "friend",
          "officeHolder",
          "tiers"
        ]
      }
    }
  },
  "required": [
    "chamberId",
    "version",
    "items"
  ]
}

visibility.mine

query public

Anyone, signed in or not.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/visibility.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

Data requests and erasure

export.mine

command signed-in secret result

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/data-requests.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

dataRequest.create

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/data-requests.ts.

Form 1 of 2:

FieldTypeRules
kind"chamber"
chamberIdstringnot empty

Form 2 of 2:

FieldTypeRules
kind"account"
Refusal codeShown as
data_already_deletedThis chamber has already deleted the data it held about you. There is nothing more to ask it to delete.
not_foundThat could not be found.
request_openYou already have a request waiting for this.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "const": "chamber"
        },
        "chamberId": {
          "type": "string",
          "minLength": 1
        }
      },
      "required": [
        "kind",
        "chamberId"
      ]
    },
    {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "const": "account"
        }
      },
      "required": [
        "kind"
      ]
    }
  ]
}

dataRequest.listMine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key; allowed before the privacy notice is accepted. Defined in packages/core/src/capabilities/data-requests.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

dataRequest.listChamber

query data.manage

Permission data.manage, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/data-requests.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

dataRequest.listAll

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/data-requests.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

dataRequest.complete

command data.manage

Permission data.manage, held by chamber_admin at the unit or above; checked at the unit found from requestId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/data-requests.ts.

FieldTypeRules
requestIdstringnot empty
note optionalstringat most 500 characters
Refusal codeShown as
holds_admin_roleThis person is still an admin. Remove them as admin first, then complete the request.
membership_openThis person still belongs to a chamber. Each chamber must complete its request, or they must resign, first.
not_foundThat could not be found.
own_requestAnother admin must decide a request about your own data.
request_decidedThis request was already completed or refused. Refresh the page.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "requestId"
  ]
}

dataRequest.refuse

command data.manage

Permission data.manage, held by chamber_admin at the unit or above; checked at the unit found from requestId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/data-requests.ts.

FieldTypeRules
requestIdstringnot empty
notestring1 to 500 characters
Refusal codeShown as
not_foundThat could not be found.
own_requestAnother admin must decide a request about your own data.
request_decidedThis request was already completed or refused. Refresh the page.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "requestId",
    "note"
  ]
}

Brands and addresses

brand.resolve

query public

Anyone, signed in or not.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/brand.ts.

FieldTypeRules
hoststringat most 300 characters

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "host": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "host"
  ]
}

brand.settings

query brand.configure

Permission brand.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/brand.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

brand.update

command brand.configure

Permission brand.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/brand.ts.

FieldTypeRules
chamberIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
nameZhstring1 to 80 characters
nameEnstring1 to 80 characters
markstring
colourstringat most 20 characters
Refusal codeShown as
brand_changedSomeone saved the brand since you opened it. The form now shows their save; make your change again.
brand_colour_invalidEnter the colour as six hexadecimal digits, such as #1F4E79.
brand_colour_low_contrastWhite text on this colour is too hard to read: it needs a contrast of at least 4.5:1. Choose a darker colour.
brand_mark_invalidThe mark is exactly one character.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "nameZh": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "nameEn": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "mark": {
      "type": "string"
    },
    "colour": {
      "type": "string",
      "maxLength": 20
    }
  },
  "required": [
    "chamberId",
    "version",
    "nameZh",
    "nameEn",
    "mark",
    "colour"
  ]
}

host.list

query platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/brand.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

host.set

command platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/brand.ts.

FieldTypeRules
hoststringat most 300 characters
chamberIdstringnot empty
Refusal codeShown as
host_takenThis address already shows another chamber. Remove it there first.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "host": {
      "type": "string",
      "maxLength": 300
    },
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "host",
    "chamberId"
  ]
}

host.remove

command platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/brand.ts.

FieldTypeRules
hoststringat most 300 characters
Refusal codeShown as
host_not_foundThis address is not mapped to a chamber.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "host": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "host"
  ]
}

Brand logos

command brand.configure not on the API

Permission brand.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId, or by a platform operator where the target belongs to the platform.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/brand-logo.ts.

FieldTypeRules
chamberIdstringnot empty
imageany
digeststringpattern ^[0-9a-f]{64}$
Refusal codeShown as
brand_logo_changedSomeone changed the logo while this one was uploading. Reload the page to see it, then try again.
brand_logo_too_largeThe logo is larger than 1 MB. Save it smaller, or as WebP, and upload it again.
brand_logo_type_unsupportedChoose a PNG, JPEG or WebP file. SVG, GIF and other formats are not accepted.
brand_logo_unavailableLogos cannot be uploaded here yet.
brand_logo_unreadableThis file could not be read as an image. Export the logo again and upload that file.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "image": {},
    "digest": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    }
  },
  "required": [
    "chamberId",
    "image",
    "digest"
  ],
  "additionalProperties": false
}
command brand.configure

Permission brand.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/brand-logo.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
brand_logo_changedSomeone changed the logo while this one was uploading. Reload the page to see it, then try again.
brand_logo_noneThe chamber has no logo to remove.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}
query public not on the API

Anyone, signed in or not.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/brand-logo.ts.

FieldTypeRules
mediaId optionalstring1 to 100 characters
chamberId optionalstring1 to 100 characters
heightnumber
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "mediaId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "chamberId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "height": {
      "type": "number"
    }
  },
  "required": [
    "height"
  ],
  "additionalProperties": false
}

News analysis

news.analyse

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/news-analysis.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Events

event.create

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from ownerUnitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
ownerUnitIdstringnot empty
reach"committee" | "branch" | "chamber"
titleZh optionalstringat most 160 characters, default ""
titleEn optionalstringat most 160 characters, default ""
descriptionZh optionalstringat most 5000 characters, default ""
descriptionEn optionalstringat most 5000 characters, default ""
venuestring1 to 300 characters
startsAtstringformat date-time
endsAtstringformat date-time
capacityinteger≥ 1, ≤ 100000, whole number
guestAllowanceinteger≥ 0, ≤ 10, whole number
Refusal codeShown as
event_cancelledThis event was cancelled and can no longer be changed.
event_changedThe event changed since you opened it. Reload the page and make your change again.
event_completed_finalThis event is completed, so it can no longer be changed or cancelled.
event_ends_before_startThe event must end after it starts. Check the times.
event_reach_invalidA branch or chamber event is offered to its whole branch or the whole chamber. Choose the organiser's own level or wider.
event_starts_in_pastThis event's start has already passed. Choose a later start time.
event_title_requiredGive the event a title in Chinese or English.
reach_above_ownerAn event cannot be offered wider than its organiser's level. Choose a narrower reach.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ownerUnitId": {
      "type": "string",
      "minLength": 1
    },
    "reach": {
      "type": "string",
      "enum": [
        "committee",
        "branch",
        "chamber"
      ]
    },
    "titleZh": {
      "default": "",
      "type": "string",
      "maxLength": 160
    },
    "titleEn": {
      "default": "",
      "type": "string",
      "maxLength": 160
    },
    "descriptionZh": {
      "default": "",
      "type": "string",
      "maxLength": 5000
    },
    "descriptionEn": {
      "default": "",
      "type": "string",
      "maxLength": 5000
    },
    "venue": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "startsAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "endsAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "capacity": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "guestAllowance": {
      "type": "integer",
      "minimum": 0,
      "maximum": 10
    }
  },
  "required": [
    "ownerUnitId",
    "reach",
    "venue",
    "startsAt",
    "endsAt",
    "capacity",
    "guestAllowance"
  ]
}

event.update

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
reach"committee" | "branch" | "chamber"
titleZh optionalstringat most 160 characters, default ""
titleEn optionalstringat most 160 characters, default ""
descriptionZh optionalstringat most 5000 characters, default ""
descriptionEn optionalstringat most 5000 characters, default ""
venuestring1 to 300 characters
startsAtstringformat date-time
endsAtstringformat date-time
capacityinteger≥ 1, ≤ 100000, whole number
guestAllowanceinteger≥ 0, ≤ 10, whole number
Refusal codeShown as
event_cancelledThis event was cancelled and can no longer be changed.
event_capacity_below_takenMore places are already taken or offered than that. Choose at least as many places as are taken.
event_changedThe event changed since you opened it. Reload the page and make your change again.
event_completed_finalThis event is completed, so it can no longer be changed or cancelled.
event_ends_before_startThe event must end after it starts. Check the times.
event_public_wave_needs_chamberOnly an event offered to the whole chamber can open to the public. Remove the public wave first.
event_reach_invalidA branch or chamber event is offered to its whole branch or the whole chamber. Choose the organiser's own level or wider.
event_starts_in_pastThis event's start has already passed. Choose a later start time.
event_title_requiredGive the event a title in Chinese or English.
event_wave_after_startEvery wave must open before the event starts. Move the wave earlier, or the event later.
not_foundThat could not be found.
reach_above_ownerAn event cannot be offered wider than its organiser's level. Choose a narrower reach.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "reach": {
      "type": "string",
      "enum": [
        "committee",
        "branch",
        "chamber"
      ]
    },
    "titleZh": {
      "default": "",
      "type": "string",
      "maxLength": 160
    },
    "titleEn": {
      "default": "",
      "type": "string",
      "maxLength": 160
    },
    "descriptionZh": {
      "default": "",
      "type": "string",
      "maxLength": 5000
    },
    "descriptionEn": {
      "default": "",
      "type": "string",
      "maxLength": 5000
    },
    "venue": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "startsAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "endsAt": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    },
    "capacity": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100000
    },
    "guestAllowance": {
      "type": "integer",
      "minimum": 0,
      "maximum": 10
    }
  },
  "required": [
    "eventId",
    "version",
    "reach",
    "venue",
    "startsAt",
    "endsAt",
    "capacity",
    "guestAllowance"
  ]
}

event.publish

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
Refusal codeShown as
event_cancelledThis event was cancelled and can no longer be changed.
event_changedThe event changed since you opened it. Reload the page and make your change again.
event_completed_finalThis event is completed, so it can no longer be changed or cancelled.
event_not_draftThis event is already published.
event_starts_in_pastThis event's start has already passed. Choose a later start time.
not_foundThat could not be found.
reach_above_ownerAn event cannot be offered wider than its organiser's level. Choose a narrower reach.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "eventId",
    "version"
  ]
}

event.cancel

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
reasonstring1 to 500 characters
Refusal codeShown as
event_cancelledThis event was cancelled and can no longer be changed.
event_changedThe event changed since you opened it. Reload the page and make your change again.
event_completed_finalThis event is completed, so it can no longer be changed or cancelled.
not_foundThat could not be found.
reach_above_ownerAn event cannot be offered wider than its organiser's level. Choose a narrower reach.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "eventId",
    "version",
    "reason"
  ]
}

event.setWaves

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
wavesobject[]at least 1 items, at most 20 items
waves[].audience"exco" | "tier" | "friend" | "public"
waves[].tierId optionalstringnot empty
waves[].opensAtstringformat date-time
Refusal codeShown as
event_cancelledThis event was cancelled and can no longer be changed.
event_changedThe event changed since you opened it. Reload the page and make your change again.
event_completed_finalThis event is completed, so it can no longer be changed or cancelled.
event_exco_wave_needs_committeeOnly a committee's event has an Exco wave.
event_public_wave_needs_chamberOnly an event offered to the whole chamber can open to the public. Remove the public wave first.
event_unknown_tierThat tier is no longer on the chamber's ladder. Reload the page and try again.
event_wave_after_startEvery wave must open before the event starts. Move the wave earlier, or the event later.
event_wave_repeatedEach audience can have only one wave.
event_waves_out_of_orderEach wave must open no earlier than the one before it.
not_foundThat could not be found.
reach_above_ownerAn event cannot be offered wider than its organiser's level. Choose a narrower reach.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "waves": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "audience": {
            "type": "string",
            "enum": [
              "exco",
              "tier",
              "friend",
              "public"
            ]
          },
          "tierId": {
            "type": "string",
            "minLength": 1
          },
          "opensAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "audience",
          "opensAt"
        ]
      }
    }
  },
  "required": [
    "eventId",
    "version",
    "waves"
  ]
}

event.configureWaves

command event.configure

Permission event.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
chamberIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
gapHoursinteger≥ 1, ≤ 720, whole number
includeExcoboolean
includeTiersboolean
includeFriendsboolean
includePublicboolean
Refusal codeShown as
event_pattern_changedThe default waves changed since you opened them. Reload the page and try again.
event_pattern_no_membersThe default waves must include the tiers or Friends, so every event has a wave. Tick one of them and save again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "gapHours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 720
    },
    "includeExco": {
      "type": "boolean"
    },
    "includeTiers": {
      "type": "boolean"
    },
    "includeFriends": {
      "type": "boolean"
    },
    "includePublic": {
      "type": "boolean"
    }
  },
  "required": [
    "chamberId",
    "version",
    "gapHours",
    "includeExco",
    "includeTiers",
    "includeFriends",
    "includePublic"
  ]
}

event.wavePattern

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

event.adminList

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

event.adminDetail

query event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

event.upcoming

query public

Anyone, signed in or not.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
chamberId optionalstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  }
}

event.view

query public

Anyone, signed in or not.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/events.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

Profiles

profile.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/profiles.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

profile.save

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/profiles.ts.

FieldTypeRules
versioninteger≥ 0, ≤ 9007199254740991, whole number
names optionalobject
names.nameZh optionalstringat most 100 characters, pattern ^[^\p{Cc}]*$
names.nameEn optionalstringat most 100 characters, pattern ^[^\p{Cc}]*$
companies optionalobject[]at most 5 items
companies[].name optionalstringat most 120 characters, pattern ^[^\p{Cc}]*$
companies[].industry optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | ""
companies[].position optionalstringat most 100 characters, pattern ^[^\p{Cc}]*$
companies[].website optionalstringat most 200 characters, pattern ^[^\p{Cc}]*$
companies[].description optionalstringat most 1000 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
companies[].size optional"s1_4" | "s5_29" | "s30_74" | "s75_200" | "s201_plus" | ""
companies[].foundedYear optionalinteger | null≥ -9007199254740991, ≤ 9007199254740991, whole number
offers optionalobject
offers.offers optionalstringat most 1000 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
offers.needs optionalstringat most 1000 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
offers.offerIndustries optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"[]at most 21 items
offers.needIndustries optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"[]at most 21 items
contacts optionalobject
contacts.phone optionalstringat most 40 characters, pattern ^[^\p{Cc}]*$
contacts.email optionalstringat most 200 characters, pattern ^[^\p{Cc}]*$
contacts.whatsapp optionalstringat most 60 characters, pattern ^[^\p{Cc}]*$
contacts.wechat optionalstringat most 60 characters, pattern ^[^\p{Cc}]*$
about optionalobject
about.bio optionalstringat most 1000 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
about.social optionalstring[]at most 5 items
about.languages optional"zh" | "en" | "ms" | "ta" | "yue" | "nan" | "hak" | "teo"[]at most 8 items
visibility optionalrecord of "members" | "hidden"
Refusal codeShown as
profile_changedYour profile changed since you opened it, perhaps on another device. Reload the page and make your change again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "names": {
      "type": "object",
      "properties": {
        "nameZh": {
          "type": "string",
          "maxLength": 100,
          "pattern": "^[^\\p{Cc}]*$"
        },
        "nameEn": {
          "type": "string",
          "maxLength": 100,
          "pattern": "^[^\\p{Cc}]*$"
        }
      }
    },
    "companies": {
      "maxItems": 5,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 120,
            "pattern": "^[^\\p{Cc}]*$"
          },
          "industry": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "A",
                  "B",
                  "C",
                  "D",
                  "E",
                  "F",
                  "G",
                  "H",
                  "I",
                  "J",
                  "K",
                  "L",
                  "M",
                  "N",
                  "O",
                  "P",
                  "Q",
                  "R",
                  "S",
                  "T",
                  "U"
                ]
              },
              {
                "type": "string",
                "const": ""
              }
            ]
          },
          "position": {
            "type": "string",
            "maxLength": 100,
            "pattern": "^[^\\p{Cc}]*$"
          },
          "website": {
            "type": "string",
            "maxLength": 200,
            "pattern": "^[^\\p{Cc}]*$"
          },
          "description": {
            "type": "string",
            "maxLength": 1000,
            "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
          },
          "size": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "s1_4",
                  "s5_29",
                  "s30_74",
                  "s75_200",
                  "s201_plus"
                ]
              },
              {
                "type": "string",
                "const": ""
              }
            ]
          },
          "foundedYear": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          }
        }
      }
    },
    "offers": {
      "type": "object",
      "properties": {
        "offers": {
          "type": "string",
          "maxLength": 1000,
          "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
        },
        "needs": {
          "type": "string",
          "maxLength": 1000,
          "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
        },
        "offerIndustries": {
          "maxItems": 21,
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G",
              "H",
              "I",
              "J",
              "K",
              "L",
              "M",
              "N",
              "O",
              "P",
              "Q",
              "R",
              "S",
              "T",
              "U"
            ]
          }
        },
        "needIndustries": {
          "maxItems": 21,
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "A",
              "B",
              "C",
              "D",
              "E",
              "F",
              "G",
              "H",
              "I",
              "J",
              "K",
              "L",
              "M",
              "N",
              "O",
              "P",
              "Q",
              "R",
              "S",
              "T",
              "U"
            ]
          }
        }
      }
    },
    "contacts": {
      "type": "object",
      "properties": {
        "phone": {
          "type": "string",
          "maxLength": 40,
          "pattern": "^[^\\p{Cc}]*$"
        },
        "email": {
          "type": "string",
          "maxLength": 200,
          "pattern": "^[^\\p{Cc}]*$"
        },
        "whatsapp": {
          "type": "string",
          "maxLength": 60,
          "pattern": "^[^\\p{Cc}]*$"
        },
        "wechat": {
          "type": "string",
          "maxLength": 60,
          "pattern": "^[^\\p{Cc}]*$"
        }
      }
    },
    "about": {
      "type": "object",
      "properties": {
        "bio": {
          "type": "string",
          "maxLength": 1000,
          "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
        },
        "social": {
          "maxItems": 5,
          "type": "array",
          "items": {
            "type": "string",
            "maxLength": 200,
            "pattern": "^[^\\p{Cc}]*$"
          }
        },
        "languages": {
          "maxItems": 8,
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "zh",
              "en",
              "ms",
              "ta",
              "yue",
              "nan",
              "hak",
              "teo"
            ]
          }
        }
      }
    },
    "visibility": {
      "type": "object",
      "propertyNames": {
        "type": "string",
        "enum": [
          "industry",
          "position",
          "website",
          "description",
          "size",
          "founded",
          "offers",
          "needs",
          "phone",
          "email",
          "whatsapp",
          "wechat",
          "bio",
          "social",
          "languages",
          "photo"
        ]
      },
      "additionalProperties": {
        "type": "string",
        "enum": [
          "members",
          "hidden"
        ]
      }
    }
  },
  "required": [
    "version"
  ]
}

profile.card

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/profiles.ts.

FieldTypeRules
chamberIdstringnot empty
userIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId",
    "userId"
  ]
}

Profile photos

profile.setPhoto

command signed-in not on the API

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/profile-photos.ts.

FieldTypeRules
imageany
digeststringpattern ^[0-9a-f]{64}$
Refusal codeShown as
photo_changedYour photo changed while this one was uploading, perhaps on another device. Reload the page and try again.
photo_profile_requiredSave your business card before adding a photo.
photo_too_largeThe photo is larger than 5 MB. Choose a smaller one, or crop it here first.
photo_type_unsupportedChoose a JPEG, PNG or WebP photo.
photo_unavailablePhotos cannot be uploaded here yet.
photo_unreadableThis file could not be read as a photo. Try another one.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "image": {},
    "digest": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    }
  },
  "required": [
    "image",
    "digest"
  ],
  "additionalProperties": false
}

profile.removePhoto

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/profile-photos.ts.

It takes no input; send an empty object, {}.

Refusal codeShown as
photo_noneYou have no photo to remove.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

profile.photo

query signed-in not on the API

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/profile-photos.ts.

FieldTypeRules
userIdstringnot empty
sizenumber
chamberId optionalstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string",
      "minLength": 1
    },
    "size": {
      "type": "number"
    },
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "userId",
    "size"
  ]
}

News digest

digest.settings

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
chamberIdstringnot empty
unitId optionalstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "unitId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

digest.configure

command digest.configure

Permission digest.configure, held by chamber_admin at the unit or above; checked at the unit found from chamberId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
chamberIdstringnot empty
versioninteger≥ 0, ≤ 9007199254740991, whole number
topics"economy" | "finance_markets" | "trade_investment" | "policy_regulation" | "technology" | "property" | "smes_entrepreneurship" | "events_community" | "other"[]at least 1 items, at most 18 items
sourceIdsstring[]at most 200 items
readyTimestringpattern ^([01]\d|2[0-3]):[0-5]\d$
variesBy"chamber" | "branch" | "committee"
Refusal codeShown as
digest_settings_changedSomeone changed the digest settings since you opened them. Reload the page and try again.
digest_source_unknownChoose sources from the allowed list only. Reload the page to see the current list.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "topics": {
      "minItems": 1,
      "maxItems": 18,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "economy",
          "finance_markets",
          "trade_investment",
          "policy_regulation",
          "technology",
          "property",
          "smes_entrepreneurship",
          "events_community",
          "other"
        ]
      }
    },
    "sourceIds": {
      "maxItems": 200,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "readyTime": {
      "type": "string",
      "pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
    },
    "variesBy": {
      "type": "string",
      "enum": [
        "chamber",
        "branch",
        "committee"
      ]
    }
  },
  "required": [
    "chamberId",
    "version",
    "topics",
    "sourceIds",
    "readyTime",
    "variesBy"
  ]
}

digest.pin

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
unitIdstringnot empty
itemIdstringnot empty
Refusal codeShown as
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_item_unknownThat story is no longer available for the digest.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "itemId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "unitId",
    "itemId"
  ]
}

digest.hide

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
unitIdstringnot empty
itemIdstringnot empty
Refusal codeShown as
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_item_unknownThat story is no longer available for the digest.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "itemId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "unitId",
    "itemId"
  ]
}

digest.restore

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
unitIdstringnot empty
itemIdstringnot empty
Refusal codeShown as
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_not_editedThat story is neither pinned nor hidden here.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "itemId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "unitId",
    "itemId"
  ]
}

digest.add

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
unitIdstringnot empty
headlinestring1 to 200 characters
summaryZh optionalstringat most 600 characters
summaryEn optionalstringat most 1200 characters
link optionalstringat most 2000 characters
Refusal codeShown as
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_link_invalidEnter the link as a full address starting with https://, or leave it empty.
digest_summary_requiredWrite a summary in Chinese, in English, or in both.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "headline": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "summaryZh": {
      "type": "string",
      "maxLength": 600
    },
    "summaryEn": {
      "type": "string",
      "maxLength": 1200
    },
    "link": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "unitId",
    "headline"
  ]
}

digest.announce

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from unitId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
unitIdstringnot empty
headlinestring1 to 200 characters
summaryZh optionalstringat most 600 characters
summaryEn optionalstringat most 1200 characters
link optionalstringat most 2000 characters
Refusal codeShown as
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_link_invalidEnter the link as a full address starting with https://, or leave it empty.
digest_summary_requiredWrite a summary in Chinese, in English, or in both.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "headline": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "summaryZh": {
      "type": "string",
      "maxLength": 600
    },
    "summaryEn": {
      "type": "string",
      "maxLength": 1200
    },
    "link": {
      "type": "string",
      "maxLength": 2000
    }
  },
  "required": [
    "unitId",
    "headline"
  ]
}

digest.withdraw

command digest.edit

Permission digest.edit, held by chamber_admin, branch_admin at the unit or above; checked at the unit found from addedId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
addedIdstringnot empty
Refusal codeShown as
digest_added_goneThat item is no longer in today's digest.
digest_changedThe digest changed while you were editing it. Reload the page and try again.
digest_unit_not_variantThis unit has no digest of its own. Edit the chamber's digest, or change the settings to vary it by this unit.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "addedId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "addedId"
  ]
}

digest.assemble

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/digest.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

digest.forViewer

query public

Anyone, signed in or not.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/digest.ts.

FieldTypeRules
chamberIdstringnot empty
unitId optionalstringnot empty
date optionalstringpattern ^\d{4}-\d{2}-\d{2}$
Refusal codeShown as
digest_not_visibleThe news digest is not shown to you in this chamber.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "unitId": {
      "type": "string",
      "minLength": 1
    },
    "date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    }
  },
  "required": [
    "chamberId"
  ]
}

Push and notice preferences

push.subscribe

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

FieldTypeRules
endpointstringat most 2048 characters
keysobject
keys.p256dhstringexactly 87 characters, pattern ^[A-Za-z0-9_-]+$
keys.authstringexactly 22 characters, pattern ^[A-Za-z0-9_-]+$
locale"zh" | "en"
labelstring1 to 80 characters
Refusal codeShown as
push_device_limitNotifications can be on for at most 10 devices. Remove one in your notification settings first.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "endpoint": {
      "type": "string",
      "maxLength": 2048
    },
    "keys": {
      "type": "object",
      "properties": {
        "p256dh": {
          "type": "string",
          "minLength": 87,
          "maxLength": 87,
          "pattern": "^[A-Za-z0-9_-]+$"
        },
        "auth": {
          "type": "string",
          "minLength": 22,
          "maxLength": 22,
          "pattern": "^[A-Za-z0-9_-]+$"
        }
      },
      "required": [
        "p256dh",
        "auth"
      ]
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    },
    "label": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    }
  },
  "required": [
    "endpoint",
    "keys",
    "locale",
    "label"
  ]
}

push.refresh

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

FieldTypeRules
endpointstringat most 2048 characters
locale"zh" | "en"

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "endpoint": {
      "type": "string",
      "maxLength": 2048
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "endpoint",
    "locale"
  ]
}

push.unsubscribe

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

Form 1 of 2:

FieldTypeRules
subscriptionIdstring1 to 128 characters

Form 2 of 2:

FieldTypeRules
endpointstringat most 2048 characters
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "subscriptionId": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128
        }
      },
      "required": [
        "subscriptionId"
      ]
    },
    {
      "type": "object",
      "properties": {
        "endpoint": {
          "type": "string",
          "maxLength": 2048
        }
      },
      "required": [
        "endpoint"
      ]
    }
  ]
}

push.listMine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

notice.preferences

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

notice.setPreferences

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/push.ts.

FieldTypeRules
choicesobject[]at least 1 items, at most 39 items
choices[].topic"applicationDecided" | "applicationReceived" | "tierRaised" | "membershipChanged" | "dataRequestDecided" | "eventOpened" | "eventRegistration" | "waitlistOffered" | "eventChanged" | "eventReminder" | "introduction" | "eventRoles" | "board"
choices[].channel"push" | "email" | "inbox"
choices[].enabledboolean
Refusal codeShown as
notice_channel_unavailableThis kind of notice is not sent by email, so there is nothing to turn off.
notice_email_requiredEmail about a decision on you cannot be turned off. You will always be told by email.
notice_inbox_requiredThis kind of notice always appears in your inbox, so it cannot be turned off there.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "choices": {
      "minItems": 1,
      "maxItems": 39,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "applicationDecided",
              "applicationReceived",
              "tierRaised",
              "membershipChanged",
              "dataRequestDecided",
              "eventOpened",
              "eventRegistration",
              "waitlistOffered",
              "eventChanged",
              "eventReminder",
              "introduction",
              "eventRoles",
              "board"
            ]
          },
          "channel": {
            "type": "string",
            "enum": [
              "push",
              "email",
              "inbox"
            ]
          },
          "enabled": {
            "type": "boolean"
          }
        },
        "required": [
          "topic",
          "channel",
          "enabled"
        ]
      }
    }
  },
  "required": [
    "choices"
  ]
}

Event registrations

registration.register

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

FieldTypeRules
eventIdstringnot empty
guests optionalstring[]at most 10 items, default []
locale"zh" | "en"
Refusal codeShown as
not_foundThat could not be found.
registration_closedThis event has started, so registration has closed.
registration_event_cancelledThis event was cancelled, so there is nothing to register for.
registration_existsYou are already registered for this event, or on its waitlist.
registration_not_offeredThis event is not offered to you.
registration_not_yet_openRegistration has not opened to you yet. Come back at the time shown.
registration_place_takenSomeone took the last place at the same moment. Try again to join the waitlist.
registration_too_many_guestsYou named more guests than this event allows. Remove one and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "guests": {
      "default": [],
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 120
      }
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "eventId",
    "locale"
  ]
}

registration.cancel

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

FieldTypeRules
registrationIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
registration_changedSomething changed at the same moment. Reload the page and try again.
registration_closedThis event has started, so registration has closed.
registration_endedThis registration has already ended. Reload the page to see where you stand.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "registrationId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "registrationId"
  ]
}

registration.accept

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

FieldTypeRules
registrationIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
registration_closedThis event has started, so registration has closed.
registration_endedThis registration has already ended. Reload the page to see where you stand.
registration_not_offeredThis event is not offered to you.
registration_offer_expiredThe place held for you has expired and gone to the next person waiting.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "registrationId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "registrationId"
  ]
}

registration.forEvent

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

registration.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

registration.adminList

query event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/registrations.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

Member directory

directory.search

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/directory.ts.

FieldTypeRules
chamberIdstringnot empty
locale"zh" | "en"
q optionalstringat most 100 characters
qIndustries optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"[]at most 21 items
branchId optionalstringnot empty
committeeId optionalstringnot empty
industry optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
industryIn optional"company" | "offers" | "needs"
after optionalstringat most 500 characters
Refusal codeShown as
directory_membership_suspendedYour membership is suspended, so the directory is closed to you until it is reinstated.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    },
    "q": {
      "type": "string",
      "maxLength": 100
    },
    "qIndustries": {
      "maxItems": 21,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "A",
          "B",
          "C",
          "D",
          "E",
          "F",
          "G",
          "H",
          "I",
          "J",
          "K",
          "L",
          "M",
          "N",
          "O",
          "P",
          "Q",
          "R",
          "S",
          "T",
          "U"
        ]
      }
    },
    "branchId": {
      "type": "string",
      "minLength": 1
    },
    "committeeId": {
      "type": "string",
      "minLength": 1
    },
    "industry": {
      "type": "string",
      "enum": [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F",
        "G",
        "H",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N",
        "O",
        "P",
        "Q",
        "R",
        "S",
        "T",
        "U"
      ]
    },
    "industryIn": {
      "type": "string",
      "enum": [
        "company",
        "offers",
        "needs"
      ]
    },
    "after": {
      "type": "string",
      "maxLength": 500
    }
  },
  "required": [
    "chamberId",
    "locale"
  ]
}

directory.card

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/directory.ts.

FieldTypeRules
chamberIdstringnot empty
userIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId",
    "userId"
  ]
}

Business matching

matching.status

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/matching.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

matching.optIn

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/matching.ts.

FieldTypeRules
chamberIdstringnot empty
noticeVersionstring1 to 40 characters
Refusal codeShown as
matching_already_onMatching is already on for you in this chamber.
matching_members_onlyOnly active members of this chamber can turn on matching.
matching_not_offeredThis chamber does not offer matching to you at present.
matching_notice_outdatedThe explanation of matching has changed. Please read it again before turning matching on.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "noticeVersion": {
      "type": "string",
      "minLength": 1,
      "maxLength": 40
    }
  },
  "required": [
    "chamberId",
    "noticeVersion"
  ]
}

matching.optOut

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/matching.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
matching_not_opted_inMatching is not on for you in this chamber.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

Digest email

digest.emailPreference

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/digest-email.ts.

FieldTypeRules
chamberIdstring1 to 128 characters
Refusal codeShown as
digest_email_hiddenThis chamber does not show its news digest to you, so it cannot be emailed to you.
digest_email_members_onlyOnly members of this chamber can have its news digest emailed.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    }
  },
  "required": [
    "chamberId"
  ]
}

digest.setEmail

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/digest-email.ts.

FieldTypeRules
chamberIdstring1 to 128 characters
frequency"off" | "daily" | "weekly"
locale"zh" | "en"
Refusal codeShown as
digest_email_hiddenThis chamber does not show its news digest to you, so it cannot be emailed to you.
digest_email_members_onlyOnly members of this chamber can have its news digest emailed.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128
    },
    "frequency": {
      "type": "string",
      "enum": [
        "off",
        "daily",
        "weekly"
      ]
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "chamberId",
    "frequency",
    "locale"
  ]
}

digest.sendEmails

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/digest-email.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Check-in

checkIn.card

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
check_in_no_cardYou have no membership of this chamber, so there is no card to show.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

checkIn.venue

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

checkIn.list

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

checkIn.scan

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
eventIdstringnot empty
tokenstring1 to 600 characters
keystringpattern ^[A-Za-z0-9_-]{16,64}$
at optionalstringformat date-time
Refusal codeShown as
check_in_card_expiredThis card's code has run out. Ask the member to open their card again.
check_in_card_invalidThis is not a member card of this app. Ask the member to open their card again.
check_in_card_other_chamberThis card is for another chamber.
check_in_membership_endedThis card's membership has ended.
check_in_not_registeredNot registered for this event. Check them in as a walk-in if there is space.
check_in_ownAnother member of staff must check you in, or scan the venue code yourself.
check_in_time_invalidThis phone's clock is wrong, or the check-in waited over two days to be sent.
member_not_activePoints can only be given to an active member.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600
    },
    "key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{16,64}$"
    },
    "at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "eventId",
    "token",
    "key"
  ]
}

checkIn.manual

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
eventIdstringnot empty
registrationIdstringnot empty
keystringpattern ^[A-Za-z0-9_-]{16,64}$
at optionalstringformat date-time
Refusal codeShown as
check_in_not_registeredNot registered for this event. Check them in as a walk-in if there is space.
check_in_ownAnother member of staff must check you in, or scan the venue code yourself.
check_in_time_invalidThis phone's clock is wrong, or the check-in waited over two days to be sent.
member_not_activePoints can only be given to an active member.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "registrationId": {
      "type": "string",
      "minLength": 1
    },
    "key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{16,64}$"
    },
    "at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "eventId",
    "registrationId",
    "key"
  ]
}

checkIn.walkIn

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
eventIdstringnot empty
tokenstring1 to 600 characters
keystringpattern ^[A-Za-z0-9_-]{16,64}$
at optionalstringformat date-time
Refusal codeShown as
check_in_already_registeredThey are already registered. Scan their card or tick their name instead.
check_in_card_expiredThis card's code has run out. Ask the member to open their card again.
check_in_card_invalidThis is not a member card of this app. Ask the member to open their card again.
check_in_card_other_chamberThis card is for another chamber.
check_in_event_cancelledThis event was cancelled.
check_in_fullThe event is full, so no walk-in can be checked in.
check_in_membership_endedThis card's membership has ended.
check_in_ownAnother member of staff must check you in, or scan the venue code yourself.
check_in_time_invalidThis phone's clock is wrong, or the check-in waited over two days to be sent.
check_in_walk_in_not_activeOnly an active member can be checked in as a walk-in.
member_not_activePoints can only be given to an active member.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "token": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600
    },
    "key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{16,64}$"
    },
    "at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "eventId",
    "token",
    "key"
  ]
}

checkIn.self

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
codestring1 to 300 characters
keystringpattern ^[A-Za-z0-9_-]{16,64}$
at optionalstringformat date-time
Refusal codeShown as
check_in_closedCheck-in for this event has closed.
check_in_code_expiredThat venue code has changed. Scan the code on the screen again.
check_in_code_invalidThat is not a venue code of this app.
check_in_event_cancelledThis event was cancelled.
check_in_key_usedThis check-in clashed with another. Try again.
check_in_not_openCheck-in opens three hours before the event starts.
check_in_self_not_registeredYou are not registered for this event. Ask the staff at the door.
check_in_time_invalidThis phone's clock is wrong, or the check-in waited over two days to be sent.
member_not_activePoints can only be given to an active member.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "minLength": 1,
      "maxLength": 300
    },
    "key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9_-]{16,64}$"
    },
    "at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
    }
  },
  "required": [
    "code",
    "key"
  ]
}

checkIn.undo

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/check-in.ts.

FieldTypeRules
checkInIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
check_in_already_undoneThis check-in was already undone.
check_in_closedCheck-in for this event has closed.
check_in_ownAnother member of staff must check you in, or scan the venue code yourself.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "checkInId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "checkInId",
    "reason"
  ]
}

Check-in door copy

checkIn.doorCopy

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/door-copy.ts.

FieldTypeRules
eventIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

Event photos

eventPhoto.upload

command signed-in not on the API

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
eventIdstringnot empty
imageany
digeststringpattern ^[0-9a-f]{64}$
Refusal codeShown as
event_photo_event_closedThis event is not taking photos.
event_photo_limit_reachedYou already have 20 photos waiting for this event. Wait for an admin to review them.
event_photo_not_startedPhotos can be added once the event has started.
event_photo_too_largeThe photo is larger than 5 MB. Choose a smaller one.
event_photo_type_unsupportedChoose a JPEG, PNG or WebP photo.
event_photo_unavailablePhotos cannot be uploaded here yet.
event_photo_unreadableThis file could not be read as a photo. Try another one.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "image": {},
    "digest": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    }
  },
  "required": [
    "eventId",
    "image",
    "digest"
  ],
  "additionalProperties": false
}

eventPhoto.approve

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from photoId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
versioninteger≥ 1, ≤ 9007199254740991, whole number
Refusal codeShown as
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "photoId",
    "version"
  ]
}

eventPhoto.reject

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from photoId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
versioninteger≥ 1, ≤ 9007199254740991, whole number
Refusal codeShown as
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "photoId",
    "version"
  ]
}

eventPhoto.addToShowcase

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from photoId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
versioninteger≥ 1, ≤ 9007199254740991, whole number
Refusal codeShown as
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
event_photo_not_approvedOnly an approved photo can be added to the showcase.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "photoId",
    "version"
  ]
}

eventPhoto.removeFromShowcase

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from photoId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
versioninteger≥ 1, ≤ 9007199254740991, whole number
Refusal codeShown as
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
event_photo_not_approvedOnly an approved photo can be added to the showcase.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "photoId",
    "version"
  ]
}

eventPhoto.caption

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
versioninteger≥ 1, ≤ 9007199254740991, whole number
captionZhstringat most 300 characters
captionEnstringat most 300 characters
Refusal codeShown as
event_photo_caption_lockedAn admin has already decided on this photo, so only an admin can change its caption.
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "captionZh": {
      "type": "string",
      "maxLength": 300
    },
    "captionEn": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "photoId",
    "version",
    "captionZh",
    "captionEn"
  ]
}

eventPhoto.remove

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
Refusal codeShown as
event_photo_changedThis photo changed since you opened the page. Reload it and try again.
event_photo_not_removableThis photo is approved and part of the event's record. Ask an admin to delete it.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "photoId"
  ]
}

eventPhoto.gallery

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
eventIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

eventPhoto.file

query signed-in not on the API

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
widthnumber

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "width": {
      "type": "number"
    }
  },
  "required": [
    "photoId",
    "width"
  ]
}

eventPhoto.showcase

query public

Anyone, signed in or not.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
chamberId optionalstringnot empty
eventId optionalstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  }
}

eventPhoto.showcaseFile

query public not on the API

Anyone, signed in or not.

Not on the JSON API: Carries or returns raw image bytes, which JSON cannot hold: uploads go through /api/uploads/*, and photos are served from their own addresses. Defined in packages/core/src/capabilities/event-photos.ts.

FieldTypeRules
photoIdstringnot empty
widthnumber

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "photoId": {
      "type": "string",
      "minLength": 1
    },
    "width": {
      "type": "number"
    }
  },
  "required": [
    "photoId",
    "width"
  ]
}

Event notices

eventNotice.send

job platform-operator not on the API

Platform operators only.

Not on the JSON API: Platform-operator work: it stays in the web admin, where support access shows its reason, and keeps operator sessions off long-lived app tokens. Defined in packages/core/src/capabilities/event-notices.ts.

It takes no input; send an empty object, {}.

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {}
}

Matching suggestions

suggestion.list

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/suggestions.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

suggestion.refresh

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/suggestions.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
suggestions_made_recentlySuggestions were made for you less than an hour ago. Please try again later.
suggestions_need_matchingTurn on business matching in this chamber to get suggestions.
suggestions_not_offeredThis chamber does not offer matching to you at present.
suggestions_not_runningSuggestions are not running here yet. Please try again later.
suggestions_still_showingYou still have suggestions to look at. Dismiss them first to ask for new ones.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

suggestion.dismiss

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/suggestions.ts.

FieldTypeRules
suggestionIdstringnot empty
Refusal codeShown as
suggestion_not_foundThat suggestion could not be found. It may have been dismissed already.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "suggestionId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "suggestionId"
  ]
}

Introductions

introduction.request

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/introductions.ts.

FieldTypeRules
chamberIdstringnot empty
userIdstringnot empty
notestringat most 500 characters
source"suggestion" | "directory" | "board"
sourceRef optionalstring1 to 100 characters
locale"zh" | "en"
Refusal codeShown as
board_post_unavailableThis post is no longer on the board, so it cannot be answered.
introduction_alreadyYou have already been introduced to this member.
introduction_declined_recentlyThis member declined your last request. You can ask again 90 days after that.
introduction_no_profileIntroductions are between members who have both saved their business card. Fill in yours from your profile.
introduction_not_opted_inIntroductions are for active members of this chamber who have both turned on business matching.
introduction_note_requiredWrite a short note saying why you would like to meet.
introduction_openA request for this introduction is already waiting for an answer.
introduction_selfYou cannot ask to be introduced to yourself.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    },
    "note": {
      "type": "string",
      "maxLength": 500
    },
    "source": {
      "type": "string",
      "enum": [
        "suggestion",
        "directory",
        "board"
      ]
    },
    "sourceRef": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "chamberId",
    "userId",
    "note",
    "source",
    "locale"
  ]
}

introduction.accept

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/introductions.ts.

FieldTypeRules
introductionIdstringnot empty
locale"zh" | "en"
Refusal codeShown as
introduction_answeredThis request has already been answered or closed.
introduction_expiredThis request has expired, so it can no longer be answered.
introduction_no_profileIntroductions are between members who have both saved their business card. Fill in yours from your profile.
introduction_not_opted_inIntroductions are for active members of this chamber who have both turned on business matching.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "introductionId": {
      "type": "string",
      "minLength": 1
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "introductionId",
    "locale"
  ]
}

introduction.decline

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/introductions.ts.

FieldTypeRules
introductionIdstringnot empty
locale"zh" | "en"
Refusal codeShown as
introduction_answeredThis request has already been answered or closed.
introduction_expiredThis request has expired, so it can no longer be answered.
introduction_no_profileIntroductions are between members who have both saved their business card. Fill in yours from your profile.
introduction_not_opted_inIntroductions are for active members of this chamber who have both turned on business matching.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "introductionId": {
      "type": "string",
      "minLength": 1
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "introductionId",
    "locale"
  ]
}

introduction.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/introductions.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

introduction.with

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/introductions.ts.

FieldTypeRules
chamberIdstringnot empty
userIdstringnot empty
Refusal codeShown as
introduction_openA request for this introduction is already waiting for an answer.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId",
    "userId"
  ]
}

Event staff and attendance

eventStaff.name

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
userIdstringnot empty
Refusal codeShown as
event_staff_alreadyThey are already event staff for this event.
event_staff_event_closedStaff can be named only while the event is published and not yet completed.
event_staff_not_memberOnly an active member of the chamber can be event staff.
event_staff_out_of_reachOnly a member offered this event, registered for it or within your reach can be named event staff.
event_staff_ownYou cannot name yourself as event staff. As an admin over this event, you can already use its door.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId",
    "userId"
  ]
}

eventStaff.remove

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
userIdstringnot empty
Refusal codeShown as
event_staff_not_namedThey are not event staff for this event. Reload the page to see who is.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId",
    "userId"
  ]
}

eventStaff.list

query event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

eventStaff.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: GET or POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
chamberId optionalstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  }
}

eventAttendance.complete

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
event_already_completedThis event is already completed.
event_completion_cancelledA cancelled or unpublished event is not completed.
event_not_endedThe event has not ended yet. Mark it completed after it ends.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

eventAttendance.report

query event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

eventOrganiser.award

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
userIdstringnot empty
role"helper" | "speaker" | "volunteer"
note optionalstringat most 300 characters
Refusal codeShown as
member_not_activePoints can only be given to an active member.
not_foundThat could not be found.
organising_already_awardedThey were already awarded organising points for this event. Each person is awarded once per event.
organising_not_memberOrganising points go only to an active member of the chamber.
organising_not_startedOrganising points can be awarded once the event has started.
organising_out_of_reachOrganising points go only to a member offered this event, registered for it or within your reach.
organising_ownAnother admin must award or remove your own organising points.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    },
    "role": {
      "type": "string",
      "enum": [
        "helper",
        "speaker",
        "volunteer"
      ]
    },
    "note": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "eventId",
    "userId",
    "role"
  ]
}

eventOrganiser.remove

command event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
userIdstringnot empty
reasonstring1 to 500 characters
Refusal codeShown as
not_foundThat could not be found.
organising_already_removedThis award was already removed.
organising_not_awardedNo organising points were awarded to them for this event.
organising_ownAnother admin must award or remove your own organising points.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    },
    "userId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  },
  "required": [
    "eventId",
    "userId",
    "reason"
  ]
}

eventOrganiser.list

query event.manage

Permission event.manage, held by chamber_admin, branch_admin, exco_admin at the unit or above; checked at the unit found from eventId.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/event-staff.ts.

FieldTypeRules
eventIdstringnot empty
Refusal codeShown as
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "eventId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "eventId"
  ]
}

Asks and offers board

board.post

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
chamberIdstringnot empty
kind"ask" | "offer"
titlestring1 to 120 characters, pattern ^[^\p{Cc}]*$
detailsstring1 to 2000 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
industry optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
days optionalinteger≥ 1, ≤ 90, whole number
locale"zh" | "en"
Refusal codeShown as
board_industry_not_on_profileChoose one of the industries on your profile, or none.
board_not_opted_inPosting on the board is for active members of this chamber who have turned on business matching.
board_post_limitYou can have at most 5 posts on the board at once. Close one first.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "kind": {
      "type": "string",
      "enum": [
        "ask",
        "offer"
      ]
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "pattern": "^[^\\p{Cc}]*$"
    },
    "details": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000,
      "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
    },
    "industry": {
      "type": "string",
      "enum": [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F",
        "G",
        "H",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N",
        "O",
        "P",
        "Q",
        "R",
        "S",
        "T",
        "U"
      ]
    },
    "days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 90
    },
    "locale": {
      "type": "string",
      "enum": [
        "zh",
        "en"
      ]
    }
  },
  "required": [
    "chamberId",
    "kind",
    "title",
    "details",
    "locale"
  ]
}

board.close

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
postIdstringnot empty
Refusal codeShown as
board_post_changedThis post is no longer open. Reload the board to see it as it is now.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "postId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "postId"
  ]
}

board.remove

command board.moderate

Permission board.moderate, held by chamber_admin at the unit or above; checked at the unit found from postId, or by a platform operator where the target belongs to the platform.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
postIdstringnot empty
reasonstring1 to 500 characters, pattern ^[^\x00-\x08\x0B\x0C\x0E-\x1F\x7F]*$
Refusal codeShown as
board_post_changedThis post is no longer open. Reload the board to see it as it is now.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "postId": {
      "type": "string",
      "minLength": 1
    },
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500,
      "pattern": "^[^\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]*$"
    }
  },
  "required": [
    "postId",
    "reason"
  ]
}

board.browse

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
chamberIdstringnot empty
kind optional"ask" | "offer"
industry optional"A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U"
q optionalstringat most 100 characters
after optionalstringat most 300 characters
Refusal codeShown as
board_industry_not_on_profileChoose one of the industries on your profile, or none.
board_not_visibleThis chamber does not show the board to you.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    },
    "kind": {
      "type": "string",
      "enum": [
        "ask",
        "offer"
      ]
    },
    "industry": {
      "type": "string",
      "enum": [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F",
        "G",
        "H",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N",
        "O",
        "P",
        "Q",
        "R",
        "S",
        "T",
        "U"
      ]
    },
    "q": {
      "type": "string",
      "maxLength": 100
    },
    "after": {
      "type": "string",
      "maxLength": 300
    }
  },
  "required": [
    "chamberId"
  ]
}

board.moderation

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

board.mine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/board.ts.

FieldTypeRules
chamberIdstringnot empty
Refusal codeShown as
board_industry_not_on_profileChoose one of the industries on your profile, or none.
board_not_opted_inPosting on the board is for active members of this chamber who have turned on business matching.
board_post_limitYou can have at most 5 posts on the board at once. Close one first.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

Introduction outcomes

introduction.answerOutcome

command signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST with an Idempotency-Key. Defined in packages/core/src/capabilities/introduction-outcomes.ts.

FieldTypeRules
introductionIdstringnot empty
answer"none" | "talks" | "deal"
versioninteger≥ 1, ≤ 9007199254740991, whole number
Refusal codeShown as
introduction_outcome_changedYour answer changed since you opened the page. Look again and choose once more.
introduction_outcome_lockedAnswers can be changed for 60 days after you were asked. This one is now locked.
introduction_outcome_not_askedYou can say how an introduction went once you are asked, 30 days after it was accepted.
not_foundThat could not be found.
JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "introductionId": {
      "type": "string",
      "minLength": 1
    },
    "answer": {
      "type": "string",
      "enum": [
        "none",
        "talks",
        "deal"
      ]
    },
    "version": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "introductionId",
    "answer",
    "version"
  ]
}

introduction.outcomesMine

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/introduction-outcomes.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}

introduction.totals

query signed-in

Anyone signed in may call it. The capability itself checks the person's memberships, admin grants or event staff roles, and refuses whoever does not qualify.

On the JSON API: POST, with no Idempotency-Key. Defined in packages/core/src/capabilities/introduction-outcomes.ts.

FieldTypeRules
chamberIdstringnot empty

Its only refusals are the executor's, listed at the top of this page.

JSON Schema of the input
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "chamberId": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "chamberId"
  ]
}