JuhJuh exposes a REST API at /api/v1/ for managing your organization, projects, tickets, agents, pages, infrastructure, and more. Every action available in the dashboard is also available through the API.
Authentication¶
Two methods are supported: API keys and session cookies.
API keys¶
API keys are the primary method for programmatic access. Every key is scoped to a single organization and prefixed with jjk_.
- Go to Settings, then API Keys in your organization dashboard
- Click Create API Key
- Name the key and set an optional expiration date
- Copy the key immediately. It is shown once and cannot be retrieved later.
Include the key in the Authorization header:
Authorization: Bearer jjk_your_key
API keys inherit the permissions of the user who created them. If the user loses access to the organization, the key stops working.
Session authentication¶
If you are already logged in to the JuhJuh dashboard, API requests from the same browser session are authenticated automatically. This is useful for building internal tools or browser extensions.
Organization scoping¶
Most endpoints require an organization context. The API resolves your organization in this order:
- The
X-Juhjuh-Org header, if present (pass your org slug)
- The organization tied to your API key
- Your first active organization membership
For multi-org users, always pass the X-Juhjuh-Org header to avoid ambiguity.
X-Juhjuh-Org: acme-engineering
Rate limits¶
Every API key has a per-minute request limit. The limit depends on your subscription plan. When you exceed it, the API returns 429 Too Many Requests with a Retry-After header indicating how many seconds to wait.
Default limit: 60 requests per minute.
All responses are JSON. Successful requests return 200, 201, or 204. Errors return the appropriate HTTP status code with a JSON body:
json
{
"error": "Permission denied."
}
List endpoints return paginated results with count, next, previous, and results fields:
json
{
"count": 42,
"next": "https://your-org.juhjuh.com/api/v1/projects/ACME/tickets/?page=2",
"previous": null,
"results": [...]
}
Follow the next URL to fetch subsequent pages.
Quick start¶
List tickets in a project¶
bash
curl -H "Authorization: Bearer jjk_your_key" \
https://your-org.juhjuh.com/api/v1/projects/ACME/tickets/
Create a ticket¶
bash
curl -X POST \
-H "Authorization: Bearer jjk_your_key" \
-H "Content-Type: application/json" \
-d '{"title": "Fix login timeout", "description": "Session expires after 5 minutes"}' \
https://your-org.juhjuh.com/api/v1/projects/ACME/tickets/
Get vault secrets¶
bash
curl -H "Authorization: Bearer jjk_your_key" \
https://your-org.juhjuh.com/api/v1/vaults/production/entries/
Chat with an agent¶
bash
curl -X POST \
-H "Authorization: Bearer jjk_your_key" \
-H "Content-Type: application/json" \
-d '{"message": "What are the open tickets this sprint?"}' \
https://your-org.juhjuh.com/api/v1/orgs/acme-engineering/agents/1/chat/
Send a natural language request¶
bash
curl -X POST \
-H "Authorization: Bearer jjk_your_key" \
-H "Content-Type: application/json" \
-d '{"query": "Create a bug ticket for the payments service"}' \
https://your-org.juhjuh.com/api/v1/gateway/
Endpoints¶
Projects¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/projects/ |
List projects in the organization |
POST |
/api/v1/orgs/{slug}/projects/ |
Create a project |
GET |
/api/v1/projects/{key}/ |
Get project details |
PATCH |
/api/v1/projects/{key}/ |
Update a project |
PATCH |
/api/v1/projects/{key}/key/ |
Rename a project key |
Tickets¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/tickets/ |
List tickets in a project |
POST |
/api/v1/projects/{key}/tickets/ |
Create a ticket |
GET |
/api/v1/projects/{key}/tickets/{id}/ |
Get ticket details |
PATCH |
/api/v1/projects/{key}/tickets/{id}/ |
Update a ticket |
DELETE |
/api/v1/projects/{key}/tickets/{id}/ |
Delete a ticket |
POST |
/api/v1/projects/{key}/tickets/{id}/queue/ |
Queue ticket for execution |
POST |
/api/v1/projects/{key}/tickets/{id}/execute/ |
Execute a ticket |
GET |
/api/v1/projects/{key}/tickets/{id}/comments/ |
List ticket comments |
POST |
/api/v1/projects/{key}/tickets/{id}/comments/ |
Add a comment |
POST |
/api/v1/projects/{key}/tickets/move/ |
Move a ticket between projects |
Tickets can also be retrieved or resolved globally:
| Method |
Path |
Description |
GET |
/api/v1/tickets/{uuid}/ |
Get ticket by UUID |
GET |
/api/v1/tickets/by-key/{display_key}/ |
Get ticket by display key (e.g., ACME-42) |
POST |
/api/v1/tickets/resolve/ |
Resolve a ticket by key |
Boards¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/board/ |
Get board state |
GET |
/api/v1/projects/{key}/board/columns/ |
List columns |
POST |
/api/v1/projects/{key}/board/columns/create/ |
Create a column |
PATCH |
/api/v1/projects/{key}/board/columns/{id}/ |
Update a column |
DELETE |
/api/v1/projects/{key}/board/columns/{id}/delete/ |
Delete a column |
POST |
/api/v1/projects/{key}/board/columns/reorder/ |
Reorder columns |
POST |
/api/v1/projects/{key}/board/tickets/{id}/move/ |
Move a ticket between columns |
PATCH |
/api/v1/projects/{key}/board/setup/ |
Configure board settings |
Sprints¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/sprints/ |
List sprints |
POST |
/api/v1/projects/{key}/sprints/ |
Create a sprint |
GET |
/api/v1/projects/{key}/sprints/{id}/ |
Get sprint details |
PATCH |
/api/v1/projects/{key}/sprints/{id}/ |
Update a sprint |
DELETE |
/api/v1/projects/{key}/sprints/{id}/ |
Delete a sprint |
GET |
/api/v1/projects/{key}/sprints/{id}/burndown/ |
Get burndown chart data |
GET |
/api/v1/projects/{key}/sprints/velocity/ |
Get velocity metrics |
Agents¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/agents/ |
List agents |
POST |
/api/v1/orgs/{slug}/agents/ |
Create an agent |
GET |
/api/v1/orgs/{slug}/agents/{id}/ |
Get agent details |
PATCH |
/api/v1/orgs/{slug}/agents/{id}/ |
Update an agent |
DELETE |
/api/v1/orgs/{slug}/agents/{id}/ |
Delete an agent |
POST |
/api/v1/orgs/{slug}/agents/{id}/chat/ |
Start a chat session |
GET |
/api/v1/orgs/{slug}/agents/{id}/sessions/ |
List chat sessions |
Agent skills¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/agents/{agent_id}/skills/ |
List skills for an agent |
POST |
/api/v1/orgs/{slug}/agents/{agent_id}/skills/ |
Attach a skill |
GET |
/api/v1/orgs/{slug}/agents/{agent_id}/skills/{id}/ |
Get skill details |
PATCH |
/api/v1/orgs/{slug}/agents/{agent_id}/skills/{id}/ |
Update a skill |
DELETE |
/api/v1/orgs/{slug}/agents/{agent_id}/skills/{id}/ |
Remove a skill |
Pipelines¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/agents/{agent_id}/pipelines/ |
List pipelines |
POST |
/api/v1/orgs/{slug}/agents/{agent_id}/pipelines/ |
Create a pipeline |
GET |
/api/v1/orgs/{slug}/agents/{agent_id}/pipelines/{id}/ |
Get pipeline details |
PATCH |
/api/v1/orgs/{slug}/agents/{agent_id}/pipelines/{id}/ |
Update a pipeline |
DELETE |
/api/v1/orgs/{slug}/agents/{agent_id}/pipelines/{id}/ |
Delete a pipeline |
Batch executions¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/agents/batch/ |
List batch executions |
POST |
/api/v1/orgs/{slug}/agents/batch/ |
Create a batch execution |
GET |
/api/v1/orgs/{slug}/agents/batch/{id}/ |
Get batch details |
POST |
/api/v1/orgs/{slug}/agents/batch/{id}/cancel/ |
Cancel a running batch |
Org-scoped shortcuts¶
These convenience endpoints mirror their project-scoped equivalents but are scoped to the organization. Useful when you need cross-project access.
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/dashboard/ |
Get organization dashboard data |
GET |
/api/v1/orgs/{slug}/tickets/ |
List tickets across all projects |
POST |
/api/v1/orgs/{slug}/tickets/create/ |
Create a ticket (specify project in body) |
GET |
/api/v1/orgs/{slug}/tickets/{key}/ |
Get ticket by display key |
GET |
/api/v1/orgs/{slug}/tickets/{key}/comments/ |
List comments on a ticket |
GET |
/api/v1/orgs/{slug}/sprints/ |
List sprints across all projects |
GET |
/api/v1/orgs/{slug}/knowledge/entries/ |
List knowledge entries |
GET |
/api/v1/orgs/{slug}/knowledge/entries/{id}/ |
Get knowledge entry details |
GET |
/api/v1/orgs/{slug}/knowledge/search/ |
Search knowledge entries |
Pages (knowledge base)¶
| Method |
Path |
Description |
GET |
/api/v1/pages/{key}/pages/ |
List pages in a project |
POST |
/api/v1/pages/{key}/pages/ |
Create a page |
GET |
/api/v1/pages/{key}/pages/{slug}/ |
Get page content |
PATCH |
/api/v1/pages/{key}/pages/{slug}/ |
Update a page |
DELETE |
/api/v1/pages/{key}/pages/{slug}/ |
Delete a page |
POST |
/api/v1/pages/{key}/pages/{slug}/restore/ |
Restore a deleted page |
GET |
/api/v1/pages/{key}/pages/{slug}/revisions/ |
List page revisions |
GET |
/api/v1/pages/{key}/pages/{slug}/revisions/{num}/ |
Get a specific revision |
POST |
/api/v1/pages/{key}/pages/{slug}/revisions/{num}/restore/ |
Restore a revision |
POST |
/api/v1/pages/{key}/sync-drafts/ |
Sync offline drafts |
POST |
/api/v1/pages/{key}/pages/{slug}/pin-offline/ |
Pin a page for offline access |
| Method |
Path |
Description |
GET |
/api/v1/pages/{key}/pages/{slug}/comments/ |
List comments on a page |
POST |
/api/v1/pages/{key}/pages/{slug}/comments/ |
Add a comment |
POST |
/api/v1/pages/{key}/pages/{slug}/comments/{id}/resolve/ |
Resolve a comment |
DELETE |
/api/v1/pages/{key}/pages/{slug}/comments/{id}/ |
Delete a comment |
Folders¶
| Method |
Path |
Description |
GET |
/api/v1/pages/{key}/folders/ |
List folders |
POST |
/api/v1/pages/{key}/folders/ |
Create a folder |
GET |
/api/v1/pages/{key}/folders/{slug}/ |
Get folder details |
PATCH |
/api/v1/pages/{key}/folders/{slug}/ |
Update a folder |
DELETE |
/api/v1/pages/{key}/folders/{slug}/ |
Delete a folder |
Search¶
| Method |
Path |
Description |
GET |
/api/v1/pages/{key}/search/ |
Search pages within a project |
GET |
/api/v1/pages/{key}/tags/ |
List all tags |
GET |
/api/v1/search/ |
Global search across projects |
GET |
/api/v1/projects/{key}/search/ |
Search within a project |
Schedules¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/schedules/ |
List schedules |
POST |
/api/v1/orgs/{slug}/schedules/ |
Create a schedule |
GET |
/api/v1/orgs/{slug}/schedules/{id}/ |
Get schedule details |
PATCH |
/api/v1/orgs/{slug}/schedules/{id}/ |
Update a schedule |
DELETE |
/api/v1/orgs/{slug}/schedules/{id}/ |
Delete a schedule |
POST |
/api/v1/orgs/{slug}/schedules/{id}/toggle/ |
Enable or disable a schedule |
GET |
/api/v1/orgs/{slug}/schedules/{id}/logs/ |
List execution logs |
GET |
/api/v1/orgs/{slug}/schedules/{id}/logs/{log_id}/ |
Get a specific log entry |
Templates¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/templates/ |
List prompt templates |
POST |
/api/v1/orgs/{slug}/templates/ |
Create a template |
GET |
/api/v1/orgs/{slug}/templates/{name}/ |
Get template by name |
PATCH |
/api/v1/orgs/{slug}/templates/{id}/ |
Update a template |
DELETE |
/api/v1/orgs/{slug}/templates/{id}/ |
Delete a template |
Ticket templates¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/ticket-templates/ |
List ticket templates |
POST |
/api/v1/orgs/{slug}/ticket-templates/ |
Create a ticket template |
GET |
/api/v1/orgs/{slug}/ticket-templates/{id}/ |
Get template details |
PATCH |
/api/v1/orgs/{slug}/ticket-templates/{id}/ |
Update a template |
DELETE |
/api/v1/orgs/{slug}/ticket-templates/{id}/ |
Delete a template |
Organization members¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/members/ |
List members |
POST |
/api/v1/orgs/{slug}/members/invite/ |
Invite a member |
GET |
/api/v1/orgs/{slug}/members/{id}/ |
Get member details |
PATCH |
/api/v1/orgs/{slug}/members/{id}/ |
Update member role |
DELETE |
/api/v1/orgs/{slug}/members/{id}/ |
Remove a member |
Project members¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/members/ |
List project members |
POST |
/api/v1/projects/{key}/members/ |
Add a member |
PATCH |
/api/v1/projects/{key}/members/{id}/ |
Update member role |
DELETE |
/api/v1/projects/{key}/members/{id}/ |
Remove a member |
Teams¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/teams/ |
List teams |
POST |
/api/v1/projects/{key}/teams/ |
Create a team |
GET |
/api/v1/projects/{key}/teams/{id}/ |
Get team details |
PATCH |
/api/v1/projects/{key}/teams/{id}/ |
Update a team |
DELETE |
/api/v1/projects/{key}/teams/{id}/ |
Delete a team |
POST |
/api/v1/projects/{key}/teams/{id}/add-member/ |
Add a team member |
POST |
/api/v1/projects/{key}/teams/{id}/remove-member/ |
Remove a team member |
Ideas¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/ideas/ |
List ideas |
POST |
/api/v1/projects/{key}/ideas/ |
Create an idea |
GET |
/api/v1/projects/{key}/ideas/{id}/ |
Get idea details |
PATCH |
/api/v1/projects/{key}/ideas/{id}/ |
Update an idea |
DELETE |
/api/v1/projects/{key}/ideas/{id}/ |
Delete an idea |
Knowledge entries¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/knowledge/ |
List knowledge entries |
POST |
/api/v1/projects/{key}/knowledge/ |
Create an entry |
GET |
/api/v1/projects/{key}/knowledge/{id}/ |
Get entry details |
PATCH |
/api/v1/projects/{key}/knowledge/{id}/ |
Update an entry |
DELETE |
/api/v1/projects/{key}/knowledge/{id}/ |
Delete an entry |
Connections (project resources)¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/connections/ |
List connections |
POST |
/api/v1/projects/{key}/connections/ |
Create a connection |
GET |
/api/v1/projects/{key}/connections/{id}/ |
Get connection details |
PATCH |
/api/v1/projects/{key}/connections/{id}/ |
Update a connection |
DELETE |
/api/v1/projects/{key}/connections/{id}/ |
Delete a connection |
Dependencies¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/dependencies/ |
List ticket dependencies |
POST |
/api/v1/projects/{key}/dependencies/ |
Create a dependency |
GET |
/api/v1/projects/{key}/dependencies/{id}/ |
Get dependency details |
PATCH |
/api/v1/projects/{key}/dependencies/{id}/ |
Update a dependency |
DELETE |
/api/v1/projects/{key}/dependencies/{id}/ |
Delete a dependency |
Design systems¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/design-systems/ |
List design systems |
POST |
/api/v1/projects/{key}/design-systems/ |
Create a design system |
GET |
/api/v1/projects/{key}/design-systems/{id}/ |
Get design system details |
PATCH |
/api/v1/projects/{key}/design-systems/{id}/ |
Update a design system |
DELETE |
/api/v1/projects/{key}/design-systems/{id}/ |
Delete a design system |
Notifications¶
| Method |
Path |
Description |
GET |
/api/v1/notifications/ |
List notifications |
GET |
/api/v1/notifications/unread/ |
Get unread count |
POST |
/api/v1/notifications/read/ |
Mark notifications as read |
Notification preferences¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/notification-preferences/ |
Get notification preferences |
PATCH |
/api/v1/orgs/{slug}/notification-preferences/{event_type}/ |
Update preferences for an event type |
POST |
/api/v1/orgs/{slug}/notification-preferences/bulk/ |
Bulk update preferences |
Brand voice¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/brand-voice/ |
Get brand voice settings |
PATCH |
/api/v1/orgs/{slug}/brand-voice/ |
Update brand voice |
GET |
/api/v1/orgs/{slug}/brand-voice/guidelines/ |
Get voice guidelines |
GET |
/api/v1/orgs/{slug}/brand-voice/user/ |
Get user voice profile |
PATCH |
/api/v1/orgs/{slug}/brand-voice/user/update/ |
Update user voice profile |
Skills (org-level)¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/skills/ |
List organization skills |
POST |
/api/v1/orgs/{slug}/skills/ |
Create a skill |
GET |
/api/v1/orgs/{slug}/skills/{id}/ |
Get skill details |
PATCH |
/api/v1/orgs/{slug}/skills/{id}/ |
Update a skill |
DELETE |
/api/v1/orgs/{slug}/skills/{id}/ |
Delete a skill |
Intake¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/intake/ |
List intake items |
GET |
/api/v1/orgs/{slug}/intake/{id}/ |
Get intake item details |
POST |
/api/v1/orgs/{slug}/intake/{id}/triage/ |
Triage an intake item |
Improvements¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/improvements/ |
List improvements |
GET |
/api/v1/orgs/{slug}/improvements/{id}/ |
Get improvement details |
POST |
/api/v1/orgs/{slug}/improvements/{id}/review/ |
Review an improvement |
Marketplace¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/marketplace/agents/ |
Browse agent marketplace |
GET |
/api/v1/orgs/{slug}/marketplace/agents/{id}/ |
Get marketplace agent details |
POST |
/api/v1/orgs/{slug}/marketplace/agents/{id}/install/ |
Install an agent |
POST |
/api/v1/orgs/{slug}/marketplace/agents/{id}/rate/ |
Rate an agent |
GET |
/api/v1/orgs/{slug}/marketplace/skills/ |
Browse skill marketplace |
GET |
/api/v1/orgs/{slug}/marketplace/skills/{id}/ |
Get marketplace skill details |
POST |
/api/v1/orgs/{slug}/marketplace/skills/{id}/install/ |
Install a skill |
POST |
/api/v1/orgs/{slug}/marketplace/skills/{id}/rate/ |
Rate a skill |
Slack channels¶
| Method |
Path |
Description |
GET |
/api/v1/orgs/{slug}/slack-channels/ |
List connected Slack channels |
GET |
/api/v1/orgs/{slug}/slack-channels/{id}/ |
Get channel details |
PATCH |
/api/v1/orgs/{slug}/slack-channels/{id}/ |
Update channel settings |
Audit logs¶
| Method |
Path |
Description |
GET |
/api/v1/projects/{key}/audit-logs/ |
List project audit logs |
GET |
/api/v1/orgs/{slug}/audit-logs/ |
List organization audit logs |
Billing¶
| Method |
Path |
Description |
GET |
/api/v1/plans/ |
List available plans |
GET |
/api/v1/plans/{id}/ |
Get plan details |
GET |
/api/v1/orgs/{slug}/billing/usage/ |
Get usage statistics |
GET |
/api/v1/orgs/{slug}/billing/invoices/ |
List invoices |
GET |
/api/v1/orgs/{slug}/billing/credits/ |
Get credit balance |
GET |
/api/v1/orgs/{slug}/billing/payment-methods/ |
List payment methods |
Virtual machines¶
| Method |
Path |
Description |
GET |
/api/v1/vms/ |
List VMs |
GET |
/api/v1/vms/{name}/ |
Get VM details |
POST |
/api/v1/vms/{name}/start/ |
Start a VM |
POST |
/api/v1/vms/{name}/stop/ |
Stop a VM |
POST |
/api/v1/vms/{name}/destroy/ |
Destroy a VM |
For config-as-code VM management, see the CLI and JuhJuh File docs.
Vault¶
| Method |
Path |
Description |
GET |
/api/v1/vaults/ |
List vaults |
GET |
/api/v1/vaults/{name}/ |
Get vault details |
GET |
/api/v1/vaults/{name}/entries/ |
List vault entries |
GET |
/api/v1/vaults/{name}/entries/{key}/ |
Get a secret value |
POST |
/api/v1/vaults/{name}/entries/{key}/ |
Set a secret |
DELETE |
/api/v1/vaults/{name}/entries/{key}/ |
Delete a secret |
POST |
/api/v1/vaults/{name}/import/ |
Bulk import secrets |
POST |
/api/v1/vaults/{name}/export/ |
Export all secrets |
POST |
/api/v1/vaults/{name}/diff/ |
Compare vault against last deployed snapshot |
Deployments¶
| Method |
Path |
Description |
GET |
/api/v1/deployments/ |
List deployments |
GET |
/api/v1/deployments/{id}/ |
Get deployment details |
POST |
/api/v1/deployments/{vm_name}/rollback/ |
Rollback a deployment |
POST |
/api/v1/deployments/{vm_name}/destroy/ |
Destroy deployment history for a VM |
API keys¶
| Method |
Path |
Description |
GET |
/api/v1/api-keys/ |
List your API keys |
POST |
/api/v1/api-keys/ |
Create an API key |
POST |
/api/v1/api-keys/{id}/ |
Revoke an API key |
Gateway (natural language)¶
| Method |
Path |
Description |
POST |
/api/v1/gateway/ |
Send a natural language request |
The gateway accepts a plain text instruction and routes it to the appropriate action. It is the same interface that powers Ask JuhJuh.
CLI authentication¶
These endpoints are used by the CLI during login. You do not need to call them directly.
| Method |
Path |
Description |
POST |
/api/v1/auth/cli-token/ |
Exchange credentials for an API key |
GET |
/api/v1/auth/me/ |
Get current user and org memberships |
GET |
/api/v1/auth/orgs/ |
List organizations |
Error codes¶
| Status |
Meaning |
400 |
Bad request. Check the request body for validation errors. |
401 |
Not authenticated. Include a valid API key or session cookie. |
403 |
Permission denied. Your role does not allow this action. See Permissions. |
404 |
Resource not found. Verify the ID, slug, or key in the URL. |
429 |
Rate limited. Wait for the duration in the Retry-After header. |
- Permissions for role-based access control and feature gating
- Agents for creating and managing AI agents
- Tickets for the ticket lifecycle and execution pipeline
- CLI for managing JuhJuh from your terminal
- Pages for the knowledge base API
- Billing for subscription plans and usage limits