MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your API Key by clicking your name in the main site's header and looking under My Info.

AI Agents

Chat

requires authentication

Send a message to an AI agent chat session. If no chat_id is provided, a new session will be created automatically.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/agents/chat'
payload = {
    "workspace_id": 1,
    "message": "\"Can you help me with this code?\"",
    "ai_model": "\"gpt-4\"",
    "entities": "\"[{\\\"id\\\":1,\\\"value\\\":\\\"12345\\\",\\\"description\\\":\\\"John Doe\\\"}]\""
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/agents/chat"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "workspace_id": 1,
    "message": "\"Can you help me with this code?\"",
    "ai_model": "\"gpt-4\"",
    "entities": "\"[{\\\"id\\\":1,\\\"value\\\":\\\"12345\\\",\\\"description\\\":\\\"John Doe\\\"}]\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/agents/chat';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'workspace_id' => 1,
            'message' => '"Can you help me with this code?"',
            'ai_model' => '"gpt-4"',
            'entities' => '"[{\\"id\\":1,\\"value\\":\\"12345\\",\\"description\\":\\"John Doe\\"}]"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/agents/chat" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"workspace_id\": 1,
    \"message\": \"\\\"Can you help me with this code?\\\"\",
    \"ai_model\": \"\\\"gpt-4\\\"\",
    \"entities\": \"\\\"[{\\\\\\\"id\\\\\\\":1,\\\\\\\"value\\\\\\\":\\\\\\\"12345\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"John Doe\\\\\\\"}]\\\"\"
}"

Example response (200):


{
    "session": {
        "id": 123,
        "unique_session_id": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Project Discussion",
        "ai_model": "claude-sonnet-4"
    },
    "messages": [
        {
            "id": 456,
            "message_uuid": "550e8400-e29b-41d4-a716-446655440001",
            "ai_model": "claude-sonnet-4",
            "message": "Hello, how can I help?",
            "message_original": null,
            "branch": 1,
            "created_on": "2025-10-31 14:30:00",
            "user": {
                "userid": 42,
                "name": "John Doe"
            },
            "role": {
                "id": 1,
                "type": "user"
            },
            "is_system_message": 0,
            "is_hidden": 0,
            "token_count": 57
        }
    ],
    "tools": [
        {
            "id": 7,
            "tool_name": "get_code",
            "mcp_server": "gitlab"
        }
    ]
}
 

Request      

POST v1.0/agents/chat

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

workspace_id   integer   

The workspace ID. Must be a workspace the user is a member of. Example: 1

chat_id   integer  optional  

The chat session ID. Use 0 or omit to create a new session.

agent_id   integer  optional  

The AI agent template ID to use. Must be active and available in the workspace. Defaults to 0 (no agent).

task_id   string  optional  

Optional task ID in format "workspaceId-todoId". Associates chat with task and uses task's default agent if no agent specified.

make_sub_task   integer  optional  

Optional flag to create subtask. If 1, creates a subtask and attaches chat session to it. Only used if task_id is provided and creating a new chat session. Ignored for existing chat sessions. Defaults to 0.

chat_session_name   string  optional  

Optional custom name for new chat sessions. Defaults to 'New Chat'. Max 255 characters. Only used when creating new sessions.

chat_session_uuid   string  optional  

Optional custom UUID for new chat sessions. Defaults to auto-generated UUID v4. Must be valid UUID format. Only used when creating new sessions.

message   string   

The message to send. Example: "Can you help me with this code?"

message_original   string  optional  

Optional original unprocessed message.

role_id   integer  optional  

The message role. Must be 1 (user), 2 (assistant), or 9 (system). Defaults to 1.

message_token_count   integer  optional  

Optional token count for the message. Defaults to 0.

ai_model   string  optional  

Optional AI model name to use. Falls back to agent/task default or system default. Example: "gpt-4"

is_deleted   integer  optional  

Optional flag to mark message as deleted. Must be 0 or 1. Defaults to 0.

is_system_message   integer  optional  

Optional flag to mark message as system message. Must be 0 or 1. Defaults to 0.

is_hidden   integer  optional  

Optional flag to mark message as hidden. Must be 0 or 1. Defaults to 0.

branch   integer  optional  

Optional branch identifier for conversation trees. Must be positive integer. Defaults to 1.

system_prompt   mixed  optional  

Optional system prompt data (string, array, or object). Inserted as system message before user message. Will be JSON-encoded if not a string. Only inserted for new chat sessions.

entities   string  optional  

Optional JSON array of entity mappings. Each entity must have 'id' (entity type), 'value' (external ID), and optional 'description'. Only processed for new chat sessions. Example: "[{\"id\":1,\"value\":\"12345\",\"description\":\"John Doe\"}]"

Get Messages

requires authentication

Retrieve all messages from an existing AI agent chat session. User must have access to the workspace and the chat session. Private chats can only be accessed by their creator.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/agents/chat/messages'
params = {
  'chat_id': '',
  'workspace_id': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/agents/chat/messages"
);

const params = {
    "chat_id": "",
    "workspace_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/agents/chat/messages';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'chat_id' => '',
            'workspace_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/agents/chat/messages?chat_id=&workspace_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "messages": [
        {
            "id": 456,
            "message_uuid": "550e8400-e29b-41d4-a716-446655440001",
            "ai_model": "claude-sonnet-4",
            "message": "Hello, how can I help?",
            "message_original": null,
            "branch": 1,
            "created_on": "2025-10-31 14:30:00",
            "user": {
                "userid": 42,
                "name": "John Doe"
            },
            "role": {
                "id": 1,
                "type": "user"
            },
            "is_system_message": 0,
            "is_hidden": 0,
            "token_count": 57
        }
    ]
}
 

Request      

GET v1.0/agents/chat/messages

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

chat_id   integer   

The chat session ID.

workspace_id   integer   

The workspace ID.

AI Chats

Version 1

requires authentication

Creates a model response for the given chat conversation.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/chats/completions'
payload = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "model": "gpt-4o-mini",
    "frequency_penalty": 0,
    "logprobs": true,
    "top_logprobs": 15,
    "max_tokens": 4000,
    "n": 1,
    "presence_penalty": 0,
    "seed": 10,
    "stream": false,
    "temperature": 0,
    "top_p": 0,
    "system_functions": [
        "get_code"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Connection': 'keep-alive',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/chats/completions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Connection": "keep-alive",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "model": "gpt-4o-mini",
    "frequency_penalty": 0,
    "logprobs": true,
    "top_logprobs": 15,
    "max_tokens": 4000,
    "n": 1,
    "presence_penalty": 0,
    "seed": 10,
    "stream": false,
    "temperature": 0,
    "top_p": 0,
    "system_functions": [
        "get_code"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/chats/completions';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Connection' => 'keep-alive',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'messages' => [
                [
                    'role' => 'user',
                    'content' => 'Please reply "OK"',
                ],
            ],
            'model' => 'gpt-4o-mini',
            'frequency_penalty' => 0,
            'logprobs' => true,
            'top_logprobs' => 15,
            'max_tokens' => 4000,
            'n' => 1,
            'presence_penalty' => 0,
            'seed' => 10,
            'stream' => false,
            'temperature' => 0.0,
            'top_p' => 0.0,
            'system_functions' => [
                'get_code',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/chats/completions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Connection: keep-alive" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"messages\": [
        {
            \"role\": \"user\",
            \"content\": \"Please reply \\\"OK\\\"\"
        }
    ],
    \"model\": \"gpt-4o-mini\",
    \"frequency_penalty\": 0,
    \"logprobs\": true,
    \"top_logprobs\": 15,
    \"max_tokens\": 4000,
    \"n\": 1,
    \"presence_penalty\": 0,
    \"seed\": 10,
    \"stream\": false,
    \"temperature\": 0,
    \"top_p\": 0,
    \"system_functions\": [
        \"get_code\"
    ]
}"

Example response (200):


