OpenAPI JSONMarkdown Docs

OpenAPI Explorer

Auto-generated OpenAPI definition for all enabled modules.

Default server: https://site-dispatch.dev.evojam.com/api

Authentication & Accounts

Showing 20 of 34 endpoints
GET/auth/admin/nav
Auth required

Resolve backend chrome bootstrap payload

Returns the backend chrome payload available to the authenticated administrator after applying scope, RBAC, role defaults, and personal sidebar preferences.

Responses

200Backend chrome payload
Content-Type: application/json
{
  "brand": null,
  "groups": [
    {
      "name": "string",
      "items": [
        {
          "href": "string",
          "title": "string"
        }
      ]
    }
  ],
  "settingsSections": [
    {
      "id": "string",
      "label": "string",
      "items": [
        {
          "id": "string",
          "label": "string",
          "href": "string"
        }
      ]
    }
  ],
  "settingsPathPrefixes": [
    "string"
  ],
  "profileSections": [
    {
      "id": "string",
      "label": "string",
      "items": [
        {
          "id": "string",
          "label": "string",
          "href": "string"
        }
      ]
    }
  ],
  "profilePathPrefixes": [
    "string"
  ],
  "grantedFeatures": [
    "string"
  ],
  "roles": [
    "string"
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/admin/nav" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/auth/feature-check
Auth required

Check feature grants for the current user

Evaluates which of the requested features are available to the signed-in user within the active tenant / organization context.

Request body (application/json)

{
  "features": [
    "string"
  ]
}

Responses

200Evaluation result
Content-Type: application/json
{
  "ok": true,
  "granted": [
    "string"
  ],
  "userId": "string"
}
400Invalid request — features array missing, too large, or contains invalid entries
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/feature-check" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"features\": [
    \"string\"
  ]
}"
GET/auth/features
Auth requiredauth.acl.manage

List declared feature flags

Returns all static features contributed by the enabled modules along with their module source. Requires features: auth.acl.manage

Responses

200Aggregated feature catalog
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "title": "string",
      "module": "string"
    }
  ],
  "modules": [
    {
      "id": "string",
      "title": "string"
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/features" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/auth/locale

Set locale and redirect

Stores the selected locale in a cookie and redirects to a safe local path.

Parameters

NameInRequiredSchemaDescription
localequeryYesany—
redirectqueryNoany—

Responses

200Success response
Content-Type: application/json
"string"
302Locale cookie set and request redirected
Content-Type: application/json
"string"
400Invalid locale
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/locale?locale=en" \
  -H "Accept: application/json"
POST/auth/locale

Set locale

Stores the selected locale in a cookie and returns a JSON success response.

Request body (application/json)

{
  "locale": "en"
}

Responses

200Locale cookie set
Content-Type: application/json
{
  "ok": true
}
400Invalid locale or malformed request body
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/locale" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d "{
  \"locale\": \"en\"
}"
POST/auth/login

Authenticate user credentials

Validates the submitted credentials and issues a bearer token cookie for subsequent API calls.

Request body (application/x-www-form-urlencoded)

email=user%40example.com&password=string

Responses

200Authentication succeeded
Content-Type: application/json
{
  "ok": true,
  "token": "string",
  "redirect": null
}
400Validation failed
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
401Invalid credentials
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
403User lacks required role
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
429Too many login attempts
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/login" \
  -H "Accept: application/json" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=user%40example.com&password=string"
POST/auth/logout
Auth required

Invalidate session and redirect

Clears authentication cookies and redirects the browser to the login page.

Responses

201Success response
Content-Type: application/json
"string"
302Redirect to login after successful logout
Content-Type: text/html
string

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/logout" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/auth/profile
Auth required

Get current profile

Returns the email address for the signed-in user.

Responses

200Profile payload
Content-Type: application/json
{
  "email": "user@example.com",
  "roles": [
    "string"
  ]
}
404User not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/profile" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/auth/profile
Auth required

Update current profile

Updates the email address or password for the signed-in user.

Request body (application/json)

{}

Responses

200Profile updated
Content-Type: application/json
{
  "ok": true,
  "email": "user@example.com"
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/auth/profile" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{}"
POST/auth/reset

Send reset email

Requests a password reset email for the given account. The endpoint always returns `ok: true` to avoid leaking account existence.

Request body (application/x-www-form-urlencoded)

email=user%40example.com

Responses

200Reset email dispatched (or ignored for unknown accounts)
Content-Type: application/json
{
  "ok": true
}
400Invalid request origin
Content-Type: application/json
{
  "error": "string"
}
429Too many password reset requests
Content-Type: application/json
{
  "error": "string"
}
500Password reset email origin is not configured
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/reset" \
  -H "Accept: application/json" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "email=user%40example.com"
POST/auth/reset/confirm

Complete password reset

Validates the reset token and updates the user password.

Request body (application/x-www-form-urlencoded)

token=string&password=string

Responses

200Password reset succeeded
Content-Type: application/json
{
  "ok": true,
  "redirect": "string"
}
400Invalid token or payload
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
429Too many reset confirmation attempts
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/reset/confirm" \
  -H "Accept: application/json" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "token=string&password=string"
GET/auth/roles
Auth requiredauth.roles.list

List roles

Returns available roles within the current tenant. Super administrators receive visibility across tenants. Requires features: auth.roles.list

Parameters

NameInRequiredSchemaDescription
idqueryNoany—
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
tenantIdqueryNoany—

Responses

200Role collection
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "usersCount": 1,
      "tenantId": null,
      "tenantName": null,
      "updatedAt": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/roles?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/auth/roles
Auth requiredauth.roles.manage

Create role

Creates a new role for the current tenant or globally when `tenantId` is omitted. Requires features: auth.roles.manage

Request body (application/json)

{
  "name": "string"
}

Responses

201Role created
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000"
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/roles" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\"
}"
PUT/auth/roles
Auth requiredauth.roles.manage

Update role

Updates mutable fields on an existing role. Requires features: auth.roles.manage

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Role updated
Content-Type: application/json
{
  "ok": true
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}
404Role not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/auth/roles" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
DELETE/auth/roles
Auth requiredauth.roles.manage

Delete role

Deletes a role by identifier. Fails when users remain assigned. Requires features: auth.roles.manage

Parameters

NameInRequiredSchemaDescription
idqueryYesanyRole identifier

Responses

200Role deleted
Content-Type: application/json
{
  "ok": true
}
400Role cannot be deleted
Content-Type: application/json
{
  "error": "string"
}
404Role not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/auth/roles?id=00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/auth/roles/acl
Auth requiredauth.acl.manage

Fetch role ACL

Returns the feature and organization assignments associated with a role within the current tenant. Requires features: auth.acl.manage

Parameters

NameInRequiredSchemaDescription
roleIdqueryYesany—
tenantIdqueryNoany—

Responses

200Role ACL entry
Content-Type: application/json
{
  "isSuperAdmin": true,
  "features": [
    "string"
  ],
  "organizations": null,
  "updatedAt": null
}
400Invalid role id
Content-Type: application/json
{
  "error": "string"
}
404Role not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/roles/acl?roleId=00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/auth/roles/acl
Auth requiredauth.acl.manage

Update role ACL

Replaces the feature list, super admin flag, and optional organization assignments for a role. Requires features: auth.acl.manage

Request body (application/json)

{
  "roleId": "00000000-0000-4000-8000-000000000000",
  "organizations": null
}

Responses

200Role ACL updated
Content-Type: application/json
{
  "ok": true,
  "sanitized": true
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}
404Role not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/auth/roles/acl" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"roleId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizations\": null
}"
GET/auth/session/refresh

Refresh auth cookie from session token (browser)

Exchanges an existing `session_token` cookie for a fresh JWT auth cookie and redirects the browser.

Parameters

NameInRequiredSchemaDescription
redirectqueryNoanyAbsolute or relative URL to redirect after refresh

Responses

200Success response
Content-Type: application/json
"string"
302Redirect to target location when session is valid
Content-Type: text/html
string

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/session/refresh" \
  -H "Accept: application/json"
POST/auth/session/refresh

Refresh access token (API/mobile)

Exchanges a refresh token for a new JWT access token. Pass the refresh token obtained from login in the request body.

Request body (application/json)

{
  "refreshToken": "string"
}

Responses

200New access token issued
Content-Type: application/json
{
  "ok": true,
  "accessToken": "string",
  "expiresIn": 1
}
400Missing refresh token
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
401Invalid or expired token
Content-Type: application/json
{
  "ok": false,
  "error": "string"
}
429Too many refresh attempts
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/auth/session/refresh" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d "{
  \"refreshToken\": \"string\"
}"
GET/auth/sidebar/preferences
Auth required

Get sidebar preferences

Returns sidebar customization for the current user (default) or the specified role (`?roleId=…`, requires `auth.sidebar.manage`).

Responses

200Current sidebar configuration
Content-Type: application/json
{
  "locale": "string",
  "settings": {
    "version": 1,
    "groupOrder": [
      "string"
    ],
    "groupLabels": {
      "key": "string"
    },
    "itemLabels": {
      "key": "string"
    },
    "hiddenItems": [
      "string"
    ],
    "itemOrder": {
      "key": [
        "string"
      ]
    }
  },
  "canApplyToRoles": true,
  "roles": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "hasPreference": true
    }
  ],
  "scope": {
    "type": "user"
  },
  "updatedAt": null
}
403Missing features for role-scope read
Content-Type: application/json
{
  "error": "string"
}
404Role not found in current tenant scope
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/sidebar/preferences" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Directory (Tenants & Organizations)

Showing 2 of 2 endpoints
GET/directory/organizations/lookup

Public organization lookup by slug

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/organizations/lookup" \
  -H "Accept: application/json"
GET/directory/tenants/lookup

Public tenant lookup

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/tenants/lookup" \
  -H "Accept: application/json"

API Documentation

Showing 1 of 1 endpoints
GET/version

Deployed Open Mercato version

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/version" \
  -H "Accept: application/json"

Audit & Action Logs

Showing 5 of 5 endpoints
GET/audit_logs/audit-logs/access
Auth requiredaudit_logs.view_self

Retrieve access logs

Fetches paginated access audit logs scoped to the authenticated user. Tenant administrators can optionally expand the search to other actors or organizations. Requires features: audit_logs.view_self

Parameters

NameInRequiredSchemaDescription
organizationIdqueryNoanyLimit results to a specific organization
actorUserIdqueryNoanyFilter by actor user id (tenant administrators only)
resourceKindqueryNoanyRestrict to a resource kind such as `order` or `product`
accessTypequeryNoanyAccess type filter, e.g. `read` or `export`
pagequeryNoanyPage number (default 1)
pageSizequeryNoanyPage size (default 50)
limitqueryNoanyExplicit maximum number of records when paginating manually
beforequeryNoanyReturn logs created before this ISO-8601 timestamp
afterqueryNoanyReturn logs created after this ISO-8601 timestamp

Responses

200Access logs returned successfully
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "resourceKind": "string",
      "resourceId": "string",
      "accessType": "string",
      "actorUserId": null,
      "actorUserName": null,
      "tenantId": null,
      "tenantName": null,
      "organizationId": null,
      "organizationName": null,
      "fields": [
        "string"
      ],
      "context": null,
      "createdAt": "string"
    }
  ],
  "canViewTenant": true,
  "page": 1,
  "pageSize": 1,
  "total": 1,
  "totalPages": 1
}
400Invalid filters supplied
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/audit_logs/audit-logs/access" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/audit_logs/audit-logs/actions
Auth requiredaudit_logs.view_self

Fetch action logs

Returns recent action audit log entries. Tenant administrators can widen the scope to other actors or organizations, and callers can optionally restrict results to undoable actions. Requires features: audit_logs.view_self

Parameters

NameInRequiredSchemaDescription
organizationIdqueryNoanyLimit results to a specific organization
actorUserIdqueryNoanyFilter logs created by specific actor IDs (tenant administrators only). Accepts a single UUID or a comma-separated UUID list.
resourceKindqueryNoanyFilter by resource kind (e.g., "order", "product")
resourceIdqueryNoanyFilter by resource ID (UUID of the specific record)
actionTypequeryNoanyFilter by action type (`create`, `edit`, `delete`, `assign`). Accepts a single value or a comma-separated list.
fieldNamequeryNoanyFilter to entries where the given field changed. Accepts a single field name or a comma-separated list.
includeRelatedqueryNoanyWhen `true`, also returns changes to child entities linked via parentResourceKind/parentResourceId
includeTotalqueryNoanyWhen `true`, the response includes the filtered total count.
undoableOnlyqueryNoanyWhen `true`, only undoable actions are returned
limitqueryNoanyMaximum number of records to return (default 50, max 1000)
offsetqueryNoanyZero-based record offset for pagination (legacy — prefer page/pageSize)
pagequeryNoanyPage number (default 1)
pageSizequeryNoanyPage size (default 50, max 200)
sortFieldqueryNoanySort field: `createdAt`, `user`, `action`, `field`, or `source`.
sortDirqueryNoanySort direction: `asc` or `desc`.
beforequeryNoanyReturn actions created before this ISO-8601 timestamp
afterqueryNoanyReturn actions created after this ISO-8601 timestamp

