Introduce exact roster#

PropertyValue
Servicecrossfire
OperationintroduceEnrollment
MethodPOST
Path/api/enrollments
Authenticationpublic
Success status201
Response dataUnpaginated value
Request formatjson
Maximum request body2097152 bytes (service default)
Permission codesNone declared

Listed permission codes are alternatives, not token scopes. The service also checks access to the requested records and rejects stale revisions or controller generations.

Path parameters#

empty object; unknown fields rejected

Validation#

check.empty

Referenced definitions:

Query parameters#

custom validation: none ; see function below

Query parameters are URL text. The validation function below specifies their format, defaults and combinations. Pagination applies only to operations that use it.

Additional checks#

The following checks apply in addition to the field limits.

Constraint on value:

export function none(input: unknown) {
    const parsed = listQuery([])(input);
    return parsed.ok ? success({}) : parsed;
}

Validation#

query.none

Referenced definitions:

Request body#

object; fields below; unknown fields rejected ( enrollment )

Field pathRepresentation and constraints
controllerobject; fields below; unknown fields rejected ( controller )
controller.namestring; 1–100 UTF-16 units; well-formed Unicode; no C0/DEL controls
controller.metadatacustom validation: metadata ; see function below; optional property
controllerCredentialstring; 1–200 UTF-16 units; well-formed Unicode; no C0/DEL controls; optional property
ownerMatrixIdwell-formed Matrix user ID; maximum 255 UTF-16 units
fleetKeylowercase name; pattern [a-z][a-z0-9-]{0,39}
instancesarray; 1–100 entries; item: object; fields below; unknown fields rejected ( instance )
instances[].instanceKeylowercase name; pattern [a-z][a-z0-9-]{0,39}
instances[].namelowercase name; pattern [a-z][a-z0-9-]{0,39}
instances[].identityobject; fields below; unknown fields rejected ( accountProof ); optional property
instances[].identity.agentIdlowercase opaque UUID
instances[].identity.accessTokenstring; 1–8192 UTF-16 units; well-formed Unicode; no C0/DEL controls
instances[].coordinationPolicyobject; fields below; unknown fields rejected; constraint: Select unique identities; everyone requires no individual selections ( coordinationPolicy )
instances[].coordinationPolicy.wakeModevalidator choice('selected', 'humans', 'everyone') ( wakeMode )
instances[].coordinationPolicy.sendersarray; 0–2000 entries; item: object; fields below; unknown fields rejected ( matrixWakeSelection )
instances[].coordinationPolicy.senders[].matrixUserIdwell-formed Matrix user ID; maximum 255 UTF-16 units
instances[].coordinationPolicy.senders[].includeAgentsboolean
instances[].coordinationPolicy.permissionsarray; 0–1 entries; item: room.agent.invite
enrollmentIdlowercase opaque UUID
claimSecret43-character base64url private claim (32 bytes)

Additional checks#

The following checks apply in addition to the field limits.

Constraint on controller.metadata:

function metadata(input: unknown): Result<Record<string, string>> {
    if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).length > 16)
        return failure('invalid', 'Controller metadata supports at most 16 text fields');
    const output: Record<string, string> = {};
    for (const [key, value] of Object.entries(input)) {
        if (!/^[a-z][a-z0-9-]{0,39}$/u.test(key) || !check.text(256, 0)(value).ok || typeof value !== 'string')
            return failure('invalid', 'Invalid controller metadata');
        output[key] = value;
    }
    return success(output);
}

Constraint on instances[].coordinationPolicy:

policy => (policy.wakeMode !== 'everyone' || policy.senders.length === 0)
    && new Set(policy.senders.map(sender => sender.matrixUserId)).size === policy.senders.length

Validation#

req.enrollment

Referenced definitions:

Response data#

object; fields below; unknown fields rejected ( enrollmentIntroduction )

