⚠️ Porta is in beta — APIs and features may change before v1.0
Skip to content

Bulk Operations API

The bulk operations API enables performing status changes on multiple entities in a single request. Designed for admin UI batch operations.

Endpoints

MethodPathPermissionDescription
POST/api/admin/bulk/organizations/statusorg:updateBulk organization status change
POST/api/admin/bulk/users/statususer:suspendBulk user status change

Bulk Organization Status Change

http
POST /api/admin/bulk/organizations/status
Authorization: Bearer <token>
Content-Type: application/json

Request Body

json
{
  "ids": ["uuid-1", "uuid-2", "uuid-3"],
  "action": "suspend",
  "reason": "Policy review"
}
FieldTypeRequiredDescription
idsUUID[]YesOrganization IDs (1-100)
actionstringYesOne of: activate, suspend, archive
reasonstringNoReason for the status change (max 500 chars)

Valid Organization Transitions

ActionFrom StatusTo Status
activatesuspendedactive
suspendactivesuspended
archiveactive, suspendedarchived

Bulk User Status Change

http
POST /api/admin/bulk/users/status
Authorization: Bearer <token>
Content-Type: application/json

Request Body

json
{
  "ids": ["uuid-1", "uuid-2"],
  "action": "suspend",
  "reason": "Suspicious activity",
  "organizationId": "org-uuid"
}
FieldTypeRequiredDescription
idsUUID[]YesUser IDs (1-100)
actionstringYesOne of: activate, deactivate, suspend, lock, unlock
reasonstringNoReason for suspend/lock (max 500 chars)
organizationIdUUIDYesOrganization scope

Valid User Transitions

ActionFrom StatusTo Status
activateinactive, suspendedactive
deactivateactiveinactive
suspendactivesuspended
lockactivelocked
unlocklockedactive

Response Format

Both endpoints return the same response format with per-item results:

json
{
  "total": 3,
  "succeeded": 2,
  "failed": 1,
  "results": [
    {
      "id": "uuid-1",
      "success": true,
      "previousStatus": "active",
      "newStatus": "suspended"
    },
    {
      "id": "uuid-2",
      "success": true,
      "previousStatus": "active",
      "newStatus": "suspended"
    },
    {
      "id": "uuid-3",
      "success": false,
      "error": "Cannot suspend from status 'archived'",
      "previousStatus": "archived"
    }
  ]
}

Limits

  • Maximum 100 items per bulk operation
  • Items are processed individually, so partial success is possible
  • Each item uses SELECT ... FOR UPDATE to prevent concurrent modification
  • All queries are parameterized (SQL injection safe)

Released under the MIT License.