===== 1. Background & Objective ===== To support platform integration and workflow automation for MCW, CX Genie must provide open APIs for third-party systems to perform the following operations on form data: * Retrieve form field metadata * Create new form entries * Update specific form entries * Query all or filtered form data * Archive form entries (internal use only) These APIs will be applied in scenarios such as: * Data synchronization * Auto-fill features * Self-service queries ===== 2. API Security Design ===== ==== 2.1 workspace_token ==== **Authentication** All API requests must include the following field in the request payload: "workspace_token": "your_token_here" The system will verify the token against the corresponding Workspace’s permissions. Requests with invalid or missing tokens will return a **401 Unauthorized** error. ==== 2.2 Error Response Format ==== { "error": "Invalid or missing workspace_token" } ===== 3. Features & API List ===== ^ API ID ^ Feature Name ^ Description ^ Method ^ Example Path ^ | [[API-001]] | Get Field Metadata | Retrieve field definitions for a specific form | POST | /api/v1/form-results-value/metadata | | API-002 | Create Form Entry | Submit a new form response to a specific Workspace | POST | /api/v1/form-results-value/create | | API-003 | Update Form Entry | Update an existing form entry by result_id | PUT | /api/v1/form-results-value/update/{result_id}| | API-004 | Query Form Entries | Retrieve all or filtered form data | POST | /api/v1/form-results-value/query | | API-005 | Archive Form Entry | Mark form entry as archived (internal API only)| PATCH | /api/v1/form-results-value/archive/{result_id}| ===== 4. API Details ===== ==== API-001: Get Field Metadata ==== **Method:** POST \\ **Endpoint:** `/api/v1/form-results-value/metadata` **Request Payload** { "workspace_id": "abc123", "form_id": "form456", "workspace_token": "xxxxx" } **Response** { "form_name": "Customer Feedback", "fields": [ { "field_key": "email", "label": "Email", "type": "text", "required": true }, { "field_key": "rating", "label": "Rating", "type": "number", "required": false } ] } ==== API-002: Create Form Entry ==== **Method:** POST **Endpoint:** `/api/v1/form-results-value/create` **Request Payload** { "workspace_id": "abc123", "form_id": "form456", "workspace_token": "xxxxx", "customer_email": "user@example.com", "data": { "email": "user@example.com", "rating": 5, "files": [ { "name": "image1.jpg", "url": "https://storage.example.com/file/image1.jpg", "type": "image/jpeg", "size": 1024000 }, { "name": "document.pdf", "url": "https://storage.example.com/file/document.pdf", "type": "application/pdf", "size": 2048000 } ] } } **Note:** For any field with `type=upload`, you should call the File Upload API first and pass the response in the format above. See: [[Form Record File Upload API]] **Success Response** { "message": "Form result created successfully", "result_id": "xyz789" } **Error Response** { "error": "Missing required field: email" } ---- ==== API-003: Update Form Entry ==== **Method:** PUT **Endpoint:** `/api/v1/form-results-value/update/{result_id}` **Path Parameter** ^ Parameter ^ Type ^ Description ^ Required | | result_id | string | Unique identifier of the record | Yes | **Request Payload** ^ Field ^ Type ^ Description ^ Required | | workspace_id | string | Workspace identifier | Yes | | workspace_token| string | Access token | Yes | | data | object | Key-value fields to update | Yes | **Example** { "workspace_id": "abc123", "workspace_token": "xxxxx", "data": { "rating": 4 } } **Note:** The system will validate that each field in `data` matches the expected format from the form metadata. If a field value does not match its type, an error will be returned. **Success Response** { "message": "Form result updated" } **Error Responses** Examples: _Invalid value_ { "error": "Invalid value for field 'rating': expected type 'number'" } _Missing token_ { "error": "Invalid or missing workspace_token" } _Invalid field key_ { "error": "Field 'unknown_field' is not defined in the form" } ---- ==== API-004: Query Form Entries ==== **Method:** POST **Endpoint:** `/api/v1/form-results-value/query` **Request Payload** { "workspace_id": "abc123", "form_id": "form456", "workspace_token": "xxxxx", "filters": { "email": "user@example.com" }, "limit": 10, "offset": 0 } **Response** { "total": 1, "data": [ { "result_id": "xyz789", "email": "user@example.com", "rating": 5 } ] } ---- ==== API-005: Archive Form Entry (Internal Use Only) ==== **Method:** PATCH **Endpoint:** `/api/v1/form-results-value/archive/{result_id}` **Path Parameter** * `result_id`: ID of the record to archive **Request Payload** { "workspace_id": "abc123", "workspace_token": "xxxxx", "internal_access_key": "internalSecretKey" } **Success Response** { "message": "Form result archived" } **Unauthorized Response** { "error": "Unauthorized access" } ----