Work Hub is your unified productivity workspace on the Haiven platform. It connects meetings, emails, documents, tasks, AI drafting, calendar management, and automated research dispatch into one place. Access it at https://work.haiven.site.
Open https://work.haiven.site in your browser. The interface has a left sidebar with navigation sections:
The backend API is fully documented at https://work.haiven.site/api/docs.
Tasks are the core of Work Hub. Each task has:
| Field | Description |
|---|---|
| Title | Short description of the work |
| Status | open, in_progress, done, blocked, archived, queued, context_ready |
| Priority | low, medium, high, critical |
| Company | Client or organisation (from taxonomy) |
| Project | Project within a company |
| Tags | Classification labels |
| Assignee | Person responsible |
| Source | Where the task came from (manual, agent, email, meeting) |
| Due date | Optional deadline |
| Context | Free-text or JSON context block (written by agents) |
In the UI, click New Task, fill in the title and fields, then save.
Via API:
curl -X POST https://work.haiven.site/api/v1/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Prepare Q1 report",
"priority": "high",
"status": "open",
"source": "manual"
}'
Status transitions are enforced — you cannot skip states. Valid paths:
open → in_progress → done
open → in_progress → blocked → in_progress
open → archived
queued → context_ready → in_progress
in_progress → done / archived
done → archived
curl -X PATCH https://work.haiven.site/api/v1/tasks/{id} \
-H "Content-Type: application/json" \
-d '{"status": "in_progress"}'
The task list supports filtering by status, priority, company, project, assignee, source, and source_application. Use the filter bar in the UI or pass query parameters to the API:
# All open high-priority tasks for a specific company
curl "https://work.haiven.site/api/v1/tasks?status=open&priority=high&company_id=<uuid>"
Every field change is recorded with a timestamp and actor. View the full history:
curl https://work.haiven.site/api/v1/tasks/{id}/history
Work Hub can generate an AI draft for any task using RAG — it searches your embedded meetings, documents, and emails for relevant context, then uses glm-4-7-flash to produce a draft.
Open a task and click Draft. The system:
qwen3-embedding-4bDrafts are versioned — each time you click Draft, a new version is saved and accessible from the draft history.
# Generate a new draft
curl -X POST https://work.haiven.site/api/v1/tasks/{id}/draft
# View draft history (all versions)
curl https://work.haiven.site/api/v1/tasks/{id}/drafts
Draft quality depends on what is in your knowledge base. If the draft lacks context:
Work Hub automatically receives and embeds meeting notes approved in Meeting Scribe via webhook. You can also browse and search meetings.
The Meetings section lists all embedded meetings with title, date, and attendees. Click a meeting to view the full markdown-rendered notes.
Search across all meeting notes using natural language:
curl -X POST https://work.haiven.site/api/v1/meetings/search \
-H "Content-Type: application/json" \
-d '{"query": "budget approval decisions from Q4", "limit": 5}'
Work Hub has two complementary email capabilities: reading email via IMAP (into the knowledge base) and sending email via Microsoft Graph (O365).
Requires CONN_EMAIL_OAUTH2_* environment variables configured by an administrator. Limited to 20 sends per hour.
curl -X POST https://work.haiven.site/api/v1/email/send \
-H "Content-Type: application/json" \
-d '{
"to": "recipient@example.com",
"subject": "Action items from today'\''s meeting",
"body": "Hi,\n\nHere are the action items we discussed..."
}'
To reply within an existing email thread, include thread_id with the original Message-ID:
curl -X POST https://work.haiven.site/api/v1/email/send \
-H "Content-Type: application/json" \
-d '{
"to": "recipient@example.com",
"subject": "Re: Action items",
"body": "Confirming I'\''ve completed item 1.",
"thread_id": "<original-message-id@mail.example.com>"
}'
Each send is automatically logged to haiven-knowledge for future RAG context.
When the IMAP connector is enabled by an administrator, Work Hub polls your mailbox in the background and embeds all emails into Qdrant for search and draft context.
Check sync status:
curl https://work.haiven.site/api/v1/email/status
Trigger an immediate sync:
curl -X POST https://work.haiven.site/api/v1/email/sync
Backfill a date range:
curl -X POST "https://work.haiven.site/api/v1/email/backfill?since_date=2026-02-01&before_date=2026-03-01"
List available IMAP folders:
curl https://work.haiven.site/api/v1/email/folders
Requires CONN_EMAIL_OAUTH2_* environment variables with Calendars.ReadWrite scope. Uses the same Azure AD app registration as email send.
curl "https://work.haiven.site/api/v1/calendar/events?start=2026-03-10T00:00:00Z&end=2026-03-17T00:00:00Z"
Returns up to 50 events ordered by start time. Each event includes: id, summary, start, end, attendees, description, web_link.
curl -X POST https://work.haiven.site/api/v1/calendar/events \
-H "Content-Type: application/json" \
-d '{
"summary": "Quarterly Review",
"start": "2026-03-15T14:00:00Z",
"end": "2026-03-15T15:30:00Z",
"attendees": ["alice@example.com", "bob@example.com"],
"description": "Q1 performance review and Q2 planning"
}'
If Microsoft Graph detects a scheduling conflict, the API returns 409 Conflict. Adjust the time slot and retry.
curl -X DELETE https://work.haiven.site/api/v1/calendar/events/{event_id}
Work Hub can ingest content from many sources. All imported content is chunked, embedded into Qdrant, and becomes available for search and draft generation.
curl -X POST https://work.haiven.site/api/v1/import/document \
-H "Content-Type: application/json" \
-d '{
"title": "Q1 Strategy Document",
"content": "## Goals\n\nIncrease revenue by 20%...",
"doc_type": "strategy",
"source": "manual"
}'
Drag and drop files onto the Import section in the UI, or use the file picker. Supported formats and limits:
| Type | Formats | Size Limit |
|---|---|---|
| Documents | PDF, DOCX, EML, HTML, CSV, ICS, MD, TXT | 50 MB |
| Audio/Video | MP3, M4A, WAV, OGG, WEBM, MP4, FLAC | 500 MB |
| Archives | PST (Outlook) | 500 MB |
Via API:
curl -X POST https://work.haiven.site/api/v1/import/upload \
-F "file=@/path/to/document.pdf"
Upload a recording and Work Hub sends it to haiven-transcribe. Transcription takes 30–120 seconds depending on file length. The transcript is then embedded and searchable.
curl -X POST https://work.haiven.site/api/v1/import/audio \
-F "file=@/path/to/meeting-recording.mp4"
Import all supported files from a server-side directory:
curl -X POST https://work.haiven.site/api/v1/import/directory \
-H "Content-Type: application/json" \
-d '{"path": "/mnt/storage/documents/reports"}'
Upload an Outlook PST file. Work Hub extracts all contained emails and calendar items, ingests them with full metadata, and deduplicates by Message-ID.
curl -X POST https://work.haiven.site/api/v1/import/pst \
-F "file=@/path/to/archive.pst"
Import all historical approved notes from Meeting Scribe in one operation:
# Preview without writing
curl -X POST "https://work.haiven.site/api/v1/backfill/scribe-notes?dry_run=true"
# Run the actual backfill
curl -X POST https://work.haiven.site/api/v1/backfill/scribe-notes
Companies, projects, and tags help you organise tasks and filter content. Manage them from the Taxonomy section in the UI or via API.
# List
curl https://work.haiven.site/api/v1/companies
# Create
curl -X POST https://work.haiven.site/api/v1/companies \
-H "Content-Type: application/json" \
-d '{"name": "Acme Corp", "domain": "acme.com"}'
# Update
curl -X PATCH https://work.haiven.site/api/v1/companies/{id} \
-H "Content-Type: application/json" \
-d '{"domain": "acmecorp.com"}'
# Delete
curl -X DELETE https://work.haiven.site/api/v1/companies/{id}
# List (optionally filter by company)
curl "https://work.haiven.site/api/v1/projects?company_id={company_uuid}"
# Create
curl -X POST https://work.haiven.site/api/v1/projects \
-H "Content-Type: application/json" \
-d '{"name": "Website Redesign", "company_id": "{uuid}", "status": "active"}'
# Update status
curl -X PATCH https://work.haiven.site/api/v1/projects/{id} \
-H "Content-Type: application/json" \
-d '{"status": "completed"}'
# List
curl https://work.haiven.site/api/v1/tags
# Create
curl -X POST https://work.haiven.site/api/v1/tags \
-H "Content-Type: application/json" \
-d '{"name": "urgent", "source": "manual"}'
# Delete
curl -X DELETE https://work.haiven.site/api/v1/tags/{id}
Work Hub automatically dispatches tasks to the research agent when you create a task with:
- Status: queued
- Title: begins with Research: (case-insensitive match on the word "research")
The dispatcher checks every 60 seconds. When it finds a matching task it:
queued → context_ready → in_progressTo trigger a research task:
curl -X POST https://work.haiven.site/api/v1/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Research: Best practices for async Python database access",
"status": "queued",
"source": "manual"
}'
Within 60 seconds the task moves to in_progress. When research completes, the task transitions to done and artifacts are attached.
Work Hub exposes dedicated endpoints for agent write-back. The briefing agent, research agent, and other Haiven services use these to push structured data back to tasks.
Append a timestamped instruction to a task. Each entry carries a processed: false flag so agents know which instructions are pending.
curl -X PATCH https://work.haiven.site/api/v1/tasks/{id}/voice-instructions \
-H "Content-Type: application/json" \
-d '{"instruction": "Focus on the executive summary. Keep it under 3 paragraphs."}'
Attach a reference to an agent output (research session, briefing output, etc.):
curl -X PATCH https://work.haiven.site/api/v1/tasks/{id}/artifacts \
-H "Content-Type: application/json" \
-d '{"type": "research_output", "path": "<session_id>"}'
Agents completing a task write their final context and status:
curl -X PATCH https://work.haiven.site/api/v1/tasks/{id} \
-H "Content-Type: application/json" \
-d '{
"status": "done",
"context": "{\"summary\": \"...\", \"sources\": [...]}"
}'
WH_IMAP_ENABLED=true in .env)source=emailPOST /api/v1/email/send with thread_id set to the original Message-IDtitle="Research: <topic>", status=queueddone and artifacts contain the research output/mnt/storage/documents/reports/)POST /api/v1/import/directory with the pathGET /api/v1/calendar/events to list upcoming meetingsPOST /api/v1/calendar/events returns 409, Graph detected a scheduling conflict. Adjust the time slot.history array records every change. Use it for audit trails or to understand what agents have done to a task.POST /api/v1/backfill/scribe-notes on a large history, add ?dry_run=true to preview the count without ingesting.