Project Management

Manage projects within mindzieStudio tenants. Create, retrieve, update, and delete projects that contain datasets, investigations, dashboards, and analysis workflows.

Connectivity Testing

Unauthorized Ping

GET /api/{tenantId}/project/unauthorized-ping

Test endpoint that does not require authentication. Use this to verify network connectivity.

Response

Ping Successful

Authenticated Ping

GET /api/{tenantId}/project/ping

Authenticated ping endpoint to verify API access for a specific tenant.

Response (200 OK)

Ping Successful (tenant id: {tenantId})

List All Projects

GET /api/{tenantId}/project

Retrieves a paginated list of all projects the authenticated user has access to within the specified tenant.

Path Parameters

Parameter Type Required Description
tenantId GUID Yes The tenant identifier

Query Parameters

Parameter Type Default Description
page integer 1 Page number for pagination
pageSize integer 50 Number of items per page (max recommended: 100)

Response (200 OK)

{
  "projects": [
    {
      "projectId": "87654321-4321-4321-4321-210987654321",
      "tenantId": "12345678-1234-1234-1234-123456789012",
      "projectName": "Purchase Order Analysis",
      "projectDescription": "Process mining analysis of P2P workflow",
      "dateCreated": "2024-01-15T10:30:00Z",
      "dateModified": "2024-01-20T14:45:00Z",
      "createdBy": "user@example.com",
      "modifiedBy": "user@example.com",
      "isActive": true,
      "datasetCount": 3,
      "investigationCount": 5,
      "dashboardCount": 2,
      "userCount": 8
    }
  ],
  "totalCount": 15,
  "page": 1,
  "pageSize": 50
}

Project Object Fields

Field Type Description
projectId GUID Unique identifier for the project
tenantId GUID Tenant this project belongs to
projectName string Display name of the project
projectDescription string Description of the project
dateCreated datetime When the project was created
dateModified datetime When the project was last modified
createdBy string User who created the project
modifiedBy string User who last modified the project
isActive boolean Whether the project is active
datasetCount integer Number of datasets in the project
investigationCount integer Number of investigations
dashboardCount integer Number of dashboards
userCount integer Number of users with access

Get Project Details

GET /api/{tenantId}/project/{projectId}

Retrieves detailed information for a specific project.

Path Parameters

Parameter Type Required Description
tenantId GUID Yes The tenant identifier
projectId GUID Yes The project identifier

Response (200 OK)

Same structure as the project object in the list response.

Error Responses

Not Found (404):

{
  "error": "Project not found with ID '{projectId}'. The project may have been deleted or the ID is incorrect.",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

Get Project Summary

GET /api/{tenantId}/project/{projectId}/summary

Retrieves aggregated statistics and key metrics for the project.

Response (200 OK)

{
  "projectId": "87654321-4321-4321-4321-210987654321",
  "projectName": "Purchase Order Analysis",
  "projectDescription": "Process mining analysis of P2P workflow",
  "dateCreated": "2024-01-15T10:30:00Z",
  "dateModified": "2024-01-20T14:45:00Z",
  "statistics": {
    "totalDatasets": 3,
    "totalInvestigations": 5,
    "totalDashboards": 2,
    "totalNotebooks": 12,
    "totalUsers": 8
  }
}

Create Project

POST /api/{tenantId}/project

Creates a new project in the specified tenant.

Request Body

{
  "projectName": "New Analysis Project",
  "projectDescription": "Process mining analysis for procurement workflow"
}

Request Fields

Field Type Required Description
projectName string Yes Project name (max 255 characters)
projectDescription string No Description (max 1000 characters)

Response (201 Created)

Returns the created project object (same structure as Get Project).

Error Responses

Bad Request (400):

{
  "error": "Validation failed",
  "validationErrors": ["Project name is required"]
}

Update Project

PUT /api/{tenantId}/project/{projectId}

Updates an existing project's properties.

Path Parameters

Parameter Type Description
tenantId GUID The tenant identifier
projectId GUID The project identifier

Request Body

{
  "projectName": "Updated Project Name",
  "projectDescription": "Updated description",
  "isActive": true
}

Request Fields

Field Type Required Description
projectName string Yes New project name
projectDescription string No New description
isActive boolean No Enable/disable project

Response (200 OK)

Returns the updated project object.


Delete Project

DELETE /api/{tenantId}/project/{projectId}

Permanently deletes a project and ALL associated data.

WARNING: This is a DESTRUCTIVE operation that CANNOT be undone.

Cascade Delete Includes

  • All datasets in the project
  • All investigations and notebooks
  • All dashboards
  • All user permissions
  • All blob storage files (event logs, attachments)

Path Parameters

Parameter Type Description
tenantId GUID The tenant identifier
projectId GUID The project identifier

Response (200 OK)

{
  "message": "Project deleted successfully",
  "projectId": "87654321-4321-4321-4321-210987654321"
}

Implementation Examples

cURL

# List all projects
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Get project details
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Create a new project
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis",
    "projectDescription": "Quarterly procurement analysis"
  }'