Field pathRepresentation and constraints
enrollmentobject; fields below; unknown fields rejected ( enrollmentDetails )
enrollment.enrollmentobject; fields below; unknown fields rejected ( enrollment )
enrollment.enrollment.ownerobject; fields below; unknown fields rejected ( principal )
enrollment.enrollment.owner.principalIdlowercase opaque UUID
enrollment.enrollment.owner.matrixUserIdwell-formed Matrix user ID; maximum 255 UTF-16 units
enrollment.enrollment.owner.kindhuman or agent
enrollment.enrollment.owner.displayNamestring; 1–255 UTF-16 units; well-formed Unicode; no C0/DEL controls
enrollment.enrollment.owner.ownerIdlowercase opaque UUID
enrollment.enrollment.owner.ownerMatrixIdwell-formed Matrix user ID; maximum 255 UTF-16 units
enrollment.enrollment.controllerNamestring; 1–100 UTF-16 units; well-formed Unicode; no C0/DEL controls
enrollment.enrollment.enrollmentIdlowercase opaque UUID
enrollment.enrollment.ownerIdlowercase opaque UUID
enrollment.enrollment.fleetKeylowercase name; pattern [a-z][a-z0-9-]{0,39}
enrollment.enrollment.verificationCodestring; 12–12 UTF-16 units; well-formed Unicode; no C0/DEL controls
enrollment.enrollment.statuspending or approved or rejected or expired
enrollment.enrollment.revisionexact JSON integer; 0…9007199254740991
enrollment.enrollment.createdAtexact JSON integer; 0…9007199254740991
enrollment.enrollment.expiresAtexact JSON integer; 0…9007199254740991
enrollment.enrollment.decidedByMemberIdlowercase opaque UUID; JSON null permitted
enrollment.enrollment.decidedAtexact JSON integer; 0…9007199254740991; JSON null permitted
enrollment.instancesarray; 0–100 entries; item: object; fields below; unknown fields rejected ( enrollmentItem )
enrollment.instances[].instanceKeylowercase name; pattern [a-z][a-z0-9-]{0,39}
enrollment.instances[].requestedNamelowercase name; pattern [a-z][a-z0-9-]{0,39}
enrollment.instances[].currentNamelowercase name; pattern [a-z][a-z0-9-]{0,39}; JSON null permitted
enrollment.instances[].outcomeclaimed or existing
enrollment.instances[].agentIdlowercase opaque UUID; JSON null permitted
enrollment.instances[].coordinationPolicyobject; fields below; unknown fields rejected; constraint: Select unique identities; everyone requires no individual selections ( coordinationPolicy )
enrollment.instances[].coordinationPolicy.wakeModevalidator choice('selected', 'humans', 'everyone') ( wakeMode )
enrollment.instances[].coordinationPolicy.sendersarray; 0–2000 entries; item: object; fields below; unknown fields rejected ( matrixWakeSelection )
enrollment.instances[].coordinationPolicy.senders[].matrixUserIdwell-formed Matrix user ID; maximum 255 UTF-16 units
enrollment.instances[].coordinationPolicy.senders[].includeAgentsboolean
enrollment.instances[].coordinationPolicy.permissionsarray; 0–1 entries; item: room.agent.invite
approvalUrlstring; 1–2048 UTF-16 units; well-formed Unicode; no C0/DEL controls

Additional checks#

The following checks apply in addition to the field limits.

Constraint on enrollment.instances[].coordinationPolicy:

policy => (policy.wakeMode !== 'everyone' || policy.senders.length === 0)
    && new Set(policy.senders.map(sender => sender.matrixUserId)).size === policy.senders.length

Validation#

res.enrollmentIntroduction

Referenced definitions:

Response envelope#

A successful JSON response contains data and meta. Replace the data placeholder below with the response fields described above. Errors contain error instead of data.

{
  "data": "<value matching the response-data validator>",
  "meta": {
    "requestId": "00000000-0000-0000-0000-000000000001"
  }
}