{
   "id": "chatcmpl-123",
   "object": "chat.completion",
   "created": 1677652288,
   "model": "gpt-3.5-turbo-0125",
   "system_fingerprint": "fp_44709d6fcb",
   "choices": [{
       "index": 0,
       "message": {
           "role": "assistant",
            "content": "\n\nThis image shows a wooden boardwalk extending through a lush green marshland.",
        },
        "logprobs": null,
        "finish_reason": "stop"
    }],
    "usage": {
        "prompt_tokens": 9,
        "completion_tokens": 12,
        "total_tokens": 21
    }
}
 

Request      

POST v1.0/chats/completions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Connection      

Example: keep-alive

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

messages   object[]   
role   string   

The role of the messages author, in this case user. Example: user

Must be one of:
  • system
  • user
  • assistant
  • tool
content   string   

The contents of the user message. Example: Please reply "OK"

model   string   

ID of the model to use. Example: gpt-4o-mini

Must be one of:
  • gpt-4o
  • gpt-4o-mini
  • gpt-4.1
  • gpt-4.1-nano
  • gpt-4.1-mini
  • o1
  • o1-mini
  • o3
  • o3-mini
  • o4-mini
  • gpt-5
  • gpt-5-chat-latest
  • gpt-5-mini
  • gpt-5-nano
frequency_penalty   integer  optional  

"frequency_penalty" that influences the probability of output tokens based on their frequency of occurrence in the generated output. Must be at least -2. Must not be greater than 2. Example: 0

logit_bias   string  optional  

Modify the likelihood of specified tokens appearing in the completion. Accepts a JSON object that maps tokens (specified by their token ID in the tokenizer) to an associated bias value from -100 to 100. Mathematically, the bias is added to the logits generated by the model prior to sampling. The exact effect will vary per model, but values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token.

type   integer  optional  

Example: 2

logprobs   boolean  optional  

Whether to return log probabilities of the output tokens or not. If true, returns the log probabilities of each output token returned in the content of message. Example: true

top_logprobs   integer  optional  

An integer between 0 and 20 specifying the number of most likely tokens to return at each token position, each with an associated log probability. logprobs must be set to true if this parameter is used. This field is required when logprobs is true. Must be at least 0. Must not be greater than 20. Example: 15

max_tokens   integer  optional  

The maximum number of tokens that can be generated in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length. Example: 4000

n   integer  optional  

How many chat completion choices to generate for each input message. Note that you will be charged based on the number of generated tokens across all of the choices. Keep n as 1 to minimize costs. Must be at least 1. Must not be greater than 128. Example: 1

presence_penalty   integer  optional  

"presence_penalty" is parameter that used to encourage the model to include a diverse range of tokens in the generated text.It is a value that is subtracted from the log-probability of a token each time it is generated.A higher presence_penalty value will result in the model being more likely to generate tokens that have not yet been included in the generated text. Must be at least -2. Must not be greater than 2. Example: 0

response_format   string  optional  

An object specifying the format that the model must output. Compatible with GPT-4 Turbo and all GPT-3.5 Turbo models newer than gpt-3.5-turbo-1106. Setting to { "type": "json_object" } enables JSON mode, which guarantees the message the model generates is valid JSON. Important: when using JSON mode, you must also instruct the model to produce JSON yourself via a system or user message. Without this, the model may generate an unending stream of whitespace until the generation reaches the token limit, resulting in a long-running and seemingly "stuck" request. Also note that the message content may be partially cut off if finish_reason="length", which indicates the generation exceeded max_tokens or the conversation exceeded the max context length.

type   string  optional  

Example: text

Must be one of:
  • text
  • json_object
seed   integer  optional  

This feature is in Beta. If specified, our system will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend. Must be at least -9223372036854775808. Must not be greater than 9223372036854775807. Example: 10

stop   object  optional  

Up to 4 sequences where the API will stop generating further tokens. Must not have more than 4 items.

stream   boolean  optional  

Example: false

temperature   number  optional  

"Temperature" is a setting that controls randomness when picking words during text creation.Low values of temperature make the text more predictable and consistent, while high values let more freedom and creativity into the mix, but can also make things less consistent. Must be at least 0. Must not be greater than 2. Example: 0

top_p   number  optional  

"top_p" or nucleus sampling is a setting that decides how many possible words to consider.A high "top_p" value means the model looks at more possible words, even the less likely ones, which makes the generated text more diverse. Must be at least 0. Must not be greater than 1. Example: 0

tools   object  optional  

A list of tools the model may call. Currently, only functions are supported as a tool. Use this to provide a list of functions the model may generate JSON inputs for. A max of 128 functions are supported.

tool_choice   string  optional  

Controls which (if any) tool is called by the model. none means the model will not call any tool and instead generates a message. auto means the model can pick between generating a message or calling one or more tools. required means the model must call one or more tools. Specifying a particular tool via {"type": "function", "function": {"name": "my_function"}} forces the model to call that tool. none is the default when no tools are present. auto is the default if tools are present.

system_functions   string[]  optional  

These are custom process commands that the Completions endpoint can execute. They are useful for running multiple operations, such as retrieving and reading files from a task in one command.

Must be one of:
  • extract_text_from_task_attachments
  • extract_text_from_url
  • transcribe_task_files

Version 2

requires authentication

Creates a model response for the given chat conversation by using Prism.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/chats/prism/completions'
payload = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "model": "gpt-4o-mini",
    "temperature": 0,
    "chatid": 0,
    "dj_ai_version": 5,
    "tool_ids": [
        9
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Connection': 'keep-alive',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/chats/prism/completions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Connection": "keep-alive",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "model": "gpt-4o-mini",
    "temperature": 0,
    "chatid": 0,
    "dj_ai_version": 5,
    "tool_ids": [
        9
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/chats/prism/completions';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Connection' => 'keep-alive',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'messages' => [
                [
                    'role' => 'user',
                    'content' => 'Please reply "OK"',
                ],
            ],
            'model' => 'gpt-4o-mini',
            'temperature' => 0.0,
            'chatid' => 0,
            'dj_ai_version' => 5,
            'tool_ids' => [
                9,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/chats/prism/completions" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Connection: keep-alive" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"messages\": [
        {
            \"role\": \"user\",
            \"content\": \"Please reply \\\"OK\\\"\"
        }
    ],
    \"model\": \"gpt-4o-mini\",
    \"temperature\": 0,
    \"chatid\": 0,
    \"dj_ai_version\": 5,
    \"tool_ids\": [
        9
    ]
}"

Example response (200):


{
   "text": "This is a response from the model.",
}
 

Request      

POST v1.0/chats/prism/completions

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Connection      

Example: keep-alive

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

messages   object[]   
role   string   

The role of the messages author, in this case user. Example: user

Must be one of:
  • system
  • user
  • assistant
content   string   

The contents of the user message. Example: Please reply "OK"

model   string   

ID of the model to use. Example: gpt-4o-mini

Must be one of:
  • gpt-4o
  • gpt-4o-mini
  • gpt-4.1
  • gpt-4.1-nano
  • gpt-4.1-mini
  • o1
  • o1-mini
  • o3
  • o3-mini
  • o4-mini
  • gpt-5
  • gpt-5-chat-latest
  • gpt-5-mini
  • gpt-5-nano
  • claude-3-5-sonnet-latest
  • claude-3-5-haiku-latest
  • claude-3-opus-latest
  • claude-3-sonnet-20240229
  • claude-3-haiku-20240307
  • claude-3-7-sonnet-latest
  • claude-sonnet-4-0
  • claude-sonnet-4-5
  • claude-opus-4-0
  • claude-opus-4-1
temperature   number  optional  

"Temperature" is a setting that controls randomness when picking words during text creation.Low values of temperature make the text more predictable and consistent, while high values let more freedom and creativity into the mix, but can also make things less consistent. Must be at least 0. Must not be greater than 2. Example: 0

chatid   integer  optional  

ID of the chat group or session. Example: 0

dj_ai_version   integer  optional  

The AI version using on Devjock. Example: 5

tool_ids   integer[]  optional  

AI Prompts

Create

requires authentication

