# KROW Workforce Platform - API Documentation

**Version:** 3.0 (Auto-Updated)  
**Last Updated:** 2025-11-20  
**Project:** KROW Workforce Control Tower  

---

## Table of Contents
1. [Overview](#overview)
2. [Authentication](#authentication)
3. [Entity Schemas](#entity-schemas)
4. [SDK Operations](#sdk-operations)
5. [Core Integrations](#core-integrations)
6. [Data Models Reference](#data-models-reference)
7. [Code Examples](#code-examples)
8. [Best Practices](#best-practices)
9. [Security Considerations](#security-considerations)
10. [Rate Limits & Quotas](#rate-limits--quotas)
11. [Changelog](#changelog)
12. [Support & Resources](#support--resources)

---

## 1. Overview
KROW Workforce is a comprehensive workforce management platform built on Base44. This documentation provides complete API specifications for all entities, SDK methods, and integration endpoints.

### Base44 Client Import
```javascript
import { base44 } from "@/api/base44Client";
```

---

## 2. Authentication

### User Authentication Methods

```javascript
// Get current authenticated user
const user = await base44.auth.me();

// Update current user
await base44.auth.updateMe({
  full_name: "John Doe",
  custom_field: "value"
});

// Logout
base44.auth.logout(redirectUrl?: string);

// Redirect to login
base44.auth.redirectToLogin(nextUrl?: string);

// Check authentication status
const isAuthenticated = await base44.auth.isAuthenticated();
```

### User Object Structure
```json
{
  "id": "string",
  "email": "string",
  "full_name": "string",
  "role": "admin | user",
  "user_role": "string",
  "created_date": "timestamp",
  "updated_date": "timestamp"
}
```

---

## 3. Entity Schemas

### 1. User Entity (Built-in)
**Description:** Core user entity with authentication and role management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique user identifier | Auto-generated, unique |
| `email` | string | User email address | Required, unique, email format |
| `full_name` | string | User's full name | Required |
| `role` | string | Base role | Enum: "admin", "user" |
| `user_role` | string | Custom application role | Optional, custom values |
| `created_date` | timestamp | Account creation date | Auto-generated |
| `updated_date` | timestamp | Last update timestamp | Auto-updated |

**Security Rules:**
*   Only admin users can list, update, or delete other users.
*   Regular users can only view and update their own user record.

### 2. Event Entity
**Description:** Core event/order management entity for workforce scheduling.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique event identifier | Auto-generated |
| `event_name` | string | Name of the event | Required |
| `is_rapid` | boolean | RAPID/urgent order flag | Default: false |
| `is_recurring` | boolean | Whether event recurs | Default: false |
| `is_multi_day` | boolean | Multi-day event flag | Default: false |
| `recurrence_type` | string | Type of recurrence | Enum: "single", "date_range", "scatter" |
| `recurrence_start_date`| date | Start date for recurring events | Optional |
| `recurrence_end_date` | date | End date for recurring events | Optional |
| `scatter_dates` | array | Specific dates for scatter recurring | Array of date strings |
| `multi_day_start_date` | date | Multi-day start date | Optional |
| `multi_day_end_date` | date | Multi-day end date | Optional |
| `buffer_time_before` | number | Buffer time before (minutes) | Default: 0 |
| `buffer_time_after` | number | Buffer time after (minutes) | Default: 0 |
| `conflict_detection_enabled`| boolean | Enable conflict detection | Default: true |
| `detected_conflicts` | array | Array of detected conflicts | Array of conflict objects |
| `business_id` | string | Associated business ID | Optional |
| `business_name` | string | Business name | Optional |
| `vendor_id` | string | Vendor ID if created by vendor | Optional |
| `vendor_name` | string | Vendor name | Optional |
| `hub` | string | Hub location | Optional |
| `event_location` | string | Event location address | Optional |
| `contract_type` | string | Contract type | Enum: "W2", "1099", "Temp", "Contract" |
| `po_reference` | string | Purchase order reference | Optional |
| `status` | string | Event status | Enum: "Draft", "Active", "Pending", "Assigned", "Confirmed", "Completed", "Canceled" |
| `date` | date | Event date | Optional |
| `shifts` | array | Array of shift objects | Optional |
| `addons` | object | Additional services/features | Optional |
| `total` | number | Total cost | Optional |
| `client_name` | string | Client contact name | Optional |
| `client_email` | string | Client email | Optional |
| `client_phone` | string | Client phone | Optional |
| `invoice_id` | string | Associated invoice ID | Optional |
| `notes` | string | Additional notes | Optional |
| `requested` | number | Total staff requested | Default: 0 |
| `assigned_staff` | array | Array of assigned staff | Optional |

**Detected Conflicts Structure:**
```json
{
  "conflict_type": "staff_overlap" | "venue_overlap" | "time_buffer",
  "severity": "low" | "medium" | "high" | "critical",
  "description": "string",
  "conflicting_event_id": "string",
  "staff_id": "string",
  "detected_at": "timestamp"
}
```

### 3. Staff Entity
**Description:** Employee/workforce member management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique staff identifier | Auto-generated |
| `employee_name` | string | Full name | Required |
| `vendor_id` | string | Associated vendor ID | Optional |
| `vendor_name` | string | Vendor company name | Optional |
| `manager` | string | Manager's name | Optional |
| `contact_number` | string | Primary contact number | Optional |
| `email` | string | Email address | Email format |
| `department` | string | Department | Enum: "Operations", "Sales", "HR", "Finance", "IT", "Marketing", "Customer Service", "Logistics" |
| `hub_location` | string | Hub/office location | Optional |
| `track` | string | Track information | Optional |
| `position` | string | Primary job position/skill | Optional |
| `profile_type` | string | Skill profile level | Enum: "Skilled", "Beginner", "Cross-Trained" |
| `employment_type` | string | Employment type | Enum: "Full Time", "Part Time", "On call", "Weekends", "Specific Days", "Seasonal", "Medical Leave" |
| `english` | string | English proficiency | Enum: "Fluent", "Intermediate", "Basic", "None" |
| `rating` | number | Staff performance rating (0-5 stars) | Min: 0, Max: 5 |
| `reliability_score` | number | Overall reliability score (0-100) | Min: 0, Max: 100 |
| `background_check_status`| string | Background check status | Enum: "pending", "cleared", "failed", "expired", "not_required" |

### 4. Vendor Entity
**Description:** Vendor/supplier management and onboarding.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique vendor identifier | Auto-generated |
| `vendor_number` | string | Vendor Number (VN-####) | Required, Pattern: `^VN-[0-9]{4}$` |
| `legal_name` | string | Legal business name | Required |
| `region` | string | Geographic region | Enum: "National", "Bay Area", "Southern California", "Northern California", "West", "East", "Midwest", "South" |
| `platform_type` | string | Technology integration level | Enum: "Full Platform", "Building platform (KROW)", "Partial Tech", "Traditional" |
| `primary_contact_email` | string | Primary email | Required, Email format |
| `approval_status` | string | Vendor approval status | Enum: "pending", "approved", "suspended", "terminated" |
| `is_active` | boolean | Is vendor currently active | Default: true |

### 5. VendorRate Entity
**Description:** Vendor pricing and rate management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique rate identifier | Auto-generated |
| `vendor_name` | string | Vendor name | Required |
| `category` | string | Service category | Enum: "Kitchen and Culinary", "Concessions", "Facilities", "Bartending", "Security", "Event Staff", "Management", "Technical", "Other" |
| `role_name` | string | Role/position name | Required |
| `employee_wage` | number | Employee base wage/hour | Required, Min: 0 |
| `markup_percentage` | number | Markup percentage | Min: 0, Max: 100 |
| `vendor_fee_percentage` | number | Vendor fee percentage | Min: 0, Max: 100 |
| `client_rate` | number | Final rate to client | Required, Min: 0 |

### 6. VendorDefaultSettings Entity
**Description:** Default markup and fee settings for vendors.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique settings identifier | Auto-generated |
| `vendor_name` | string | Name of the vendor | Required |
| `default_markup_percentage`| number | Default markup percentage | Required, Min: 0, Max: 100 |
| `default_vendor_fee_percentage`| number | Default vendor fee percentage | Required, Min: 0, Max: 100 |

### 7. Invoice Entity
**Description:** Invoice and billing management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique invoice identifier | Auto-generated |
| `invoice_number` | string | Unique invoice number | Required |
| `amount` | number | Grand total invoice amount | Required, Min: 0 |
| `status` | string | Current invoice status | Enum: "Draft", "Pending Review", "Approved", "Disputed", "Under Review", "Resolved", "Overdue", "Paid", "Reconciled", "Cancelled" |
| `issue_date` | date | Invoice issue date | Required |
| `due_date` | date | Payment due date | Required |
| `disputed_items` | array | List of disputed staff entry indices | Optional |
| `is_auto_generated` | boolean | Whether invoice was auto-generated | Default: false |

### 8. Business Entity
**Description:** Client business/company management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique business identifier | Auto-generated |
| `business_name` | string | Business/client company name | Required |
| `contact_name` | string | Primary contact person | Required |
| `email` | string | Business email | Email format |
| `sector` | string | Sector/industry | Enum: "Bon Appétit", "Eurest", "Aramark", "Epicurean Group", "Chartwells", "Other" |
| `rate_group` | string | Pricing tier | Required, Enum: "Standard", "Premium", "Enterprise", "Custom" |
| `status` | string | Business status | Enum: "Active", "Inactive", "Pending" |

### 9. Certification Entity
**Description:** Employee certification and compliance tracking.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique certification ID | Auto-generated |
| `employee_name` | string | Staff member name | Required |
| `certification_name` | string | Certification name | Required |
| `certification_type` | string | Type of certification | Enum: "Legal", "Operational", "Safety", "Training", "License", "Other" |
| `status` | string | Current status | Enum: "current", "expiring_soon", "expired", "pending_validation" |
| `expiry_date` | date | Expiration date | Required |
| `validation_status` | string | Validation status | Enum: "approved", "pending_expert_review", "rejected", "ai_verified", "ai_flagged", "manual_review_needed" |

### 10. Team Entity
**Description:** Team and organization management with role-based isolation.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique team identifier | Auto-generated |
| `team_name` | string | Name of the team | Required |
| `owner_id` | string | Team owner user ID | Required |
| `owner_name` | string | Team owner name | Required |
| `owner_role` | string | Role of team owner | Required, Enum: "admin", "procurement", "operator", "sector", "client", "vendor", "workforce" |
| `favorite_staff` | array | Array of favorite staff | Array of objects |
| `blocked_staff` | array | Array of blocked staff | Array of objects |

### 11. TeamMember Entity
**Description:** Team member management within teams.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique member identifier | Auto-generated |
| `team_id` | string | ID of the team this member belongs to | Required |
| `member_name` | string | Name of the team member | Required |
| `email` | string | Member email | Required, Email format |
| `role` | string | Role in the team | Enum: "admin", "manager", "member", "viewer" |
| `is_active` | boolean | Whether the member is active | Default: true |

### 12. TeamHub Entity
**Description:** Team hub/location management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique hub identifier | Auto-generated |
| `team_id` | string | ID of the team | Required |
| `hub_name` | string | Name of the hub/location | Required |
| `departments` | array | Departments within this hub | Array of objects with `department_name`, `cost_center` |

### 13. TeamMemberInvite Entity
**Description:** Team member invitation management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique invite identifier | Auto-generated |
| `team_id` | string | Team ID | Required |
| `invite_code` | string | Unique invite code | Required |
| `email` | string | Invitee email | Required, Email format |
| `invite_status` | string | Invite status | Enum: "pending", "accepted", "expired", "cancelled" |

### 14. Conversation Entity
**Description:** Messaging and communication management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique conversation ID | Auto-generated |
| `participants` | array | Array of participant IDs/emails | Required |
| `conversation_type` | string | Type of conversation | Required, Enum: "client-vendor", "staff-client", "staff-admin", "vendor-admin", "client-admin", "group-staff", "group-event-staff" |
| `related_to` | string | ID of related entity | Optional |
| `status` | string | Conversation status | Enum: "active", "archived", "closed" |

### 15. Message Entity
**Description:** Individual messages within conversations.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique message identifier | Auto-generated |
| `conversation_id` | string | ID of the conversation | Required |
| `sender_name` | string | Name of the sender | Required |
| `content` | string | Message content | Required |
| `read_by` | array | Array of user IDs who have read the message | Array of strings |

### 16. ActivityLog Entity
**Description:** Activity and notification tracking.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique activity identifier | Auto-generated |
| `title` | string | Notification title | Required |
| `description` | string | Detailed description | Required |
| `activity_type` | string | Type of activity | Required, Enum: "event_created", "event_updated", "staff_assigned", "invoice_paid", etc. |
| `user_id` | string | ID of the user this notification is for | Required |
| `is_read` | boolean | Whether the notification has been read | Default: false |

### 17. Enterprise Entity
**Description:** Enterprise organization management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique enterprise ID | Auto-generated |
| `enterprise_number`| string | Enterprise Number format EN-#### | Required, Pattern: `^EN-[0-9]{4}$` |
| `enterprise_name` | string | Enterprise name (e.g., Compass) | Required |
| `enterprise_code` | string | Short code identifier | Required |

### 18. Sector Entity
**Description:** Sector/branch management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique sector identifier | Auto-generated |
| `sector_number` | string | Sector Number format SN-#### | Required, Pattern: `^SN-[0-9]{4}$` |
| `sector_name` | string | Sector/brand name (e.g., Bon Appétit) | Required |
| `sector_type` | string | Sector business type | Enum: "Food Service", "Facilities", "Healthcare", "Education", "Corporate", "Sports & Entertainment" |

### 19. Partner Entity
**Description:** Partner/client organization management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique partner identifier | Auto-generated |
| `partner_name` | string | Partner/client name | Required |
| `partner_number` | string | Partner Number format PN-#### | Required, Pattern: `^PN-[0-9]{4}$` |
| `partner_type` | string | Partner type | Enum: "Corporate", "Education", "Healthcare", "Sports & Entertainment", "Government" |

### 20. Order Entity
**Description:** Order management system.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique order identifier | Auto-generated |
| `order_number` | string | Order Number format ORD-#### | Required, Pattern: `^ORD-[0-9]{4,6}$` |
| `partner_id` | string | Partner/Client ID | Required |
| `order_type` | string | Type of order | Enum: "Standard", "Last Minute", "Emergency", "Recurring" |
| `order_status` | string | Order status | Enum: "Draft", "Submitted", "Confirmed", "In Progress", "Completed", "Cancelled" |

### 21. Shift Entity
**Description:** Shift scheduling and management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique shift identifier | Auto-generated |
| `shift_name` | string | Name of the shift | Required |
| `start_date` | timestamp | Shift start date/time | Required |
| `end_date` | timestamp | Shift end date/time | Optional |
| `assigned_staff` | array | List of assigned staff | Array of objects |

### 22. Assignment Entity
**Description:** Worker assignment and tracking.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique assignment identifier | Auto-generated |
| `assignment_number` | string | Assignment Number format ASN-#### | Pattern: `^ASN-[0-9]{4,6}$` |
| `order_id` | string | Associated order ID | Required |
| `workforce_id` | string | Assigned worker ID | Required |
| `vendor_id` | string | Vendor providing the worker | Required |
| `role` | string | Role assigned | Required |
| `assignment_status` | string | Assignment status | Enum: "Pending", "Confirmed", "Checked In", "In Progress", "Completed", "Cancelled", "No Show" |
| `scheduled_start` | timestamp | Scheduled start time | Required |

### 23. Workforce Entity
**Description:** Worker/contractor management.

| Field Name | Type | Description | Validation |
| :--- | :--- | :--- | :--- |
| `id` | string | Unique workforce identifier | Auto-generated |
| `workforce_number` | string | Worker Number format WF-#### | Required, Pattern: `^WF-[0-9]{4,6}$` |
| `vendor_id` | string | Vendor who manages this worker | Required |
| `first_name` | string | Worker first name | Required |
| `last_name` | string | Worker last name | Required |
| `employment_type` | string | Employment classification | Enum: "W2", "1099", "Temporary", "Contract" |

---

## 4. SDK Operations

All entities support the following base operations. Replace `EntityName` with the specific entity (e.g., `Event`, `Staff`, `Invoice`).

### List & Filter
```javascript
// List all records (default limit: 50)
const records = await base44.entities.EntityName.list();

// List with sorting (descending by created_date)
const records = await base44.entities.EntityName.list('-created_date');

// Filter with multiple conditions
const records = await base44.entities.EntityName.filter({
  status: 'Active',
  created_by: user.email
});

// Filter with operators ($gte, $lte, $in, $contains)
const records = await base44.entities.EntityName.filter({
  rating: { $gte: 4.5 },
  total: { $lte: 1000 }
});
```

### CRUD Operations
```javascript
// Create
const newRecord = await base44.entities.EntityName.create({
  field1: 'value1',
  field2: 'value2'
});

// Bulk Create
const newRecords = await base44.entities.EntityName.bulkCreate([
  { field1: 'value1' },
  { field1: 'value2' }
]);

// Update
const updatedRecord = await base44.entities.EntityName.update(recordId, {
  field1: 'new value'
});

// Delete
await base44.entities.EntityName.delete(recordId);

// Get Schema
const schema = await base44.entities.EntityName.schema();
```

---

## 5. Core Integrations

### InvokeLLM
Generates a response from an LLM with a prompt.

| Parameter | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| `prompt` | string | Yes | The prompt to send to the LLM |
| `add_context_from_internet` | boolean | No | Fetch context from Google Search/Maps/News |
| `response_json_schema` | object | No | JSON schema for structured output |
| `file_urls` | string[] | No | Array of file URLs for context |

```javascript
const data = await base44.integrations.Core.InvokeLLM({
  prompt: "Give me data on Apple",
  add_context_from_internet: true,
  response_json_schema: {
    type: "object",
    properties: {
      stock_price: { type: "number" },
      ceo: { type: "string" }
    }
  }
});
```

### SendEmail
Send an email to a user.

| Parameter | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| `to` | string | Yes | Recipient email address |
| `subject` | string | Yes | Email subject line |
| `body` | string | Yes | Email body (supports HTML) |
| `from_name` | string | No | Sender name |

### File Operations

*   **UploadFile:** Upload a file to public storage.
*   **UploadPrivateFile:** Upload a file to private storage (requires signed URL).
*   **CreateFileSignedUrl:** Create a temporary signed URL for accessing a private file.

```javascript
// Upload private document
const { file_uri } = await base44.integrations.Core.UploadPrivateFile({
  file: sensitiveDocument
});

// Create signed URL
const { signed_url } = await base44.integrations.Core.CreateFileSignedUrl({
  file_uri: file_uri,
  expires_in: 3600
});
```

### ExtractDataFromUploadedFile
Extract structured data from uploaded files (CSV, PDF, images).

```javascript
const result = await base44.integrations.Core.ExtractDataFromUploadedFile({
  file_url: file_url,
  json_schema: {
    type: "array",
    items: {
      type: "object",
      properties: {
        employee_name: { type: "string" },
        email: { type: "string" }
      }
    }
  }
});
```

---

## 6. Data Models Reference

### Complete Event Object Example
```json
{
  "id": "evt_1234567890",
  "event_name": "Google Campus Lunch Service",
  "is_recurring": true,
  "status": "Active",
  "date": "2025-01-15",
  "shifts": [
    {
      "shift_name": "Lunch Shift",
      "roles": [
        {
          "role": "Server",
          "count": 10,
          "hours": 4,
          "cost_per_hour": 25,
          "total_value": 1000
        }
      ]
    }
  ],
  "assigned_staff": [
    {
      "staff_id": "stf_111",
      "staff_name": "Maria Garcia",
      "confirmed": true
    }
  ]
}
```

---

## 7. Code Examples

### Example: Create Event with Staff Assignment
```javascript
import { base44 } from "@/api/base44Client";

async function createEventAndAssignStaff() {
  const user = await base44.auth.me();
  
  // 1. Create Event
  const event = await base44.entities.Event.create({
    event_name: "Corporate Holiday Party",
    date: "2025-12-20",
    status: "Draft",
    requested: 20,
    shifts: [{
        shift_name: "Evening Service",
        roles: [{ role: "Server", count: 15, cost_per_hour: 28 }]
    }],
    client_email: user.email
  });
  
  // 2. Find Staff
  const availableStaff = await base44.entities.Staff.filter({
    position: "Server",
    rating: { $gte: 4.5 }
  }, '-rating', 15);
  
  // 3. Assign Staff
  const assignedStaff = availableStaff.map(staff => ({
    staff_id: staff.id,
    staff_name: staff.employee_name,
    role: "Server",
    confirmed: false
  }));
  
  await base44.entities.Event.update(event.id, {
    assigned_staff: assignedStaff,
    status: "Pending"
  });
  
  return event;
}
```

### Example: AI-Powered Staff Recommendation
```javascript
import { base44 } from "@/api/base44Client";

async function getStaffRecommendations(eventId) {
  const events = await base44.entities.Event.filter({ id: eventId });
  const event = events[0];
  const allStaff = await base44.entities.Staff.list();
  
  const recommendations = await base44.integrations.Core.InvokeLLM({
    prompt: `Analyze this event (${event.event_name}) and recommend staff based on rating and reliability.`,
    response_json_schema: {
      type: "object",
      properties: {
        recommendations: {
          type: "array",
          items: {
            type: "object",
            properties: {
              staff_id: { type: "string" },
              score: { type: "number" },
              reasoning: { type: "string" }
            }
          }
        }
      }
    }
  });
  
  return recommendations;
}
```

---

## 8. Best Practices

1.  **Error Handling:** Always wrap calls in `try/catch` blocks and provide user-friendly error messages.
2.  **Query Optimization:** Filter data at the database level (using `.filter()`) rather than fetching all records and filtering in memory.
3.  **Pagination:** Use the `limit` and `offset` parameters in `.list()` for large datasets to improve performance.
4.  **Caching:** Use libraries like React Query to cache SDK responses and reduce API calls.
5.  **Batch Operations:** Prefer `bulkCreate` over looping through single create calls.
6.  **Team Isolation:** Rely on the built-in `owner_id` filtering. Do not attempt to bypass cross-layer visibility rules (e.g., Vendors should not see Procurement teams).

---

## 9. Security Considerations

*   **User Entity Access Control:** Built-in rules enforce that only admins can modify other users. Regular users are restricted to their own records.
*   **Team Isolation:** Complete data isolation across organizational layers (Vendor, Procurement, Operator, Client) is enforced via `owner_id`.
*   **Private Files:** Always use `UploadPrivateFile` for sensitive documents (W9, Insurance, etc.) and generate temporary signed URLs for access.
*   **Input Validation:** While the API performs validation, always validate email formats and required fields on the client side before making requests.

---

## 10. Rate Limits & Quotas

| Operation | Limit |
| :--- | :--- |
| **Entity Operations** | 1000 requests/minute |
| **LLM Invocations** | 100 requests/minute |
| **File Uploads** | 100 MB per file |
| **Email Sending** | 1000 emails/day |

*Tip: Implement exponential backoff for retries if you hit these limits.*

---

## 11. Changelog

**Version 3.0 (2025-11-20)**
*   Added Team, TeamMember, TeamHub, TeamMemberInvite entities.
*   Added Assignment and Workforce entities.
*   Enhanced Invoice entity with dispute tracking.
*   Updated Event entity (Conflict detection, Multi-day).

**Version 2.0 (2025-01-11)**
*   Complete entity schema documentation.
*   Core integration specifications.

---

## 12. Support & Resources

*   **Platform Docs:** [https://docs.base44.com](https://docs.base44.com)
*   **API Reference:** [https://api.base44.com/docs](https://api.base44.com/docs)
*   **Technical Support:** support@krow.com

© 2025 KROW Workforce. All rights reserved.