Responses

200Action logs retrieved successfully
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "commandId": "string",
      "actionLabel": null,
      "executionState": "done",
      "actorUserId": null,
      "actorUserName": null,
      "tenantId": null,
      "tenantName": null,
      "organizationId": null,
      "organizationName": null,
      "resourceKind": null,
      "resourceId": null,
      "parentResourceKind": null,
      "parentResourceId": null,
      "undoToken": null,
      "createdAt": "string",
      "updatedAt": "string",
      "snapshotBefore": null,
      "snapshotAfter": null,
      "changes": null,
      "context": null
    }
  ],
  "canViewTenant": true,
  "page": 1,
  "pageSize": 1,
  "total": 1,
  "totalPages": 1
}
400Invalid filter values
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/audit_logs/audit-logs/actions?includeRelated=false&includeTotal=false&undoableOnly=false" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/audit_logs/audit-logs/actions/export
Auth requiredaudit_logs.view_self

Export action logs as CSV

Returns a CSV attachment containing filtered action audit log entries. Tenant administrators can widen the scope to other actors or organizations. Requires features: audit_logs.view_self

Parameters

NameInRequiredSchemaDescription
organizationIdqueryNoanyLimit results to a specific organization
actorUserIdqueryNoanyFilter logs created by specific actor IDs (tenant administrators only). Accepts a single UUID or a comma-separated UUID list.
resourceKindqueryNoanyFilter by resource kind (e.g., "order", "product")
resourceIdqueryNoanyFilter by resource ID (UUID of the specific record)
actionTypequeryNoanyFilter by action type (`create`, `edit`, `delete`, `assign`). Accepts a single value or a comma-separated list.
fieldNamequeryNoanyFilter to entries where the given field changed. Accepts a single field name or a comma-separated list.
includeRelatedqueryNoanyWhen `true`, also returns changes to child entities linked via parentResourceKind/parentResourceId
undoableOnlyqueryNoanyWhen `true`, only undoable actions are returned
limitqueryNoanyMaximum number of records to export (default 1000, capped at 1000)
sortFieldqueryNoanySort field: `createdAt`, `user`, `action`, `field`, or `source`.
sortDirqueryNoanySort direction: `asc` or `desc`.
beforequeryNoanyReturn actions created before this ISO-8601 timestamp
afterqueryNoanyReturn actions created after this ISO-8601 timestamp

Responses

200CSV export generated successfully
Content-Type: application/json
{
  "file": "csv"
}
400Invalid filter values
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/audit_logs/audit-logs/actions/export?includeRelated=false&undoableOnly=false" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/audit_logs/audit-logs/actions/redo
Auth requiredaudit_logs.redo_self

Redo by action log id

Redoes the latest undone command owned by the caller. Requires the action to still be eligible for redo within tenant and organization scope. Requires features: audit_logs.redo_self

Request body (application/json)

{
  "logId": "string"
}

Responses

200Redo executed successfully
Content-Type: application/json
{
  "ok": true,
  "logId": null,
  "undoToken": null
}
400Log not eligible for redo
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/audit_logs/audit-logs/actions/redo" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"logId\": \"string\"
}"
POST/audit_logs/audit-logs/actions/undo
Auth requiredaudit_logs.undo_self

Undo action by token

Replays the undo handler registered for a command. The provided undo token must match the latest undoable log entry accessible to the caller. Requires features: audit_logs.undo_self

Request body (application/json)

{
  "undoToken": "string"
}

Responses

200Undo applied successfully
Content-Type: application/json
{
  "ok": true,
  "logId": "string"
}
400Invalid or unavailable undo token
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/audit_logs/audit-logs/actions/undo" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"undoToken\": \"string\"
}"

Notifications

Showing 13 of 13 endpoints
GET/notifications
Auth required

List notifications

Returns a paginated collection of notifications.

Parameters

NameInRequiredSchemaDescription
statusqueryNoany—
typequeryNoany—
severityqueryNoany—
sourceEntityTypequeryNoany—
sourceEntityIdqueryNoany—
sincequeryNoany—
pagequeryNoany—
pageSizequeryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated notifications
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "type": "string",
      "title": "string",
      "body": null,
      "titleKey": null,
      "bodyKey": null,
      "titleVariables": null,
      "bodyVariables": null,
      "icon": null,
      "severity": "string",
      "status": "string",
      "actions": [
        {
          "id": "string",
          "label": "string"
        }
      ],
      "sourceModule": null,
      "sourceEntityType": null,
      "sourceEntityId": null,
      "linkHref": null,
      "createdAt": "string",
      "readAt": null,
      "actionTaken": null
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/notifications?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/notifications
Auth requirednotifications.create

Create notification

Creates a notification for a user. Requires features: notifications.create

Request body (application/json)

{
  "type": "string",
  "severity": "info",
  "recipientUserId": "00000000-0000-4000-8000-000000000000"
}

Responses

201Notification created
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"type\": \"string\",
  \"severity\": \"info\",
  \"recipientUserId\": \"00000000-0000-4000-8000-000000000000\"
}"
POST/notifications/{id}/action
Auth required

POST /notifications/{id}/action

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

201Success response
Content-Type: application/json
"string"

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications/:id/action" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/notifications/{id}/dismiss
Auth required

PUT /notifications/{id}/dismiss

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/notifications/:id/dismiss" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/notifications/{id}/read
Auth required

PUT /notifications/{id}/read

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/notifications/:id/read" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/notifications/{id}/restore
Auth required

PUT /notifications/{id}/restore

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/notifications/:id/restore" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/notifications/batch
Auth requirednotifications.create

POST /notifications/batch

Requires features: notifications.create

Responses

201Success response
Content-Type: application/json
"string"

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications/batch" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/notifications/feature
Auth requirednotifications.create

POST /notifications/feature

Requires features: notifications.create

Responses

201Success response
Content-Type: application/json
"string"

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications/feature" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/notifications/mark-all-read
Auth required

PUT /notifications/mark-all-read

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/notifications/mark-all-read" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/notifications/role
Auth requirednotifications.create

POST /notifications/role

Requires features: notifications.create

Responses

201Success response
Content-Type: application/json
"string"

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications/role" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/notifications/settings
Auth requirednotifications.manage

GET /notifications/settings

Requires features: notifications.manage

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/notifications/settings" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/notifications/settings
Auth requirednotifications.manage

POST /notifications/settings

Requires features: notifications.manage

Responses

201Success response
Content-Type: application/json
"string"

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/notifications/settings" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/notifications/unread-count
Auth required

GET /notifications/unread-count

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/notifications/unread-count" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Events

Showing 2 of 2 endpoints
GET/events
Auth required

List declared events

Returns every declared event. Filters: category, module, excludeTriggerExcluded (default true).

Responses

200Declared events
Content-Type: application/json
{
  "data": [
    {
      "id": "string",
      "label": "string"
    }
  ],
  "total": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/events" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/events/stream
Auth required

GET /events/stream

Responses

200Success response
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/events/stream" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Scheduler

Showing 8 of 8 endpoints
GET/scheduler/jobs
Auth requiredscheduler.jobs.view

List scheduledjobs

Returns a paginated collection of scheduledjobs scoped to the authenticated organization. Requires features: scheduler.jobs.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
idqueryNoany—
searchqueryNoany—
scopeTypequeryNoany—
isEnabledqueryYesany—
sourceTypequeryNoany—
sourceModulequeryNoany—
sortqueryNoany—
orderqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated scheduledjobs
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "description": null,
      "scopeType": "system",
      "organizationId": null,
      "tenantId": null,
      "scheduleType": "cron",
      "scheduleValue": "string",
      "timezone": "string",
      "targetType": "queue",
      "targetQueue": null,
      "targetCommand": null,
      "targetPayload": null,
      "requireFeature": null,
      "isEnabled": true,
      "lastRunAt": null,
      "nextRunAt": null,
      "sourceType": "user",
      "sourceModule": null,
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/scheduler/jobs?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/scheduler/jobs
Auth requiredscheduler.jobs.manage

Create scheduledjob

Creates a new scheduled job with cron or interval-based scheduling. Requires features: scheduler.jobs.manage

Request body (application/json)

{
  "name": "string",
  "description": null,
  "scopeType": "system",
  "organizationId": null,
  "tenantId": null,
  "scheduleType": "cron",
  "scheduleValue": "string",
  "timezone": "UTC",
  "targetType": "queue",
  "targetQueue": null,
  "targetCommand": null,
  "targetPayload": null,
  "requireFeature": null,
  "isEnabled": true,
  "sourceType": "user",
  "sourceModule": null
}

Responses

201ScheduledJob created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/scheduler/jobs" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\",
  \"description\": null,
  \"scopeType\": \"system\",
  \"organizationId\": null,
  \"tenantId\": null,
  \"scheduleType\": \"cron\",
  \"scheduleValue\": \"string\",
  \"timezone\": \"UTC\",
  \"targetType\": \"queue\",
  \"targetQueue\": null,
  \"targetCommand\": null,
  \"targetPayload\": null,
  \"requireFeature\": null,
  \"isEnabled\": true,
  \"sourceType\": \"user\",
  \"sourceModule\": null
}"
PUT/scheduler/jobs
Auth requiredscheduler.jobs.manage

Update scheduledjob

Updates an existing scheduled job by ID. Requires features: scheduler.jobs.manage

Request body (application/json)

{
  "id": "string",
  "description": null,
  "targetQueue": null,
  "targetCommand": null,
  "targetPayload": null,
  "requireFeature": null
}

Responses

200ScheduledJob updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/scheduler/jobs" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"description\": null,
  \"targetQueue\": null,
  \"targetCommand\": null,
  \"targetPayload\": null,
  \"requireFeature\": null
}"
DELETE/scheduler/jobs
Auth requiredscheduler.jobs.manage

Delete scheduledjob

Deletes a scheduled job by ID. Requires features: scheduler.jobs.manage

Request body (application/json)

{
  "id": "string"
}

Responses

200ScheduledJob deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/scheduler/jobs" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"
GET/scheduler/jobs/{id}/executions

Get execution history for a schedule

Fetch recent executions from BullMQ for a scheduled job. Requires QUEUE_STRATEGY=async.

Parameters

NameInRequiredSchemaDescription
idpathYesany—
pageSizequeryNoany—

Responses

200Execution history
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "scheduleId": "00000000-0000-4000-8000-000000000000",
      "startedAt": "string",
      "finishedAt": null,
      "status": "running",
      "triggerType": "scheduled",
      "triggeredByUserId": null,
      "errorMessage": null,
      "errorStack": null,
      "durationMs": null,
      "queueJobId": "string",
      "queueName": "string",
      "attemptsMade": 1,
      "result": null
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1
}
400Local strategy not supported
Content-Type: application/json
{
  "error": "string"
}
401Unauthorized
Content-Type: application/json
{
  "error": "string"
}
403Access denied
Content-Type: application/json
{
  "error": "string"
}
404Schedule not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/scheduler/jobs/:id/executions?pageSize=20" \
  -H "Accept: application/json"
GET/scheduler/queue-jobs/{jobId}

Get BullMQ job details and logs

Fetch detailed information and logs for a queue job. Requires QUEUE_STRATEGY=async.

Parameters

NameInRequiredSchemaDescription
jobIdpathYesany—
queuequeryYesany—

Responses

200Job details and logs
Content-Type: application/json
{
  "id": "string",
  "name": "string",
  "state": "waiting",
  "progress": null,
  "returnvalue": null,
  "failedReason": null,
  "stacktrace": null,
  "attemptsMade": 1,
  "processedOn": null,
  "finishedOn": null,
  "logs": [
    "string"
  ]
}
400Invalid request or local strategy not supported
Content-Type: application/json
{
  "error": "string"
}
401Unauthorized
Content-Type: application/json
{
  "error": "string"
}
403Access denied
Content-Type: application/json
{
  "error": "string"
}
404Job not found
Content-Type: application/json
{
  "error": "string"
}
500Internal server error
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/scheduler/queue-jobs/:jobId?queue=string" \
  -H "Accept: application/json"
GET/scheduler/targets

List available queues and commands

Returns all registered queue names (from module workers) and command IDs (from the command registry) that can be used as schedule targets.

Responses

200Available targets
Content-Type: application/json
{
  "queues": [
    {
      "value": "string",
      "label": "string"
    }
  ],
  "commands": [
    {
      "value": "string",
      "label": "string"
    }
  ]
}
401Unauthorized
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/scheduler/targets" \
  -H "Accept: application/json"
POST/scheduler/trigger

Manually trigger a schedule

Executes a scheduled job immediately, bypassing the scheduled time. Only works with async queue strategy.

Request body (application/json)

{
  "id": "string"
}

Responses