Create a new AI prompt with the provided information. All required fields must be present. The prompt must be assigned to at least one workspace where the user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/prompts/create'
payload = {
    "name": null,
    "description": null,
    "prompt": null,
    "workspace_ids": null
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/prompts/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": null,
    "description": null,
    "prompt": null,
    "workspace_ids": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/prompts/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => null,
            'description' => null,
            'prompt' => null,
            'workspace_ids' => null,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/prompts/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": null,
    \"description\": null,
    \"prompt\": null,
    \"workspace_ids\": null
}"

Example response (201):


{
    "create": "success",
    "prompt_id": 42
}
 

Request      

POST v1.0/prompts/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

The name/title of the prompt.

description   string   

The description of what this prompt does.

prompt   string   

The actual prompt text/template.

workspace_ids   string   

A single id or comma-separated workspace IDs to assign this prompt to. User must be a member of all specified workspaces.

ai_prompt_category_id   integer  optional  

The category ID for this prompt. Must be an active category.

type_id   integer  optional  

The type ID for this prompt. Must be an active type.

sort_order   integer  optional  

The sort order for displaying this prompt.

Read

requires authentication

Will return information about a specific AI prompt. The prompt must be associated with a workspace where the authenticated user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/prompts/get'
params = {
  'prompt_id': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/prompts/get"
);

const params = {
    "prompt_id": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/prompts/get';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'prompt_id' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/prompts/get?prompt_id=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "id": 1,
    "category_id": 5,
    "category_name": "CODE",
    "name": "Code Review Prompt",
    "description": "Reviews code for best practices",
    "prompt": "Please review the following code...",
    "type_id": 1,
    "type": "default",
    "active": true,
    "workspace_ids": [
        1,
        2
    ]
}
 

Request      

GET v1.0/prompts/get

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

prompt_id   integer   

The prompt ID to retrieve. Example: 1

List

requires authentication

Will return a list of AI prompts that are associated with workspaces where the authenticated user is a team member. Only prompts with active categories are returned.

Active/Inactive Filtering: By default only active prompts are returned. To include inactive prompts, include the show_inactive query parameter.

Workspace IDs Field: The workspace_ids field is omitted from the response when filtering by workspace_id, as the workspace context is already known from your filter. To see all workspace associations for a prompt, query without the workspace_id filter.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/prompts/list'
params = {
  'page': '1',
  'workspace_id': '"1,2,3"',
  'category_id': '"5,3"',
  'type_id': '"1,2"',
  'show_inactive': '"true"',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/prompts/list"
);

const params = {
    "page": "1",
    "workspace_id": ""1,2,3"",
    "category_id": ""5,3"",
    "type_id": ""1,2"",
    "show_inactive": ""true"",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/prompts/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'workspace_id' => '"1,2,3"',
            'category_id' => '"5,3"',
            'type_id' => '"1,2"',
            'show_inactive' => '"true"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/prompts/list?page=1&workspace_id=%221%2C2%2C3%22&category_id=%225%2C3%22&type_id=%221%2C2%22&show_inactive=%22true%22" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_prompts": 45,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_prompts_returned": 45,
    "prompts": [
        {
            "id": 1,
            "name": "Code Review Prompt",
            "active": true,
            "type": {
                "id": 1,
                "name": "Review"
            },
            "category": {
                "id": 1,
                "name": "Development"
            },
            "workspace_ids": [
                1,
                2,
                3
            ]
        }
    ]
}
 

Request      

GET v1.0/prompts/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Example: 1

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids. Example: "1,2,3"

category_id   string  optional  

A single category id or a comma separated list of category ids to filter by. Example: "5,3"

type_id   string  optional  

A single type id or a comma separated list of type ids to filter by. Example: "1,2"

show_inactive   string  optional  

Will return prompts marked inactive if included. Example: "true"

sort_by   string  optional  

Optional. Sort results by 'id', 'name', or 'default'. Defaults to 'default'.

sort_dir   string  optional  

Optional. Sort direction 'asc', 'desc', or 'default'. Defaults to 'default'.

Update

requires authentication

Update an AI prompt with new information. At least one Body Parameter must be present. The current state of the prompt is automatically archived to the change log before updating.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/prompts/update'
payload = {
    "type_id": 1,
    "name": "\"Code Review Assistant\"",
    "description": "\"Reviews code for best practices and security issues\"",
    "workspace_ids": "\"1,2,42\""
}
params = {
  'prompt_id': '5',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/prompts/update"
);

const params = {
    "prompt_id": "5",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "type_id": 1,
    "name": "\"Code Review Assistant\"",
    "description": "\"Reviews code for best practices and security issues\"",
    "workspace_ids": "\"1,2,42\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/prompts/update';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'prompt_id' => '5',
        ],
        'json' => [
            'type_id' => 1,
            'name' => '"Code Review Assistant"',
            'description' => '"Reviews code for best practices and security issues"',
            'workspace_ids' => '"1,2,42"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/prompts/update?prompt_id=5" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type_id\": 1,
    \"name\": \"\\\"Code Review Assistant\\\"\",
    \"description\": \"\\\"Reviews code for best practices and security issues\\\"\",
    \"workspace_ids\": \"\\\"1,2,42\\\"\"
}"

Example response (200):


{
    "update": "success"
}
 

Example response (400):


{
    "error": "Invalid prompt_id"
}
 

Request      

POST v1.0/prompts/update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

prompt_id   integer   

The prompt ID to update. Example: 5

Body Parameters

ai_prompt_category_id   integer  optional  

The category ID for this prompt. Must be an active category.

type_id   integer  optional  

The type ID for this prompt. Must be an active type. Example: 1

name   string  optional  

The name/title of the prompt. Example: "Code Review Assistant"

description   string  optional  

The description of what this prompt does. Example: "Reviews code for best practices and security issues"

prompt   string  optional  

The actual prompt text/template.

workspace_ids   string  optional  

A single id or comma-separated workspace IDs to assign this prompt to. Replaces all existing workspace assignments. Example: "1,2,42"

Delete

requires authentication

Permanently deletes an AI prompt that the user created. The prompt data is archived to a table before deletion. Users can only delete prompts they created themselves and must have access to a workspace using the prompt.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/prompts/delete'
params = {
  'prompt_id': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/prompts/delete"
);

const params = {
    "prompt_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/prompts/delete';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'prompt_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/prompts/delete?prompt_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "delete": "success"
}
 

Example response (400):


{
    "error": "Access denied: You can only delete prompts you created"
}
 

Request      

POST v1.0/prompts/delete

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

prompt_id   integer   

The prompt ID to delete.

Documents

Extract Text

requires authentication

Takes a collection of PDF documents (other file types might be added in the future) and converts them into text.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/documents/extract-text'
payload = {
    "documents": [
        "ullam"
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/documents/extract-text"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "documents": [
        "ullam"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/documents/extract-text';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'documents' => [
                'ullam',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/documents/extract-text" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"documents\": [
        \"ullam\"
    ]
}"

Example response (200):


{
    "documents": [
        {
            "document_name": "some-file.pdf"
            "document_text": "some text from PDF ..."
        }
    ]
}
 

Request      

POST v1.0/documents/extract-text

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

documents   string[]   

Groups

Create

requires authentication

Create a new epic with the provided information. All required fields must be present. The epic must be assigned to a workspace where the user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/groups/create'
payload = {
    "name": null,
    "workspace_id": null
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/groups/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": null,
    "workspace_id": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/groups/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => null,
            'workspace_id' => null,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/groups/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": null,
    \"workspace_id\": null
}"

Example response (201):


{
    "create": "success",
    "group_id": 42
}
 

Request      

POST v1.0/groups/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

The name/title of the epic.

description   string  optional  

The description of the epic.

workspace_id   integer   

The workspace ID to assign this epic to. User must be a member.

active   integer  optional  

Active status (0 or 1). Defaults to 1.

start_date   string  optional  

Epic start date in YYYY-MM-DD format.

end_date   string  optional  

Epic end date in YYYY-MM-DD format.

ai_summary   string  optional  

AI-generated summary of the epic.

Read

requires authentication

Will return information about a specific epic/group. The group must be assigned to a workspace where the authenticated user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/groups/get'
params = {
  'group_id': '123',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/groups/get"
);

