Skip to main content
POST
/
projects
/
{project_id}
/
tools
Run Tool
curl --request POST \
  --url https://actionkit.useparagon.com/projects/{project_id}/tools \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "tool": "SLACK_SEND_MESSAGE",
  "parameters": {}
}
'
import requests

url = "https://actionkit.useparagon.com/projects/{project_id}/tools"

payload = {
"tool": "SLACK_SEND_MESSAGE",
"parameters": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({tool: 'SLACK_SEND_MESSAGE', parameters: {}})
};

fetch('https://actionkit.useparagon.com/projects/{project_id}/tools', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://actionkit.useparagon.com/projects/{project_id}/tools",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'tool' => 'SLACK_SEND_MESSAGE',
'parameters' => [

]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://actionkit.useparagon.com/projects/{project_id}/tools"

payload := strings.NewReader("{\n \"tool\": \"SLACK_SEND_MESSAGE\",\n \"parameters\": {}\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://actionkit.useparagon.com/projects/{project_id}/tools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"tool\": \"SLACK_SEND_MESSAGE\",\n \"parameters\": {}\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://actionkit.useparagon.com/projects/{project_id}/tools")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"tool\": \"SLACK_SEND_MESSAGE\",\n \"parameters\": {}\n}"

response = http.request(request)
puts response.read_body
{
  "ok": true,
  "channel": "CSQCUNXBP",
  "ts": "1739896301.418839",
  "message": {
    "user": "U0101SYAC07",
    "type": "message",
    "ts": "1739896301.418839",
    "bot_id": "B0101SYAB3R",
    "app_id": "A01001G1G7J",
    "text": "test",
    "team": "TM7FL705V",
    "bot_profile": {
      "id": "B0101SYAB3R",
      "app_id": "A01001G1G7J",
      "name": "Paragon",
      "icons": {
        "image_36": "https://avatars.slack-edge.com/2020-03-24/1022919802484_c4af0a8de9e9c25f4b58_36.png",
        "image_48": "https://avatars.slack-edge.com/2020-03-24/1022919802484_c4af0a8de9e9c25f4b58_48.png",
        "image_72": "https://avatars.slack-edge.com/2020-03-24/1022919802484_c4af0a8de9e9c25f4b58_72.png"
      },
      "deleted": false,
      "updated": 1587073960,
      "team_id": "TM7FL705V"
    },
    "blocks": [
      {
        "type": "section",
        "block_id": "iAHFB",
        "text": {
          "type": "mrkdwn",
          "text": "test",
          "verbatim": false
        }
      }
    ]
  },
  "response_metadata": {
    "scopes": [
      "app_mentions:read",
      "chat:write",
      "chat:write.public",
      "channels:read",
      "reactions:write",
      "chat:write.customize",
      "im:read",
      "im:write",
      "users:read",
      "groups:read",
      "channels:manage",
      "groups:write",
      "mpim:write",
      "team:read",
      "channels:history",
      "users:read.email",
      "files:read",
      "files:write"
    ],
    "acceptedScopes": [
      "chat:write"
    ]
  }
}
{
"message": "Your authorization token has expired.",
"code": "7203",
"status": 401,
"meta": {
"projectId": "ddcd1f1a-440d-4d48-97ab-44878b77f800"
}
}
This endpoint can be used to call any ActionKit Tool on behalf of your user. You can find specific input parameters for a Tool you want to call in the Tools Reference, for example: Each Tool in the Reference is an example call to this endpoint.
This endpoint was previously available at POST /projects/{project_id}/actions. The /actions path is preserved for backward compatibility; both paths work identically.

Authorizations

Authorization
string
header
required

Your Paragon User Token (JWT), which you can generate using your project's signing keys.

Path Parameters

project_id
string
required

Your Paragon Project ID. You can copy your Project ID from your dashboard URL or by clicking Copy Project ID under the Environment switcher.

Body

application/json
tool
string
required

The Tool to run

Example:

"SLACK_SEND_MESSAGE"

parameters
object
required

The parameters to pass to the Tool. See available parameters for your specific Tool in the Tools Reference.

Response

Note: Responses will vary by integration provider. Paragon returns the API response of the last request that was used to run this Tool.