12 KiB
Simplified Workflow API - Postman Guide
✅ Updated Simplified Format
The API has been updated to make workflow creation much simpler. You now only need to provide email and tatHours for approvers, and email for spectators. The backend automatically handles:
- User lookup/creation from Okta/Azure AD
- Fetching user details (name, department, designation)
- Auto-generating level names based on designation/department
- Auto-detecting final approver (last level)
- Proper validation with clear error messages
Authentication
Login
POST {{baseUrl}}/auth/login
Content-Type: application/json
{
"email": "your-email@example.com",
"password": "your-password"
}
Response:
{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": { "userId": "...", "email": "...", ... }
}
}
Create Workflow - Simplified Format
Example 1: Simple Workflow (JSON)
POST {{baseUrl}}/workflows
Headers:
Content-Type: application/json
Authorization: Bearer <your_token>
Body:
{
"templateType": "CUSTOM",
"title": "Purchase Order Approval - Office Equipment",
"description": "Approval needed for purchasing new office equipment including laptops and monitors. Total budget: $50,000",
"priority": "STANDARD",
"approvalLevels": [
{
"email": "manager@royalenfield.com",
"tatHours": 24
},
{
"email": "director@royalenfield.com",
"tatHours": 48
},
{
"email": "cfo@royalenfield.com",
"tatHours": 72
}
],
"spectators": [
{
"email": "hr@royalenfield.com"
},
{
"email": "finance@royalenfield.com"
}
]
}
Example 2: Express Priority with Final Approver Flag
{
"templateType": "CUSTOM",
"title": "Urgent: Server Infrastructure Upgrade",
"description": "Critical server infrastructure upgrade required immediately",
"priority": "EXPRESS",
"approvalLevels": [
{
"email": "it-manager@royalenfield.com",
"tatHours": 8
},
{
"email": "cto@royalenfield.com",
"tatHours": 16,
"isFinalApprover": true
}
]
}
Example 3: With Custom Level Names
{
"templateType": "CUSTOM",
"title": "Vendor Contract Approval",
"description": "New vendor contract for manufacturing components",
"priority": "STANDARD",
"approvalLevels": [
{
"email": "procurement@royalenfield.com",
"tatHours": 24,
"levelName": "Procurement Review"
},
{
"email": "legal@royalenfield.com",
"tatHours": 48,
"levelName": "Legal Compliance"
},
{
"email": "vp@royalenfield.com",
"tatHours": 72,
"levelName": "Executive Approval",
"isFinalApprover": true
}
]
}
Example 4: Multipart with Files
POST {{baseUrl}}/workflows/multipart
Headers:
Authorization: Bearer <your_token>
Body (form-data):
| Key | Type | Value |
|---|---|---|
payload |
Text | {"templateType":"CUSTOM","title":"Budget Request 2025","description":"Annual budget request","priority":"STANDARD","approvalLevels":[{"email":"finance-manager@royalenfield.com","tatHours":48},{"email":"cfo@royalenfield.com","tatHours":72}]} |
files |
File | Select PDF/Excel file(s) |
category |
Text | SUPPORTING |
Field Reference
Required Fields
| Field | Type | Description | Example |
|---|---|---|---|
templateType |
string | Workflow type | "CUSTOM" or "TEMPLATE" |
title |
string | Request title (max 500 chars) | "Purchase Order Approval" |
description |
string | Detailed description | "Approval needed for..." |
priority |
string | Request priority | "STANDARD" or "EXPRESS" |
approvalLevels |
array | List of approvers (min 1, max 10) | See below |
Approval Level Fields
| Field | Type | Required | Description |
|---|---|---|---|
email |
string | ✅ Yes | Approver's email address |
tatHours |
number | ✅ Yes | Turn-around time in hours (positive number) |
isFinalApprover |
boolean | ❌ No | Explicitly mark as final approver (auto-detected if last level) |
levelName |
string | ❌ No | Custom level name (auto-generated if not provided) |
Auto-generated levelName logic:
- If approver has designation:
"{Designation} Approval"(e.g., "Manager Approval") - If approver has department:
"{Department} Approval"(e.g., "Finance Approval") - Otherwise:
"Level {N} Approval"(e.g., "Level 1 Approval")
Spectator Fields
| Field | Type | Required | Description |
|---|---|---|---|
email |
string | ✅ Yes | Spectator's email address |
Validation & Error Handling
The backend automatically validates and provides clear error messages:
✅ Successful Response
{
"success": true,
"message": "Workflow created successfully",
"data": {
"requestId": "uuid",
"requestNumber": "REQ-2025-12-0001",
"title": "...",
"status": "PENDING",
...
}
}
❌ Error: Invalid Email
{
"success": false,
"error": "Failed to create workflow",
"details": "Approver email 'invalid@example.com' not found in organization directory. Please verify the email address."
}
❌ Error: Duplicate Email
{
"success": false,
"error": "Failed to create workflow",
"details": "Duplicate approver email found: manager@example.com. Each approver must have a unique email."
}
❌ Error: Invalid Initiator
{
"success": false,
"error": "Failed to create workflow",
"details": "Invalid initiator: User with ID '...' not found. Please ensure you are logged in with a valid account."
}
❌ Error: Validation Failed
{
"success": false,
"error": "Validation failed",
"details": "approvalLevels.0.email: Valid email is required; approvalLevels.0.tatHours: TAT hours must be positive"
}
What Happens Behind the Scenes
When you create a workflow, the backend:
- Validates Initiator: Ensures the logged-in user exists
- Enriches Approval Levels:
- Searches for each approver in the local database
- If not found, fetches from Okta/Azure AD
- Creates user record if they exist in AD but not in DB
- Extracts:
userId,displayName,designation,department - Auto-generates
levelNameif not provided - Auto-detects
isFinalApprover(last level = true)
- Enriches Spectators:
- Same lookup/creation process as approvers
- Sets default permissions (view + comment, no download)
- Creates Workflow:
- Saves workflow request
- Creates approval levels
- Creates participants
- Sends notifications
- Logs activity
Migration from Old Format
❌ Old Format (No Longer Required)
{
"approvalLevels": [
{
"levelNumber": 1,
"levelName": "Manager Approval",
"approverId": "uuid-123",
"approverEmail": "manager@example.com",
"approverName": "John Doe",
"tatHours": 24,
"isFinalApprover": false
}
]
}
✅ New Simplified Format
{
"approvalLevels": [
{
"email": "manager@example.com",
"tatHours": 24
}
]
}
The backend handles everything else automatically!
Tips & Best Practices
- Use Valid Email Addresses: Ensure all approver/spectator emails exist in your Okta/Azure AD
- TAT Hours: Set realistic turn-around times based on priority:
- STANDARD: 24-72 hours per level
- EXPRESS: 8-24 hours per level
- Final Approver: Last level is automatically marked as final approver (you can override with
isFinalApprover: trueon any level) - Level Names: Let the system auto-generate based on designation/department, or provide custom names
- Spectators: Add users who need visibility but not approval authority
- Documents: Use
/multipartendpoint for file uploads
Testing in Postman
-
Set Environment Variables:
baseUrl:http://localhost:5000/api/v1token: Your auth token from login
-
Login First:
- Call
POST /auth/login - Copy the
tokenfrom response - Set as environment variable
- Call
-
Create Workflow:
- Use simplified format
- Only provide email + tatHours
- Backend handles the rest
-
Check Response:
- Verify
requestNumberis generated - Check
approvalLevelsare enriched with user data - Confirm
participantsincludes spectators
- Verify
Add Approver/Spectator After Request Creation
These endpoints allow adding approvers or spectators to an existing request. They follow the same simplified pattern - just provide email, and the backend handles user lookup/creation.
Add Approver at Specific Level
POST {{baseUrl}}/workflows/:requestId/approvers/at-level
Headers:
Authorization: Bearer <your_token>
Content-Type: application/json
Body:
{
"email": "newapprover@royalenfield.com",
"tatHours": 24,
"level": 2
}
What Happens:
- ✅ Finds user by email in DB, or syncs from Okta/AD if not found
- ✅ Auto-generates levelName based on designation/department
- ✅ Shifts existing levels if needed
- ✅ Updates final approver flag
- ✅ Sends notification to new approver
- ✅ Logs activity
Response:
{
"success": true,
"message": "Approver added successfully",
"data": {
"levelId": "uuid",
"levelNumber": 2,
"levelName": "Manager Approval",
"approverId": "uuid",
"approverEmail": "newapprover@royalenfield.com",
"approverName": "John Doe",
"tatHours": 24,
"status": "PENDING"
}
}
Add Simple Approver (General)
POST {{baseUrl}}/workflows/:requestId/participants/approver
Headers:
Authorization: Bearer <your_token>
Content-Type: application/json
Body:
{
"email": "approver@royalenfield.com"
}
Note: This adds them as a general approver participant, not at a specific level.
Add Spectator
POST {{baseUrl}}/workflows/:requestId/participants/spectator
Headers:
Authorization: Bearer <your_token>
Content-Type: application/json
Body:
{
"email": "spectator@royalenfield.com"
}
What Happens:
- ✅ Finds user by email in DB, or syncs from Okta/AD if not found
- ✅ Sets spectator permissions (view + comment, no download)
- ✅ Sends notification to new spectator
- ✅ Logs activity
Response:
{
"success": true,
"data": {
"participantId": "uuid",
"userId": "uuid",
"userEmail": "spectator@royalenfield.com",
"userName": "Jane Doe",
"participantType": "SPECTATOR",
"canComment": true,
"canViewDocuments": true,
"canDownloadDocuments": false
}
}
Error Handling for Add Operations
❌ User Not Found in AD:
{
"success": false,
"error": "Failed to add approver",
"details": "Approver email 'invalid@example.com' not found in organization directory. Please verify the email address."
}
❌ User Already a Participant:
{
"success": false,
"error": "Failed to add spectator",
"details": "User is already a participant in this request"
}
❌ Invalid Level:
{
"success": false,
"error": "Failed to add approver at level",
"details": "Cannot add approver at level 1 - level has already been completed"
}
Complete Flow Example
1. Login
POST /api/v1/auth/login
Body: { "email": "user@example.com", "password": "pass" }
2. Create Workflow (Simplified)
POST /api/v1/workflows
Body: {
"templateType": "CUSTOM",
"title": "Purchase Order",
"description": "Office equipment",
"priority": "STANDARD",
"approvalLevels": [
{ "email": "manager@example.com", "tatHours": 24 }
]
}
3. Add Additional Approver (After Creation)
POST /api/v1/workflows/:requestId/approvers/at-level
Body: {
"email": "director@example.com",
"tatHours": 48,
"level": 2
}
4. Add Spectator
POST /api/v1/workflows/:requestId/participants/spectator
Body: { "email": "hr@example.com" }
Need Help?
If you encounter any issues:
- Check the error message - it will tell you exactly what's wrong
- Verify emails exist in your organization directory
- Ensure you're logged in with a valid token
- Check backend logs for detailed error information