const params = {
    "group_id": "123",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/groups/get';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'group_id' => '123',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/groups/get?group_id=123" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "id": 123,
    "active": true,
    "name": "Backend Infrastructure",
    "description": "Core backend systems and infrastructure improvements",
    "start_date": "2025-01-01",
    "end_date": "2025-03-31",
    "created_by": {
        "userid": 46905,
        "user": "Brian Smith"
    },
    "ai_summary": "Focus on API improvements and database optimization",
    "ai_summary_lastupdate": "2025-01-15T10:30:00.000000Z",
    "workspace_ids": [
        1,
        2,
        5
    ]
}
 

Request      

GET v1.0/groups/get

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

group_id   integer   

The group ID to retrieve. Example: 123

List

requires authentication

Will return a list of goals.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/groups/list'
params = {
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/groups/list"
);

const params = {
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/groups/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/groups/list?page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_groups": 2,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_groups_returned": 2,
    "groups": [
        {
            "id": 123,
            "name": "Backend Infrastructure",
            "description": "Core backend systems and infrastructure improvements",
            "ai_summary": null,
            "ai_summary_lastupdate": null
        },
        {
            "id": 124,
            "name": "User Interface Redesign",
            "description": "Modern UI/UX improvements and responsive design",
            "ai_summary": null,
            "ai_summary_lastupdate": null
        }
    ]
}
 

Request      

GET v1.0/groups/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Example: 1

group_id   string  optional  

A single group id or a comma separated list of group ids

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids

assigned_to   string  optional  

A single user id or a comma separated list of user ids

lifecycle_id   string  optional  

A single lifecycle id or a comma separated list of lifecycle ids

status_id   string  optional  

A single status id or a comma separated list of status ids

sprint_id   string  optional  

A single sprint id or a comma separated list of sprint ids

tag_id   string  optional  

A single tag id or a comma separated list of tag ids

sort_by   string  optional  

Optional. Sort results by 'id' or 'name'. Defaults to 'id'.

sort_dir   string  optional  

Optional. Sort direction 'asc' or 'desc'. Defaults to 'desc'.

Update

requires authentication

Update an group with new information. At least one Body Parameter must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/groups/update'
params = {
  'group_id': '54',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/groups/update"
);

const params = {
    "group_id": "54",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/groups/update';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'group_id' => '54',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/groups/update?group_id=54" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \

Example response (200):


{
    "update": "success"
}
 

Example response (400):


{
    "error": "Invalid group_id"
}
 

Request      

POST v1.0/groups/update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

group_id   integer   

The group ID to update. Example: 54

Body Parameters

name   string  optional  

The name/title of the group.

description   string  optional  

The description of the group.

workspace_ids   string  optional  

A single id or comma-separated workspace IDs to assign this group to. Replaces all existing workspace assignments.

active   integer  optional  

Active status (0 or 1).

start_date   string  optional  

Group start date in YYYY-MM-DD format.

end_date   string  optional  

Group end date in YYYY-MM-DD format.

ai_summary   string  optional  

AI-generated summary of the group.

Delete

requires authentication

Permanently deletes a group that the user created. The group data is archived before deletion. Users can only delete groups they created and that have no tasks associated. Groups with tasks should be marked inactive instead.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/groups/delete'
params = {
  'group_id': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/groups/delete"
);

const params = {
    "group_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/groups/delete';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'group_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/groups/delete?group_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "delete": "success"
}
 

Example response (400):


{
    "error": "Access denied: You can only delete groups you created"
}
 

Example response (400):


{
    "error": "Cannot be deleted because the group has tasks. Please update the group to inactive instead."
}
 

Request      

POST v1.0/groups/delete

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

group_id   integer   

The group ID to delete.

Project Assistants

List

requires authentication

Retrieve a paginated list of assistant-related project/tasks from the user's workspaces. Returns tasks where gtd_status_id = 19 and projects_categoriesID NOT IN (9, 24).

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/resources/assistants'
params = {
  'page': '1',
  'workspace_id': '1 or 1,2,3',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/resources/assistants"
);

const params = {
    "page": "1",
    "workspace_id": "1 or 1,2,3",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/resources/assistants';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'workspace_id' => '1 or 1,2,3',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/resources/assistants?page=1&workspace_id=1+or+1%2C2%2C3" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_tasks": 9,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_tasks_returned": 9,
    "tasks": [
        {
            "task_id": "1-39674",
            "id": 41188,
            "workspace_id": 1,
            "todo_id": 39674,
            "title": "Due Diligence Analyst"
        },
        {
            "task_id": "1-39675",
            "id": 41189,
            "workspace_id": 1,
            "todo_id": 39675,
            "title": "Content Strategy Assistant"
        }
    ]
}
 

Request      

GET v1.0/resources/assistants

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Page number for pagination. Example: 1

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids. Example: 1 or 1,2,3

Project Attachments

Read

requires authentication

Get the file contents of a project/task attachment.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/1-123456/get_file/12345'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/1-123456/get_file/12345"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/1-123456/get_file/12345';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/tasks/1-123456/get_file/12345" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "id": "123456",
    "contents": "contents of the file"
}
 

Request      

GET v1.0/tasks/{taskId}/get_file/{fileId}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

taskId   string   

The Devjock task ID. Example: 1-123456

fileId   number   

The attached file id to update. Example: 12345

Create

requires authentication

Creates a single file attachment for a project/task. Only supports text-based files (txt and md extensions).

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/1-123456/attachment/create'
payload = {
    "file_name": "\"readme-notes\"",
    "file_extension": "\"txt\"",
    "file_body": "\"This is the file content.\"",
    "ai_summary": "\"This file contains project notes.\"",
    "metadata": "\"Created for project documentation.\""
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/1-123456/attachment/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "file_name": "\"readme-notes\"",
    "file_extension": "\"txt\"",
    "file_body": "\"This is the file content.\"",
    "ai_summary": "\"This file contains project notes.\"",
    "metadata": "\"Created for project documentation.\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/1-123456/attachment/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'file_name' => '"readme-notes"',
            'file_extension' => '"txt"',
            'file_body' => '"This is the file content."',
            'ai_summary' => '"This file contains project notes."',
            'metadata' => '"Created for project documentation."',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tasks/1-123456/attachment/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"file_name\": \"\\\"readme-notes\\\"\",
    \"file_extension\": \"\\\"txt\\\"\",
    \"file_body\": \"\\\"This is the file content.\\\"\",
    \"ai_summary\": \"\\\"This file contains project notes.\\\"\",
    \"metadata\": \"\\\"Created for project documentation.\\\"\"
}"

Example response (200):


{
    "message": "upload attachment successful",
    "file": {
        "id": 12345,
        "uploaded_by": 46905,
        "uploaded_on": "2025-01-15 10:30:00",
        "file_display_name": "readme-notes.txt",
        "file_name": "aifile-1-123456-46905-1234567890.txt",
        "file_url": "https://s3.amazonaws.com/uploads.devjock.com/aifile-1-123456-46905-1234567890.txt",
        "metadata": "Created for project documentation.",
        "metadata_lastupdate": "2025-01-15 10:30:00",
        "ai_summary": "This file contains project notes.",
        "ai_summary_lastupdate": "2025-01-15 10:30:00"
    }
}
 

Request      

POST v1.0/tasks/{taskId}/attachment/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

taskId   string   

The Devjock task ID. Example: 1-123456

Body Parameters

file_name   string   

The name you want the document to be called. Example: "readme-notes"

file_extension   string   

File extension, must be txt or md. Example: "txt"

file_body   string   

Contents of the document. Example: "This is the file content."

ai_summary   string  optional  

The AI summary of the file content. Example: "This file contains project notes."

metadata   string  optional  

Additional metadata about the file. Example: "Created for project documentation."

Project Comments

Create

requires authentication

Create a new comment (blog post) and attached to a project/task. At least one Body Parameter must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/blog/create'
payload = {
    "blog_post": "This is the body of the post.",
    "hours_worked": "2",
    "minutes_worked": "15"
}
params = {
  'task_id': '1-123456',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/blog/create"
);