200Schedule triggered successfully
Content-Type: application/json
{
  "ok": true,
  "jobId": "string",
  "message": "string"
}
400Invalid request or local strategy not supported
Content-Type: application/json
{
  "error": "string"
}
401Unauthorized
Content-Type: application/json
{
  "error": "string"
}
403Access denied
Content-Type: application/json
{
  "error": "string"
}
404Schedule not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/scheduler/trigger" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"

Access — Users

Showing 5 of 5 endpoints
GET/access/users
Auth requiredaccess.users.view

List users (name, email, role, status)

Requires features: access.users.view

Parameters

NameInRequiredSchemaDescription
searchqueryNoany—
rolequeryNoany—
statusqueryNoany—
pagequeryNoany—
pageSizequeryNoany—

Responses

200Paginated users
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "email": "string",
      "role": null,
      "status": "active",
      "invite": null
    }
  ],
  "page": 1,
  "pageSize": 1,
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/access/users?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/access/users
Auth requiredaccess.users.manage

Invite a user (dispatcher or viewer)

Requires features: access.users.manage

Request body (application/json)

{
  "email": "string",
  "name": "string",
  "role": "dispatcher"
}

Responses

201Invited; emailSent=false means the account exists but the mail did not go out
Content-Type: application/json
{
  "id": "string",
  "emailSent": true
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/access/users" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"email\": \"string\",
  \"name\": \"string\",
  \"role\": \"dispatcher\"
}"
GET/access/users/{id}
Auth requiredaccess.users.view

Get one user

Requires features: access.users.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200User
Content-Type: application/json
{
  "id": "string",
  "name": "string",
  "email": "string",
  "role": null,
  "status": "active",
  "invite": null
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/access/users/:id" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/access/users/{id}
Auth requiredaccess.users.manage

Change a user role (dispatcher or viewer)

Requires features: access.users.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "role": "dispatcher"
}

Responses

200Updated
Content-Type: application/json
{
  "ok": true
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/access/users/:id" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"role\": \"dispatcher\"
}"
POST/access/users/{id}/resend-invite
Auth requiredaccess.users.manage

Resend the invitation email (invalidates earlier invite links)

Requires features: access.users.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200New link issued; emailSent=false means the mail did not go out
Content-Type: application/json
{
  "emailSent": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409User already set a password
Content-Type: application/json
{
  "code": "user_already_active"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/access/users/:id/resend-invite" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Alerts — Alert Center

Showing 3 of 3 endpoints
GET/alerts/alerts
Auth requiredalerts.view

List alert center items

Requires features: alerts.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
jobSiteIdsqueryNoany—
subjectTypequeryNoany—
subjectIdsqueryNoany—
kindsqueryNoany—
urgenciesqueryNoany—
unreadOnlyqueryNoany—
resolvedqueryNoany—

Responses

200Paginated alerts
Content-Type: application/json
{
  "items": [
    {
      "alertId": "string",
      "notificationId": null,
      "kind": "subject_overlap_same_site",
      "urgency": "critical",
      "read": true,
      "jobSites": [
        {
          "id": "string",
          "name": "string"
        }
      ],
      "conflictingAssignmentIds": [
        "string"
      ],
      "occurredAt": "string",
      "linkHref": "string"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1,
  "unreadCount": 1
}
400Invalid filters
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/alerts/alerts?page=1&pageSize=20&resolved=false" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/alerts/alerts/{id}/read
Auth requiredalerts.view

Mark an alert as read for the current user

Requires features: alerts.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Marked as read
Content-Type: application/json
{
  "id": "string",
  "read": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/alerts/alerts/string/read" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/alerts/alerts/read-all
Auth requiredalerts.view

Mark all of the current user's alerts as read

Requires features: alerts.view

Responses

200Marked all as read
Content-Type: application/json
{
  "updated": 1
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/alerts/alerts/read-all" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Auth

Showing 1 of 1 endpoints
GET/auth/users/consents
Auth requiredauth.users.edit

List user consents

Returns all consent records for a given user, with integrity verification status. Requires features: auth.users.edit

Parameters

NameInRequiredSchemaDescription
userIdqueryYesany—

Responses

200Consent list returned
Content-Type: application/json
"string"

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/auth/users/consents?userId=00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Calendar — Availability Windows

Showing 4 of 4 endpoints
POST/calendar/availability-windows
Auth requiredcalendar.manage

Create an unavailability window

Requires features: calendar.manage

Request body (application/json)

{
  "resourceType": "equipment",
  "resourceId": "string",
  "startDate": "string",
  "endDateExclusive": "string",
  "reasonCode": "in_service"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/calendar/availability-windows" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"resourceType\": \"equipment\",
  \"resourceId\": \"string\",
  \"startDate\": \"string\",
  \"endDateExclusive\": \"string\",
  \"reasonCode\": \"in_service\"
}"
GET/calendar/availability-windows/{id}
Auth requiredcalendar.view

Get an unavailability window

Requires features: calendar.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Window detail
Content-Type: application/json
{
  "id": "string",
  "resourceType": "equipment",
  "resourceId": "string",
  "startAt": "string",
  "endAt": "string",
  "reasonCode": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/calendar/availability-windows/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/calendar/availability-windows/{id}
Auth requiredcalendar.manage

Update an unavailability window

Requires features: calendar.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "note": null
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/calendar/availability-windows/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"note\": null
}"
DELETE/calendar/availability-windows/{id}
Auth requiredcalendar.manage

Delete an unavailability window

Requires features: calendar.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/calendar/availability-windows/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Calendar — Unavailability Reasons

Showing 1 of 1 endpoints
GET/calendar/unavailability-reasons
Auth requiredcalendar.view

List unavailability reasons

Requires features: calendar.view

Responses

200Seeded reasons dictionary
Content-Type: application/json
[
  {
    "code": "string",
    "resourceType": "equipment"
  }
]

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/calendar/unavailability-reasons" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Calendar — Working Calendar

Showing 2 of 2 endpoints
GET/calendar/working-calendar
Auth requiredcalendar.view

Get the org working calendar

Requires features: calendar.view

Responses

200Org working calendar
Content-Type: application/json
{
  "timeZone": "string",
  "offWeekdays": [
    "mon"
  ],
  "holidays": [
    {
      "id": "string",
      "date": "string",
      "name": "string"
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/calendar/working-calendar" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/calendar/working-calendar
Auth requiredcalendar.manage

Replace the org working calendar (weekly free days + holidays)

Requires features: calendar.manage

Request body (application/json)

{
  "timeZone": "string",
  "offWeekdays": [
    "mon"
  ],
  "holidays": [
    {
      "date": "string"
    }
  ]
}

Responses

200Updated working calendar
Content-Type: application/json
{
  "timeZone": "string",
  "offWeekdays": [
    "mon"
  ],
  "holidays": [
    {
      "id": "string",
      "date": "string",
      "name": "string"
    }
  ]
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/calendar/working-calendar" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"timeZone\": \"string\",
  \"offWeekdays\": [
    \"mon\"
  ],
  \"holidays\": [
    {
      \"date\": \"string\"
    }
  ]
}"

Configs

Showing 6 of 6 endpoints
GET/configs/cache
Auth requiredconfigs.cache.view

Get cache statistics

Returns detailed cache statistics including total entries and breakdown by cache segments. Requires cache service to be available. Requires features: configs.cache.view

Responses

200Cache statistics
Content-Type: application/json
{
  "generatedAt": "string",
  "totalKeys": 1,
  "segments": [
    {
      "segment": "string",
      "resource": null,
      "method": null,
      "path": null,
      "keyCount": 1,
      "keys": [
        "string"
      ]
    }
  ]
}
500Failed to resolve cache stats
Content-Type: application/json
{
  "error": "string"
}
503Cache service unavailable
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/configs/cache" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/configs/cache
Auth requiredconfigs.cache.manage

Purge cache

Purges cache entries. Supports two actions: purgeAll (clears entire cache) or purgeSegment (clears specific segment). Returns updated cache statistics after purge. Requires features: configs.cache.manage

Request body (application/json)

{
  "action": "purgeAll"
}

Responses

200Cache segment cleared successfully
Content-Type: application/json
{
  "action": "purgeSegment",
  "segment": "string",
  "deleted": 1,
  "stats": {
    "generatedAt": "string",
    "totalKeys": 1,
    "segments": [
      {
        "segment": "string",
        "resource": null,
        "method": null,
        "path": null,
        "keyCount": 1,
        "keys": [
          "string"
        ]
      }
    ]
  }
}
400Invalid request - missing segment identifier for purgeSegment action
Content-Type: application/json
{
  "error": "string"
}
500Failed to purge cache
Content-Type: application/json
{
  "error": "string"
}
503Cache service unavailable
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/configs/cache" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"action\": \"purgeAll\"
}"
GET/configs/system-status
Auth requiredconfigs.system_status.view

Get system health status

Returns comprehensive system health information including environment details, version, resource usage, and service connectivity status. Requires features: configs.system_status.view

Responses

200System status snapshot
Content-Type: application/json
{
  "generatedAt": "string",
  "runtimeMode": "development",
  "categories": [
    {
      "key": "profiling",
      "labelKey": "string",
      "descriptionKey": null,
      "items": [
        {
          "key": "string",
          "category": "profiling",
          "kind": "boolean",
          "labelKey": "string",
          "descriptionKey": "string",
          "docUrl": null,
          "defaultValue": null,
          "state": "enabled",
          "value": null,
          "normalizedValue": null
        }
      ]
    }
  ]
}
500Failed to load system status
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/configs/system-status" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/configs/system-status
Auth requiredconfigs.manage

Clear system cache

Purges the entire cache for the current tenant. Useful for troubleshooting or forcing fresh data loading. Requires features: configs.manage

Responses

200Cache cleared successfully
Content-Type: application/json
{
  "cleared": true
}
500Failed to purge cache
Content-Type: application/json
{
  "error": "string"
}
503Cache service unavailable
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/configs/system-status" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/configs/upgrade-actions
Auth requiredconfigs.manage

List pending upgrade actions

Returns a list of pending upgrade actions for the current version. These are one-time setup tasks that need to be executed after upgrading to a new version. Requires organization and tenant context. Requires features: configs.manage

Responses

200List of pending upgrade actions
Content-Type: application/json
{
  "version": "string",
  "actions": [
    {
      "id": "string",
      "version": "string",
      "message": "string",
      "ctaLabel": "string",
      "successMessage": "string",
      "loadingLabel": "string"
    }
  ]
}
400Missing organization or tenant context
Content-Type: application/json
{
  "error": "string"
}
500Failed to load upgrade actions
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/configs/upgrade-actions" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/configs/upgrade-actions
Auth requiredconfigs.manage

Execute upgrade action

Executes a specific upgrade action by ID. Typically used for one-time setup tasks like seeding example data after version upgrade. Returns execution status and localized success message. Requires features: configs.manage

Request body (application/json)

{
  "actionId": "string"
}

Responses

200Upgrade action executed successfully
Content-Type: application/json
{
  "status": "string",
  "message": "string",
  "version": "string"
}
400Invalid request body or missing context
Content-Type: application/json
{
  "error": "string"
}
500Failed to execute upgrade action
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/configs/upgrade-actions" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"actionId\": \"string\"
}"

Dashboards

Showing 10 of 10 endpoints
GET/dashboards/layout
Auth requireddashboards.view

Load the current dashboard layout

Returns the saved widget layout together with the widgets the current user is allowed to place. Requires features: dashboards.view

Responses

200Current dashboard layout and available widgets.
Content-Type: application/json
{
  "layout": {
    "items": [
      {
        "id": "00000000-0000-4000-8000-000000000000",
        "widgetId": "string",
        "order": 1
      }
    ]
  },
  "allowedWidgetIds": [
    "string"
  ],
  "canConfigure": true,
  "context": {
    "userId": "00000000-0000-4000-8000-000000000000",
    "tenantId": null,
    "organizationId": null,
    "userName": null,
    "userEmail": null,
    "userLabel": "string"
  },
  "widgets": [
    {
      "id": "string",
      "title": "string",
      "description": null,
      "defaultSize": "sm",
      "defaultEnabled": true,
      "defaultSettings": null,
      "features": [
        "string"
      ],
      "moduleId": "string",
      "icon": null,
      "loaderKey": "string",
      "supportsRefresh": true
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dashboards/layout" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dashboards/layout
Auth requireddashboards.configure

Persist dashboard layout changes

Saves the provided widget ordering, sizes, and settings for the current user. Requires features: dashboards.configure

Request body (application/json)

{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "widgetId": "string",
      "order": 1
    }
  ]
}

Responses

200Layout updated successfully.
Content-Type: application/json
{
  "ok": true
}
400Invalid layout payload
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dashboards/layout" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"items\": [
    {
      \"id\": \"00000000-0000-4000-8000-000000000000\",
      \"widgetId\": \"string\",
      \"order\": 1
    }
  ]
}"
PATCH/dashboards/layout/{itemId}
Auth requireddashboards.configure

Update a dashboard layout item

Adjusts the size or settings for a single widget within the dashboard layout. Requires features: dashboards.configure

Parameters

NameInRequiredSchemaDescription
itemIdpathYesany—

Request body (application/json)

{}

Responses

200Layout item updated.
Content-Type: application/json
{
  "ok": true
}
400Invalid payload or missing item id
Content-Type: application/json
{
  "error": "string"
}
404Item not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PATCH "https://site-dispatch.dev.evojam.com/api/dashboards/layout/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{}"
GET/dashboards/roles/widgets
Auth requireddashboards.admin.assign-widgets

Fetch widget assignments for a role

Returns the widgets explicitly assigned to the given role together with the evaluation scope. Requires features: dashboards.admin.assign-widgets

Parameters

NameInRequiredSchemaDescription
roleIdqueryYesany—
tenantIdqueryNoany—
organizationIdqueryNoany—

Responses

200Current widget configuration for the role.
Content-Type: application/json
{
  "widgetIds": [
    "string"
  ],
  "hasCustom": true,
  "scope": {
    "tenantId": null,
    "organizationId": null
  }
}
400Missing role identifier
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dashboards/roles/widgets?roleId=00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dashboards/roles/widgets
Auth requireddashboards.admin.assign-widgets

Update widgets assigned to a role

Persists the widget list for a role within the provided tenant and organization scope. Requires features: dashboards.admin.assign-widgets

Request body (application/json)

{
  "roleId": "00000000-0000-4000-8000-000000000000",
  "widgetIds": [
    "string"
  ]
}

Responses

200Widgets updated successfully.
Content-Type: application/json
{
  "ok": true,
  "widgetIds": [
    "string"
  ]
}
400Invalid payload or unknown widgets
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dashboards/roles/widgets" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"roleId\": \"00000000-0000-4000-8000-000000000000\",
  \"widgetIds\": [
    \"string\"
  ]
}"
GET/dashboards/users/widgets
Auth requireddashboards.admin.assign-widgets

Read widget overrides for a user

Returns the widgets inherited and explicitly configured for the requested user within the current scope. Requires features: dashboards.admin.assign-widgets

Parameters

NameInRequiredSchemaDescription
userIdqueryYesany—
tenantIdqueryNoany—
organizationIdqueryNoany—

Responses

200Widget settings for the user.
Content-Type: application/json
{
  "mode": "inherit",
  "widgetIds": [
    "string"
  ],
  "hasCustom": true,
  "effectiveWidgetIds": [
    "string"
  ],
  "scope": {
    "tenantId": null,
    "organizationId": null
  }
}
400Missing user identifier
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dashboards/users/widgets?userId=00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dashboards/users/widgets
Auth requireddashboards.admin.assign-widgets

Update user-specific dashboard widgets

Sets the widget override mode and allowed widgets for a user. Passing `mode: inherit` clears overrides. Requires features: dashboards.admin.assign-widgets

Request body (application/json)

{
  "userId": "00000000-0000-4000-8000-000000000000",
  "mode": "inherit",
  "widgetIds": [
    "string"
  ]
}

Responses

200Overrides saved.
Content-Type: application/json
{
  "ok": true,
  "mode": "inherit",
  "widgetIds": [
    "string"
  ]
}
400Invalid payload or unknown widgets
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dashboards/users/widgets" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"userId\": \"00000000-0000-4000-8000-000000000000\",
  \"mode\": \"inherit\",
  \"widgetIds\": [
    \"string\"
  ]
}"
GET/dashboards/widgets/catalog
Auth requireddashboards.admin.assign-widgets

