JustFlows docs

API reference

Resolve an approval request

POST /api/v1/approvals/{approval_id}/decision

cURL

curl --request POST \
  --url '/api/v1/approvals/{approval_id}/decision' \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "decision": "changes_requested",
  "feedback": "Use the approved customer-facing wording."
}'

JavaScript

const response = await fetch('/api/v1/approvals/{approval_id}/decision', {
  method: 'POST',
  headers: {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "decision": "changes_requested",
    "feedback": "Use the approved customer-facing wording."
  })
});

const data = await response.json();

Python

import requests

response = requests.request(
    "POST",
    "/api/v1/approvals/{approval_id}/decision",
    headers={
      "Authorization": "Bearer <token>",
      "Content-Type": "application/json"
    },
    json={
      "decision": "changes_requested",
      "feedback": "Use the approved customer-facing wording."
    },
)

print(response.json())

PHP

<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', '/api/v1/approvals/{approval_id}/decision', [
    'headers' => [
        'Authorization' => 'Bearer <token>',
        'Content-Type' => 'application/json',
    ],
    'json' => [
        'decision' => 'changes_requested',
        'feedback' => 'Use the approved customer-facing wording.',
    ],
]);

echo $response->getBody();

Go

package main

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

func main() {
	body := strings.NewReader(`{
  "decision": "changes_requested",
  "feedback": "Use the approved customer-facing wording."
}`)
	req, _ := http.NewRequest("POST", "/api/v1/approvals/{approval_id}/decision", body)
	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	data, _ := io.ReadAll(res.Body)
	fmt.Println(string(data))
}

Ruby

require "net/http"

uri = URI("/api/v1/approvals/{approval_id}/decision")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == "https"

request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer <token>"
request["Content-Type"] = "application/json"
request.body = <<~'JSON'
  {
    "decision": "changes_requested",
    "feedback": "Use the approved customer-facing wording."
  }
JSON

response = http.request(request)
puts response.body

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("/api/v1/approvals/{approval_id}/decision"))
    .header("Authorization", "Bearer <token>")
    .header("Content-Type", "application/json")
    .method("POST", HttpRequest.BodyPublishers.ofString("""
        {
          "decision": "changes_requested",
          "feedback": "Use the approved customer-facing wording."
        }
        """))
    .build();

HttpResponse<String> response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.body());

Authorization

A bearer token in the Authorization header.

Path parameters

NameTypeRequiredDescription
approval_idstringYes

Request body

application/json · Required

NameTypeRequiredDescription
decisionstringYesOne of: approved, rejected, changes_requested
feedbackstring or nullNo

Responses

200 · The resolved approval request.
NameTypeRequiredDescription
dataApprovalDecisionYes
data.idstringYes
data.objectstringYes
data.run_idstring or nullYes
data.statusstringYesOne of: approved, rejected, changes_requested
data.decisionstringYesOne of: approved, rejected, changes_requested
data.responded_atstring (date-time) or null (date-time)Yes
data.updated_atstring (date-time) or null (date-time)Yes
request_idstringYes
{
  "data": {
    "id": "string",
    "object": "approval",
    "run_id": "string",
    "status": "approved",
    "decision": "approved",
    "responded_at": "2024-01-01T00:00:00Z",
    "updated_at": "2024-01-01T00:00:00Z"
  },
  "request_id": "string"
}
401 · The Bearer token is missing, malformed, expired, or revoked.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
403 · The token lacks the required ability.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
404 · The resource was not found in the token workspace.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
409 · The operation conflicts with current state or idempotency history.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
422 · The request is invalid or the workspace cannot perform the operation.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
429 · A per-token rate limit was exceeded.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}
503 · The site administrator has disabled the Workspace API.
NameTypeRequiredDescription
errorobjectYes
error.codestringYes
error.messagestringYes
error.detailsobjectNo
request_idstringYes
{
  "error": {
    "code": "string",
    "message": "string",
    "details": {}
  },
  "request_id": "string"
}