const params = {
    "task_id": "1-123456",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "blog_post": "This is the body of the post.",
    "hours_worked": "2",
    "minutes_worked": "15"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/blog/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'task_id' => '1-123456',
        ],
        'json' => [
            'blog_post' => 'This is the body of the post.',
            'hours_worked' => '2',
            'minutes_worked' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tasks/blog/create?task_id=1-123456" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"blog_post\": \"This is the body of the post.\",
    \"hours_worked\": \"2\",
    \"minutes_worked\": \"15\"
}"

Example response (201):


{
    "create": "success",
    "id": 12345,
    "link": "https://www.devjockproto.com/todo/details/?ID=1-12345#12345"
}
 

Request      

POST v1.0/tasks/blog/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

task_id   string   

The task ID to update. Example: 1-123456

Body Parameters

blog_post   string   

The text you want entered. Example: This is the body of the post.

hours_worked   string  optional  

Use this parameter to specify how many hours to log into the blog post. Must be one of the following: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24 will be 0 if left empty. Example: 2

minutes_worked   string  optional  

Use this parameter to specify how many minutes to log into the blog post. Must be one of the following: 0,1,5,10,15,20,25,30,35,40,45,50,55 will be 0 if left empty. Example: 15

Projects

Create

requires authentication

Create a new project/task with the provided information. At least one Body Parameter must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/create'
payload = {
    "title": "\"New Task Title\""
}
params = {
  'workspace_id': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/create"
);

const params = {
    "workspace_id": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "title": "\"New Task Title\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'workspace_id' => '1',
        ],
        'json' => [
            'title' => '"New Task Title"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tasks/create?workspace_id=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"\\\"New Task Title\\\"\"
}"

Example response (201):


{
    "create": "success",
    "task_id": "1-123456",
    "id": 456789,
    "workspace_id": 1,
    "todo_id": 123456
}
 

Request      

POST v1.0/tasks/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

workspace_id   integer   

The workspace ID where the task will be created. Example: 1

Body Parameters

title   string  optional  

The task title. Example: "New Task Title"

description   string  optional  

The task description.

priority   string  optional  

A single lower-case letter (a to z) representing the task priority.

assigned_to   string  optional  

The userid you want to assign the task to, they must be a team member.

qa_assigned_to   string  optional  

The userid you want to assign the QA task to, they must be a team member.

lifecycle_id   string  optional  

The id of the task lifecycle.

status_id   string  optional  

The id of the task status.

business_requirements   string  optional  

The business requirements text.

qa_instructions   string  optional  

The QA instructions text.

technical_spec   string  optional  

The technical specification text.

ai_summary   string  optional  

AI-generated summary.

ai_marketing_summary   string  optional  

AI-generated marketing summary.

website_content   string  optional  

Website content text.

add_sprints   string  optional  

A single sprint id to associate with the task.

add_groups   string  optional  

A single epic id to associate with the task.

parent_id   string  optional  

The parent task ID in format workspace_id-todo_id.

Read

requires authentication

Will return information about a specific project/task. Use the resolves Body Parameter to return specific data, or leave out to return minimal task information.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/single'
payload = {
    "resolves": [
        "title",
        "description",
        "workspace",
        "lifecycle",
        "status",
        "assigned_to",
        "created_by",
        "created_on",
        "last_updated",
        "technical_spec",
        "business_requirements",
        "qa_instructions",
        "difficulty",
        "track_as_bug",
        "time_actual",
        "time_estimate",
        "revision_date",
        "revision_number",
        "ai_summary",
        "ai_summary_lastupdate",
        "ai_marketing_summary",
        "ai_marketing_summary_lastupdate",
        "hours_worked",
        "attached_files",
        "code_files",
        "groups",
        "sprints",
        "tags",
        "parent_task",
        "sub_tasks",
        "blog_posts",
        "change_log",
        "website_content",
        "qa_assigned_to",
        "default_ai_agent_template_id"
    ]
}
params = {
  'task_id': '1-123456',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/single"
);