List available dashboard widgets

Returns the catalog of widgets that modules expose, including defaults and feature requirements. Requires features: dashboards.admin.assign-widgets

Responses

200Widgets available for assignment.
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "title": "string",
      "description": null,
      "defaultSize": "sm",
      "defaultEnabled": true,
      "defaultSettings": null,
      "features": [
        "string"
      ],
      "moduleId": "string",
      "icon": null,
      "loaderKey": "string",
      "supportsRefresh": true
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dashboards/widgets/catalog" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dashboards/widgets/data
Auth requiredanalytics.view

Fetch aggregated data for dashboard widgets

Executes an aggregation query against the specified entity type and returns the result. Supports date range filtering, grouping, and period-over-period comparison. Requires features: analytics.view

Request body (application/json)

{
  "entityType": "string",
  "metric": {
    "field": "string",
    "aggregate": "count"
  }
}

Responses

200Aggregated data for the widget.
Content-Type: application/json
{
  "value": null,
  "data": [
    {
      "value": null
    }
  ],
  "metadata": {
    "fetchedAt": "string",
    "recordCount": 1
  }
}
400Invalid request payload
Content-Type: application/json
{
  "error": "string"
}
500Internal server error
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dashboards/widgets/data" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityType\": \"string\",
  \"metric\": {
    \"field\": \"string\",
    \"aggregate\": \"count\"
  }
}"
POST/dashboards/widgets/data/batch
Auth requiredanalytics.view

Fetch aggregated data for multiple dashboard widgets in one request

Resolves a batch of widget data requests with a single authentication, RBAC, organization-scope, and database-context setup. Each request is keyed by an opaque widget id and resolved independently, so a failure in one widget does not fail the batch. Requires features: analytics.view

Request body (application/json)

{
  "requests": [
    {
      "id": "string",
      "request": {
        "entityType": "string",
        "metric": {
          "field": "string",
          "aggregate": "count"
        }
      }
    }
  ]
}

Responses

200Per-widget aggregation results keyed by request id.
Content-Type: application/json
{
  "results": [
    {
      "id": "string",
      "ok": true,
      "data": {
        "value": null,
        "data": [
          {
            "value": null
          }
        ],
        "metadata": {
          "fetchedAt": "string",
          "recordCount": 1
        }
      }
    }
  ]
}
400Invalid request payload
Content-Type: application/json
{
  "error": "string"
}
500Internal server error
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dashboards/widgets/data/batch" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"requests\": [
    {
      \"id\": \"string\",
      \"request\": {
        \"entityType\": \"string\",
        \"metric\": {
          \"field\": \"string\",
          \"aggregate\": \"count\"
        }
      }
    }
  ]
}"

Dictionaries

Showing 11 of 11 endpoints
GET/dictionaries
Auth requireddictionaries.view

List dictionaries

Returns dictionaries accessible to the current organization, optionally including inactive records. Requires features: dictionaries.view

Parameters

NameInRequiredSchemaDescription
includeInactivequeryNoany—

Responses

200Dictionary collection.
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "key": "string",
      "name": "string",
      "description": null,
      "isSystem": true,
      "isActive": true,
      "managerVisibility": null,
      "organizationId": null,
      "createdAt": "string",
      "updatedAt": null
    }
  ]
}
500Failed to load dictionaries
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dictionaries" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dictionaries
Auth requireddictionaries.manage

Create dictionary

Registers a dictionary scoped to the current organization. Requires features: dictionaries.manage

Request body (application/json)

{
  "key": "string",
  "name": "string"
}

Responses

201Dictionary created.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000",
  "key": "string",
  "name": "string",
  "description": null,
  "isSystem": true,
  "isActive": true,
  "managerVisibility": null,
  "organizationId": null,
  "createdAt": "string",
  "updatedAt": null
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
409Dictionary key already exists
Content-Type: application/json
{
  "error": "string"
}
500Failed to create dictionary
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dictionaries" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"key\": \"string\",
  \"name\": \"string\"
}"
GET/dictionaries/{dictionaryId}
Auth requireddictionaries.view

Get dictionary

Returns details for the specified dictionary, including inheritance flags. Requires features: dictionaries.view

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Responses

200Dictionary details.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000",
  "key": "string",
  "name": "string",
  "description": null,
  "isSystem": true,
  "isActive": true,
  "managerVisibility": null,
  "organizationId": null,
  "createdAt": "string",
  "updatedAt": null
}
400Invalid parameters
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to load dictionary
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PATCH/dictionaries/{dictionaryId}
Auth requireddictionaries.manage

Update dictionary

Updates mutable attributes of the dictionary. Currency dictionaries are protected from modification. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Request body (application/json)

{}

Responses

200Dictionary updated.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000",
  "key": "string",
  "name": "string",
  "description": null,
  "isSystem": true,
  "isActive": true,
  "managerVisibility": null,
  "organizationId": null,
  "createdAt": "string",
  "updatedAt": null
}
400Validation failed or protected dictionary
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
409Dictionary key already exists
Content-Type: application/json
{
  "error": "string"
}
500Failed to update dictionary
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PATCH "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{}"
DELETE/dictionaries/{dictionaryId}
Auth requireddictionaries.manage

Delete dictionary

Soft deletes the dictionary unless it is the protected currency dictionary. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Responses

200Dictionary archived.
Content-Type: application/json
{
  "ok": true
}
400Protected dictionary cannot be deleted
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to delete dictionary
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/dictionaries/{dictionaryId}/entries
Auth requireddictionaries.view

List dictionary entries

Returns entries for the specified dictionary ordered by its configured entry sort mode. Requires features: dictionaries.view

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Responses

200Dictionary entries.
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "value": "string",
      "label": "string",
      "color": null,
      "icon": null,
      "position": 1,
      "isDefault": true,
      "createdAt": "string",
      "updatedAt": null
    }
  ]
}
400Invalid parameters
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to load dictionary entries
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dictionaries/{dictionaryId}/entries
Auth requireddictionaries.manage

Create dictionary entry

Creates a new entry in the specified dictionary. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Request body (application/json)

{
  "value": "string",
  "color": null,
  "icon": null
}

Responses

201Dictionary entry created.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000",
  "value": "string",
  "label": "string",
  "color": null,
  "icon": null,
  "position": 1,
  "isDefault": true,
  "createdAt": "string",
  "updatedAt": null
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to create dictionary entry
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"value\": \"string\",
  \"color\": null,
  \"icon\": null
}"
PATCH/dictionaries/{dictionaryId}/entries/{entryId}
Auth requireddictionaries.manage

Update dictionary entry

Updates the specified dictionary entry using the command bus pipeline. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—
entryIdpathYesany—

Request body (application/json)

{
  "color": null,
  "icon": null
}

Responses

200Dictionary entry updated.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000",
  "value": "string",
  "label": "string",
  "color": null,
  "icon": null,
  "position": 1,
  "isDefault": true,
  "createdAt": "string",
  "updatedAt": null
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
404Dictionary or entry not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to update entry
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PATCH "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"color\": null,
  \"icon\": null
}"
DELETE/dictionaries/{dictionaryId}/entries/{entryId}
Auth requireddictionaries.manage

Delete dictionary entry

Deletes the specified dictionary entry via the command bus. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—
entryIdpathYesany—

Responses

200Entry deleted.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
404Dictionary or entry not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to delete entry
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries/00000000-0000-4000-8000-000000000000" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dictionaries/{dictionaryId}/entries/reorder
Auth requireddictionaries.manage

Reorder dictionary entries

Updates the position of dictionary entries for drag-and-drop reordering. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Request body (application/json)

{
  "entries": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "position": 1
    }
  ]
}

Responses

200Entries reordered.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
404Dictionary not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to reorder entries
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries/reorder" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entries\": [
    {
      \"id\": \"00000000-0000-4000-8000-000000000000\",
      \"position\": 1
    }
  ]
}"
POST/dictionaries/{dictionaryId}/entries/set-default
Auth requireddictionaries.manage

Set default dictionary entry

Marks the specified entry as the default for this dictionary, clearing any previous default. Requires features: dictionaries.manage

Parameters

NameInRequiredSchemaDescription
dictionaryIdpathYesany—

Request body (application/json)

{
  "entryId": "00000000-0000-4000-8000-000000000000"
}

Responses

200Default entry set.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}
404Dictionary or entry not found
Content-Type: application/json
{
  "error": "string"
}
500Failed to set default entry
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dictionaries/00000000-0000-4000-8000-000000000000/entries/set-default" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entryId\": \"00000000-0000-4000-8000-000000000000\"
}"

Directory

Showing 11 of 11 endpoints
GET/directory/organization-branding
Auth requireddirectory.organizations.view

Read sidebar branding for the selected organization

Returns the logo URL used by the backend sidebar for the currently selected organization. Requires features: directory.organizations.view

Responses

200Organization branding
Content-Type: application/json
{
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "organizationName": "string",
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "logoUrl": null
}
400A concrete organization scope is required
Content-Type: application/json
{
  "error": "string"
}
404Organization not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/organization-branding" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/directory/organization-branding
Auth requireddirectory.organizations.manage

Update sidebar branding for the selected organization

Stores an external image URL or an internal attachment image URL as the selected organization logo. Requires features: directory.organizations.manage

Request body (application/json)

{
  "logoUrl": null
}

Responses

