# Inquiry Management API The Inquiry Management API provides endpoints for managing human-in-the-loop interactions within Attune workflows. Inquiries allow executions to pause and request input from users before continuing, enabling approval workflows, data collection, and interactive automation. ## Table of Contents - [Overview](#overview) - [Inquiry Model](#inquiry-model) - [Authentication](#authentication) - [Endpoints](#endpoints) - [List Inquiries](#list-inquiries) - [Get Inquiry by ID](#get-inquiry-by-id) - [List Inquiries by Status](#list-inquiries-by-status) - [List Inquiries by Execution](#list-inquiries-by-execution) - [Create Inquiry](#create-inquiry) - [Update Inquiry](#update-inquiry) - [Respond to Inquiry](#respond-to-inquiry) - [Delete Inquiry](#delete-inquiry) - [Use Cases](#use-cases) - [Related Resources](#related-resources) --- ## Overview Inquiries represent questions or prompts that require human input during workflow execution. They support: - **Approval Workflows**: Request approval before proceeding with critical actions - **Data Collection**: Gather additional information from users during execution - **Interactive Automation**: Enable dynamic workflows that adapt based on user input - **Assignment**: Direct inquiries to specific users or teams - **Timeouts**: Automatically expire inquiries after a specified time - **Schema Validation**: Define expected response formats using JSON Schema ### Key Features - **Status Tracking**: Monitor inquiry lifecycle (pending, responded, timeout, canceled) - **Response Validation**: Optionally validate responses against JSON schemas - **User Assignment**: Assign inquiries to specific users for accountability - **Timeout Handling**: Automatically handle expired inquiries - **Execution Integration**: Link inquiries to specific workflow executions --- ## Inquiry Model ### Inquiry Object ```json { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "comment": {"type": "string"} }, "required": ["approved"] }, "assigned_to": 789, "status": "pending", "response": null, "timeout_at": "2024-01-15T12:00:00Z", "responded_at": null, "created": "2024-01-15T10:00:00Z", "updated": "2024-01-15T10:00:00Z" } ``` ### Fields | Field | Type | Description | |-------|------|-------------| | `id` | integer | Unique inquiry identifier | | `execution` | integer | ID of the execution this inquiry belongs to | | `prompt` | string | Question or prompt text displayed to the user | | `response_schema` | object | Optional JSON Schema defining expected response format | | `assigned_to` | integer | Optional user ID this inquiry is assigned to | | `status` | string | Current status: `pending`, `responded`, `timeout`, `canceled` | | `response` | object | User's response data (null until responded) | | `timeout_at` | datetime | Optional timestamp when inquiry expires | | `responded_at` | datetime | Timestamp when user responded (null until responded) | | `created` | datetime | Timestamp when inquiry was created | | `updated` | datetime | Timestamp of last update | ### Inquiry Status | Status | Description | |--------|-------------| | `pending` | Inquiry is waiting for a response | | `responded` | User has provided a response | | `timeout` | Inquiry expired without receiving a response | | `canceled` | Inquiry was canceled before completion | --- ## Authentication All inquiry endpoints require authentication. Include a valid JWT access token in the `Authorization` header: ``` Authorization: Bearer ``` See the [Authentication Guide](./authentication.md) for details on obtaining tokens. --- ## Endpoints ### List Inquiries Retrieve a paginated list of inquiries with optional filtering. **Endpoint:** `GET /api/v1/inquiries` **Query Parameters:** | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `status` | string | - | Filter by status (`pending`, `responded`, `timeout`, `canceled`) | | `execution` | integer | - | Filter by execution ID | | `assigned_to` | integer | - | Filter by assigned user ID | | `page` | integer | 1 | Page number (1-indexed) | | `per_page` | integer | 50 | Items per page (max 100) | **Example Request:** ```bash curl -X GET "http://localhost:8080/api/v1/inquiries?status=pending&page=1&per_page=20" \ -H "Authorization: Bearer " ``` **Response:** `200 OK` ```json { "data": [ { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "assigned_to": 789, "status": "pending", "has_response": false, "timeout_at": "2024-01-15T12:00:00Z", "created": "2024-01-15T10:00:00Z" } ], "meta": { "page": 1, "page_size": 20, "total": 1, "total_pages": 1 } } ``` --- ### Get Inquiry by ID Retrieve a single inquiry by its ID. **Endpoint:** `GET /api/v1/inquiries/:id` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `id` | integer | Inquiry ID | **Example Request:** ```bash curl -X GET "http://localhost:8080/api/v1/inquiries/123" \ -H "Authorization: Bearer " ``` **Response:** `200 OK` ```json { "data": { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "comment": {"type": "string"} }, "required": ["approved"] }, "assigned_to": 789, "status": "pending", "response": null, "timeout_at": "2024-01-15T12:00:00Z", "responded_at": null, "created": "2024-01-15T10:00:00Z", "updated": "2024-01-15T10:00:00Z" } } ``` **Error Responses:** - `404 Not Found`: Inquiry not found --- ### List Inquiries by Status Retrieve inquiries filtered by status. **Endpoint:** `GET /api/v1/inquiries/status/:status` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `status` | string | Status filter: `pending`, `responded`, `timeout`, `canceled` | **Query Parameters:** | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `page` | integer | 1 | Page number | | `page_size` | integer | 50 | Items per page | **Example Request:** ```bash curl -X GET "http://localhost:8080/api/v1/inquiries/status/pending" \ -H "Authorization: Bearer " ``` **Response:** `200 OK` ```json { "data": [ { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "assigned_to": 789, "status": "pending", "has_response": false, "timeout_at": "2024-01-15T12:00:00Z", "created": "2024-01-15T10:00:00Z" } ], "meta": { "page": 1, "page_size": 50, "total": 1, "total_pages": 1 } } ``` **Error Responses:** - `400 Bad Request`: Invalid status value --- ### List Inquiries by Execution Retrieve all inquiries associated with a specific execution. **Endpoint:** `GET /api/v1/executions/:execution_id/inquiries` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `execution_id` | integer | Execution ID | **Query Parameters:** | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `page` | integer | 1 | Page number | | `page_size` | integer | 50 | Items per page | **Example Request:** ```bash curl -X GET "http://localhost:8080/api/v1/executions/456/inquiries" \ -H "Authorization: Bearer " ``` **Response:** `200 OK` ```json { "data": [ { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "assigned_to": 789, "status": "pending", "has_response": false, "timeout_at": "2024-01-15T12:00:00Z", "created": "2024-01-15T10:00:00Z" } ], "meta": { "page": 1, "page_size": 50, "total": 1, "total_pages": 1 } } ``` **Error Responses:** - `404 Not Found`: Execution not found --- ### Create Inquiry Create a new inquiry for an execution. **Endpoint:** `POST /api/v1/inquiries` **Request Body:** ```json { "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "comment": {"type": "string"} }, "required": ["approved"] }, "assigned_to": 789, "timeout_at": "2024-01-15T12:00:00Z" } ``` **Field Validation:** | Field | Required | Constraints | |-------|----------|-------------| | `execution` | Yes | Must be a valid execution ID | | `prompt` | Yes | 1-10,000 characters | | `response_schema` | No | Valid JSON Schema object | | `assigned_to` | No | Valid user ID | | `timeout_at` | No | ISO 8601 datetime in the future | **Example Request:** ```bash curl -X POST "http://localhost:8080/api/v1/inquiries" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"} } }, "timeout_at": "2024-01-15T12:00:00Z" }' ``` **Response:** `201 Created` ```json { "data": { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"} } }, "assigned_to": null, "status": "pending", "response": null, "timeout_at": "2024-01-15T12:00:00Z", "responded_at": null, "created": "2024-01-15T10:00:00Z", "updated": "2024-01-15T10:00:00Z" }, "message": "Inquiry created successfully" } ``` **Error Responses:** - `400 Bad Request`: Validation error - `404 Not Found`: Execution not found --- ### Update Inquiry Update an existing inquiry's properties. **Endpoint:** `PUT /api/v1/inquiries/:id` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `id` | integer | Inquiry ID | **Request Body:** ```json { "status": "canceled", "assigned_to": 999 } ``` **Updatable Fields:** | Field | Type | Description | |-------|------|-------------| | `status` | string | Update status (any valid status) | | `response` | object | Manually set response data | | `assigned_to` | integer | Change assignment | **Example Request:** ```bash curl -X PUT "http://localhost:8080/api/v1/inquiries/123" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "status": "canceled" }' ``` **Response:** `200 OK` ```json { "data": { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "response_schema": null, "assigned_to": null, "status": "canceled", "response": null, "timeout_at": "2024-01-15T12:00:00Z", "responded_at": null, "created": "2024-01-15T10:00:00Z", "updated": "2024-01-15T10:05:00Z" }, "message": "Inquiry updated successfully" } ``` **Error Responses:** - `404 Not Found`: Inquiry not found - `400 Bad Request`: Validation error --- ### Respond to Inquiry Submit a response to a pending inquiry. This is the primary endpoint for users to answer inquiries. **Endpoint:** `POST /api/v1/inquiries/:id/respond` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `id` | integer | Inquiry ID | **Request Body:** ```json { "response": { "approved": true, "comment": "Deployment approved for production release v2.1.0" } } ``` **Behavior:** - Only `pending` inquiries can be responded to - If inquiry has `assigned_to`, only that user can respond - If inquiry has timed out, response is rejected - Automatically sets `status` to `responded` - Automatically sets `responded_at` timestamp - Response should conform to `response_schema` if defined (future validation) **Example Request:** ```bash curl -X POST "http://localhost:8080/api/v1/inquiries/123/respond" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "response": { "approved": true, "comment": "Looks good, proceeding with deployment" } }' ``` **Response:** `200 OK` ```json { "data": { "id": 123, "execution": 456, "prompt": "Approve deployment to production?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "comment": {"type": "string"} } }, "assigned_to": 789, "status": "responded", "response": { "approved": true, "comment": "Looks good, proceeding with deployment" }, "timeout_at": "2024-01-15T12:00:00Z", "responded_at": "2024-01-15T10:30:00Z", "created": "2024-01-15T10:00:00Z", "updated": "2024-01-15T10:30:00Z" }, "message": "Response submitted successfully" } ``` **Error Responses:** - `404 Not Found`: Inquiry not found - `400 Bad Request`: Inquiry is not in pending status or has timed out - `403 Forbidden`: User is not authorized to respond (inquiry assigned to someone else) --- ### Delete Inquiry Delete an inquiry. **Endpoint:** `DELETE /api/v1/inquiries/:id` **Path Parameters:** | Parameter | Type | Description | |-----------|------|-------------| | `id` | integer | Inquiry ID | **Example Request:** ```bash curl -X DELETE "http://localhost:8080/api/v1/inquiries/123" \ -H "Authorization: Bearer " ``` **Response:** `200 OK` ```json { "message": "Inquiry deleted successfully", "success": true } ``` **Error Responses:** - `404 Not Found`: Inquiry not found --- ## Use Cases ### Approval Workflows Create inquiries to request approval before executing critical actions: ```bash # Create an approval inquiry curl -X POST "http://localhost:8080/api/v1/inquiries" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "execution": 456, "prompt": "Approve deletion of production database backup?", "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "reason": {"type": "string"} }, "required": ["approved", "reason"] }, "assigned_to": 789, "timeout_at": "2024-01-15T18:00:00Z" }' ``` ### Data Collection Gather additional information during workflow execution: ```bash # Request deployment details curl -X POST "http://localhost:8080/api/v1/inquiries" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "execution": 456, "prompt": "Enter deployment configuration", "response_schema": { "type": "object", "properties": { "environment": {"type": "string", "enum": ["staging", "production"]}, "replicas": {"type": "integer", "minimum": 1, "maximum": 10}, "rollback_enabled": {"type": "boolean"} }, "required": ["environment", "replicas"] } }' ``` ### Monitoring Pending Inquiries List all pending inquiries requiring attention: ```bash # Get all pending inquiries curl -X GET "http://localhost:8080/api/v1/inquiries?status=pending" \ -H "Authorization: Bearer " # Get inquiries assigned to a specific user curl -X GET "http://localhost:8080/api/v1/inquiries?status=pending&assigned_to=789" \ -H "Authorization: Bearer " ``` ### Responding to Inquiries Users can respond to assigned inquiries: ```bash curl -X POST "http://localhost:8080/api/v1/inquiries/123/respond" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "response": { "environment": "production", "replicas": 5, "rollback_enabled": true } }' ``` --- ## Best Practices ### 1. Use Response Schemas Define clear response schemas to validate user input: ```json { "response_schema": { "type": "object", "properties": { "approved": {"type": "boolean"}, "justification": {"type": "string", "minLength": 10} }, "required": ["approved", "justification"] } } ``` ### 2. Set Reasonable Timeouts Always set timeouts to prevent inquiries from blocking workflows indefinitely: ```json { "timeout_at": "2024-01-15T23:59:59Z" } ``` ### 3. Assign to Specific Users For accountability, assign inquiries to responsible users: ```json { "assigned_to": 789, "prompt": "Review and approve security patch deployment" } ``` ### 4. Handle Timeouts Gracefully Monitor inquiries and handle timeout status appropriately in your workflows. ### 5. Provide Clear Prompts Write descriptive prompts that clearly explain what information is needed: ```json { "prompt": "The deployment to production requires approval. Review the changes at https://github.com/org/repo/pull/123 and approve or reject." } ``` --- ## Error Handling ### Common Error Codes | Status Code | Description | |-------------|-------------| | `400 Bad Request` | Invalid input or inquiry not in correct state | | `401 Unauthorized` | Missing or invalid authentication token | | `403 Forbidden` | User not authorized to respond to inquiry | | `404 Not Found` | Inquiry or execution not found | | `422 Unprocessable Entity` | Validation errors | | `500 Internal Server Error` | Server error | ### Example Error Response ```json { "error": "Cannot respond to inquiry with status 'responded'. Only pending inquiries can be responded to.", "status": 400 } ``` --- ## Related Resources - [Execution Management API](./api-executions.md) - Manage workflow executions - [Action Management API](./api-actions.md) - Define executable actions - [Rule Management API](./api-rules.md) - Create automation rules - [Authentication Guide](./authentication.md) - API authentication details --- ## Future Enhancements ### Planned Features 1. **Response Schema Validation**: Automatic validation of responses against JSON Schema 2. **Inquiry Templates**: Reusable inquiry templates for common patterns 3. **Batch Operations**: Respond to multiple inquiries at once 4. **Notification Integration**: Automatic notifications when inquiries are created 5. **Audit Trail**: Detailed logging of inquiry lifecycle events 6. **Custom Actions**: Trigger actions on inquiry state changes 7. **WebSocket Updates**: Real-time inquiry status updates --- **Last Updated:** 2024-01-15 **API Version:** v1