const params = {
    "task_id": "1-123456",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "resolves": [
        "title",
        "description",
        "workspace",
        "lifecycle",
        "status",
        "assigned_to",
        "created_by",
        "created_on",
        "last_updated",
        "technical_spec",
        "business_requirements",
        "qa_instructions",
        "difficulty",
        "track_as_bug",
        "time_actual",
        "time_estimate",
        "revision_date",
        "revision_number",
        "ai_summary",
        "ai_summary_lastupdate",
        "ai_marketing_summary",
        "ai_marketing_summary_lastupdate",
        "hours_worked",
        "attached_files",
        "code_files",
        "groups",
        "sprints",
        "tags",
        "parent_task",
        "sub_tasks",
        "blog_posts",
        "change_log",
        "website_content",
        "qa_assigned_to",
        "default_ai_agent_template_id"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/single';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'task_id' => '1-123456',
        ],
        'json' => [
            'resolves' => [
                'title',
                'description',
                'workspace',
                'lifecycle',
                'status',
                'assigned_to',
                'created_by',
                'created_on',
                'last_updated',
                'technical_spec',
                'business_requirements',
                'qa_instructions',
                'difficulty',
                'track_as_bug',
                'time_actual',
                'time_estimate',
                'revision_date',
                'revision_number',
                'ai_summary',
                'ai_summary_lastupdate',
                'ai_marketing_summary',
                'ai_marketing_summary_lastupdate',
                'hours_worked',
                'attached_files',
                'code_files',
                'groups',
                'sprints',
                'tags',
                'parent_task',
                'sub_tasks',
                'blog_posts',
                'change_log',
                'website_content',
                'qa_assigned_to',
                'default_ai_agent_template_id',
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tasks/single?task_id=1-123456" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"resolves\": [
        \"title\",
        \"description\",
        \"workspace\",
        \"lifecycle\",
        \"status\",
        \"assigned_to\",
        \"created_by\",
        \"created_on\",
        \"last_updated\",
        \"technical_spec\",
        \"business_requirements\",
        \"qa_instructions\",
        \"difficulty\",
        \"track_as_bug\",
        \"time_actual\",
        \"time_estimate\",
        \"revision_date\",
        \"revision_number\",
        \"ai_summary\",
        \"ai_summary_lastupdate\",
        \"ai_marketing_summary\",
        \"ai_marketing_summary_lastupdate\",
        \"hours_worked\",
        \"attached_files\",
        \"code_files\",
        \"groups\",
        \"sprints\",
        \"tags\",
        \"parent_task\",
        \"sub_tasks\",
        \"blog_posts\",
        \"change_log\",
        \"website_content\",
        \"qa_assigned_to\",
        \"default_ai_agent_template_id\"
    ]
}"

Example response (200):


{
"task_id": "1-123456",
"id": 456789,
"workspace_id": 1,
"todo_id": 123456,
"title": "The task title",
"description": "The task description",
"workspace": {
"id": 1,
"name": "name"
},
"lifecycle": {
"id": 36,
"name": "Backlog",
"description": "Tasks with a spec and an estimate which are ready to be worked on."
},
"status": {
"id": 2,
"name": "Next",
"description": "To be worked on after the ''In progress'' pile is complete"
},
}
 

Request      

POST v1.0/tasks/single

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

task_id   string   

The task ID to show information on. Example: 1-123456

Body Parameters

resolves   string[]  optional  

Use this parameter to specify which data fields you want returned. Specifying the resolves parameter allows you to tailor the response to include only the desired fields, such as title, description, lifecycle, etc. If omitted, minimal task information will be returned.

List

requires authentication

Will return a list of projects/tasks. At least one query parameter other then page must be present. Using show_assistants will ignore any status_id and lifecycle_id filters.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/list'
params = {
  'page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/list"
);

const params = {
    "page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/tasks/list?page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_tasks": 2,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_tasks_returned": 2,
    "tasks": [
        {
            "task_id": "1-123456",
            "id": 456789,
            "workspace_id": 1,
            "todo_id": 123456,
            "workspace": {
                "id": 1,
                "name": "name"
            }
        },
        {
            "task_id": "1-789012",
            "id": 5698545,
            "workspace_id": 1,
            "todo_id": 789012,
            "workspace": {
                "id": 1,
                "name": "name"
            }
        }
    ]
}
 

Request      

GET v1.0/tasks/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Example: 1

workspace_id   string  optional  
assigned_to   integer  optional  
created_by   integer  optional  
group_id   string  optional  
last_update_from   string  optional  
last_update_to   string  optional  
lifecycle_id   integer  optional  
parent_id   integer  optional  
no_parent   string  optional  

Only show projects/tasks without a parent project/task if present (any value). Will be ignored if parent_id is present.

status_id   string  optional  
sprint_id   string  optional  
tag_id   string  optional  
track_as_bug   integer  optional  
with_estimates   integer  optional  
qa_assigned_to   integer  optional  
show_assistants   string  optional  

Only show Assistants if present (any value).

search_term   string  optional  

Free-text search across TITLE, DESCRIPTION.

sort_by   string  optional  

Optional. Sort results by 'id', 'created_on', 'last_update', or 'title'. Defaults to 'id'.

sort_dir   string  optional  

Optional. Sort direction 'asc' or 'desc'. Defaults to 'desc'.

Update

requires authentication

Update a project/task with new information. One of the Body Parameters must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tasks/update'
payload = {
    "title": "\"New Task Title\""
}
params = {
  'task_id': '1-123456',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tasks/update"
);

const params = {
    "task_id": "1-123456",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "title": "\"New Task Title\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tasks/update';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'task_id' => '1-123456',
        ],
        'json' => [
            'title' => '"New Task Title"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tasks/update?task_id=1-123456" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"\\\"New Task Title\\\"\"
}"

Example response (200):


{'update': 'success'}
 

Request      

POST v1.0/tasks/update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

task_id   string   

The task ID to update. Example: 1-123456

Body Parameters

title   string  optional  

The text you want entered. Example: "New Task Title"

description   string  optional  

The text you want entered.

priority   string  optional  

A single lower-case letter (a to z) representing the task priority.

difficulty   string  optional  

The difficulty level of the task. Must be one of the following: 0, 1, 2, 3, 6, 10, 20, 30, 40.

assigned_to   string  optional  

The userid you want to assign the task to, they must be a team member.

qa_assigned_to   string  optional  

The userid you want to assign the QA task to, they must be a team member.

lifecycle_id   string  optional  

The id of the task lifecycle.

status_id   string  optional  

The id of the task status.

business_requirements   string  optional  

The text you want entered.

clear_sprints   string  optional  

If used it will remove all sprint ids.

add_sprints   string  optional  

A single sprint id or comma-separated list of sprint ids to add.

clear_groups   string  optional  

If used it will remove all group ids.

add_groups   string  optional  

A single group id or comma-separated list of group ids to add.

qa_instructions   string  optional  

The text you want entered.

technical_spec   string  optional  

The text you want entered.

ai_summary   string  optional  

The text you want entered.

ai_marketing_summary   string  optional  

The text you want entered.

website_content   string  optional  

The text you want entered.

parent_id   string  optional  

The parent task ID in format workspace_id-todo_id.

estimate   string  optional  

The estimated time for the task as a whole number or number with up to 2 decimal places. Use 0 to clear.

revision_date   string  optional  

The revision date in YYYY-MM-DD format. Use "0" to clear.

revision_id   string  optional  

The revision ID as a string up to 10 characters. Use "0" to clear.

tag_ids   string  optional  

Tag IDs to assign to the task. Can be comma-separated (e.g., "1,2,3") or single ID. Use "0" to clear all tags.

RAG

Add Index

requires authentication

Adds specified attachments to the RAG index

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/rag/48-37855/index'
payload = {
    "attachment_ids": [
        19800
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/rag/48-37855/index"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "attachment_ids": [
        19800
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/rag/48-37855/index';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'attachment_ids' => [
                19800,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/rag/48-37855/index" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"attachment_ids\": [
        19800
    ]
}"

Example response (200):


{}
 

Request      

POST v1.0/rag/{taskId}/index

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

taskId   string   

The task ID to show information on. Example: 48-37855

Body Parameters

attachment_ids   integer[]   

Task attachment id.

requires authentication

Search in by query

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/rag/search'
params = {
  'query': 'NFT Token',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/rag/search"
);

const params = {
    "query": "NFT Token",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/rag/search';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'query' => 'NFT Token',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/rag/search?query=NFT+Token" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{}
 

RAG Assistant

requires authentication

Search by query with Pinecone assistant

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/rag/assistant/devjock/search'
payload = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "stream": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/rag/assistant/devjock/search"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "messages": [
        {
            "role": "user",
            "content": "Please reply \"OK\""
        }
    ],
    "stream": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/rag/assistant/devjock/search';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'messages' => [
                [
                    'role' => 'user',
                    'content' => 'Please reply "OK"',
                ],
            ],
            'stream' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/rag/assistant/devjock/search" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"messages\": [
        {
            \"role\": \"user\",
            \"content\": \"Please reply \\\"OK\\\"\"
        }
    ],
    \"stream\": false
}"

Example response (200):


{}
 

Add Index

requires authentication

Adds specified attachments to the RAG assistant index

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/rag/assistant/devjock/index'
payload = {
    "attachment_ids": [
        19800
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/rag/assistant/devjock/index"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "attachment_ids": [
        19800
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/rag/assistant/devjock/index';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'attachment_ids' => [
                19800,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/rag/assistant/devjock/index" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"attachment_ids\": [
        19800
    ]
}"

Example response (200):


{}
 

Request      

POST v1.0/rag/assistant/{assistant_name}/index

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

assistant_name   string   

Pinecone assistant name. Example: devjock

Body Parameters

attachment_ids   integer[]   

Task attachment id.

Scrape

Scrape URL

requires authentication

Scrape a single webpage for it's content.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/scrape/url'
payload = {
    "url": "https:\/\/www.example-site.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/scrape/url"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "url": "https:\/\/www.example-site.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/scrape/url';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'url' => 'https://www.example-site.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/scrape/url" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"url\": \"https:\\/\\/www.example-site.com\"
}"

Example response (200):


{
   "url": "https://example.com",
   "content": "Scraped data",
}
 

Request      

POST v1.0/scrape/url

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

url   string   

URL you want to scrape. Must be a valid URL. Example: https://www.example-site.com

Screenshot URL

requires authentication

Create a screenshot of the page by given URL.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/scrape/screenshot'
payload = {
    "url": "https:\/\/www.example-site.com"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/scrape/screenshot"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "url": "https:\/\/www.example-site.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/scrape/screenshot';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'url' => 'https://www.example-site.com',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/scrape/screenshot" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"url\": \"https:\\/\\/www.example-site.com\"
}"

Example response (200):


{
   "screenshot_url": "https://alttmdsdujxrfnakrkyi.supabase.co/storage/screenshot-5833962.png",
}
 

Request      

POST v1.0/scrape/screenshot

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

url   string   

URL you want to scrape. Must be a valid URL. Example: https://www.example-site.com

Sentry

Get Issue

requires authentication

Show Sentry issue by id.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sentry/issues/12345'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sentry/issues/12345"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sentry/issues/12345';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/sentry/issues/12345" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "issue": [],
    "last_error": []
}
 

Request      

GET v1.0/sentry/issues/{issueId}

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

issueId   string   

The Sentry id for the issue. Example: 12345

Sprints

Create

requires authentication

Create a new sprint with the provided information. All required fields must be present. The sprint must be assigned to at least one workspace where the user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sprints/create'
payload = {
    "name": null,
    "workspace_ids": null
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sprints/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": null,
    "workspace_ids": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sprints/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => null,
            'workspace_ids' => null,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/sprints/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": null,
    \"workspace_ids\": null
}"

Example response (201):


{
    "create": "success",
    "sprint_id": 347
}
 

Request      

POST v1.0/sprints/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

The name/title of the sprint.

description   string  optional  

The description of the sprint.

workspace_ids   string   

A single id or comma-separated workspace IDs to assign this sprint to. User must be a member of all specified workspaces.

active   integer  optional  

Active status (0 or 1). Defaults to 1.

start_date   string  optional  