200Updated organization branding
Content-Type: application/json
{
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "organizationName": "string",
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "logoUrl": null
}
400Save failed
Content-Type: application/json
{
  "error": "string"
}
422Invalid logo URL
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/directory/organization-branding" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"logoUrl\": null
}"
GET/directory/organization-switcher
Auth required

Load organization switcher menu

Returns the hierarchical menu of organizations the current user may switch to within the active tenant.

Responses

200Organization switcher payload.
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "depth": 1,
      "selectable": true,
      "children": []
    }
  ],
  "selectedId": null,
  "canManage": true,
  "canViewAllOrganizations": true,
  "tenantId": null,
  "tenants": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "isActive": true
    }
  ],
  "isSuperAdmin": true
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/organization-switcher" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/directory/organizations
Auth requireddirectory.organizations.view

List organizations

Returns organizations using options, tree, or paginated manage view depending on the `view` parameter. Requires features: directory.organizations.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
viewqueryNoany—
idsqueryNoany—
tenantIdqueryNoany—
includeInactivequeryNoany—
statusqueryNoany—

Responses

200Organization data for the requested view.
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "parentId": null,
      "parentName": null,
      "tenantId": null,
      "tenantName": null,
      "rootId": null,
      "treePath": null
    }
  ]
}
400Invalid query or tenant scope
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/organizations?page=1&pageSize=50&view=options" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/directory/organizations
Auth requireddirectory.organizations.manage

Create organization

Creates a new organization within a tenant and optionally assigns hierarchy relationships. Requires features: directory.organizations.manage

Request body (application/json)

{
  "name": "string",
  "slug": null,
  "logoUrl": null,
  "parentId": null
}

Responses

201Organization created.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000"
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/directory/organizations" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\",
  \"slug\": null,
  \"logoUrl\": null,
  \"parentId\": null
}"
PUT/directory/organizations
Auth requireddirectory.organizations.manage

Update organization

Updates organization details and hierarchy assignments. Requires features: directory.organizations.manage

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "slug": null,
  "logoUrl": null,
  "parentId": null
}

Responses

200Organization updated.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/directory/organizations" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"slug\": null,
  \"logoUrl\": null,
  \"parentId\": null
}"
DELETE/directory/organizations
Auth requireddirectory.organizations.manage

Delete organization

Soft deletes an organization identified by id. Requires features: directory.organizations.manage

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Organization deleted.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/directory/organizations" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/directory/tenants
Auth requireddirectory.tenants.view

List tenants

Returns tenants visible to the current user with optional search and pagination. Requires features: directory.tenants.view

Parameters

NameInRequiredSchemaDescription
idqueryNoany—
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
isActivequeryNoany—

Responses

200Paged list of tenants.
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "name": "string",
      "isActive": true,
      "createdAt": null,
      "updatedAt": null
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}
400Invalid query parameters
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/directory/tenants?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/directory/tenants
Auth requireddirectory.tenants.manage

Create tenant

Creates a new tenant and returns its identifier. Requires features: directory.tenants.manage

Request body (application/json)

{
  "name": "string"
}

Responses

201Tenant created.
Content-Type: application/json
{
  "id": "00000000-0000-4000-8000-000000000000"
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/directory/tenants" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\"
}"
PUT/directory/tenants
Auth requireddirectory.tenants.manage

Update tenant

Updates tenant properties such as name or activation state. Requires features: directory.tenants.manage

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Tenant updated.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/directory/tenants" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
DELETE/directory/tenants
Auth requireddirectory.tenants.manage

Delete tenant