# Update a project
curl -X PUT "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "projectName": "Q4 Analysis - Final",
    "projectDescription": "Updated description"
  }'

# Delete a project (CAUTION: Irreversible!)
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Python

import requests

TENANT_ID = '12345678-1234-1234-1234-123456789012'
BASE_URL = 'https://your-mindzie-instance.com'

class ProjectManager:
    def __init__(self, token):
        self.headers = {
            'Authorization': f'Bearer {token}',
            'Content-Type': 'application/json'
        }

    def list_projects(self, page=1, page_size=50):
        """List all projects in the tenant."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        params = {'page': page, 'pageSize': page_size}
        response = requests.get(url, headers=self.headers, params=params)
        response.raise_for_status()
        return response.json()

    def get_project(self, project_id):
        """Get project details."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def create_project(self, name, description=''):
        """Create a new project."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project'
        payload = {
            'projectName': name,
            'projectDescription': description
        }
        response = requests.post(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def update_project(self, project_id, name=None, description=None, is_active=None):
        """Update an existing project."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        payload = {}
        if name:
            payload['projectName'] = name
        if description is not None:
            payload['projectDescription'] = description
        if is_active is not None:
            payload['isActive'] = is_active
        response = requests.put(url, json=payload, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def delete_project(self, project_id):
        """Delete a project (CAUTION: Irreversible!)."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Usage
manager = ProjectManager('your-auth-token')

# List all projects
result = manager.list_projects()
print(f"Total projects: {result['totalCount']}")

for project in result['projects']:
    print(f"- {project['projectName']}: {project['datasetCount']} datasets")

# Create a new project
new_project = manager.create_project(
    name='API Test Project',
    description='Created via API'
)
print(f"Created: {new_project['projectId']}")

JavaScript/Node.js

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const BASE_URL = 'https://your-mindzie-instance.com';

class ProjectManager {
  constructor(token) {
    this.headers = {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    };
  }

  async listProjects(page = 1, pageSize = 50) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project?page=${page}&pageSize=${pageSize}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async getProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, { headers: this.headers });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async createProject(name, description = '') {
    const url = `${BASE_URL}/api/${TENANT_ID}/project`;
    const response = await fetch(url, {
      method: 'POST',
      headers: this.headers,
      body: JSON.stringify({ projectName: name, projectDescription: description })
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }

  async deleteProject(projectId) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}`;
    const response = await fetch(url, {
      method: 'DELETE',
      headers: this.headers
    });
    if (!response.ok) throw new Error(`Failed: ${response.status}`);
    return await response.json();
  }
}

// Usage
const manager = new ProjectManager('your-auth-token');

const projects = await manager.listProjects();
console.log(`Found ${projects.totalCount} projects`);