Sprint start date in YYYY-MM-DD format.

end_date   string  optional  

Sprint end date in YYYY-MM-DD format.

ai_summary   string  optional  

AI-generated summary of the sprint.

Read

requires authentication

Will return information about a specific sprint. The sprint must be assigned to a workspace where the authenticated user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sprints/get'
params = {
  'sprint_id': '342',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sprints/get"
);

const params = {
    "sprint_id": "342",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sprints/get';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'sprint_id' => '342',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/sprints/get?sprint_id=342" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "id": 342,
    "active": true,
    "name": "Sprint Q1 2025",
    "description": "First quarter development sprint",
    "start_date": "2025-01-01",
    "end_date": "2025-03-31",
    "created_by": {
        "userid": 46905,
        "user": "Brian Smith"
    },
    "ai_summary": "Focus on API improvements and new features",
    "ai_summary_lastupdate": "2025-01-15T10:30:00.000000Z",
    "workspace_ids": [
        1,
        2,
        5
    ]
}
 

Request      

GET v1.0/sprints/get

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

sprint_id   integer   

The sprint ID to retrieve. Example: 342

List

requires authentication

Will return a list of sprints.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sprints/list'
params = {
  'page': '1',
  'sprint_id': 'omnis',
  'workspace_id': 'quidem',
  'show_inactive': '1 or true',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sprints/list"
);

const params = {
    "page": "1",
    "sprint_id": "omnis",
    "workspace_id": "quidem",
    "show_inactive": "1 or true",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sprints/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'sprint_id' => 'omnis',
            'workspace_id' => 'quidem',
            'show_inactive' => '1 or true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/sprints/list?page=1&sprint_id=omnis&workspace_id=quidem&show_inactive=1+or+true" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_sprints": 2,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_sprints_returned": 2,
    "sprints": [
        {
            "id": 123,
            "active": 1,
            "name": "Sprint 1",
            "description": "First quarter development sprint",
            "start_date": null,
            "end_date": null,
            "created_by": {
                "userid": 1001,
                "user": "John Smith"
            },
            "ai_summary": null,
            "ai_summary_lastupdate": null
        },
        {
            "id": 124,
            "active": 1,
            "name": "Sprint 2",
            "description": "API improvements and bug fixes",
            "start_date": null,
            "end_date": null,
            "created_by": {
                "userid": 1002,
                "user": "Jane Doe"
            },
            "ai_summary": null,
            "ai_summary_lastupdate": null
        }
    ]
}
 

Request      

GET v1.0/sprints/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Example: 1

sprint_id   string  optional  

A single sprint id or a comma separated list of sprint ids Example: omnis

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids Example: quidem

show_inactive   string  optional  

Include inactive tags if present (any value). Example: 1 or true

Update

requires authentication

Update a sprint with new information. At least one Body Parameter must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sprints/update'
params = {
  'sprint_id': '347',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sprints/update"
);