Soft deletes the tenant identified by id. Requires features: directory.tenants.manage

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Tenant removed.
Content-Type: application/json
{
  "ok": true
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/directory/tenants" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"

Dispatch — Crew Specializations

Showing 5 of 5 endpoints
GET/dispatch/crew-specializations
Auth requireddispatch.view

List crew specializations

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—

Responses

200Paginated crew specializations
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "label": "string"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/crew-specializations?page=1&pageSize=100" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/crew-specializations
Auth requireddispatch.manage

Create a crew specialization

Requires features: dispatch.manage

Request body (application/json)

{
  "label": "string"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/crew-specializations" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"label\": \"string\"
}"
GET/dispatch/crew-specializations/{id}
Auth requireddispatch.view

Get a crew specialization

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Crew specialization
Content-Type: application/json
{
  "id": "string",
  "label": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/crew-specializations/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/crew-specializations/{id}
Auth requireddispatch.manage

Update a crew specialization

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string"
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/crew-specializations/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"
DELETE/dispatch/crew-specializations/{id}
Auth requireddispatch.manage

Soft delete a crew specialization no crew uses

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Still used by at least one crew
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dispatch/crew-specializations/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Crews

Showing 7 of 7 endpoints
GET/dispatch/crews
Auth requireddispatch.view

List crews

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
specializationsqueryNoany—
statusesqueryNoany—
searchqueryNoany—

Responses

200Paginated crews
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "specializationId": "string",
      "headCount": 1,
      "isActive": true,
      "status": "free"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/crews?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/crews
Auth requireddispatch.manage

Create a crew

Requires features: dispatch.manage

Request body (application/json)

{
  "name": "string",
  "specializationId": "string",
  "headCount": 1
}

Responses

201Created
Content-Type: application/json
{
  "id": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/crews" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\",
  \"specializationId\": \"string\",
  \"headCount\": 1
}"
GET/dispatch/crews/{id}
Auth requireddispatch.view

Get a crew

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Crew detail
Content-Type: application/json
{
  "id": "string",
  "name": "string",
  "specializationId": "string",
  "headCount": 1,
  "isActive": true,
  "status": "free"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/crews/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/crews/{id}
Auth requireddispatch.manage

Update a crew

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string"
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/crews/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"
DELETE/dispatch/crews/{id}
Auth requireddispatch.manage

Delete a crew that never had a reservation

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Crew has reservation history
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dispatch/crews/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/crews/{id}/reactivate
Auth requireddispatch.manage

Reactivate a crew (set active)

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Reactivated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/crews/string/reactivate" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/crews/{id}/retire
Auth requireddispatch.manage

Retire a crew (set inactive)

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Retired
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/crews/string/retire" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Equipment

Showing 9 of 9 endpoints
GET/dispatch/equipment
Auth requireddispatch.view

List equipment

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
typesqueryNoany—
statusesqueryNoany—
searchqueryNoany—

Responses

200Paginated equipment
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "resourceTypeId": "string",
      "sideNumber": "string",
      "isActive": true,
      "requiredPermit": "string",
      "status": "free"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/equipment
Auth requireddispatch.manage

Create equipment

Requires features: dispatch.manage

Request body (application/json)

{
  "name": "string",
  "type": "string",
  "sideNumber": "string"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/equipment" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\",
  \"type\": \"string\",
  \"sideNumber\": \"string\"
}"
GET/dispatch/equipment/{id}
Auth requireddispatch.view

Get equipment

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Equipment detail
Content-Type: application/json
{
  "id": "string",
  "name": "string",
  "resourceTypeId": "string",
  "sideNumber": "string",
  "isActive": true,
  "requiredPermit": "string",
  "status": "free"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/equipment/{id}
Auth requireddispatch.manage

Update equipment

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string"
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"
DELETE/dispatch/equipment/{id}
Auth requireddispatch.manage

Delete equipment that never had a reservation

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Equipment has reservation history
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/equipment/{id}/reactivate
Auth requireddispatch.manage

Reactivate equipment

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Reactivated
Content-Type: application/json
{
  "id": "string",
  "isActive": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/string/reactivate" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/equipment/{id}/retire
Auth requireddispatch.manage

Retire equipment

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Retired
Content-Type: application/json
{
  "id": "string",
  "isActive": false
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/string/retire" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/dispatch/equipment/attention
Auth requireddispatch.view

Count of equipment requiring dispatcher attention

Requires features: dispatch.view

Responses

200Attention summary
Content-Type: application/json
{
  "count": 1,
  "conflictSubjectCount": 1,
  "coverageGapReservationCount": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/attention" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/dispatch/equipment/timeline
Auth requireddispatch.view

Equipment timeline

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
fromqueryYesany—
toqueryYesany—
pagequeryNoany—
pageSizequeryNoany—
typesqueryNoany—
statusesqueryNoany—
jobSiteIdsqueryNoany—

Responses

200Equipment timeline rows
Content-Type: application/json
{
  "items": [
    {
      "equipment": {
        "id": "string",
        "name": "string",
        "resourceTypeId": "string",
        "sideNumber": "string",
        "isActive": true,
        "requiredPermit": "string",
        "status": "free"
      },
      "reservations": [
        {
          "id": "string",
          "tenantId": "string",
          "organizationId": "string",
          "jobSiteId": "string",
          "jobSiteName": "string",
          "subjectType": "equipment",
          "subjectId": "string",
          "subjectName": "string",
          "durationWorkingDays": 1,
          "latestStart": "string",
          "status": "planned"
        }
      ],
      "availabilityWindows": [
        {
          "id": "string",
          "resourceType": "equipment",
          "resourceId": "string",
          "startAt": "string",
          "endAt": "string",
          "reasonCode": "string"
        }
      ]
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment/timeline?from=string&to=string&page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Equipment Types

Showing 5 of 5 endpoints
GET/dispatch/equipment-types
Auth requireddispatch.view

List equipment types

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—

Responses

200Paginated equipment types
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "label": "string"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment-types?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/equipment-types
Auth requireddispatch.manage

Create an equipment type

Requires features: dispatch.manage

Request body (application/json)

{
  "label": "string"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string",
  "label": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/equipment-types" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"label\": \"string\"
}"
GET/dispatch/equipment-types/{id}
Auth requireddispatch.view

Get an equipment type

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Equipment type detail
Content-Type: application/json
{
  "id": "string",
  "label": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/equipment-types/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/equipment-types/{id}
Auth requireddispatch.manage

Update an equipment type

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string"
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string",
  "label": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/equipment-types/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\"
}"
DELETE/dispatch/equipment-types/{id}
Auth requireddispatch.manage

Delete an equipment type

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dispatch/equipment-types/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Executors

Showing 7 of 7 endpoints
GET/dispatch/executors
Auth requireddispatch.view

List executors

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
kindqueryNoany—
pagequeryNoany—
pageSizequeryNoany—
specializationsqueryNoany—
statusesqueryNoany—

Responses

200Paginated executors
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "kind": "team",
      "refId": "string",
      "refName": "string",
      "availabilityRuleSetId": null,
      "specializationId": null,
      "isActive": true,
      "status": "free"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/executors?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/executors
Auth requireddispatch.manage

Create an executor

Requires features: dispatch.manage

Request body (application/json)

{
  "kind": "team",
  "refId": "string",
  "availabilityRuleSetId": null
}

Responses

201Created
Content-Type: application/json
{
  "id": "string",
  "kind": "team",
  "refId": "string",
  "availabilityRuleSetId": "string",
  "isActive": true
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/executors" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"kind\": \"team\",
  \"refId\": \"string\",
  \"availabilityRuleSetId\": null
}"
GET/dispatch/executors/{id}
Auth requireddispatch.view

Get an executor

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Executor detail
Content-Type: application/json
{
  "id": "string",
  "kind": "team",
  "refId": "string",
  "refName": "string",
  "availabilityRuleSetId": null,
  "specializationId": null,
  "isActive": true,
  "status": "free"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/executors/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/executors/{id}
Auth requireddispatch.manage

Update an executor

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "availabilityRuleSetId": null
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string",
  "isActive": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/executors/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"availabilityRuleSetId\": null
}"
PUT/dispatch/executors/{id}/retire
Auth requireddispatch.manage

Retire an executor

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Retired
Content-Type: application/json
{
  "id": "string",
  "isActive": false
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/executors/string/retire" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/dispatch/executors/attention
Auth requireddispatch.view

Count of crews requiring dispatcher attention

Requires features: dispatch.view

Responses

200Attention summary
Content-Type: application/json
{
  "count": 1,
  "conflictSubjectCount": 1,
  "coverageGapReservationCount": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/executors/attention" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/dispatch/executors/timeline
Auth requireddispatch.view

Executor timeline

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
fromqueryYesany—
toqueryYesany—
pagequeryNoany—
pageSizequeryNoany—
specializationsqueryNoany—
statusesqueryNoany—
jobSiteIdsqueryNoany—

Responses

200Executor timeline rows
Content-Type: application/json
{
  "items": [
    {
      "executor": {
        "id": "string",
        "kind": "team",
        "refId": "string",
        "refName": "string",
        "availabilityRuleSetId": null,
        "specializationId": null,
        "isActive": true,
        "status": "free"
      },
      "reservations": [
        {
          "id": "string",
          "tenantId": "string",
          "organizationId": "string",
          "jobSiteId": "string",
          "jobSiteName": "string",
          "subjectType": "equipment",
          "subjectId": "string",
          "subjectName": "string",
          "durationWorkingDays": 1,
          "latestStart": "string",
          "status": "planned"
        }
      ],
      "availabilityWindows": [
        {
          "id": "string",
          "resourceType": "equipment",
          "resourceId": "string",
          "startAt": "string",
          "endAt": "string",
          "reasonCode": "string"
        }
      ]
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/executors/timeline?from=string&to=string&page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Job Sites

Showing 5 of 5 endpoints
GET/dispatch/job-sites
Auth requireddispatch.view

List job sites

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
statusesqueryNoany—
prioritiesqueryNoany—
searchqueryNoany—

Responses

200Paginated job sites
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "color": "string",
      "statusEntryId": "string",
      "priorityEntryId": null,
      "jobSiteTypeEntryId": null,
      "periodStart": "string",
      "periodEnd": "string"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/job-sites?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/job-sites
Auth requireddispatch.manage

Create a job site

Requires features: dispatch.manage

Request body (application/json)

{
  "name": "string",
  "mode": "long",
  "location": {},
  "period": {
    "startDate": "string",
    "endDate": "string"
  },
  "statusEntryId": "string"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}
422Domain rule violation (e.g. invalid_location)
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/job-sites" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"name\": \"string\",
  \"mode\": \"long\",
  \"location\": {},
  \"period\": {
    \"startDate\": \"string\",
    \"endDate\": \"string\"
  },
  \"statusEntryId\": \"string\"
}"
GET/dispatch/job-sites/{id}
Auth requireddispatch.view

Get a job site

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Job site detail
Content-Type: application/json
{
  "id": "string",
  "name": "string",
  "mode": "long",
  "location": {},
  "period": {
    "startDate": "string",
    "endDate": "string"
  },
  "statusEntryId": "string",
  "priorityEntryId": null,
  "jobSiteTypeEntryId": null,
  "customerEntityId": null,
  "color": "string",
  "createdAt": "string",
  "updatedAt": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/job-sites/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/job-sites/{id}
Auth requireddispatch.manage

Update a job site

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "priorityEntryId": null,
  "jobSiteTypeEntryId": null,
  "customerEntityId": null
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
422Domain rule violation (e.g. invalid_location)
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/job-sites/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"priorityEntryId\": null,
  \"jobSiteTypeEntryId\": null,
  \"customerEntityId\": null
}"
DELETE/dispatch/job-sites/{id}
Auth requireddispatch.manage

Delete a job site

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Deleted
Content-Type: application/json
{
  "deleted": true
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/dispatch/job-sites/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Dispatch — Reservations

Showing 12 of 12 endpoints
GET/dispatch/reservations
Auth requireddispatch.view

List reservations

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
jobSiteIdqueryNoany—
subjectTypequeryNoany—
subjectIdqueryNoany—
statusqueryNoany—
typesqueryNoany—
specializationsqueryNoany—

Responses

200Paginated reservations
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "tenantId": "string",
      "organizationId": "string",
      "jobSiteId": "string",
      "jobSiteName": "string",
      "subjectType": "equipment",
      "subjectId": "string",
      "subjectName": "string",
      "durationWorkingDays": 1,
      "latestStart": "string",
      "status": "planned"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/reservations?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/reservations
Auth requireddispatch.manage

Create a reservation

Requires features: dispatch.manage

Request body (application/json)

{
  "jobSiteId": "string",
  "subjectType": "equipment",
  "subjectId": "string",
  "durationWorkingDays": 1,
  "latestStart": "string"
}

Responses

201Created
Content-Type: application/json
{
  "id": "string",
  "status": "planned"
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/reservations" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"jobSiteId\": \"string\",
  \"subjectType\": \"equipment\",
  \"subjectId\": \"string\",
  \"durationWorkingDays\": 1,
  \"latestStart\": \"string\"
}"
GET/dispatch/reservations/{id}
Auth requireddispatch.view

Get a reservation

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Reservation detail
Content-Type: application/json
{
  "id": "string",
  "tenantId": "string",
  "organizationId": "string",
  "jobSiteId": "string",
  "jobSiteName": "string",
  "subjectType": "equipment",
  "subjectId": "string",
  "subjectName": "string",
  "durationWorkingDays": 1,
  "latestStart": "string",
  "status": "planned"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/reservations/{id}
Auth requireddispatch.manage

Update a reservation

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "note": null
}

Responses

200Updated
Content-Type: application/json
{
  "id": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"note\": null
}"
PUT/dispatch/reservations/{id}/cancel
Auth requireddispatch.manage

Cancel a reservation

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Cancelled
Content-Type: application/json
{
  "id": "string",
  "status": "cancelled"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string/cancel" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
PUT/dispatch/reservations/{id}/place
Auth requireddispatch.manage

Place a reservation on the timeline

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "startDate": "string"
}

Responses

200Placed
Content-Type: application/json
{
  "id": "string",
  "placement": {
    "startAt": "string",
    "endAt": "string",
    "plannerRuleId": "string"
  },
  "status": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Conflict
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string/place" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"startDate\": \"string\"
}"
PUT/dispatch/reservations/{id}/status
Auth requireddispatch.manage

Change reservation status

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "status": "planned"
}

Responses

200Status changed
Content-Type: application/json
{
  "id": "string",
  "status": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string/status" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"status\": \"planned\"
}"
POST/dispatch/reservations/{id}/transfer
Auth requireddispatch.manage

Transfer a reservation to another job site

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Request body (application/json)

{
  "id": "string",
  "targetJobSiteId": "string",
  "startDate": "string"
}

Responses

201Transferred
Content-Type: application/json
{
  "closedReservationId": "string",
  "newReservationId": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Conflict
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string/transfer" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"string\",
  \"targetJobSiteId\": \"string\",
  \"startDate\": \"string\"
}"
PUT/dispatch/reservations/{id}/unplace
Auth requireddispatch.manage

Unplace a reservation (move it back to the backlog)

Requires features: dispatch.manage

Parameters

NameInRequiredSchemaDescription
idpathYesany—

Responses

200Unplaced
Content-Type: application/json
{
  "id": "string",
  "status": "string"
}
404Not found
Content-Type: application/json
{
  "code": "string"
}
409Conflict
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/string/unplace" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/dispatch/reservations/batch-apply
Auth requireddispatch.manage

Batch-apply timeline move/resize operations

Requires features: dispatch.manage

Request body (application/json)

{
  "operations": [
    {
      "reservationId": "string",
      "type": "move",
      "startAt": "string"
    }
  ]
}

Responses

200Applied
Content-Type: application/json
{
  "results": [
    {
      "reservationId": "string",
      "status": "string"
    }
  ]
}
400Invalid payload
Content-Type: application/json
{
  "code": "string"
}
409Conflict
Content-Type: application/json
{
  "code": "string"
}
422Invalid transition
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/batch-apply" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"operations\": [
    {
      \"reservationId\": \"string\",
      \"type\": \"move\",
      \"startAt\": \"string\"
    }
  ]
}"
POST/dispatch/reservations/schedule
Auth requireddispatch.manage

Create a reservation together with its placement (one transaction)

Requires features: dispatch.manage

Request body (application/json)

{
  "jobSiteId": "string",
  "subjectType": "equipment",
  "subjectId": "string",
  "durationWorkingDays": 1,
  "latestStart": "string",
  "startDate": "string"
}

Responses

201Created and placed
Content-Type: application/json
{
  "id": "string",
  "status": "string",
  "placement": {
    "startAt": "string",
    "endAt": "string",
    "plannerRuleId": null
  }
}
404Job site or subject not found
Content-Type: application/json
{
  "code": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/schedule" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"jobSiteId\": \"string\",
  \"subjectType\": \"equipment\",
  \"subjectId\": \"string\",
  \"durationWorkingDays\": 1,
  \"latestStart\": \"string\",
  \"startDate\": \"string\"
}"
GET/dispatch/reservations/unplaced
Auth requireddispatch.view

List unplaced reservations

Requires features: dispatch.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
subjectTypequeryNoany—
jobSiteIdsqueryNoany—
typesqueryNoany—
specializationsqueryNoany—

Responses

200Paginated unplaced reservations
Content-Type: application/json
{
  "items": [
    {
      "id": "string",
      "tenantId": "string",
      "organizationId": "string",
      "jobSiteId": "string",
      "jobSiteName": "string",
      "subjectType": "equipment",
      "subjectId": "string",
      "subjectName": "string",
      "durationWorkingDays": 1,
      "latestStart": "string",
      "status": "planned"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/dispatch/reservations/unplaced?page=1&pageSize=20" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Entities

Showing 17 of 17 endpoints
GET/entities/definitions
Auth required

List active custom field definitions

Returns active custom field definitions for the supplied entity ids, respecting tenant scope and tombstones.

Parameters

NameInRequiredSchemaDescription
entityIdqueryNoany—
entityIdsqueryNoany—
fieldsetqueryNoany—

Responses

200Definition list
Content-Type: application/json
{
  "items": [
    {
      "key": "string",
      "kind": "string",
      "label": "string",
      "entityId": "string"
    }
  ]
}
400Missing entity id
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/definitions" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/entities/definitions
Auth requiredentities.definitions.manage

Upsert custom field definition

Creates or updates a custom field definition for the current tenant/org scope. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "key": "string",
  "kind": "text"
}

Responses

200Definition saved
Content-Type: application/json
{
  "ok": true,
  "item": {
    "id": "00000000-0000-4000-8000-000000000000",
    "key": "string",
    "kind": "string",
    "configJson": {}
  }
}
400Validation failed
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/definitions" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"key\": \"string\",
  \"kind\": \"text\"
}"
DELETE/entities/definitions
Auth requiredentities.definitions.manage

Soft delete custom field definition

Marks the specified definition inactive and tombstones it for the current scope. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "key": "string"
}

Responses

200Definition deleted
Content-Type: application/json
{
  "ok": true
}
400Missing entity id or key
Content-Type: application/json
{
  "error": "string"
}
404Definition not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/entities/definitions" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"key\": \"string\"
}"
POST/entities/definitions.batch
Auth requiredentities.definitions.manage

Save multiple custom field definitions

Creates or updates multiple definitions for a single entity in one transaction. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "definitions": [
    {
      "key": "string",
      "kind": "text"
    }
  ]
}

Responses

200Definitions saved
Content-Type: application/json
{
  "ok": true
}
400Validation error
Content-Type: application/json
{
  "error": "string"
}
500Unexpected failure
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/definitions.batch" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"definitions\": [
    {
      \"key\": \"string\",
      \"kind\": \"text\"
    }
  ]
}"
GET/entities/definitions.manage
Auth requiredentities.definitions.manage

Get management snapshot

Returns scoped custom field definitions (including inactive tombstones) for administration interfaces. Requires features: entities.definitions.manage

Parameters

NameInRequiredSchemaDescription
entityIdqueryYesany—

Responses

200Scoped definitions and deleted keys
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "key": "string",
      "kind": "string",
      "configJson": null,
      "organizationId": null,
      "tenantId": null
    }
  ],
  "deletedKeys": [
    "string"
  ]
}
400Missing entity id
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/definitions.manage?entityId=string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/entities/definitions.restore
Auth requiredentities.definitions.manage

Restore definition

Reactivates a previously soft-deleted definition within the current tenant/org scope. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "key": "string"
}

Responses

200Definition restored
Content-Type: application/json
{
  "ok": true
}
400Missing entity id or key
Content-Type: application/json
{
  "error": "string"
}
404Definition not found
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/definitions.restore" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"key\": \"string\"
}"
GET/entities/encryption
Auth requiredentities.definitions.manage

Fetch encryption map

Returns the encrypted field map for the current tenant/organization scope. Requires features: entities.definitions.manage

Parameters

NameInRequiredSchemaDescription
entityIdqueryYesany—

Responses

200Map
Content-Type: application/json
{
  "entityId": "string",
  "fields": [
    {
      "field": "string",
      "hashField": null
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/encryption?entityId=string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/entities/encryption
Auth requiredentities.definitions.manage

Upsert encryption map

Creates or updates the encryption map for the current tenant/organization scope. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "tenantId": null,
  "organizationId": null,
  "fields": [
    {
      "field": "string",
      "hashField": null
    }
  ]
}

Responses

200Saved
Content-Type: application/json
{
  "ok": true
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/encryption" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"tenantId\": null,
  \"organizationId\": null,
  \"fields\": [
    {
      \"field\": \"string\",
      \"hashField\": null
    }
  ]
}"
GET/entities/entities
Auth required

List available entities

Returns generated and custom entities scoped to the caller with field counts per entity.

Responses

200List of entities
Content-Type: application/json
{
  "items": [
    {
      "entityId": "string",
      "source": "code",
      "label": "string",
      "count": 1
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/entities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/entities/entities
Auth requiredentities.definitions.manage

Upsert custom entity

Creates or updates a tenant/org scoped custom entity definition. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string",
  "label": "string",
  "description": null,
  "showInSidebar": false
}

Responses

200Entity saved
Content-Type: application/json
{
  "ok": true,
  "item": {
    "id": "00000000-0000-4000-8000-000000000000",
    "entityId": "string",
    "label": "string"
  }
}
400Validation error
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/entities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"label\": \"string\",
  \"description\": null,
  \"showInSidebar\": false
}"
DELETE/entities/entities
Auth requiredentities.definitions.manage

Soft delete custom entity

Marks the specified custom entity inactive within the current scope. Requires features: entities.definitions.manage

Request body (application/json)

{
  "entityId": "string"
}

Responses

200Entity deleted
Content-Type: application/json
{
  "ok": true
}
400Missing entity id
Content-Type: application/json
{
  "error": "string"
}
404Entity not found in scope
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/entities/entities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\"
}"
GET/entities/records
Auth requiredentities.records.view

List records

Returns paginated records for the supplied entity. Supports custom field filters, exports, and soft-delete toggles. Requires features: entities.records.view

Parameters

NameInRequiredSchemaDescription
entityIdqueryYesany—
pagequeryNoany—
pageSizequeryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
withDeletedqueryNoany—
formatqueryNoany—
exportScopequeryNoany—
export_scopequeryNoany—
allqueryNoany—
fullqueryNoany—

Responses

200Paginated records
Content-Type: application/json
{
  "items": [
    {}
  ],
  "total": 1,
  "page": 1,
  "pageSize": 1,
  "totalPages": 1
}
400Missing entity id
Content-Type: application/json
{
  "error": "string"
}
500Unexpected failure
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/records?entityId=string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/entities/records
Auth requiredentities.records.manage

Create record

Creates a record for the given entity. When `recordId` is omitted or not a UUID the data engine will generate one automatically. Requires features: entities.records.manage

Request body (application/json)

{
  "entityId": "string",
  "values": {}
}

Responses

200Record created
Content-Type: application/json
{
  "ok": true
}
400Validation failure
Content-Type: application/json
{
  "error": "string"
}
500Unexpected failure
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/entities/records" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"values\": {}
}"
PUT/entities/records
Auth requiredentities.records.manage

Update record

Updates an existing record. If the provided recordId is not a UUID the record will be created instead to support optimistic flows. Requires features: entities.records.manage

Request body (application/json)

{
  "entityId": "string",
  "recordId": "string",
  "values": {}
}

Responses

200Record updated
Content-Type: application/json
{
  "ok": true
}
400Validation failure
Content-Type: application/json
{
  "error": "string"
}
500Unexpected failure
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/entities/records" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"recordId\": \"string\",
  \"values\": {}
}"
DELETE/entities/records
Auth requiredentities.records.manage

Delete record

Soft deletes the specified record within the current tenant/org scope. Requires features: entities.records.manage

Request body (application/json)

{
  "entityId": "string",
  "recordId": "string"
}

Responses

200Record deleted
Content-Type: application/json
{
  "ok": true
}
400Missing entity id or record id
Content-Type: application/json
{
  "error": "string"
}
404Record not found
Content-Type: application/json
{
  "error": "string"
}
500Unexpected failure
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/entities/records" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityId\": \"string\",
  \"recordId\": \"string\"
}"
GET/entities/relations/options
Auth requiredentities.definitions.view

List relation options

Returns up to 200 option entries for populating relation dropdowns, automatically resolving label fields when omitted. Requires features: entities.definitions.view

Parameters

NameInRequiredSchemaDescription
entityIdqueryYesany—
labelFieldqueryNoany—
qqueryNoany—
idsqueryNoany—
routeContextFieldsqueryNoany—

Responses

200Option list
Content-Type: application/json
{
  "items": [
    {
      "value": "string",
      "label": "string"
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/relations/options?entityId=string" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
GET/entities/sidebar-entities
Auth required

Get sidebar entities

Returns custom entities flagged with `showInSidebar` for the current tenant/org scope.

Responses

200Sidebar entities for navigation
Content-Type: application/json
{
  "items": [
    {
      "entityId": "string",
      "label": "string",
      "href": "string"
    }
  ]
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/entities/sidebar-entities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Planner

Showing 10 of 10 endpoints
GET/planner/availability
Auth requiredplanner.view

List availability rules

Returns a paginated collection of availability rules scoped to the authenticated organization. Requires features: planner.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
subjectTypequeryNoany—
subjectIdsqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated availability rules
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "organization_id": null,
      "tenant_id": null,
      "subject_type": null,
      "subject_id": null,
      "timezone": null,
      "rrule": null,
      "exdates": null,
      "kind": null,
      "note": null,
      "unavailability_reason_entry_id": null,
      "unavailability_reason_value": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/planner/availability?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/planner/availability
Auth required

Create availability rule

Creates an availability rule for the selected subject.

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "subjectType": "member",
  "subjectId": "00000000-0000-4000-8000-000000000000",
  "timezone": "string",
  "rrule": "string",
  "exdates": [],
  "kind": "availability",
  "note": null,
  "unavailabilityReasonEntryId": null,
  "unavailabilityReasonValue": null
}

Responses

201Availability rule created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/planner/availability" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"subjectType\": \"member\",
  \"subjectId\": \"00000000-0000-4000-8000-000000000000\",
  \"timezone\": \"string\",
  \"rrule\": \"string\",
  \"exdates\": [],
  \"kind\": \"availability\",
  \"note\": null,
  \"unavailabilityReasonEntryId\": null,
  \"unavailabilityReasonValue\": null
}"
PUT/planner/availability
Auth required

Update availability rule

Updates an availability rule by id.

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "note": null,
  "unavailabilityReasonEntryId": null,
  "unavailabilityReasonValue": null
}

Responses

200Availability rule updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/planner/availability" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"note\": null,
  \"unavailabilityReasonEntryId\": null,
  \"unavailabilityReasonValue\": null
}"
DELETE/planner/availability
Auth required

Delete availability rule

Deletes an availability rule by id.

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Availability rule deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/planner/availability" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
POST/planner/availability-date-specific
Auth required

Replace date-specific availability

Replaces date-specific availability rules for the subject in a single request.

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "subjectType": "member",
  "subjectId": "00000000-0000-4000-8000-000000000000",
  "timezone": "string",
  "windows": [],
  "isAvailable": true,
  "note": null,
  "unavailabilityReasonEntryId": null,
  "unavailabilityReasonValue": null
}

Responses

200Date-specific availability updated
Content-Type: application/json
{
  "ok": true
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}
403Forbidden
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/planner/availability-date-specific" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"subjectType\": \"member\",
  \"subjectId\": \"00000000-0000-4000-8000-000000000000\",
  \"timezone\": \"string\",
  \"windows\": [],
  \"isAvailable\": true,
  \"note\": null,
  \"unavailabilityReasonEntryId\": null,
  \"unavailabilityReasonValue\": null
}"
GET/planner/availability-rule-sets
Auth requiredplanner.view

List availability rule sets

Returns a paginated collection of availability rule sets scoped to the authenticated organization. Requires features: planner.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).
searchqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—

Responses

200Paginated availability rule sets
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "organization_id": null,
      "tenant_id": null,
      "name": null,
      "description": null,
      "timezone": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/planner/availability-rule-sets?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/planner/availability-rule-sets
Auth requiredplanner.manage_availability

Create availability rule set

Creates a reusable availability rule set. Requires features: planner.manage_availability

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "name": "string",
  "description": null,
  "timezone": "string"
}

Responses

201Availability rule set created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/planner/availability-rule-sets" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"name\": \"string\",
  \"description\": null,
  \"timezone\": \"string\"
}"
PUT/planner/availability-rule-sets
Auth requiredplanner.manage_availability

Update availability rule set

Updates an availability rule set by id. Requires features: planner.manage_availability

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "description": null
}

Responses

200Availability rule set updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/planner/availability-rule-sets" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"description\": null
}"
DELETE/planner/availability-rule-sets
Auth requiredplanner.manage_availability

Delete availability rule set

Deletes an availability rule set by id. Requires features: planner.manage_availability

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Availability rule set deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/planner/availability-rule-sets" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
POST/planner/availability-weekly
Auth required

Replace weekly availability

Replaces weekly availability rules for the subject in a single request.

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "subjectType": "member",
  "subjectId": "00000000-0000-4000-8000-000000000000",
  "timezone": "string",
  "windows": []
}

Responses

200Weekly availability updated
Content-Type: application/json
{
  "ok": true
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}
403Forbidden
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/planner/availability-weekly" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"subjectType\": \"member\",
  \"subjectId\": \"00000000-0000-4000-8000-000000000000\",
  \"timezone\": \"string\",
  \"windows\": []
}"

Query Index

Showing 3 of 3 endpoints
POST/query_index/purge
Auth requiredquery_index.purge

Purge query index records

Queues a purge job to remove indexed records for an entity type within the active scope. Requires features: query_index.purge

Request body (application/json)

{
  "entityType": "string"
}

Responses

200Purge job accepted.
Content-Type: application/json
{
  "ok": true
}
400Missing entity type
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/query_index/purge" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityType\": \"string\"
}"
POST/query_index/reindex
Auth requiredquery_index.reindex

Trigger query index rebuild

Queues a reindex job for the specified entity type within the current tenant scope. Requires features: query_index.reindex

Request body (application/json)

{
  "entityType": "string"
}

Responses

200Reindex job accepted.
Content-Type: application/json
{
  "ok": true
}
400Missing entity type
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/query_index/reindex" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"entityType\": \"string\"
}"
GET/query_index/status
Auth requiredquery_index.status.view

Inspect query index coverage

Returns entity counts comparing base tables with the query index along with the latest job status. Requires features: query_index.status.view

Responses

200Current query index status.
Content-Type: application/json
{
  "items": [
    {
      "entityId": "string",
      "label": "string",
      "baseCount": null,
      "indexCount": null,
      "vectorCount": null,
      "ok": true,
      "job": {
        "status": "idle",
        "startedAt": null,
        "finishedAt": null,
        "heartbeatAt": null,
        "processedCount": null,
        "totalCount": null,
        "scope": null
      }
    }
  ],
  "errors": [
    {
      "id": "string",
      "source": "string",
      "handler": "string",
      "entityType": null,
      "recordId": null,
      "tenantId": null,
      "organizationId": null,
      "message": "string",
      "stack": null,
      "payload": null,
      "occurredAt": "string"
    }
  ],
  "logs": [
    {
      "id": "string",
      "source": "string",
      "handler": "string",
      "level": "info",
      "entityType": null,
      "recordId": null,
      "tenantId": null,
      "organizationId": null,
      "message": "string",
      "details": null,
      "occurredAt": "string"
    }
  ]
}
400Tenant or organization context required
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/query_index/status" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"

Resources

Showing 20 of 22 endpoints
GET/resources/activities
Auth requiredresources.view

List resourceactivitys

Returns a paginated collection of resourceactivitys scoped to the authenticated organization. Requires features: resources.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated resourceactivitys
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "resource_id": null,
      "activity_type": null,
      "subject": null,
      "body": null,
      "occurred_at": null,
      "author_user_id": null,
      "appearance_icon": null,
      "appearance_color": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/resources/activities?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/resources/activities
Auth requiredresources.manage_resources

Create resourceactivity

Adds an activity to a resource timeline. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "activityType": "string",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

201ResourceActivity created
Content-Type: application/json
{
  "id": null,
  "authorUserId": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"activityType\": \"string\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
PUT/resources/activities
Auth requiredresources.manage_resources

Update resourceactivity

Updates a resource activity. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

200ResourceActivity updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/resources/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
DELETE/resources/activities
Auth requiredresources.manage_resources

Delete resourceactivity

Deletes a resource activity. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200ResourceActivity deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/resources/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/resources/comments
Auth requiredresources.view

List resourcecomments

Returns a paginated collection of resourcecomments scoped to the authenticated organization. Requires features: resources.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated resourcecomments
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "resource_id": null,
      "body": null,
      "author_user_id": null,
      "appearance_icon": null,
      "appearance_color": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/resources/comments?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/resources/comments
Auth requiredresources.manage_resources

Create resourcecomment

Adds a note to a resource timeline. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "body": "string",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

201ResourceComment created
Content-Type: application/json
{
  "id": null,
  "authorUserId": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"body\": \"string\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
PUT/resources/comments
Auth requiredresources.manage_resources

Update resourcecomment

Updates a resource note. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

200ResourceComment updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/resources/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
DELETE/resources/comments
Auth requiredresources.manage_resources

Delete resourcecomment

Deletes a resource note. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200ResourceComment deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/resources/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/resources/resource-types
Auth requiredresources.view

List resource types

Returns a paginated collection of resource types scoped to the authenticated organization. Requires features: resources.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).
sortFieldqueryNoany—
sortDirqueryNoany—

Responses

200Paginated resource types
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "organization_id": null,
      "tenant_id": null,
      "name": null,
      "description": null,
      "appearance_icon": null,
      "appearance_color": null,
      "created_at": null,
      "updated_at": null,
      "resourceCount": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/resources/resource-types?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/resources/resource-types
Auth requiredresources.manage_resources

Create resource type

Creates a resource type for resources resources. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "name": "string",
  "description": null,
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

201Resource type created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/resource-types" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"name\": \"string\",
  \"description\": null,
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
PUT/resources/resource-types
Auth requiredresources.manage_resources

Update resource type

Updates a resource type by id. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "description": null,
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

200Resource type updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/resources/resource-types" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"description\": null,
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
DELETE/resources/resource-types
Auth requiredresources.manage_resources

Delete resource type

Deletes a resource type by id. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Resource type deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/resources/resource-types" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/resources/resources
Auth requiredresources.view

List resources

Returns a paginated collection of resources scoped to the authenticated organization. Requires features: resources.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).
resourceTypeIdqueryNoany—
isActivequeryNoany—
tagIdsqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—