const params = {
    "sprint_id": "347",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sprints/update';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'sprint_id' => '347',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/sprints/update?sprint_id=347" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \

Example response (200):


{
    "update": "success"
}
 

Example response (400):


{
    "error": "Invalid sprint_id"
}
 

Request      

POST v1.0/sprints/update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

sprint_id   integer   

The sprint ID to update. Example: 347

Body Parameters

name   string  optional  

The name/title of the sprint.

description   string  optional  

The description of the sprint.

workspace_ids   string  optional  

A single id or comma-separated workspace IDs to assign this sprint to. Replaces all existing workspace assignments.

active   integer  optional  

Active status (0 or 1).

start_date   string  optional  

Sprint start date in YYYY-MM-DD format.

end_date   string  optional  

Sprint end date in YYYY-MM-DD format.

ai_summary   string  optional  

AI-generated summary of the sprint.

Delete

requires authentication

Permanently deletes a sprint that the user created. The sprint data is archived before deletion. Users can only delete sprints they created and that have no tasks associated. Sprints with tasks should be marked inactive instead.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/sprints/delete'
params = {
  'sprint_id': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/sprints/delete"
);

const params = {
    "sprint_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/sprints/delete';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'sprint_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/sprints/delete?sprint_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "delete": "success"
}
 

Example response (400):


{
    "error": "Access denied: You can only delete sprints you created"
}
 

Example response (400):


{
    "error": "Cannot be deleted because the sprint has tasks. Please update the sprint to inactive instead."
}
 

Request      

POST v1.0/sprints/delete

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

sprint_id   integer   

The sprint ID to delete.

Tags

Create

requires authentication

Create a new tag with the provided information. All required fields must be present. The tag must be assigned to at least one workspace where the user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tags/create'
payload = {
    "name": null,
    "workspace_ids": null
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tags/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": null,
    "workspace_ids": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tags/create';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => null,
            'workspace_ids' => null,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tags/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": null,
    \"workspace_ids\": null
}"

Example response (201):


{
    "create": "success",
    "tag_id": 42
}
 

Request      

POST v1.0/tags/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

name   string   

The name/title of the tag.

workspace_ids   string   

A single id or comma-separated workspace IDs to assign this tag to. User must be a member of all specified workspaces.

symbol   string  optional  

Symbol or shorthand for the tag.

description   string  optional  

Description of the tag.

backgroundcolor   string  optional  

Background color in hex format (#RRGGBB).

active   integer  optional  

Active status (0 or 1). Defaults to 1.

Read

requires authentication

Will return information about a specific tag. The tag must be assigned to a workspace where the authenticated user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tags/get'
params = {
  'tag_id': '16',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tags/get"
);

const params = {
    "tag_id": "16",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tags/get';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'tag_id' => '16',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/tags/get?tag_id=16" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "id": 16,
    "symbol": "Op",
    "name": "Operations",
    "description": "Operations",
    "active": 1,
    "backgroundcolor": "#FF0000",
    "created_by": {
        "userid": 46905,
        "user": "Brian Smith"
    },
    "workspace_ids": [
        1,
        2,
        5
    ]
}
 

Request      

GET v1.0/tags/get

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

tag_id   integer   

The tag ID to retrieve. Example: 16

List

requires authentication

Will return a list of tags from workspaces where the authenticated user is a team member.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tags/list'
params = {
  'tag_id': '123 or 123,456,789',
  'workspace_id': '1 or 1,2,3',
  'created_by': '123456 or 123456,789012',
  'show_inactive': 'true',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tags/list"
);

const params = {
    "tag_id": "123 or 123,456,789",
    "workspace_id": "1 or 1,2,3",
    "created_by": "123456 or 123456,789012",
    "show_inactive": "true",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tags/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'tag_id' => '123 or 123,456,789',
            'workspace_id' => '1 or 1,2,3',
            'created_by' => '123456 or 123456,789012',
            'show_inactive' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/tags/list?tag_id=123+or+123%2C456%2C789&workspace_id=1+or+1%2C2%2C3&created_by=123456+or+123456%2C789012&show_inactive=true" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total": 39,
    "tags": [
        {
            "id": 16,
            "symbol": "Op",
            "name": "Operations",
            "description": "Operations",
            "active": 1,
            "workspace_id": 1
        },
        {
            "id": 17,
            "symbol": "$",
            "name": "Financial Impact",
            "description": "Incremental Improvement",
            "active": 1,
            "workspace_id": 1
        }
    ]
}
 

Request      

GET v1.0/tags/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

tag_id   string  optional  

A single tag id or a comma separated list of tag ids. Example: 123 or 123,456,789

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids. Example: 1 or 1,2,3

created_by   string  optional  

A single user id or a comma separated list of user ids. Example: 123456 or 123456,789012

show_inactive   string  optional  

Include inactive tags if present (any value). Example: true

Update

requires authentication

Update a tag with new information. At least one Body Parameter must be present.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tags/update'
params = {
  'tag_id': '42',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tags/update"
);

const params = {
    "tag_id": "42",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tags/update';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'tag_id' => '42',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tags/update?tag_id=42" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \

Example response (200):


{
    "update": "success"
}
 

Example response (400):


{
    "error": "Invalid tag_id"
}
 

Request      

POST v1.0/tags/update

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

tag_id   integer   

The tag ID to update. Example: 42

Body Parameters

name   string  optional  

The name/title of the tag.

symbol   string  optional  

The symbol/shorthand for the tag.

description   string  optional  

The description of the tag.

backgroundcolor   string  optional  

Background color in hex format (#RRGGBB).

workspace_ids   string  optional  

A single id or comma-separated workspace IDs to assign this tag to. Replaces all existing workspace assignments.

active   integer  optional  

Active status (0 or 1).

Delete

requires authentication

Permanently deletes a tag that the user created. The tag data is archived before deletion. Users can only delete tags they created and that have no tasks associated. Tags with tasks should be marked inactive instead.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/tags/delete'
params = {
  'tag_id': '',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/tags/delete"
);

const params = {
    "tag_id": "",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/tags/delete';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'tag_id' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/tags/delete?tag_id=" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "delete": "success"
}
 

Example response (400):


{
    "error": "Access denied: You can only delete tags you created"
}
 

Example response (400):


{
    "error": "Cannot be deleted because the tag has tasks. Please update the tag to inactive instead."
}
 

Request      

POST v1.0/tags/delete

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

tag_id   integer   

The tag ID to delete.

Transcribe

Transcribe Media

requires authentication

Processes a single media file, converting the speech within it into a textual transcript.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/transcribe/media'
files = {
  'media': open('/tmp/phpMBOJfb', 'rb')}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/transcribe/media"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('media', document.querySelector('input[name="media"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/transcribe/media';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'media',
                'contents' => fopen('/tmp/phpMBOJfb', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/transcribe/media" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "media=@/tmp/phpMBOJfb" 

Example response (200):


{
   "transcription": "Transcribed text",
}
 

Request      

POST v1.0/transcribe/media

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: multipart/form-data

Accept      

Example: application/json

Body Parameters

media   file   

Media file to transcribe. Supported formats are: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, wav-x, webm. Must be a file. Must not be greater than 25600 kilobytes. Example: /tmp/phpMBOJfb

Utilities

Check Health

Check if DevJock API is fully operational. If everything is okay, you'll get a list where all checks are OK.

Otherwise, the request will response with the failed checks.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/health'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/health"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/health';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/health" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "finishedAt": 1707929853,
    "checkResults": [
        {
            "name": "DebugMode",
            "label": "Debug Mode",
            "notificationMessage": "",
            "shortSummary": "false",
            "status": "ok",
            "meta": {
                "actual": false,
                "expected": false
            }
        }
    ]
}
 

Request      

GET v1.0/health

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Get User Context

requires authentication

Get Devjock context information for the authenticated user.

This includes information about Devjock life_cycles and the user's workspaces and team members.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/resources/list'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/resources/list"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/resources/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/resources/list" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "today": "Thu, 12 Sep 2025 14:30:45 GMT",
    "generated_at": 1726150245,
    "Devjock": {
        "life_cycles": [
            {
                "id": 1,
                "name": "Development",
                "description": "Development lifecycle for new features"
            },
            {
                "id": 2,
                "name": "Bug",
                "description": "Bug tracking and resolution lifecycle"
            }
        ],
        "statuses": [
            {
                "id": 1,
                "name": "Open",
                "description": "Task is open and ready to work"
            },
            {
                "id": 2,
                "name": "In Progress",
                "description": "Work is actively being done"
            }
        ],
        "workspaces": [
            {
                "id": 1,
                "name": "Project Alpha",
                "description": "Main development workspace"
            },
            {
                "id": 2,
                "name": "Testing Environment",
                "description": "QA and testing workspace"
            }
        ],
        "sprints": [
            {
                "id": 123,
                "name": "Sprint 1",
                "description": "First quarter development sprint",
                "workspace_ids": [
                    1,
                    2
                ]
            },
            {
                "id": 124,
                "name": "Sprint 2",
                "description": "API improvements and bug fixes",
                "workspace_ids": [
                    1
                ]
            }
        ],
        "tags": [
            {
                "id": 16,
                "name": "Operations",
                "symbol": "Op",
                "description": "Operations related tasks",
                "workspace_id": 1
            },
            {
                "id": 17,
                "name": "High Priority",
                "symbol": "!",
                "description": "High priority items",
                "workspace_id": 1
            }
        ],
        "groups": [
            {
                "id": 123,
                "name": "Backend Infrastructure",
                "description": "Core backend systems and infrastructure improvements",
                "workspace_id": 1
            },
            {
                "id": 124,
                "name": "User Interface Redesign",
                "description": "Modern UI/UX improvements and responsive design",
                "workspace_id": 2
            }
        ]
    },
    "me": {
        "userid": 1001,
        "name": "John Smith",
        "team_members": [
            {
                "userid": 1002,
                "name": "Jane Doe",
                "workspace_ids": [
                    1,
                    2
                ]
            },
            {
                "userid": 1003,
                "name": "Bob Johnson",
                "workspace_ids": [
                    1
                ]
            }
        ]
    }
}
 

Request      

GET v1.0/resources/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Vision

Describe Images

requires authentication

Takes a promt and collection of images then returns a list of answers for each image based on prompt. This is simplified way to ask question about images, other way is to do it over Chat API endpoint.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/vision/describe-images'
payload = {
    "prompt": "Please describe image",
    "images": [
        {
            "image": "https:\/\/shorturl.at\/hrov6"
        }
    ]
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/vision/describe-images"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "prompt": "Please describe image",
    "images": [
        {
            "image": "https:\/\/shorturl.at\/hrov6"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/vision/describe-images';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'prompt' => 'Please describe image',
            'images' => [
                [
                    'image' => 'https://shorturl.at/hrov6',
                ],
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request POST \
    "https://api.devjock.com/v1.0/vision/describe-images" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"prompt\": \"Please describe image\",
    \"images\": [
        {
            \"image\": \"https:\\/\\/shorturl.at\\/hrov6\"
        }
    ]
}"

Example response (200):


{
    "text": "Some text ..."
}
 

Request      

POST v1.0/vision/describe-images

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

prompt   string   

Prompt with question about images. Example: Please describe image

images   object[]   

Collection of images to send. Must have at least 1 items.

image   string   

Image to describe, can be URL, base64 encoded or file. Example: https://shorturl.at/hrov6

Workspaces

List

requires authentication

Will return a list of workspaces where the authenticated user is a team member.

By default only active workspaces are returned. To include inactive workspaces, include the show_inactive query parameter.

Example request:
import requests
import json

url = 'https://api.devjock.com/v1.0/workspaces/list'
params = {
  'page': '1',
  'workspace_id': '1,2,3',
  'show_inactive': 'true',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'X-Server-Apikey': 'E79GH-UIL999',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()
const url = new URL(
    "https://api.devjock.com/v1.0/workspaces/list"
);

const params = {
    "page": "1",
    "workspace_id": "1,2,3",
    "show_inactive": "true",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "X-Server-Apikey": "E79GH-UIL999",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api.devjock.com/v1.0/workspaces/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'X-Server-Apikey' => 'E79GH-UIL999',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'workspace_id' => '1,2,3',
            'show_inactive' => 'true',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
curl --request GET \
    --get "https://api.devjock.com/v1.0/workspaces/list?page=1&workspace_id=1%2C2%2C3&show_inactive=true" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "X-Server-Apikey: E79GH-UIL999" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"

Example response (200):


{
    "total_workspaces": 2,
    "this_page": 1,
    "has_more_pages": false,
    "total_pages": 1,
    "count_workspaces_returned": 2,
    "workspaces": [
        {
            "id": 123,
            "active": 1,
            "name": "Project Alpha",
            "description": "Main development workspace"
        },
        {
            "id": 124,
            "active": 1,
            "name": "Testing Environment",
            "description": "QA and testing workspace"
        }
    ]
}
 

Request      

GET v1.0/workspaces/list

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

X-Server-Apikey      

Example: E79GH-UIL999

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

page   integer  optional  

Example: 1

workspace_id   string  optional  

A single workspace id or a comma separated list of workspace ids. Example: 1,2,3

show_inactive   string  optional  

Will return workspaces marked inactive if included. Example: true