Responses

200Paginated resources
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "organization_id": null,
      "tenant_id": null,
      "name": null,
      "description": null,
      "resource_type_id": null,
      "capacity": null,
      "capacity_unit_value": null,
      "capacity_unit_name": null,
      "capacity_unit_color": null,
      "capacity_unit_icon": null,
      "appearance_icon": null,
      "appearance_color": null,
      "is_active": null,
      "availability_rule_set_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/resources/resources?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/resources/resources
Auth requiredresources.manage_resources

Create resource

Creates a resource scoped to the selected organization. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "name": "string",
  "description": null,
  "resourceTypeId": null,
  "capacity": null,
  "capacityUnitValue": null,
  "appearanceIcon": null,
  "appearanceColor": null,
  "availabilityRuleSetId": null
}

Responses

201Resource created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/resources" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"name\": \"string\",
  \"description\": null,
  \"resourceTypeId\": null,
  \"capacity\": null,
  \"capacityUnitValue\": null,
  \"appearanceIcon\": null,
  \"appearanceColor\": null,
  \"availabilityRuleSetId\": null
}"
PUT/resources/resources
Auth requiredresources.manage_resources

Update resource

Updates a resource by id. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "description": null,
  "resourceTypeId": null,
  "capacity": null,
  "capacityUnitValue": null,
  "appearanceIcon": null,
  "appearanceColor": null,
  "availabilityRuleSetId": null
}

Responses

200Resource updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/resources/resources" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"description\": null,
  \"resourceTypeId\": null,
  \"capacity\": null,
  \"capacityUnitValue\": null,
  \"appearanceIcon\": null,
  \"appearanceColor\": null,
  \"availabilityRuleSetId\": null
}"
DELETE/resources/resources
Auth requiredresources.manage_resources

Delete resource

Deletes a resource by id. Requires features: resources.manage_resources

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Resource deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/resources/resources" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
POST/resources/resources/tags/assign
Auth requiredresources.manage_resources

Assign resource tag

Assigns a tag to a resources resource. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "tagId": "00000000-0000-4000-8000-000000000000",
  "resourceId": "00000000-0000-4000-8000-000000000000"
}

Responses

201Tag assignment created
Content-Type: application/json
{
  "id": null
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/resources/tags/assign" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"tagId\": \"00000000-0000-4000-8000-000000000000\",
  \"resourceId\": \"00000000-0000-4000-8000-000000000000\"
}"
POST/resources/resources/tags/unassign
Auth requiredresources.manage_resources

Unassign resource tag

Removes a tag from a resources resource. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "tagId": "00000000-0000-4000-8000-000000000000",
  "resourceId": "00000000-0000-4000-8000-000000000000"
}

Responses

200Tag assignment removed
Content-Type: application/json
{
  "id": null
}
400Invalid payload
Content-Type: application/json
{
  "error": "string"
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/resources/tags/unassign" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"tagId\": \"00000000-0000-4000-8000-000000000000\",
  \"resourceId\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/resources/tags
Auth requiredresources.view

List resource tags

Returns a paginated collection of resource tags scoped to the authenticated organization. Requires features: resources.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated resource tags
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "slug": null,
      "label": null,
      "color": null,
      "description": null,
      "organization_id": null,
      "tenant_id": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/resources/tags?page=1&pageSize=100" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/resources/tags
Auth requiredresources.manage_resources

Create resource tag

Creates a tag for resources resources and services. Requires features: resources.manage_resources

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "label": "string",
  "color": null,
  "description": null
}

Responses

201Resource tag created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/resources/tags" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"label\": \"string\",
  \"color\": null,
  \"description\": null
}"

Staff

Showing 20 of 58 endpoints
GET/staff/activities
Auth requiredstaff.view

List teammemberactivitys

Returns a paginated collection of teammemberactivitys scoped to the authenticated organization. Requires features: staff.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated teammemberactivitys
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "member_id": null,
      "activity_type": null,
      "subject": null,
      "body": null,
      "occurred_at": null,
      "author_user_id": null,
      "appearance_icon": null,
      "appearance_color": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/staff/activities?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/staff/activities
Auth requiredstaff.manage_team

Create teammemberactivity

Adds an activity to a team member timeline. Requires features: staff.manage_team

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "activityType": "string",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

201TeamMemberActivity created
Content-Type: application/json
{
  "id": null,
  "authorUserId": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/staff/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"activityType\": \"string\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
PUT/staff/activities
Auth requiredstaff.manage_team

Update teammemberactivity

Updates a team member activity. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

200TeamMemberActivity updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/staff/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
DELETE/staff/activities
Auth requiredstaff.manage_team

Delete teammemberactivity

Deletes a team member activity. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200TeamMemberActivity deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/staff/activities" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/staff/addresses
Auth requiredstaff.view

List teammemberaddresss

Returns a paginated collection of teammemberaddresss scoped to the authenticated organization. Requires features: staff.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated teammemberaddresss
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "member_id": null,
      "name": null,
      "purpose": null,
      "company_name": null,
      "address_line1": null,
      "address_line2": null,
      "building_number": null,
      "flat_number": null,
      "city": null,
      "region": null,
      "postal_code": null,
      "country": null,
      "latitude": null,
      "longitude": null,
      "is_primary": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/staff/addresses?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/staff/addresses
Auth requiredstaff.manage_team

Create teammemberaddress

Adds a team member address. Requires features: staff.manage_team

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "addressLine1": "string"
}

Responses

201TeamMemberAddress created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/staff/addresses" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"addressLine1\": \"string\"
}"
PUT/staff/addresses
Auth requiredstaff.manage_team

Update teammemberaddress

Updates a team member address. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200TeamMemberAddress updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/staff/addresses" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
DELETE/staff/addresses
Auth requiredstaff.manage_team

Delete teammemberaddress

Deletes a team member address. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200TeamMemberAddress deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/staff/addresses" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/staff/comments
Auth requiredstaff.view

List teammembercomments

Returns a paginated collection of teammembercomments scoped to the authenticated organization. Requires features: staff.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated teammembercomments
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "member_id": null,
      "body": null,
      "author_user_id": null,
      "appearance_icon": null,
      "appearance_color": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/staff/comments?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/staff/comments
Auth requiredstaff.manage_team

Create teammembercomment

Adds a note to a team member timeline. Requires features: staff.manage_team

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "body": "string",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

201TeamMemberComment created
Content-Type: application/json
{
  "id": null,
  "authorUserId": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/staff/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"body\": \"string\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
PUT/staff/comments
Auth requiredstaff.manage_team

Update teammembercomment

Updates a team member note. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "appearanceIcon": null,
  "appearanceColor": null
}

Responses

200TeamMemberComment updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/staff/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"appearanceIcon\": null,
  \"appearanceColor\": null
}"
DELETE/staff/comments
Auth requiredstaff.manage_team

Delete teammembercomment

Deletes a team member note. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200TeamMemberComment deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/staff/comments" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/staff/job-histories
Auth requiredstaff.view

List teammemberjobhistorys

Returns a paginated collection of teammemberjobhistorys scoped to the authenticated organization. Requires features: staff.view

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
entityIdqueryNoany—
sortFieldqueryNoany—
sortDirqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).

Responses

200Paginated teammemberjobhistorys
Content-Type: application/json
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000000",
      "member_id": null,
      "name": null,
      "company_name": null,
      "description": null,
      "start_date": null,
      "end_date": null,
      "organization_id": null,
      "tenant_id": null,
      "created_at": null,
      "updated_at": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/staff/job-histories?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/staff/job-histories
Auth requiredstaff.manage_team

Create teammemberjobhistory

Adds a team member job history entry. Requires features: staff.manage_team

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "entityId": "00000000-0000-4000-8000-000000000000",
  "name": "string",
  "companyName": null,
  "description": null,
  "startDate": "2025-01-01T00:00:00.000Z",
  "endDate": null
}

Responses

201TeamMemberJobHistory created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/staff/job-histories" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"entityId\": \"00000000-0000-4000-8000-000000000000\",
  \"name\": \"string\",
  \"companyName\": null,
  \"description\": null,
  \"startDate\": \"2025-01-01T00:00:00.000Z\",
  \"endDate\": null
}"
PUT/staff/job-histories
Auth requiredstaff.manage_team

Update teammemberjobhistory

Updates a team member job history entry. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "companyName": null,
  "description": null,
  "endDate": null
}

Responses

200TeamMemberJobHistory updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/staff/job-histories" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"companyName\": null,
  \"description\": null,
  \"endDate\": null
}"
DELETE/staff/job-histories
Auth requiredstaff.manage_team

Delete teammemberjobhistory

Deletes a team member job history entry. Requires features: staff.manage_team

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200TeamMemberJobHistory deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/staff/job-histories" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"
GET/staff/leave-requests
Auth required

List leave requests

Returns a paginated collection of leave requests scoped to the authenticated organization.

Parameters

NameInRequiredSchemaDescription
pagequeryNoany—
pageSizequeryNoany—
searchqueryNoany—
statusqueryNoany—
memberIdqueryNoany—
idsqueryNoanyComma-separated list of record UUIDs to filter by (max 200).
sortFieldqueryNoany—
sortDirqueryNoany—

Responses

200Paginated leave requests
Content-Type: application/json
{
  "items": [
    {
      "id": null,
      "organization_id": null,
      "tenant_id": null,
      "member_id": null,
      "start_date": null,
      "end_date": null,
      "timezone": null,
      "status": null,
      "unavailability_reason_entry_id": null,
      "unavailability_reason_value": null,
      "note": null,
      "decision_comment": null,
      "submitted_by_user_id": null,
      "decided_by_user_id": null,
      "decided_at": null,
      "created_at": null,
      "updated_at": null,
      "member": null
    }
  ],
  "total": 1,
  "totalPages": 1
}

Example

curl -X GET "https://site-dispatch.dev.evojam.com/api/staff/leave-requests?page=1&pageSize=50" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>"
POST/staff/leave-requests
Auth required

Create leave request

Creates a leave request for a staff member.

Request body (application/json)

{
  "tenantId": "00000000-0000-4000-8000-000000000000",
  "organizationId": "00000000-0000-4000-8000-000000000000",
  "memberId": "00000000-0000-4000-8000-000000000000",
  "timezone": "string",
  "startDate": "2025-01-01T00:00:00.000Z",
  "endDate": "2025-01-01T00:00:00.000Z",
  "unavailabilityReasonEntryId": null,
  "unavailabilityReasonValue": null,
  "note": null,
  "submittedByUserId": null
}

Responses

201Leave request created
Content-Type: application/json
{
  "id": null
}

Example

curl -X POST "https://site-dispatch.dev.evojam.com/api/staff/leave-requests" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"tenantId\": \"00000000-0000-4000-8000-000000000000\",
  \"organizationId\": \"00000000-0000-4000-8000-000000000000\",
  \"memberId\": \"00000000-0000-4000-8000-000000000000\",
  \"timezone\": \"string\",
  \"startDate\": \"2025-01-01T00:00:00.000Z\",
  \"endDate\": \"2025-01-01T00:00:00.000Z\",
  \"unavailabilityReasonEntryId\": null,
  \"unavailabilityReasonValue\": null,
  \"note\": null,
  \"submittedByUserId\": null
}"
PUT/staff/leave-requests
Auth required

Update leave request

Updates a leave request by id.

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000",
  "unavailabilityReasonEntryId": null,
  "unavailabilityReasonValue": null,
  "note": null
}

Responses

200Leave request updated
Content-Type: application/json
{
  "ok": true
}

Example

curl -X PUT "https://site-dispatch.dev.evojam.com/api/staff/leave-requests" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\",
  \"unavailabilityReasonEntryId\": null,
  \"unavailabilityReasonValue\": null,
  \"note\": null
}"
DELETE/staff/leave-requests
Auth required

Delete leave request

Deletes a leave request by id.

Request body (application/json)

{
  "id": "00000000-0000-4000-8000-000000000000"
}

Responses

200Leave request deleted
Content-Type: application/json
{
  "ok": true
}

Example

curl -X DELETE "https://site-dispatch.dev.evojam.com/api/staff/leave-requests" \
  -H "Accept: application/json" \
  -H "authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d "{
  \"id\": \"00000000-0000-4000-8000-000000000000\"
}"