MENU navbar-image

Introduction

You can use our ProductLift's API to smoothly integrate ProductLift with other services.

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

Base URL

{YOUR_PORTAL_URL}

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 token by visiting your portal and go to Customize > API & Webhooks.

Anonymous Votes

Manage anonymous votes on posts and comments.

Vote anonymously

requires authentication

Add an anonymous vote to a post or comment.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/ad" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/ad"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/ad',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/ad'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "created_at": "2024-11-08T15:15:01.000000Z",
        "voter": null
    }
}
 

Example response (404):


{
    "message": "No query results for model ..."
}
 

Example response (422):


{
    "message": "Item is not voteable."
}
 

Example response (422):


{
    "message": "Anonymous user has already voted for this item."
}
 

Request   

POST api/v1/posts/{key}/anonymous_votes/{anonymous_id}

URL Parameters

key  string  

The ID of the post or comment.

anonymous_id  string  

The ID of the anonymous.

anonymousId  string  

The MD5 hash representing the anonymous user.

Revoke anonymous vote

requires authentication

Revoke an anonymous vote for a post or comment.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/in" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/in"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/in',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/anonymous_votes/in'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model ..."
}
 

Example response (422):


{
    "message": "Item is not voteable."
}
 

Example response (422):


{
    "message": "Anonymous user has not voted yet."
}
 

Request   

DELETE api/v1/posts/{key}/anonymous_votes/{anonymous_id}

URL Parameters

key  string  

The ID of the post or comment.

anonymous_id  string  

The ID of the anonymous.

anonymousId  string  

The MD5 hash representing the anonymous user.

Categories

Categories (e.g. Bug, Integration) can be used to organize and group posts. Categories are visible for your users. Posts can have multiple categories.

List categories

requires authentication

Lists all categories of your portal.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/categories"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/categories'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 1,
            "name": "Bug",
            "color": "#ABDEE6"
        },
        {
            "id": 1,
            "name": "Bug",
            "color": "#ABDEE6"
        }
    ]
}
 

Request   

GET api/v1/categories

Create category

requires authentication

Creates a new category in your portal.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/categories" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/categories"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/categories',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/categories'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Bug",
        "color": "#ABDEE6"
    }
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "name": [
     "The name has already been taken."
 ]
}
 

Request   

POST api/v1/categories

Body Parameters

name  string optional  

Delete category

requires authentication

Deletes a specified category.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/categories/18" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/categories/18"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/categories/18',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/categories/18'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "message": "Category deleted successfully"
}
 

Example response (404):


{
    "message": "Category not found"
}
 

Example response (403):


{
    "message": "You do not have permission to delete this category"
}
 

Request   

DELETE api/v1/categories/{id}

URL Parameters

id  integer  

The ID of the category.

Update category

requires authentication

Updates the details of a category.

Example request:
curl --request PATCH \
    "{YOUR_PORTAL_URL}/api/v1/categories/11" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"cywovtfwvqwcqqrsxyjanddbppxdcbbjhjazzht\",
    \"color\": \"#fe5c77$\\/m\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/categories/11"
);

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

let body = {
    "name": "cywovtfwvqwcqqrsxyjanddbppxdcbbjhjazzht",
    "color": "#fe5c77$\/m"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    '{YOUR_PORTAL_URL}/api/v1/categories/11',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'name' => 'cywovtfwvqwcqqrsxyjanddbppxdcbbjhjazzht',
            'color' => '#fe5c77$/m',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/categories/11'
payload = {
    "name": "cywovtfwvqwcqqrsxyjanddbppxdcbbjhjazzht",
    "color": "#fe5c77$\/m"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Bug",
        "color": "#ABDEE6"
    }
}
 

Example response (404):


{
    "message": "Category not found."
}
 

Example response (403):


{
    "message": "You do not have permission to update this category."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "name": [
            "The name has already been taken.",
            "The name must be at least 2 characters.",
            "The name may not be greater than 60 characters."
        ],
        "color": [
            "The color format is invalid. It should be a valid hex color code (e.g., #FF5733)."
        ]
    }
}
 

Request   

PATCH api/v1/categories/{id}

URL Parameters

id  integer  

The ID of the category.

Body Parameters

name  string  

Name of the category. Must be at least 2 characters. Must not be greater than 60 characters.

color  string  

Hex color code for the category. The value format is invalid.

Comments

Comments can be added to posts. Each post can have multiple comments.

List comments

requires authentication

Retrieves all comments for a specific post.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": null,
            "comment": "Yes 😍",
            "author": {
                "id": "4d47819a-fa99-4319-95f4-f4c30c7e86e4",
                "name": "oubiha mohamed",
                "email": "mohaoubiha@gmail.com",
                "role": "member",
                "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
                "avatar_small_url": "https://www.gravatar.com/avatar/13e445aeb61694eb2109326d7e611bcb?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/oubiha+mohamed/60/8FCACA/003434",
                "counter_votes": 0,
                "counter_comments": 0,
                "counter_posts": 0,
                "counter_comment_votes": 0,
                "created_at": "2023-03-28T15:25:31.000000Z",
                "is_blocked": 0,
                "verified": true,
                "admin_accepted": 0,
                "sso_uid": "74899",
                "sso_avatar_url": null,
                "company": null,
                "segment_1": null,
                "segment_2": null,
                "segment_3": null,
                "segment_4": null,
                "segment_5": null,
                "segment_6": null,
                "segment_7": null,
                "segment_8": null,
                "segment_9": null,
                "segment_10": null,
                "segment_mrr": null,
                "segment_arr": null,
                "segment_ltv": null,
                "email_unsubscribed_at": null
            },
            "pinned_to_top": false,
            "tagged_for_changelog": false,
            "parent_id": null,
            "created_at": null,
            "updated_at": null,
            "url": "{YOUR-PORTAL-URL}/p/example-slug-123456#comment_123"
        },
        {
            "id": null,
            "comment": "When can this be available?",
            "author": {
                "id": "fff9da8d-5f5d-45f8-a530-4fa23e9676c2",
                "name": "Bruce Wayne",
                "email": "dioman.ko@gmail.com",
                "role": "member",
                "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
                "avatar_small_url": "https://www.gravatar.com/avatar/82dab8351e0c037ba871fb4a25b06c39?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Bruce+Wayne/60/FFC8A2/69320c",
                "counter_votes": 0,
                "counter_comments": 0,
                "counter_posts": 0,
                "counter_comment_votes": 0,
                "created_at": "2024-04-26T19:44:06.000000Z",
                "is_blocked": 0,
                "verified": false,
                "admin_accepted": 1,
                "sso_uid": null,
                "sso_avatar_url": null,
                "company": null,
                "segment_1": null,
                "segment_2": null,
                "segment_3": null,
                "segment_4": null,
                "segment_5": null,
                "segment_6": null,
                "segment_7": null,
                "segment_8": null,
                "segment_9": null,
                "segment_10": null,
                "segment_mrr": null,
                "segment_arr": null,
                "segment_ltv": null,
                "email_unsubscribed_at": null
            },
            "pinned_to_top": false,
            "tagged_for_changelog": false,
            "parent_id": null,
            "created_at": null,
            "updated_at": null,
            "url": "{YOUR-PORTAL-URL}/p/example-slug-123456#comment_123"
        }
    ]
}
 

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Request   

GET api/v1/posts/{postId}/comments

URL Parameters

postId  string  

The unique key of the post.

Create comment

requires authentication

Adds a new comment to a specific post.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": \"ad80d9df-d5e4-3b3b-b8b4-cc4599aa64dc\",
    \"comment\": \"This is a new comment\",
    \"parent_id\": 1,
    \"tagged_for_changelog\": \"true\",
    \"pinned_to_top\": \"true\",
    \"created_at\": \"2023-08-11 14:30:00\",
    \"use_for_changelog\": false,
    \"pin_to_top\": false
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments"
);

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

let body = {
    "user_id": "ad80d9df-d5e4-3b3b-b8b4-cc4599aa64dc",
    "comment": "This is a new comment",
    "parent_id": 1,
    "tagged_for_changelog": "true",
    "pinned_to_top": "true",
    "created_at": "2023-08-11 14:30:00",
    "use_for_changelog": false,
    "pin_to_top": false
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user_id' => 'ad80d9df-d5e4-3b3b-b8b4-cc4599aa64dc',
            'comment' => 'This is a new comment',
            'parent_id' => 1,
            'tagged_for_changelog' => 'true',
            'pinned_to_top' => 'true',
            'created_at' => '2023-08-11 14:30:00',
            'use_for_changelog' => false,
            'pin_to_top' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/abc123/comments'
payload = {
    "user_id": "ad80d9df-d5e4-3b3b-b8b4-cc4599aa64dc",
    "comment": "This is a new comment",
    "parent_id": 1,
    "tagged_for_changelog": "true",
    "pinned_to_top": "true",
    "created_at": "2023-08-11 14:30:00",
    "use_for_changelog": false,
    "pin_to_top": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": null,
        "comment": "Nice! This sounds good :)",
        "author": {
            "id": "773e7602-fdfb-4a33-bd09-9b743ff3986d",
            "name": "Bruce Wayne",
            "email": "joelbrgal@yahoo.com",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/1ab56f4055fb400aee2f37224ffe079d?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Bruce+Wayne/60/FFC8A2/69320c",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-04-26T10:41:04.000000Z",
            "is_blocked": 0,
            "verified": false,
            "admin_accepted": 1,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        },
        "pinned_to_top": false,
        "tagged_for_changelog": false,
        "parent_id": null,
        "created_at": null,
        "updated_at": null,
        "url": "{YOUR-PORTAL-URL}/p/example-slug-123456#comment_123"
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "comment": [
            "The comment field is required."
        ]
    }
}
 

Request   

POST api/v1/posts/{postId}/comments

URL Parameters

postId  string  

The unique key of the post.

Body Parameters

user_id  string  

Must be a valid UUID.

comment  string  

The content of the comment.

parent_id  integer optional  

nullable The ID of the parent comment if this is a reply.

tagged_for_changelog  string optional  

Must be one of true, false, 0, or 1.

pinned_to_top  string optional  

Must be one of true, false, 0, or 1.

created_at  string optional  

nullable The creation timestamp of the comment.

use_for_changelog  boolean optional  

nullable Whether to tag this comment for changelog.

pin_to_top  boolean optional  

nullable Whether to pin this comment to the top.

Update comment

requires authentication

Updates the details of a comment.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/comments/17" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"comment\": \"This is an updated comment\",
    \"parent_id\": 1,
    \"tagged_for_changelog\": \"1\",
    \"pinned_to_top\": \"0\",
    \"created_at\": \"2023-08-11 14:30:00\",
    \"use_for_changelog\": false,
    \"pin_to_top\": false
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/comments/17"
);

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

let body = {
    "comment": "This is an updated comment",
    "parent_id": 1,
    "tagged_for_changelog": "1",
    "pinned_to_top": "0",
    "created_at": "2023-08-11 14:30:00",
    "use_for_changelog": false,
    "pin_to_top": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/comments/17',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'comment' => 'This is an updated comment',
            'parent_id' => 1,
            'tagged_for_changelog' => '1',
            'pinned_to_top' => '0',
            'created_at' => '2023-08-11 14:30:00',
            'use_for_changelog' => false,
            'pin_to_top' => false,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/comments/17'
payload = {
    "comment": "This is an updated comment",
    "parent_id": 1,
    "tagged_for_changelog": "1",
    "pinned_to_top": "0",
    "created_at": "2023-08-11 14:30:00",
    "use_for_changelog": false,
    "pin_to_top": false
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": null,
        "comment": "Yes 😍",
        "author": {
            "id": "54c08278-692d-4d27-a500-c1787cc9d32b",
            "name": "Bruce Wayne",
            "email": "clchandre@premiercollections.be",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/b6101e392410bae54f59163678332d19?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Bruce+Wayne/60/FFC8A2/69320c",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-04-19T08:29:32.000000Z",
            "is_blocked": 0,
            "verified": false,
            "admin_accepted": 1,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        },
        "pinned_to_top": false,
        "tagged_for_changelog": false,
        "parent_id": null,
        "created_at": null,
        "updated_at": null,
        "url": "{YOUR-PORTAL-URL}/p/example-slug-123456#comment_123"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Comment] ..."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "comment": [
            "The comment field is required."
        ]
    }
}
 

Request   

PUT api/v1/comments/{id}

URL Parameters

id  integer  

The ID of the comment.

Body Parameters

comment  string  

The content of the comment.

parent_id  integer optional  

nullable The ID of the parent comment if this is a reply.

tagged_for_changelog  string optional  

Must be one of true, false, 0, or 1.

pinned_to_top  string optional  

Must be one of true, false, 0, or 1.

created_at  string optional  

nullable The creation timestamp of the comment.

use_for_changelog  boolean optional  

nullable Whether to tag this comment for changelog.

pin_to_top  boolean optional  

nullable Whether to pin this comment to the top.

Delete comment

requires authentication

Deletes a specified comment.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/comments/16" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/comments/16"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/comments/16',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/comments/16'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Comment] ..."
}
 

Request   

DELETE api/v1/comments/{id}

URL Parameters

id  integer  

The ID of the comment.

Feedback

Handles operations related to user feedback including listing, creating, updating, deleting, and analyzing feedback.

List feedback

requires authentication

Retrieves a collection of all feedback entries, ordered by creation date in descending order.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/feedback" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/feedback"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/feedback',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/feedback'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request   

GET api/v1/feedback

Create feedback

requires authentication

Stores a new feedback entry in the database.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/feedback" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"deleniti\",
    \"feedback\": \"totam\",
    \"user_id\": \"190a6b17-3a7d-3b22-a61d-a92c3af6bcc4\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/feedback"
);

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

let body = {
    "type": "deleniti",
    "feedback": "totam",
    "user_id": "190a6b17-3a7d-3b22-a61d-a92c3af6bcc4"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/feedback',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'type' => 'deleniti',
            'feedback' => 'totam',
            'user_id' => '190a6b17-3a7d-3b22-a61d-a92c3af6bcc4',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/feedback'
payload = {
    "type": "deleniti",
    "feedback": "totam",
    "user_id": "190a6b17-3a7d-3b22-a61d-a92c3af6bcc4"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "feedback": [
            "The feedback field is required."
        ]
    }
}
 

Request   

POST api/v1/feedback

Body Parameters

type  string  

feedback  string  

user_id  string optional  

Optional user ID. If not given or not found, the post will be created from the logged in user or anonymous. Must be a valid UUID.

Update feedback

requires authentication

Updates an existing feedback entry.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/feedback/et" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"feedback\": \"et\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/feedback/et"
);

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

let body = {
    "feedback": "et"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/feedback/et',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'feedback' => 'et',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/feedback/et'
payload = {
    "feedback": "et"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (404):


{
    "message": "No query results for model [App\\Models\\Feedback] ..."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "feedback": [
            "The feedback field must be given."
        ]
    }
}
 

Request   

PUT api/v1/feedback/{id}

URL Parameters

id  string  

The ID of the feedback.

Body Parameters

feedback  string  

Delete feedback

requires authentication

Removes a specified feedback entry from the database.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/feedback/consequatur" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/feedback/consequatur"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/feedback/consequatur',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/feedback/consequatur'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Models\\Feedback] ..."
}
 

Request   

DELETE api/v1/feedback/{id}

URL Parameters

id  string  

The ID of the feedback.

Summarize feedback

requires authentication

Generates a summary of filtered feedback using AI analysis.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/feedback/summarize" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"sentiment\": \"positive\",
    \"focus\": \"functionality\",
    \"source\": \"commodi\",
    \"widget\": \"150bb1c8-0c18-31de-ac3a-d421fd7e6e5f\",
    \"created_from\": \"2024-11-23T22:11:29\",
    \"created_to\": \"2024-11-23T22:11:29\",
    \"keyword\": \"ea\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/feedback/summarize"
);

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

let body = {
    "sentiment": "positive",
    "focus": "functionality",
    "source": "commodi",
    "widget": "150bb1c8-0c18-31de-ac3a-d421fd7e6e5f",
    "created_from": "2024-11-23T22:11:29",
    "created_to": "2024-11-23T22:11:29",
    "keyword": "ea"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/feedback/summarize',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'sentiment' => 'positive',
            'focus' => 'functionality',
            'source' => 'commodi',
            'widget' => '150bb1c8-0c18-31de-ac3a-d421fd7e6e5f',
            'created_from' => '2024-11-23T22:11:29',
            'created_to' => '2024-11-23T22:11:29',
            'keyword' => 'ea',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/feedback/summarize'
payload = {
    "sentiment": "positive",
    "focus": "functionality",
    "source": "commodi",
    "widget": "150bb1c8-0c18-31de-ac3a-d421fd7e6e5f",
    "created_from": "2024-11-23T22:11:29",
    "created_to": "2024-11-23T22:11:29",
    "keyword": "ea"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Request   

POST api/v1/feedback/summarize

Body Parameters

sentiment  string optional  

Must be one of positive, neutral, or negative.

focus  string optional  

Must be one of usability, functionality, or value.

source  string optional  

widget  string optional  

Must be a valid UUID.

created_from  string optional  

Must be a valid date.

created_to  string optional  

Must be a valid date.

keyword  string optional  

Groups

Group management lets you organize users, control access, and customize experiences. Use it for focus groups, beta tests, customer segments, or team organization. After creating groups, you can set tab visibility for specific groups and choose who can access them.

List groups

requires authentication

Lists all groups.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "024fbe81-0c1c-4b7e-81d2-d89659c9d6b1",
            "portal_id": 3674,
            "name": "Sureders",
            "description": null,
            "created_at": "2024-10-21T17:15:47.000000Z",
            "updated_at": "2024-10-21T17:15:47.000000Z"
        },
        {
            "id": "024fbe81-0c1c-4b7e-81d2-d89659c9d6b1",
            "portal_id": 3674,
            "name": "Sureders",
            "description": null,
            "created_at": "2024-10-21T17:15:47.000000Z",
            "updated_at": "2024-10-21T17:15:47.000000Z"
        }
    ]
}
 

Request   

GET api/v1/groups

Create group

requires authentication

Creates a new group.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/groups" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"description\": \"occaecati\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups"
);

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

let body = {
    "description": "occaecati"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/groups',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'description' => 'occaecati',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups'
payload = {
    "description": "occaecati"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "024fbe81-0c1c-4b7e-81d2-d89659c9d6b1",
        "portal_id": 3674,
        "name": "Sureders",
        "description": null,
        "created_at": "2024-10-21T17:15:47.000000Z",
        "updated_at": "2024-10-21T17:15:47.000000Z"
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "name": [
            "The name has already been taken."
        ]
    }
}
 

Request   

POST api/v1/groups

Body Parameters

name  string optional  

description  string optional  

Show group

requires authentication

Displays details of a specific group.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/groups/9" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/9"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/groups/9',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/9'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "024fbe81-0c1c-4b7e-81d2-d89659c9d6b1",
        "portal_id": 3674,
        "name": "Sureders",
        "description": null,
        "created_at": "2024-10-21T17:15:47.000000Z",
        "updated_at": "2024-10-21T17:15:47.000000Z"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Group] ..."
}
 

Request   

GET api/v1/groups/{id}

URL Parameters

id  integer  

The ID of the group.

Update group

requires authentication

Updates the details of a group.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/groups/2" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"description\": \"quibusdam\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/2"
);

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

let body = {
    "description": "quibusdam"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/groups/2',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'description' => 'quibusdam',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/2'
payload = {
    "description": "quibusdam"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "024fbe81-0c1c-4b7e-81d2-d89659c9d6b1",
        "portal_id": 3674,
        "name": "Sureders",
        "description": null,
        "created_at": "2024-10-21T17:15:47.000000Z",
        "updated_at": "2024-10-21T17:15:47.000000Z"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Group] ..."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "name": [
            "The name has already been taken."
        ]
    }
}
 

Request   

PUT api/v1/groups/{id}

PATCH api/v1/groups/{id}

URL Parameters

id  integer  

The ID of the group.

Body Parameters

name  string optional  

description  string optional  

Delete group

requires authentication

Deletes a specified group.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/groups/13" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/13"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/groups/13',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/13'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "message": "Group deleted successfully"
}
 

Example response (404):


{
    "message": "No query results for model [App\\Group] ..."
}
 

Request   

DELETE api/v1/groups/{id}

URL Parameters

id  integer  

The ID of the group.

Add user to group

requires authentication

Adds a user to the specified group.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/groups/soluta/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": 20
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/soluta/users"
);

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

let body = {
    "user_id": 20
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/groups/soluta/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user_id' => 20,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/soluta/users'
payload = {
    "user_id": 20
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "message": "User added to group successfully"
}
 

Example response (404):


{
    "message": "Group or User not found"
}
 

Example response (422):


{
    "message": "User is already in the group"
}
 

Request   

POST api/v1/groups/{group}/users

URL Parameters

group  string  

id  integer  

The ID of the group.

Body Parameters

user_id  integer  

The ID of the user to add.

Remove user from group

requires authentication

Removes a user from the specified group.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/groups/dignissimos/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_id\": 4
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/dignissimos/users"
);

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

let body = {
    "user_id": 4
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/groups/dignissimos/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'user_id' => 4,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/dignissimos/users'
payload = {
    "user_id": 4
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "message": "User removed from group successfully"
}
 

Example response (404):


{
    "message": "Group or User not found"
}
 

Example response (422):


{
    "message": "User is not in the group"
}
 

Request   

DELETE api/v1/groups/{group}/users

URL Parameters

group  string  

id  integer  

The ID of the group.

Body Parameters

user_id  integer  

The ID of the user to remove.

Get users in group

requires authentication

Retrieves all users belonging to a specific group.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/groups/et/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/groups/et/users"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/groups/et/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/groups/et/users'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "83d3c512-9e0a-4369-b8b3-a9fc01165712",
            "name": "Mortimer",
            "email": "oran65@example.org",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/329f3191dd442618247b279b9c272cbb?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Mortimer/60/8FCACA/003434",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-11-23T22:11:29.000000Z",
            "is_blocked": null,
            "verified": null,
            "admin_accepted": null,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        },
        {
            "id": "69a7a6d0-cd52-4844-a4a7-01e3fd89a68f",
            "name": "Vicky",
            "email": "carter.feeney@example.net",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/58167300da9283ed3274171644260c29?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Vicky/60/FFAEA5/69180f",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-11-23T22:11:29.000000Z",
            "is_blocked": null,
            "verified": null,
            "admin_accepted": null,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        }
    ]
}
 

Example response (200):


{
  "data": [
    {
      "id": 1,
      "name": "John Doe",
      "email": "john@example.com",
      // ... other user attributes
    },
    // ... more users
  ]
}
 

Example response (404):


{
    "message": "No query results for model [App\\Group] ..."
}
 

Request   

GET api/v1/groups/{group}/users

URL Parameters

group  string  

id  integer  

The ID of the group.

Moderation

Handles operations related to post and comment moderation including listing pending and rejected items, approving, and rejecting them.

Get pending items

requires authentication

Retrieves all posts and comments with a moderation status of 'pending'.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/moderation/pending" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/moderation/pending"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/moderation/pending',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/moderation/pending'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request   

GET api/v1/moderation/pending

Get rejected items

requires authentication

Retrieves all posts and comments with a moderation status of 'rejected'.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/moderation/rejected" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/moderation/rejected"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/moderation/rejected',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/moderation/rejected'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 57
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request   

GET api/v1/moderation/rejected

Reject item (post or comment)

requires authentication

Updates the specified post or comment's moderation status to 'rejected'.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/moderation/reject/quam/dolor" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/moderation/reject/quam/dolor"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/moderation/reject/quam/dolor',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/moderation/reject/quam/dolor'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request   

POST api/v1/moderation/reject/{type}/{identifier}

URL Parameters

type  string  

identifier  string  

Approve item (post or comment)

requires authentication

Updates the specified post or comment's moderation status to 'approved'.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/moderation/approve/quisquam/iste" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/moderation/approve/quisquam/iste"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/moderation/approve/quisquam/iste',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/moderation/approve/quisquam/iste'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request   

POST api/v1/moderation/approve/{type}/{identifier}

URL Parameters

type  string  

identifier  string  

Other endpoints

PUT api/v1/posts/{key}/toggle-publish

requires authentication

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/posts/17/toggle-publish" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/17/toggle-publish"
);

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

fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/posts/17/toggle-publish',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/17/toggle-publish'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Request   

PUT api/v1/posts/{key}/toggle-publish

URL Parameters

key  integer  

Portal

You should see a portal as a single project for your product or service. It can consist of roadmaps, changelogs, voting boards, etc.

Get portal

requires authentication

Retrieves the details of your portal.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/portal" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/portal"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/portal',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/portal'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "guid": "c94866a3-253c-45c3-8190-334241949587",
        "title": "velit quo",
        "localization": "en"
    }
}
 

Request   

GET api/v1/portal

Posts

Manage posts.

Find duplicates

requires authentication

Searches the database for duplicate posts.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/posts/search_duplicates" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/search_duplicates"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/posts/search_duplicates',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/search_duplicates'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
 "count": 0,
}
 

Example response (200):


{
 "count": 1,
 "posts": {
             {
                 "id": "d8QEXH",
                 "title": "Open links in new window",
                 "description": "Option to open links in a new window."
              }
          }
}
 

Request   

GET api/v1/posts/search_duplicates

Create post

requires authentication

Creates a new post in your portal.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/posts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "title=herudolklrwthpogazynkwerfttygmfaggwopamcriznpc" \
    --form "description=quia" \
    --form "category_id=18" \
    --form "status_id=8" \
    --form "section_id=8" \
    --form "user_id=9c79235a-348c-3e71-8441-3a89f5fb5a69" \
    --form "allow_comments=1" \
    --form "jira_key=omnis" \
    --form "azure_boards_key=doloribus" \
    --form "estimated_date=2024-11-23T22:11:28" \
    --form "tags[]=rrzvryhjgnfazebketscvgitfvlvdttitulnovlukkpajssvhezzuoc" \
    --form "created_at=2024-11-23T22:11:28" \
    --form "prioritization_impact=1" \
    --form "prioritization_confidence=74" \
    --form "prioritization_ease=92" \
    --form "prioritization_reach=37" \
    --form "moscow_priority=W" \
    --form "prioritization_color=sbvw" \
    --form "manual_bonus_votes=7" \
    --form "is_published=0" \
    --form "image=@/tmp/phpJLGPya" \
    --form "attachment=@/tmp/phpRnEd47" 
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts"
);

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

const body = new FormData();
body.append('title', 'herudolklrwthpogazynkwerfttygmfaggwopamcriznpc');
body.append('description', 'quia');
body.append('category_id', '18');
body.append('status_id', '8');
body.append('section_id', '8');
body.append('user_id', '9c79235a-348c-3e71-8441-3a89f5fb5a69');
body.append('allow_comments', '1');
body.append('jira_key', 'omnis');
body.append('azure_boards_key', 'doloribus');
body.append('estimated_date', '2024-11-23T22:11:28');
body.append('tags[]', 'rrzvryhjgnfazebketscvgitfvlvdttitulnovlukkpajssvhezzuoc');
body.append('created_at', '2024-11-23T22:11:28');
body.append('prioritization_impact', '1');
body.append('prioritization_confidence', '74');
body.append('prioritization_ease', '92');
body.append('prioritization_reach', '37');
body.append('moscow_priority', 'W');
body.append('prioritization_color', 'sbvw');
body.append('manual_bonus_votes', '7');
body.append('is_published', '0');
body.append('image', document.querySelector('input[name="image"]').files[0]);
body.append('attachment', document.querySelector('input[name="attachment"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/posts',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'title',
                'contents' => 'herudolklrwthpogazynkwerfttygmfaggwopamcriznpc'
            ],
            [
                'name' => 'description',
                'contents' => 'quia'
            ],
            [
                'name' => 'category_id',
                'contents' => '18'
            ],
            [
                'name' => 'status_id',
                'contents' => '8'
            ],
            [
                'name' => 'section_id',
                'contents' => '8'
            ],
            [
                'name' => 'user_id',
                'contents' => '9c79235a-348c-3e71-8441-3a89f5fb5a69'
            ],
            [
                'name' => 'allow_comments',
                'contents' => '1'
            ],
            [
                'name' => 'jira_key',
                'contents' => 'omnis'
            ],
            [
                'name' => 'azure_boards_key',
                'contents' => 'doloribus'
            ],
            [
                'name' => 'estimated_date',
                'contents' => '2024-11-23T22:11:28'
            ],
            [
                'name' => 'tags[]',
                'contents' => 'rrzvryhjgnfazebketscvgitfvlvdttitulnovlukkpajssvhezzuoc'
            ],
            [
                'name' => 'created_at',
                'contents' => '2024-11-23T22:11:28'
            ],
            [
                'name' => 'prioritization_impact',
                'contents' => '1'
            ],
            [
                'name' => 'prioritization_confidence',
                'contents' => '74'
            ],
            [
                'name' => 'prioritization_ease',
                'contents' => '92'
            ],
            [
                'name' => 'prioritization_reach',
                'contents' => '37'
            ],
            [
                'name' => 'moscow_priority',
                'contents' => 'W'
            ],
            [
                'name' => 'prioritization_color',
                'contents' => 'sbvw'
            ],
            [
                'name' => 'manual_bonus_votes',
                'contents' => '7'
            ],
            [
                'name' => 'is_published',
                'contents' => '0'
            ],
            [
                'name' => 'image',
                'contents' => fopen('/tmp/phpJLGPya', 'r')
            ],
            [
                'name' => 'attachment',
                'contents' => fopen('/tmp/phpRnEd47', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts'
files = {
  'image': open('/tmp/phpJLGPya', 'rb'),
  'attachment': open('/tmp/phpRnEd47', 'rb')
}
payload = {
    "title": "herudolklrwthpogazynkwerfttygmfaggwopamcriznpc",
    "description": "quia",
    "category_id": 18,
    "status_id": 8,
    "section_id": 8,
    "user_id": "9c79235a-348c-3e71-8441-3a89f5fb5a69",
    "allow_comments": "1",
    "jira_key": "omnis",
    "azure_boards_key": "doloribus",
    "estimated_date": "2024-11-23T22:11:28",
    "tags": [
        "rrzvryhjgnfazebketscvgitfvlvdttitulnovlukkpajssvhezzuoc"
    ],
    "created_at": "2024-11-23T22:11:28",
    "prioritization_impact": 1,
    "prioritization_confidence": 74,
    "prioritization_ease": 92,
    "prioritization_reach": 37,
    "moscow_priority": "W",
    "prioritization_color": "sbvw",
    "manual_bonus_votes": 7,
    "is_published": "0"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'multipart/form-data',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, files=files, data=payload)
response.json()

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
   "user_id": [
     "The user id must be a valid UUID."
   ]
}
 

Example response (200):


{
    "data": {
        "id": "WEukJy",
        "uid": "WEukJy-uid",
        "title": "Photo upload",
        "description_short": "It would be great if I can upload a photo.",
        "description": "It would be great if I can upload a photo. This feature would allow users to share visual content directly within the platform.",
        "description_changelog": "Added photo upload functionality to enhance user experience.",
        "clean_description_changelog": "Added photo upload functionality to enhance user experience.",
        "image_main": "https://example.com/images/photo-upload.jpg",
        "votes_count": 15,
        "comments_count": 3,
        "views_count": 100,
        "url": "https://your-portal-url.com/p/photo-upload-WEukJy",
        "url_edit": "https://your-portal-url.com/admin/posts/edit/WEukJy",
        "url_delete": "https://your-portal-url.com/admin/posts/delete/WEukJy",
        "created_at": "2023-05-15T10:00:00Z",
        "updated_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at_formatted": "16 May 2023",
        "author": {
            "id": "420b8cfb-2c3d-4df2-b6bd-7ac6aae1a14a",
            "name": "Madalyn",
            "email": "robyn.oconner@example.net",
            "role": "member",
            "counter_votes": 4,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0
        },
        "categories": [
            {
                "id": 3,
                "name": "Integration",
                "color": "#FFAEA5"
            }
        ],
        "status": {
            "id": 3,
            "name": "💪 Now available",
            "color": "#FFCCB6",
            "tab_name": "Updates"
        },
        "section_id": 2,
        "moderation_status": "approved",
        "conversion": 0.75,
        "prioritization_impact": 8,
        "prioritization_confidence": 7,
        "prioritization_ease": 6,
        "prioritization_reach": 9
    }
}
 

Request   

POST api/v1/posts

Body Parameters

title  string  

Post title. Must be at least 2 characters. Must not be greater than 180 characters.

description  string optional  

Description of the post.

category_id  integer optional  

Optional category ID of the post. If not given or not found, no category will be added.

status_id  integer optional  

Optional status ID of the post. If not given or not found, the default status will be selected.

section_id  integer optional  

Optional section ID of the post. If not given or not found, it will be null.

user_id  string optional  

Optional user ID. If not given or not found, the post will be created from the logged in user or anonymous. Must be a valid UUID.

image  file optional  

Optional image. Must be an image. Must not be greater than 20480 kilobytes.

attachment  file optional  

Optional attachment. Must be a file. Must not be greater than 5240 kilobytes.

allow_comments  string optional  

Optional: Allow comments on this post. Defaults to true if not specified. Must be one of true, false, 0, or 1.

jira_key  string optional  

Optional: JIRA issue key associated with this post.

azure_boards_key  string optional  

Optional: Azure Boards work item key associated with this post.

estimated_date  string optional  

Optional: Estimated completion date for this post. Must be a valid date.

tags  string[] optional  

Each tag must be a string of at least 2 characters. Must be at least 2 characters. Must not be greater than 60 characters.

created_at  string optional  

Optional: Creation date of the post. Must be a valid date.

prioritization_impact  integer optional  

Optional: Impact score for prioritization (null or tinyint between 0 and 100). Must be between 0 and 100.

prioritization_confidence  integer optional  

Optional: Confidence score for prioritization (null or tinyint between 0 and 100). Must be between 0 and 100.

prioritization_ease  integer optional  

Optional: Ease score for prioritization (null or tinyint between 0 and 100). Must be between 0 and 100.

prioritization_reach  integer optional  

Optional: Reach score for prioritization (null or tinyint between 0 and 100). Must be between 0 and 100.

moscow_priority  string optional  

Optional: MoSCoW score for prioritization. (Can be null or M,S,C,W). Must be one of M, S, C, or W.

prioritization_color  string optional  

Optional: Color hex for status of prioritization. Must not be greater than 7 characters.

manual_bonus_votes  integer optional  

Optional: Manual bonus votes for the post.

is_published  string optional  

Optional: Publish as draft (false) or directly visible. Must be one of true, false, 0, or 1.

Get post

requires authentication

Retrieves the details of a specified post.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/posts/7" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/7"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/posts/7',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/7'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Example response (200):


{
    "data": {
        "id": "WEukJy",
        "uid": "WEukJy-uid",
        "title": "Photo upload",
        "description_short": "It would be great if I can upload a photo.",
        "description": "It would be great if I can upload a photo. This feature would allow users to share visual content directly within the platform.",
        "description_changelog": "Added photo upload functionality to enhance user experience.",
        "clean_description_changelog": "Added photo upload functionality to enhance user experience.",
        "image_main": "https://example.com/images/photo-upload.jpg",
        "votes_count": 15,
        "comments_count": 3,
        "views_count": 100,
        "url": "https://your-portal-url.com/p/photo-upload-WEukJy",
        "url_edit": "https://your-portal-url.com/admin/posts/edit/WEukJy",
        "url_delete": "https://your-portal-url.com/admin/posts/delete/WEukJy",
        "created_at": "2023-05-15T10:00:00Z",
        "updated_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at_formatted": "16 May 2023",
        "author": {
            "id": "420b8cfb-2c3d-4df2-b6bd-7ac6aae1a14a",
            "name": "Madalyn",
            "email": "robyn.oconner@example.net",
            "role": "member",
            "counter_votes": 4,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0
        },
        "categories": [
            {
                "id": 3,
                "name": "Integration",
                "color": "#FFAEA5"
            }
        ],
        "status": {
            "id": 3,
            "name": "💪 Now available",
            "color": "#FFCCB6",
            "tab_name": "Updates"
        },
        "section_id": 2,
        "moderation_status": "approved",
        "conversion": 0.75,
        "prioritization_impact": 8,
        "prioritization_confidence": 7,
        "prioritization_ease": 6,
        "prioritization_reach": 9
    }
}
 

Request   

GET api/v1/posts/{post}

URL Parameters

post  integer  

id  string  

The ID of the post.

Update post

requires authentication

Updates the specified post by setting the values of the parameters passed. Any parameters not provided will be left unchanged. This endpoint allows for updating the post's general attributes, status, and tags.

Example request:
curl --request PATCH \
    "{YOUR_PORTAL_URL}/api/v1/posts/8" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"byzugcrzwdghemzmhzpvclnclqvvuajzphsznshsacthecumrcucdixwlzttwqrfjppxkcfiipifyvsidparxizskmpkouyfucwrlhshqhhajfxrgnzi\",
    \"description\": \"culpa\",
    \"user_id\": \"94fd1e45-81ca-3436-8248-761e96ef48bf\",
    \"section_id\": 516373.20906,
    \"allow_comments\": \"true\",
    \"jira_key\": \"iste\",
    \"azure_boards_key\": \"itaque\",
    \"estimated_date\": \"2024-11-23T22:11:28\",
    \"status\": 2.57134468,
    \"status_update_email\": \"zmnborucbfrcbxymwsseciucrjsodghmzizxlljedulnzwyayvhtqmdofwvhwijncaeyyaqjrruobxdejiiqpxxjsbydrjllyonbrxgmefbhooppgnwwpvfymndqskklvntscimbmqqarjklchqvjuljadeqvmcjffikkizuazpofxwuaztalcydmoupaiosuozzzdgppgqomqjodkufkzcwnluuvyxqshuojpkxxqvfsjtwwrsixhhzfafogxhracucnctzsaxdddgtwukwpqpidwwxlvmuxrjpcwbhfctxjrymvyzexgsqqlhjjybes\",
    \"status_update_comment\": \"cesqqewskgynmlyiorovdaspbmojknzoceejqeiekygacqllvucwvclqtxokmuxnmqbrdgqlgccfgkukphbaufcyrdixtwdrjeuflexuzdzgqatriiznlyigikyhbbagcktneaiukumcrnljomgkstsijsuternbynyfnoasxssrswdavorsxavbuydebidygqzqkxkmwwmlagodbktahcesszawcporhfjxbpvucmxiwjicoqbvbasccownkcaortfhkrauwrjllvactuqbivkxdiycvjdiqghzwiyjgoyxnvuysuuwykvfpimxbxrimzozedhioutwtjgjvvfbpkbjvolybzlfucgvvkdkbabjsyqthzofqjcfbjxynzjzemxplpgvkyrlqtfwvqamyinomjnfeccpdhmfltowbcpxfowzikhxqzgttkfcnkmbkmahckhhezwnzwscangzhvkyhddzjokcsrdzabwdcrwewyecnxjlvkmjvwqkwhwacabrfegbvxbqmqbvtxgsyzljlofawqkbaqqkwbgushjxovlmdwkifxcvgprommxohkmxzammvokglqpyhaajqnygsstazddaogquuswuokwuaabzxfzndxfadsarlnlwhemndnmsznrblmygdgogdhnvdaswwrmxffddgtjvhzasfpltwbpgprihapcojdczjtnqxepqprnjdgwstzymoexdsnqqpvgudwesmuhvwludznuqddypcjrqqrbuklvfotvjixkselopyorplpqujdpsqoaqextjcrgoysqjpxheiixmjadvtcrfubhcshrqbvatghsjeankuzidtqrxllywexmcqcvhidjxhomlohehkjqqtsjfeoubtrtcihtppdaichibhgsykzkysmehrlvenjqxhujhpeocxicbaugkbrkllkmcyrjubkuelggoxlneypdncsucfqhrmtsqlvyxlcewpsnvjxltcpkmdnpkgwrrrzrnicqdyiohvvuilfjzevoahbjttepercykmiskcqqksmyvrkluiqjxmqqthrsonttiqvpmvgaeqwihpsyfcgrdxmhjfstggakytobnvgkalksrtxmxeciwwqmgoxcsuubgzzaxhqzigxcslmruhnmcyeicgcwjhbyyihwvaiafiptjwaymrgnkgwgxtrmulzquulogjufievzbrdjbjrkdxudzledzareisemtqottilfeshwszjctlaaimlsulyuupjebjmiwvuutsgcnkzuknybkzaoliyqypyswgbgkdhqxdmraxxstweenfghdiawnffyxtbrrfplxggkkvvgsoyzfmgscchwawsdqictycpyffqdcwwcmkxnyryhajzndwbllkkckcpmeqojbaecaiaewurjepuktxxnmunruvqfmmtuggxjmwdwtytdtymizklofnpdzbhmvjledogltfkhuqzgsmcuggnvbxaqyfrgjoypdzwdfuextnqmgbnidbaeqvqcbpkrlpexunsfjkwofcosvhtpcuijajieqoaeoclirqwdphochtufxbohnnusiblcgltrmiqgfilcspgekakunxwcpcaeffmxdrpbhzzorczuiqjozlyslcatxffxgxrtmgcglxjwdforcdlapgfsnflpqtdhhntzcobabghnugjfamatojllfdpyhoktqmmqsjeozoasublvsdtioihbzzeahlfbywdosczvcvmdqldhqipmwfitswvvjdgwntegybfzdstdvqmhwbmkwfrqclfrkurjtsuinbpwnmvlmmdhmaaftlfpgjazhugbxmipaocbjlyhmwzrgmzmsasiyqrksztzekgtbdmcagvyoyfwebmrzdzksmynpquljuhyvckrnpjbvaprmeofbknqqaeflwjfqmmyahtduucxsthpiskysa\",
    \"status_update_replace_prior\": \"debitis\",
    \"status_update_comment_tagged_for_changelog\": \"false\",
    \"status_update_comment_pinned_to_top\": \"0\",
    \"tags\": [
        \"waovhdjdsupwlxibgmntsydhzgdvtiafbow\"
    ],
    \"category_id\": 11,
    \"created_at\": \"2024-11-23T22:11:28\",
    \"prioritization_impact\": 98,
    \"prioritization_confidence\": 80,
    \"prioritization_ease\": 38,
    \"prioritization_reach\": 9,
    \"moscow_priority\": \"W\",
    \"prioritization_color\": \"\",
    \"manual_bonus_votes\": 11,
    \"is_published\": \"1\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/8"
);

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

let body = {
    "title": "byzugcrzwdghemzmhzpvclnclqvvuajzphsznshsacthecumrcucdixwlzttwqrfjppxkcfiipifyvsidparxizskmpkouyfucwrlhshqhhajfxrgnzi",
    "description": "culpa",
    "user_id": "94fd1e45-81ca-3436-8248-761e96ef48bf",
    "section_id": 516373.20906,
    "allow_comments": "true",
    "jira_key": "iste",
    "azure_boards_key": "itaque",
    "estimated_date": "2024-11-23T22:11:28",
    "status": 2.57134468,
    "status_update_email": "zmnborucbfrcbxymwsseciucrjsodghmzizxlljedulnzwyayvhtqmdofwvhwijncaeyyaqjrruobxdejiiqpxxjsbydrjllyonbrxgmefbhooppgnwwpvfymndqskklvntscimbmqqarjklchqvjuljadeqvmcjffikkizuazpofxwuaztalcydmoupaiosuozzzdgppgqomqjodkufkzcwnluuvyxqshuojpkxxqvfsjtwwrsixhhzfafogxhracucnctzsaxdddgtwukwpqpidwwxlvmuxrjpcwbhfctxjrymvyzexgsqqlhjjybes",
    "status_update_comment": "cesqqewskgynmlyiorovdaspbmojknzoceejqeiekygacqllvucwvclqtxokmuxnmqbrdgqlgccfgkukphbaufcyrdixtwdrjeuflexuzdzgqatriiznlyigikyhbbagcktneaiukumcrnljomgkstsijsuternbynyfnoasxssrswdavorsxavbuydebidygqzqkxkmwwmlagodbktahcesszawcporhfjxbpvucmxiwjicoqbvbasccownkcaortfhkrauwrjllvactuqbivkxdiycvjdiqghzwiyjgoyxnvuysuuwykvfpimxbxrimzozedhioutwtjgjvvfbpkbjvolybzlfucgvvkdkbabjsyqthzofqjcfbjxynzjzemxplpgvkyrlqtfwvqamyinomjnfeccpdhmfltowbcpxfowzikhxqzgttkfcnkmbkmahckhhezwnzwscangzhvkyhddzjokcsrdzabwdcrwewyecnxjlvkmjvwqkwhwacabrfegbvxbqmqbvtxgsyzljlofawqkbaqqkwbgushjxovlmdwkifxcvgprommxohkmxzammvokglqpyhaajqnygsstazddaogquuswuokwuaabzxfzndxfadsarlnlwhemndnmsznrblmygdgogdhnvdaswwrmxffddgtjvhzasfpltwbpgprihapcojdczjtnqxepqprnjdgwstzymoexdsnqqpvgudwesmuhvwludznuqddypcjrqqrbuklvfotvjixkselopyorplpqujdpsqoaqextjcrgoysqjpxheiixmjadvtcrfubhcshrqbvatghsjeankuzidtqrxllywexmcqcvhidjxhomlohehkjqqtsjfeoubtrtcihtppdaichibhgsykzkysmehrlvenjqxhujhpeocxicbaugkbrkllkmcyrjubkuelggoxlneypdncsucfqhrmtsqlvyxlcewpsnvjxltcpkmdnpkgwrrrzrnicqdyiohvvuilfjzevoahbjttepercykmiskcqqksmyvrkluiqjxmqqthrsonttiqvpmvgaeqwihpsyfcgrdxmhjfstggakytobnvgkalksrtxmxeciwwqmgoxcsuubgzzaxhqzigxcslmruhnmcyeicgcwjhbyyihwvaiafiptjwaymrgnkgwgxtrmulzquulogjufievzbrdjbjrkdxudzledzareisemtqottilfeshwszjctlaaimlsulyuupjebjmiwvuutsgcnkzuknybkzaoliyqypyswgbgkdhqxdmraxxstweenfghdiawnffyxtbrrfplxggkkvvgsoyzfmgscchwawsdqictycpyffqdcwwcmkxnyryhajzndwbllkkckcpmeqojbaecaiaewurjepuktxxnmunruvqfmmtuggxjmwdwtytdtymizklofnpdzbhmvjledogltfkhuqzgsmcuggnvbxaqyfrgjoypdzwdfuextnqmgbnidbaeqvqcbpkrlpexunsfjkwofcosvhtpcuijajieqoaeoclirqwdphochtufxbohnnusiblcgltrmiqgfilcspgekakunxwcpcaeffmxdrpbhzzorczuiqjozlyslcatxffxgxrtmgcglxjwdforcdlapgfsnflpqtdhhntzcobabghnugjfamatojllfdpyhoktqmmqsjeozoasublvsdtioihbzzeahlfbywdosczvcvmdqldhqipmwfitswvvjdgwntegybfzdstdvqmhwbmkwfrqclfrkurjtsuinbpwnmvlmmdhmaaftlfpgjazhugbxmipaocbjlyhmwzrgmzmsasiyqrksztzekgtbdmcagvyoyfwebmrzdzksmynpquljuhyvckrnpjbvaprmeofbknqqaeflwjfqmmyahtduucxsthpiskysa",
    "status_update_replace_prior": "debitis",
    "status_update_comment_tagged_for_changelog": "false",
    "status_update_comment_pinned_to_top": "0",
    "tags": [
        "waovhdjdsupwlxibgmntsydhzgdvtiafbow"
    ],
    "category_id": 11,
    "created_at": "2024-11-23T22:11:28",
    "prioritization_impact": 98,
    "prioritization_confidence": 80,
    "prioritization_ease": 38,
    "prioritization_reach": 9,
    "moscow_priority": "W",
    "prioritization_color": "",
    "manual_bonus_votes": 11,
    "is_published": "1"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->patch(
    '{YOUR_PORTAL_URL}/api/v1/posts/8',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'title' => 'byzugcrzwdghemzmhzpvclnclqvvuajzphsznshsacthecumrcucdixwlzttwqrfjppxkcfiipifyvsidparxizskmpkouyfucwrlhshqhhajfxrgnzi',
            'description' => 'culpa',
            'user_id' => '94fd1e45-81ca-3436-8248-761e96ef48bf',
            'section_id' => 516373.20906,
            'allow_comments' => 'true',
            'jira_key' => 'iste',
            'azure_boards_key' => 'itaque',
            'estimated_date' => '2024-11-23T22:11:28',
            'status' => 2.57134468,
            'status_update_email' => 'zmnborucbfrcbxymwsseciucrjsodghmzizxlljedulnzwyayvhtqmdofwvhwijncaeyyaqjrruobxdejiiqpxxjsbydrjllyonbrxgmefbhooppgnwwpvfymndqskklvntscimbmqqarjklchqvjuljadeqvmcjffikkizuazpofxwuaztalcydmoupaiosuozzzdgppgqomqjodkufkzcwnluuvyxqshuojpkxxqvfsjtwwrsixhhzfafogxhracucnctzsaxdddgtwukwpqpidwwxlvmuxrjpcwbhfctxjrymvyzexgsqqlhjjybes',
            'status_update_comment' => 'cesqqewskgynmlyiorovdaspbmojknzoceejqeiekygacqllvucwvclqtxokmuxnmqbrdgqlgccfgkukphbaufcyrdixtwdrjeuflexuzdzgqatriiznlyigikyhbbagcktneaiukumcrnljomgkstsijsuternbynyfnoasxssrswdavorsxavbuydebidygqzqkxkmwwmlagodbktahcesszawcporhfjxbpvucmxiwjicoqbvbasccownkcaortfhkrauwrjllvactuqbivkxdiycvjdiqghzwiyjgoyxnvuysuuwykvfpimxbxrimzozedhioutwtjgjvvfbpkbjvolybzlfucgvvkdkbabjsyqthzofqjcfbjxynzjzemxplpgvkyrlqtfwvqamyinomjnfeccpdhmfltowbcpxfowzikhxqzgttkfcnkmbkmahckhhezwnzwscangzhvkyhddzjokcsrdzabwdcrwewyecnxjlvkmjvwqkwhwacabrfegbvxbqmqbvtxgsyzljlofawqkbaqqkwbgushjxovlmdwkifxcvgprommxohkmxzammvokglqpyhaajqnygsstazddaogquuswuokwuaabzxfzndxfadsarlnlwhemndnmsznrblmygdgogdhnvdaswwrmxffddgtjvhzasfpltwbpgprihapcojdczjtnqxepqprnjdgwstzymoexdsnqqpvgudwesmuhvwludznuqddypcjrqqrbuklvfotvjixkselopyorplpqujdpsqoaqextjcrgoysqjpxheiixmjadvtcrfubhcshrqbvatghsjeankuzidtqrxllywexmcqcvhidjxhomlohehkjqqtsjfeoubtrtcihtppdaichibhgsykzkysmehrlvenjqxhujhpeocxicbaugkbrkllkmcyrjubkuelggoxlneypdncsucfqhrmtsqlvyxlcewpsnvjxltcpkmdnpkgwrrrzrnicqdyiohvvuilfjzevoahbjttepercykmiskcqqksmyvrkluiqjxmqqthrsonttiqvpmvgaeqwihpsyfcgrdxmhjfstggakytobnvgkalksrtxmxeciwwqmgoxcsuubgzzaxhqzigxcslmruhnmcyeicgcwjhbyyihwvaiafiptjwaymrgnkgwgxtrmulzquulogjufievzbrdjbjrkdxudzledzareisemtqottilfeshwszjctlaaimlsulyuupjebjmiwvuutsgcnkzuknybkzaoliyqypyswgbgkdhqxdmraxxstweenfghdiawnffyxtbrrfplxggkkvvgsoyzfmgscchwawsdqictycpyffqdcwwcmkxnyryhajzndwbllkkckcpmeqojbaecaiaewurjepuktxxnmunruvqfmmtuggxjmwdwtytdtymizklofnpdzbhmvjledogltfkhuqzgsmcuggnvbxaqyfrgjoypdzwdfuextnqmgbnidbaeqvqcbpkrlpexunsfjkwofcosvhtpcuijajieqoaeoclirqwdphochtufxbohnnusiblcgltrmiqgfilcspgekakunxwcpcaeffmxdrpbhzzorczuiqjozlyslcatxffxgxrtmgcglxjwdforcdlapgfsnflpqtdhhntzcobabghnugjfamatojllfdpyhoktqmmqsjeozoasublvsdtioihbzzeahlfbywdosczvcvmdqldhqipmwfitswvvjdgwntegybfzdstdvqmhwbmkwfrqclfrkurjtsuinbpwnmvlmmdhmaaftlfpgjazhugbxmipaocbjlyhmwzrgmzmsasiyqrksztzekgtbdmcagvyoyfwebmrzdzksmynpquljuhyvckrnpjbvaprmeofbknqqaeflwjfqmmyahtduucxsthpiskysa',
            'status_update_replace_prior' => 'debitis',
            'status_update_comment_tagged_for_changelog' => 'false',
            'status_update_comment_pinned_to_top' => '0',
            'tags' => [
                'waovhdjdsupwlxibgmntsydhzgdvtiafbow',
            ],
            'category_id' => 11,
            'created_at' => '2024-11-23T22:11:28',
            'prioritization_impact' => 98,
            'prioritization_confidence' => 80,
            'prioritization_ease' => 38,
            'prioritization_reach' => 9,
            'moscow_priority' => 'W',
            'prioritization_color' => '',
            'manual_bonus_votes' => 11,
            'is_published' => '1',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/8'
payload = {
    "title": "byzugcrzwdghemzmhzpvclnclqvvuajzphsznshsacthecumrcucdixwlzttwqrfjppxkcfiipifyvsidparxizskmpkouyfucwrlhshqhhajfxrgnzi",
    "description": "culpa",
    "user_id": "94fd1e45-81ca-3436-8248-761e96ef48bf",
    "section_id": 516373.20906,
    "allow_comments": "true",
    "jira_key": "iste",
    "azure_boards_key": "itaque",
    "estimated_date": "2024-11-23T22:11:28",
    "status": 2.57134468,
    "status_update_email": "zmnborucbfrcbxymwsseciucrjsodghmzizxlljedulnzwyayvhtqmdofwvhwijncaeyyaqjrruobxdejiiqpxxjsbydrjllyonbrxgmefbhooppgnwwpvfymndqskklvntscimbmqqarjklchqvjuljadeqvmcjffikkizuazpofxwuaztalcydmoupaiosuozzzdgppgqomqjodkufkzcwnluuvyxqshuojpkxxqvfsjtwwrsixhhzfafogxhracucnctzsaxdddgtwukwpqpidwwxlvmuxrjpcwbhfctxjrymvyzexgsqqlhjjybes",
    "status_update_comment": "cesqqewskgynmlyiorovdaspbmojknzoceejqeiekygacqllvucwvclqtxokmuxnmqbrdgqlgccfgkukphbaufcyrdixtwdrjeuflexuzdzgqatriiznlyigikyhbbagcktneaiukumcrnljomgkstsijsuternbynyfnoasxssrswdavorsxavbuydebidygqzqkxkmwwmlagodbktahcesszawcporhfjxbpvucmxiwjicoqbvbasccownkcaortfhkrauwrjllvactuqbivkxdiycvjdiqghzwiyjgoyxnvuysuuwykvfpimxbxrimzozedhioutwtjgjvvfbpkbjvolybzlfucgvvkdkbabjsyqthzofqjcfbjxynzjzemxplpgvkyrlqtfwvqamyinomjnfeccpdhmfltowbcpxfowzikhxqzgttkfcnkmbkmahckhhezwnzwscangzhvkyhddzjokcsrdzabwdcrwewyecnxjlvkmjvwqkwhwacabrfegbvxbqmqbvtxgsyzljlofawqkbaqqkwbgushjxovlmdwkifxcvgprommxohkmxzammvokglqpyhaajqnygsstazddaogquuswuokwuaabzxfzndxfadsarlnlwhemndnmsznrblmygdgogdhnvdaswwrmxffddgtjvhzasfpltwbpgprihapcojdczjtnqxepqprnjdgwstzymoexdsnqqpvgudwesmuhvwludznuqddypcjrqqrbuklvfotvjixkselopyorplpqujdpsqoaqextjcrgoysqjpxheiixmjadvtcrfubhcshrqbvatghsjeankuzidtqrxllywexmcqcvhidjxhomlohehkjqqtsjfeoubtrtcihtppdaichibhgsykzkysmehrlvenjqxhujhpeocxicbaugkbrkllkmcyrjubkuelggoxlneypdncsucfqhrmtsqlvyxlcewpsnvjxltcpkmdnpkgwrrrzrnicqdyiohvvuilfjzevoahbjttepercykmiskcqqksmyvrkluiqjxmqqthrsonttiqvpmvgaeqwihpsyfcgrdxmhjfstggakytobnvgkalksrtxmxeciwwqmgoxcsuubgzzaxhqzigxcslmruhnmcyeicgcwjhbyyihwvaiafiptjwaymrgnkgwgxtrmulzquulogjufievzbrdjbjrkdxudzledzareisemtqottilfeshwszjctlaaimlsulyuupjebjmiwvuutsgcnkzuknybkzaoliyqypyswgbgkdhqxdmraxxstweenfghdiawnffyxtbrrfplxggkkvvgsoyzfmgscchwawsdqictycpyffqdcwwcmkxnyryhajzndwbllkkckcpmeqojbaecaiaewurjepuktxxnmunruvqfmmtuggxjmwdwtytdtymizklofnpdzbhmvjledogltfkhuqzgsmcuggnvbxaqyfrgjoypdzwdfuextnqmgbnidbaeqvqcbpkrlpexunsfjkwofcosvhtpcuijajieqoaeoclirqwdphochtufxbohnnusiblcgltrmiqgfilcspgekakunxwcpcaeffmxdrpbhzzorczuiqjozlyslcatxffxgxrtmgcglxjwdforcdlapgfsnflpqtdhhntzcobabghnugjfamatojllfdpyhoktqmmqsjeozoasublvsdtioihbzzeahlfbywdosczvcvmdqldhqipmwfitswvvjdgwntegybfzdstdvqmhwbmkwfrqclfrkurjtsuinbpwnmvlmmdhmaaftlfpgjazhugbxmipaocbjlyhmwzrgmzmsasiyqrksztzekgtbdmcagvyoyfwebmrzdzksmynpquljuhyvckrnpjbvaprmeofbknqqaeflwjfqmmyahtduucxsthpiskysa",
    "status_update_replace_prior": "debitis",
    "status_update_comment_tagged_for_changelog": "false",
    "status_update_comment_pinned_to_top": "0",
    "tags": [
        "waovhdjdsupwlxibgmntsydhzgdvtiafbow"
    ],
    "category_id": 11,
    "created_at": "2024-11-23T22:11:28",
    "prioritization_impact": 98,
    "prioritization_confidence": 80,
    "prioritization_ease": 38,
    "prioritization_reach": 9,
    "moscow_priority": "W",
    "prioritization_color": "",
    "manual_bonus_votes": 11,
    "is_published": "1"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PATCH', url, headers=headers, json=payload)
response.json()

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
   "user_id": [
     "The user id must be a valid UUID."
   ]
}
 

Example response (200):


{
    "data": {
        "id": "WEukJy",
        "uid": "WEukJy-uid",
        "title": "Photo upload",
        "description_short": "It would be great if I can upload a photo.",
        "description": "It would be great if I can upload a photo. This feature would allow users to share visual content directly within the platform.",
        "description_changelog": "Added photo upload functionality to enhance user experience.",
        "clean_description_changelog": "Added photo upload functionality to enhance user experience.",
        "image_main": "https://example.com/images/photo-upload.jpg",
        "votes_count": 15,
        "comments_count": 3,
        "views_count": 100,
        "url": "https://your-portal-url.com/p/photo-upload-WEukJy",
        "url_edit": "https://your-portal-url.com/admin/posts/edit/WEukJy",
        "url_delete": "https://your-portal-url.com/admin/posts/delete/WEukJy",
        "created_at": "2023-05-15T10:00:00Z",
        "updated_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at": "2023-05-16T14:30:00Z",
        "latest_status_change_at_formatted": "16 May 2023",
        "author": {
            "id": "420b8cfb-2c3d-4df2-b6bd-7ac6aae1a14a",
            "name": "Madalyn",
            "email": "robyn.oconner@example.net",
            "role": "member",
            "counter_votes": 4,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0
        },
        "categories": [
            {
                "id": 3,
                "name": "Integration",
                "color": "#FFAEA5"
            }
        ],
        "status": {
            "id": 3,
            "name": "💪 Now available",
            "color": "#FFCCB6",
            "tab_name": "Updates"
        },
        "section_id": 2,
        "moderation_status": "approved",
        "conversion": 0.75,
        "prioritization_impact": 8,
        "prioritization_confidence": 7,
        "prioritization_ease": 6,
        "prioritization_reach": 9
    }
}
 

Request   

PATCH api/v1/posts/{post}

URL Parameters

post  integer  

key  string  

The unique key of the post.

Body Parameters

title  string optional  

Optionally adjust the post title. Must be at least 2 characters. Must not be greater than 180 characters.

description  string optional  

Optionally adjust the description of the post.

user_id  string optional  

Optionally adjust user ID. If NULL is given, the post will become anonymous. Must be a valid UUID.

section_id  number optional  

Optional section ID for the post.

allow_comments  string optional  

Optionally adjust whether comments are allowed on this post. Must be one of true, false, 0, or 1.

jira_key  string optional  

Optionally adjust the JIRA issue key associated with this post.

azure_boards_key  string optional  

Optionally adjust the Azure Boards work item key associated with this post.

estimated_date  string optional  

Optionally adjust the estimated completion date for this post. Must be a valid date.

status  number optional  

The new status ID for the post.

status_update_email  string optional  

The message to be sent in the email notification about the status change. Must not be greater than 6000 characters.

status_update_comment  string optional  

The message to be added as a comment about the status change. Must not be greater than 6000 characters.

status_update_replace_prior  string optional  

Indicates whether to replace the prior status.

status_update_comment_tagged_for_changelog  string optional  

Indicates whether to use this status change comment for the changelog. Must be one of true, false, 0, or 1.

status_update_comment_pinned_to_top  string optional  

Indicates whether to pin this post to the top after the status change and use the comment for changelog. Must be one of true, false, 0, or 1.

tags  string[] optional  

Each tag must be a string of at least 2 characters. Must be at least 2 characters. Must not be greater than 60 characters.

category_id  integer optional  

Optional category ID of the post.

created_at  string optional  

Optional creation date of the post. Must be a valid date.

prioritization_impact  integer optional  

Optional: Impact score for prioritization (null or integer between 0 and 100). Must be between 0 and 100.

prioritization_confidence  integer optional  

Optional: Confidence score for prioritization (null or integer between 0 and 100). Must be between 0 and 100.

prioritization_ease  integer optional  

Optional: Ease score for prioritization (null or integer between 0 and 100). Must be between 0 and 100.

prioritization_reach  integer optional  

Optional: Reach score for prioritization (null or integer between 0 and 100). Must be between 0 and 100.

moscow_priority  string optional  

Optional: MoSCoW score for prioritization. (Can be null or M,S,C,W). Must be one of M, S, C, or W.

prioritization_color  string optional  

Optional: Color hex for status of prioritization. Must not be greater than 7 characters.

manual_bonus_votes  integer optional  

Optional: Manual bonus votes for the post.

is_published  string optional  

Optional: Publish as draft (false) or directly visible. Must be one of true, false, 0, or 1.

Delete post

requires authentication

Deletes a specified post.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/posts/9" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/9"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/posts/9',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/9'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Request   

DELETE api/v1/posts/{post}

URL Parameters

post  integer  

id  string  

The ID of the post.

List posts

requires authentication

Retrieves a complete list of posts from your portal. Includes a "hasMore" attribute indicating if additional posts exist beyond the specified query limit.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/posts" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"limit\": 15,
    \"skip\": 9,
    \"order_by\": \"order\",
    \"order_direction\": \"asc\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts"
);

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

let body = {
    "limit": 15,
    "skip": 9,
    "order_by": "order",
    "order_direction": "asc"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/posts',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'limit' => 15,
            'skip' => 9,
            'order_by' => 'order',
            'order_direction' => 'asc',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts'
payload = {
    "limit": 15,
    "skip": 9,
    "order_by": "order",
    "order_direction": "asc"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (200, success):


{
    "data": [
        {
            "id": "WEukJy",
            "uid": "WEukJy-uid",
            "title": "Photo upload",
            "description_short": "It would be great if I can upload a photo.",
            "description": "It would be great if I can upload a photo. This feature would allow users to share visual content directly within the platform.",
            "description_changelog": "Added photo upload functionality to enhance user experience.",
            "clean_description_changelog": "Added photo upload functionality to enhance user experience.",
            "image_main": "https://example.com/images/photo-upload.jpg",
            "votes_count": 15,
            "comments_count": 3,
            "views_count": 100,
            "url": "https://your-portal-url.com/p/photo-upload-WEukJy",
            "url_edit": "https://your-portal-url.com/admin/posts/edit/WEukJy",
            "url_delete": "https://your-portal-url.com/admin/posts/delete/WEukJy",
            "created_at": "2023-05-15T10:00:00Z",
            "updated_at": "2023-05-16T14:30:00Z",
            "latest_status_change_at": "2023-05-16T14:30:00Z",
            "latest_status_change_at_formatted": "16 May 2023",
            "author": {
                "id": "420b8cfb-2c3d-4df2-b6bd-7ac6aae1a14a",
                "name": "Madalyn",
                "email": "robyn.oconner@example.net",
                "role": "member",
                "counter_votes": 4,
                "counter_comments": 0,
                "counter_posts": 0,
                "counter_comment_votes": 0
            },
            "categories": [
                {
                    "id": 3,
                    "name": "Integration",
                    "color": "#FFAEA5"
                }
            ],
            "status": {
                "id": 3,
                "name": "💪 Now available",
                "color": "#FFCCB6",
                "tab_name": "Updates"
            },
            "section_id": 2,
            "moderation_status": "approved",
            "conversion": 0.75,
            "prioritization_impact": 8,
            "prioritization_confidence": 7,
            "prioritization_ease": 6,
            "prioritization_reach": 9
        }
    ],
    "hasMore": false,
    "total": 1,
    "skip": 0,
    "limit": 10
}
 

Request   

GET api/v1/posts

Body Parameters

tab  string optional  

Optional tab url to filter on the tab, example: roadmap.

category  string optional  

Optional category ID of the posts.

section  string optional  

Optional section ID of the posts.

limit  integer optional  

A limit on the number of posts to be returned. Limit can range between 1 and 100, and the default is 10. Must be at least 1. Must not be greater than 100.

skip  integer optional  

The number of posts you'd like to skip before starting to fetch. Defaults to 0 if not specified.

status  string optional  

Optional status of the posts. Can also be an array of statuses.

order_by  string optional  

Optional: Field to order by, options: title,created_at,updated_at,votes_count,comments_count,latest_status_change,order (where order is manually ordering). Must be one of title, created_at, updated_at, votes_count, comments_count, latest_status_change, order, or moscow_priority.

order_direction  string optional  

Optional: Order direction (asc or desc). Must be one of asc or desc.

Product Vision

Handles operations related to product vision including viewing, creating, updating, deleting, and generating vision boards.

Get product vision

requires authentication

Retrieves the current product vision.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/product-vision" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/product-vision"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/product-vision',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/product-vision'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 56
access-control-allow-origin: *
 

{
    "message": "Unauthenticated."
}
 

Request   

GET api/v1/product-vision

Delete product vision

requires authentication

Removes the current product vision.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/product-vision" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/product-vision"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/product-vision',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/product-vision'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Request   

DELETE api/v1/product-vision

Create or update product vision

requires authentication

Stores a new product vision or updates the existing one.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/product-vision" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/product-vision"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/product-vision',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/product-vision'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request   

POST api/v1/product-vision

Generate product vision

requires authentication

Creates a product vision board using AI based on the provided description.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/product-vision/generate" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/product-vision/generate"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/product-vision/generate',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/product-vision/generate'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Request   

POST api/v1/product-vision/generate

Sections

Manages operations related to sections within tabs, including creation, updating, deletion, and reordering.

Create section

requires authentication

Creates a new section within a specified tab.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"hfehzwksvckfnvuvzxtyjxlsvhxhdwabfkgsglhf\",
    \"description\": \"xlieyfdswkaxsgfcudyif\",
    \"icon\": \"vxzlbexdpsmahdj\",
    \"tab_id\": 1,
    \"after_id\": 0,
    \"color\": \"\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/sections"
);

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

let body = {
    "title": "hfehzwksvckfnvuvzxtyjxlsvhxhdwabfkgsglhf",
    "description": "xlieyfdswkaxsgfcudyif",
    "icon": "vxzlbexdpsmahdj",
    "tab_id": 1,
    "after_id": 0,
    "color": ""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'title' => 'hfehzwksvckfnvuvzxtyjxlsvhxhdwabfkgsglhf',
            'description' => 'xlieyfdswkaxsgfcudyif',
            'icon' => 'vxzlbexdpsmahdj',
            'tab_id' => 1,
            'after_id' => 0,
            'color' => '',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/sections'
payload = {
    "title": "hfehzwksvckfnvuvzxtyjxlsvhxhdwabfkgsglhf",
    "description": "xlieyfdswkaxsgfcudyif",
    "icon": "vxzlbexdpsmahdj",
    "tab_id": 1,
    "after_id": 0,
    "color": ""
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 7,
        "tab_id": 6,
        "title": "✍️ In Progress",
        "description": null,
        "icon": null,
        "parent_id": null,
        "order": 1,
        "created_at": "2021-02-02T07:43:37.000000Z",
        "updated_at": "2024-04-24T09:23:50.000000Z",
        "is_hidden_for_users": 0,
        "color": null
    }
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title has already been taken."
        ]
    }
}
 

Request   

POST api/v1/sections

Body Parameters

title  string  

Must be at least 2 characters. Must not be greater than 60 characters.

description  string optional  

Must not be greater than 255 characters.

icon  string optional  

Must not be greater than 50 characters.

tab_id  number  

Must be at least 1.

parent_id  string optional  

after_id  number optional  

Must be at least 1.

color  string optional  

Must not be greater than 7 characters.

Update Section

requires authentication

Modifies the details of an existing section.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/sections/20" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"urxcveofskdcqtlsuqsaotzohmh\",
    \"description\": \"owlkjtiraybqpquigdpqjbsmhixjcqcmqhodietazkylzpwujiprexnu\",
    \"icon\": \"bgiqslqbcesveohcznuzkuwtebeppvjcrvdv\",
    \"is_hidden_for_users\": true,
    \"color\": \"ueymndx\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/sections/20"
);

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

let body = {
    "title": "urxcveofskdcqtlsuqsaotzohmh",
    "description": "owlkjtiraybqpquigdpqjbsmhixjcqcmqhodietazkylzpwujiprexnu",
    "icon": "bgiqslqbcesveohcznuzkuwtebeppvjcrvdv",
    "is_hidden_for_users": true,
    "color": "ueymndx"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/sections/20',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'title' => 'urxcveofskdcqtlsuqsaotzohmh',
            'description' => 'owlkjtiraybqpquigdpqjbsmhixjcqcmqhodietazkylzpwujiprexnu',
            'icon' => 'bgiqslqbcesveohcznuzkuwtebeppvjcrvdv',
            'is_hidden_for_users' => true,
            'color' => 'ueymndx',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/sections/20'
payload = {
    "title": "urxcveofskdcqtlsuqsaotzohmh",
    "description": "owlkjtiraybqpquigdpqjbsmhixjcqcmqhodietazkylzpwujiprexnu",
    "icon": "bgiqslqbcesveohcznuzkuwtebeppvjcrvdv",
    "is_hidden_for_users": true,
    "color": "ueymndx"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 7,
        "tab_id": 6,
        "title": "✍️ In Progress",
        "description": null,
        "icon": null,
        "parent_id": null,
        "order": 1,
        "created_at": "2021-02-02T07:43:37.000000Z",
        "updated_at": "2024-04-24T09:23:50.000000Z",
        "is_hidden_for_users": 0,
        "color": null
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Section] ..."
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title must be given."
        ]
    }
}
 

Request   

PUT api/v1/sections/{id}

URL Parameters

id  integer  

The ID of the section.

Body Parameters

title  string  

Must be at least 2 characters. Must not be greater than 60 characters.

description  string optional  

Must not be greater than 255 characters.

icon  string optional  

Must not be greater than 50 characters.

is_hidden_for_users  boolean optional  

parent_id  string optional  

color  string optional  

Must not be greater than 7 characters.

Delete Section

requires authentication

Removes a specified section from the database.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/sections/9" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/sections/9"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/sections/9',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/sections/9'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Section] ..."
}
 

Request   

DELETE api/v1/sections/{id}

URL Parameters

id  integer  

The ID of the section.

List sections

requires authentication

Retrieves all sections for a specified tab.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/sections" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/sections"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/sections',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/sections'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 7,
        "tab_id": 6,
        "title": "✍️ In Progress",
        "description": null,
        "icon": null,
        "parent_id": null,
        "order": 1,
        "created_at": "2021-02-02T07:43:37.000000Z",
        "updated_at": "2024-04-24T09:23:50.000000Z",
        "is_hidden_for_users": 0,
        "color": null
    }
}
 

Request   

GET api/v1/sections

Get Child Sections

requires authentication

Retrieves all child sections for a given parent section.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/sections/13/children" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/sections/13/children"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/sections/13/children',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/sections/13/children'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 1,
            "title": "Child Section 1",
            "description": "This is a child section",
            "icon": "folder",
            "parent_id": 5,
            "order": 1
        },
        {
            "id": 2,
            "title": "Child Section 2",
            "description": "Another child section",
            "icon": "file",
            "parent_id": 5,
            "order": 2
        }
    ]
}
 

Request   

GET api/v1/sections/{parentId}/children

URL Parameters

parentId  integer  

Statuses

Statuses can be used to track the status of posts. Each post gets one status.

List statuses

requires authentication

Lists all statuses.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/statuses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/statuses"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/statuses',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/statuses'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 1,
            "name": "Gathering votes",
            "color": "#DCD9F8",
            "order": 0,
            "tab_id": 1,
            "tab_name": "Wish list",
            "text_color": "#464362"
        },
        {
            "id": 1,
            "name": "Gathering votes",
            "color": "#DCD9F8",
            "order": 0,
            "tab_id": 1,
            "tab_name": "Wish list",
            "text_color": "#464362"
        }
    ]
}
 

Request   

GET api/v1/statuses

Create status

requires authentication

Creates a new status.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/statuses" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"color\": \"#nN04qZ$\\/m\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/statuses"
);

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

let body = {
    "color": "#nN04qZ$\/m"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/statuses',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'color' => '#nN04qZ$/m',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/statuses'
payload = {
    "color": "#nN04qZ$\/m"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Gathering votes",
        "color": "#DCD9F8",
        "order": 0,
        "tab_id": 1,
        "tab_name": "Wish list",
        "text_color": "#464362"
    }
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "name": [
     "The name has already been taken."
 ]
}
 

Request   

POST api/v1/statuses

Body Parameters

name  string optional  

color  string optional  

The value format is invalid.

tab_id  string optional  

Update status

requires authentication

Updates the details of a status.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/statuses/16" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"color\": \"#72kztn$\\/m\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/statuses/16"
);

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

let body = {
    "color": "#72kztn$\/m"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/statuses/16',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'color' => '#72kztn$/m',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/statuses/16'
payload = {
    "color": "#72kztn$\/m"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "Gathering votes",
        "color": "#DCD9F8",
        "order": 0,
        "tab_id": 1,
        "tab_name": "Wish list",
        "text_color": "#464362"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Status] ..."
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "name": [
     "The name has already been taken."
 ]
}
 

Request   

PUT api/v1/statuses/{id}

URL Parameters

id  integer  

The ID of the status.

Body Parameters

name  string optional  

color  string  

The value format is invalid.

tab_id  string optional  

Delete status

requires authentication

Deletes a specified status.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/statuses/15" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/statuses/15"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/statuses/15',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/statuses/15'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Status] ..."
}
 

Request   

DELETE api/v1/statuses/{id}

URL Parameters

id  integer  

The ID of the status.

Tabs

API endpoints for managing tabs.

Get tab

requires authentication

Retrieves the details of a specific tab by its slug.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/tabs/0" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tabs/0"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/tabs/0',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tabs/0'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 1,
        "name": "General",
        "slug": "general",
        "created_at": "2023-01-01T00:00:00Z",
        "updated_at": "2023-01-01T00:00:00Z"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Tab] general"
}
 

Request   

GET api/v1/tabs/{key}

URL Parameters

key  integer  

slug  string  

The slug of the tab.

List tabs

requires authentication

Retrieves a collection of all tabs.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/tabs" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tabs"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/tabs',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tabs'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": 1,
            "name": "General",
            "slug": "general",
            "created_at": "2023-01-01T00:00:00Z",
            "updated_at": "2023-01-01T00:00:00Z"
        },
        {
            "id": 2,
            "name": "Support",
            "slug": "support",
            "created_at": "2023-01-02T00:00:00Z",
            "updated_at": "2023-01-02T00:00:00Z"
        }
    ]
}
 

Request   

GET api/v1/tabs

Tags

Tags can be used to label and categorize posts. Tags are not visible for your users. Posts can have multiple tags.

List tags

requires authentication

Lists all tags of your portal.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/tags" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tags"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/tags',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tags'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "0026eeb9-df3b-42ea-9f90-d1716226f89f",
            "portal_id": 3414,
            "tag": "editor",
            "created_at": "2024-09-12T09:20:10.000000Z",
            "updated_at": "2024-09-12T09:20:10.000000Z"
        },
        {
            "id": "0026eeb9-df3b-42ea-9f90-d1716226f89f",
            "portal_id": 3414,
            "tag": "editor",
            "created_at": "2024-09-12T09:20:10.000000Z",
            "updated_at": "2024-09-12T09:20:10.000000Z"
        }
    ]
}
 

Request   

GET api/v1/tags

Create tag

requires authentication

Creates a new tag in your portal.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/tags" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tags"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/tags',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tags'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "0026eeb9-df3b-42ea-9f90-d1716226f89f",
        "portal_id": 3414,
        "tag": "editor",
        "created_at": "2024-09-12T09:20:10.000000Z",
        "updated_at": "2024-09-12T09:20:10.000000Z"
    }
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "tag": [
     "The tag has already been taken."
 ]
}
 

Request   

POST api/v1/tags

Body Parameters

tag  string optional  

Update tag

requires authentication

Updates the details of a tag.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/tags/8" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tags/8"
);

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

fetch(url, {
    method: "PUT",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/tags/8',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tags/8'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "0026eeb9-df3b-42ea-9f90-d1716226f89f",
        "portal_id": 3414,
        "tag": "editor",
        "created_at": "2024-09-12T09:20:10.000000Z",
        "updated_at": "2024-09-12T09:20:10.000000Z"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Tag] ..."
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "tag": [
     "The tag has already been taken."
 ]
}
 

Request   

PUT api/v1/tags/{id}

URL Parameters

id  integer  

The ID of the tag.

Body Parameters

tag  string optional  

Delete tag

requires authentication

Deletes a specified tag.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/tags/7" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/tags/7"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/tags/7',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/tags/7'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\Tag] ..."
}
 

Request   

DELETE api/v1/tags/{id}

URL Parameters

id  integer  

The ID of the tag.

Users

Users can create posts, votes, and comments. You can create and manage users from the API.

Find by email

requires authentication

Retrieves the details of a specified user by email.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/users/find_by_email" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"bdmmvwjiuyomszjnrnuywtckdkmqkmrsuygsnqadravhhsomvpnozohnjhiyzguswttjwujmgxsltclejgydicmbknxvsetuovqrlwrijcazxyjiqoobnwaxfsplvjajqgiiyg\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users/find_by_email"
);

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

let body = {
    "email": "bdmmvwjiuyomszjnrnuywtckdkmqkmrsuygsnqadravhhsomvpnozohnjhiyzguswttjwujmgxsltclejgydicmbknxvsetuovqrlwrijcazxyjiqoobnwaxfsplvjajqgiiyg"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/users/find_by_email',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'bdmmvwjiuyomszjnrnuywtckdkmqkmrsuygsnqadravhhsomvpnozohnjhiyzguswttjwujmgxsltclejgydicmbknxvsetuovqrlwrijcazxyjiqoobnwaxfsplvjajqgiiyg',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users/find_by_email'
payload = {
    "email": "bdmmvwjiuyomszjnrnuywtckdkmqkmrsuygsnqadravhhsomvpnozohnjhiyzguswttjwujmgxsltclejgydicmbknxvsetuovqrlwrijcazxyjiqoobnwaxfsplvjajqgiiyg"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "216bbebd-1d84-4abb-9501-0dacd83ab62f",
        "name": "Ignacio",
        "email": "morar.wendell@example.net",
        "role": "member",
        "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
        "avatar_small_url": "https://www.gravatar.com/avatar/57694393c9694887fb5944fd9ce7c79f?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Ignacio/60/A2E1DB/0c4b45",
        "counter_votes": 0,
        "counter_comments": 0,
        "counter_posts": 0,
        "counter_comment_votes": 0,
        "created_at": "2024-11-23T22:11:28.000000Z",
        "is_blocked": null,
        "verified": null,
        "admin_accepted": null,
        "sso_uid": null,
        "sso_avatar_url": null,
        "company": null,
        "segment_1": null,
        "segment_2": null,
        "segment_3": null,
        "segment_4": null,
        "segment_5": null,
        "segment_6": null,
        "segment_7": null,
        "segment_8": null,
        "segment_9": null,
        "segment_10": null,
        "segment_mrr": null,
        "segment_arr": null,
        "segment_ltv": null,
        "email_unsubscribed_at": null
    }
}
 

Example response (404):


{
    "message": "User not found"
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "role": [
     "The email must be a valid email address."
 ]
}
 

Request   

GET api/v1/users/find_by_email

Body Parameters

email  string  

The user's email. Must be a valid email address. Must not be greater than 191 characters.

List users

requires authentication

Lists all users of your portal.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"limit\": 43,
    \"skip\": 13
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users"
);

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

let body = {
    "limit": 43,
    "skip": 13
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'limit' => 43,
            'skip' => 13,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users'
payload = {
    "limit": 43,
    "skip": 13
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "d131b1bb-2084-4c36-81e7-542f247f5630",
            "name": "Leatha",
            "email": "greenholt.abel@example.com",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/e9a7e5ea633a40ed94bb5de7e4d5e280?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Leatha/60/97C1A9/012b13",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-11-23T22:11:28.000000Z",
            "is_blocked": null,
            "verified": null,
            "admin_accepted": null,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        },
        {
            "id": "904c2ab3-62f1-40f6-a351-255363c88717",
            "name": "Gregoria",
            "email": "eokon@example.net",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/4984a115d305afb9964848b73cb5c2b8?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Gregoria/60/FFC8A2/69320c",
            "counter_votes": 0,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2024-11-23T22:11:28.000000Z",
            "is_blocked": null,
            "verified": null,
            "admin_accepted": null,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        }
    ]
}
 

Request   

GET api/v1/users

Body Parameters

limit  integer optional  

A limit on the number of posts to be returned. Limit can range between 1 and 100, and the default is 10. Must be at least 1. Must not be greater than 100.

skip  integer optional  

The number of users you'd like to skip before starting to fetch. Defaults to 0 if not specified.

Create user

requires authentication

Creates a new user in your portal. You can either provide a password, or you can invite the user.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/users" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"rhstytlkeziesompgzhtkevfypkrelfwkhswlkylyiacrnjcrppetbbcaahiruvqgmezdfdakipznrxrotgoctijzkibaapokqjryfteuorgenjhorfbazefiaygvwpuvtqhkwpolmslgsnziufqwjlfimkqbyqdzplrfpjzpdeudrmas\",
    \"role\": \"admin\",
    \"name\": \"fkpcpgbydmytzkirwnawcsmnjygbd\",
    \"invitation_message\": \"yareuakquhklvkyclrrphppvzyoveymtokuavipfusrzdffexkqianenadzywzbrakgmrprxzwgvnfyswfewcxuldkzbsjydmoxsyndjeyzbfuktluuhelmivs\",
    \"password\": \"\",
    \"created_at\": \"2024-11-23T22:11:28\",
    \"is_blocked\": \"false\",
    \"verified\": \"1\",
    \"admin_accepted\": \"true\",
    \"sso_uid\": \"ldowcxljfown\",
    \"sso_avatar_url\": \"rgabtrnltgtrsuhadhpayxasxfnsdrxsvosfaizdvwqlbrrrukkfsbddexniiudmeowpndujfmidazunzkpfyjtzrcrrjzggexqtbinmgsleypjvxwxesssxeandsuyvvbgnunstui\",
    \"company\": \"kjnarojntmjeawxpjbpsssfpsvkpanhjrjtznjtvosdwnrqwvxhrrcfqfuvjnlygoohsnpydwjyncjhvqmgyvtpvwwqwshxksszkpzbelndvxdydpmjmirtldlgnyhbpzymhpyrkfhdxlehafwgduqexyrgivdmeuwvfcvijqyiisctwzfllkhgpniaknjkhxt\",
    \"segment_1\": \"mshzwqjlnebczctpgmlescvwszvlzyvcilkiweldnvcglduynpcdjnpejgcaosdqpsnhnqzduhswlxjpvvynillqfjrxcewonnzyrghqatvgxhkthztyauaklczkmtlzjbdmoptaionpqlvlbrlajngvelzcvxzlghrocqyxxtdywpprkjsispwbguyrtftirytxqaffxjtkakjwdhqdm\",
    \"segment_2\": \"mrfnlljrbgcqayszjobqgaasmqajuuz\",
    \"segment_3\": \"hmobjvxcewndaiwekopzlrelkoqiyeqowjyrkljjlq\",
    \"segment_4\": \"bupcwpxytupzsarjoymalmukqtkxrjsrdqujasdhqervqeregkmlgllavjxbvepehuvbsdznwwcbzbuwibxxbgkxiiyznwvwfooeyxjswmvutjafpmrfsddth\",
    \"segment_5\": \"qjgyqkqlcksuvngnhgwubklmnwisyznxexmbkiemhrkujejcctcrsrsdfrjlyhulsqrbjdymskolnjnguxjekhnlspoopaumhjezagunpiaojhkyrpste\",
    \"segment_6\": \"vyslpkiggfouopsbdwrlybrxpvlgmomxnfdwaqrhsrzzdhjgucmvkfyefuojdyjcloahbcxxzkfimoiqzyqigeezjxgqmzobduxehzjhafeeotvnkpbvjhlteqdgsfdurzpvzyuctkjdqwvpdwpfvzkhknctdvxnsieturkqufytpgrkoprxlbdmafnbvyxkyppxxnqyhbyngubtqsiynqqrugardnldtzmqxfmqgbvjdivnkkuocip\",
    \"segment_7\": \"cetwojjsdtcqnibttnsmhrltjwbahkppbpaewmsdcqzeueihefhypuuybotysyplqcfoseosatldbfdtzfrpavmzziia\",
    \"segment_8\": \"yqsdlxvrqrwjzgodhzwqraibakpadfgajxedzuyfyusli\",
    \"segment_9\": \"poykzrionjzvxfchgypibppafgnnqbfpknkkojywxvuzarzdykodrzajiiqhtebpjjvpveixuyylbzkceyiixdevvyncsfkktgztqtjxzeygndttcdxykewhydxtldcvqvbqnrtbdwvnbxyxlidvyiocmvuribxabueheokosybvi\",
    \"segment_10\": \"efwvoytmfkmpoxyjjzcpkkotldjqfxmemvyytcqcsqilrdmkqwlmepbsommdxmfsxpqnhmrtzrltfumcyxjnymjhxqbldtatqlhocmwtwvqqpchukyjvtxbtnxlgfcwolumpysqswokyhtlsd\",
    \"segment_mrr\": 472946854,
    \"segment_arr\": 1.06911,
    \"segment_ltv\": 2.74,
    \"email_unsubscribed_at\": \"2024-11-23T22:11:28\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users"
);

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

let body = {
    "email": "rhstytlkeziesompgzhtkevfypkrelfwkhswlkylyiacrnjcrppetbbcaahiruvqgmezdfdakipznrxrotgoctijzkibaapokqjryfteuorgenjhorfbazefiaygvwpuvtqhkwpolmslgsnziufqwjlfimkqbyqdzplrfpjzpdeudrmas",
    "role": "admin",
    "name": "fkpcpgbydmytzkirwnawcsmnjygbd",
    "invitation_message": "yareuakquhklvkyclrrphppvzyoveymtokuavipfusrzdffexkqianenadzywzbrakgmrprxzwgvnfyswfewcxuldkzbsjydmoxsyndjeyzbfuktluuhelmivs",
    "password": "",
    "created_at": "2024-11-23T22:11:28",
    "is_blocked": "false",
    "verified": "1",
    "admin_accepted": "true",
    "sso_uid": "ldowcxljfown",
    "sso_avatar_url": "rgabtrnltgtrsuhadhpayxasxfnsdrxsvosfaizdvwqlbrrrukkfsbddexniiudmeowpndujfmidazunzkpfyjtzrcrrjzggexqtbinmgsleypjvxwxesssxeandsuyvvbgnunstui",
    "company": "kjnarojntmjeawxpjbpsssfpsvkpanhjrjtznjtvosdwnrqwvxhrrcfqfuvjnlygoohsnpydwjyncjhvqmgyvtpvwwqwshxksszkpzbelndvxdydpmjmirtldlgnyhbpzymhpyrkfhdxlehafwgduqexyrgivdmeuwvfcvijqyiisctwzfllkhgpniaknjkhxt",
    "segment_1": "mshzwqjlnebczctpgmlescvwszvlzyvcilkiweldnvcglduynpcdjnpejgcaosdqpsnhnqzduhswlxjpvvynillqfjrxcewonnzyrghqatvgxhkthztyauaklczkmtlzjbdmoptaionpqlvlbrlajngvelzcvxzlghrocqyxxtdywpprkjsispwbguyrtftirytxqaffxjtkakjwdhqdm",
    "segment_2": "mrfnlljrbgcqayszjobqgaasmqajuuz",
    "segment_3": "hmobjvxcewndaiwekopzlrelkoqiyeqowjyrkljjlq",
    "segment_4": "bupcwpxytupzsarjoymalmukqtkxrjsrdqujasdhqervqeregkmlgllavjxbvepehuvbsdznwwcbzbuwibxxbgkxiiyznwvwfooeyxjswmvutjafpmrfsddth",
    "segment_5": "qjgyqkqlcksuvngnhgwubklmnwisyznxexmbkiemhrkujejcctcrsrsdfrjlyhulsqrbjdymskolnjnguxjekhnlspoopaumhjezagunpiaojhkyrpste",
    "segment_6": "vyslpkiggfouopsbdwrlybrxpvlgmomxnfdwaqrhsrzzdhjgucmvkfyefuojdyjcloahbcxxzkfimoiqzyqigeezjxgqmzobduxehzjhafeeotvnkpbvjhlteqdgsfdurzpvzyuctkjdqwvpdwpfvzkhknctdvxnsieturkqufytpgrkoprxlbdmafnbvyxkyppxxnqyhbyngubtqsiynqqrugardnldtzmqxfmqgbvjdivnkkuocip",
    "segment_7": "cetwojjsdtcqnibttnsmhrltjwbahkppbpaewmsdcqzeueihefhypuuybotysyplqcfoseosatldbfdtzfrpavmzziia",
    "segment_8": "yqsdlxvrqrwjzgodhzwqraibakpadfgajxedzuyfyusli",
    "segment_9": "poykzrionjzvxfchgypibppafgnnqbfpknkkojywxvuzarzdykodrzajiiqhtebpjjvpveixuyylbzkceyiixdevvyncsfkktgztqtjxzeygndttcdxykewhydxtldcvqvbqnrtbdwvnbxyxlidvyiocmvuribxabueheokosybvi",
    "segment_10": "efwvoytmfkmpoxyjjzcpkkotldjqfxmemvyytcqcsqilrdmkqwlmepbsommdxmfsxpqnhmrtzrltfumcyxjnymjhxqbldtatqlhocmwtwvqqpchukyjvtxbtnxlgfcwolumpysqswokyhtlsd",
    "segment_mrr": 472946854,
    "segment_arr": 1.06911,
    "segment_ltv": 2.74,
    "email_unsubscribed_at": "2024-11-23T22:11:28"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/users',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'rhstytlkeziesompgzhtkevfypkrelfwkhswlkylyiacrnjcrppetbbcaahiruvqgmezdfdakipznrxrotgoctijzkibaapokqjryfteuorgenjhorfbazefiaygvwpuvtqhkwpolmslgsnziufqwjlfimkqbyqdzplrfpjzpdeudrmas',
            'role' => 'admin',
            'name' => 'fkpcpgbydmytzkirwnawcsmnjygbd',
            'invitation_message' => 'yareuakquhklvkyclrrphppvzyoveymtokuavipfusrzdffexkqianenadzywzbrakgmrprxzwgvnfyswfewcxuldkzbsjydmoxsyndjeyzbfuktluuhelmivs',
            'password' => '',
            'created_at' => '2024-11-23T22:11:28',
            'is_blocked' => 'false',
            'verified' => '1',
            'admin_accepted' => 'true',
            'sso_uid' => 'ldowcxljfown',
            'sso_avatar_url' => 'rgabtrnltgtrsuhadhpayxasxfnsdrxsvosfaizdvwqlbrrrukkfsbddexniiudmeowpndujfmidazunzkpfyjtzrcrrjzggexqtbinmgsleypjvxwxesssxeandsuyvvbgnunstui',
            'company' => 'kjnarojntmjeawxpjbpsssfpsvkpanhjrjtznjtvosdwnrqwvxhrrcfqfuvjnlygoohsnpydwjyncjhvqmgyvtpvwwqwshxksszkpzbelndvxdydpmjmirtldlgnyhbpzymhpyrkfhdxlehafwgduqexyrgivdmeuwvfcvijqyiisctwzfllkhgpniaknjkhxt',
            'segment_1' => 'mshzwqjlnebczctpgmlescvwszvlzyvcilkiweldnvcglduynpcdjnpejgcaosdqpsnhnqzduhswlxjpvvynillqfjrxcewonnzyrghqatvgxhkthztyauaklczkmtlzjbdmoptaionpqlvlbrlajngvelzcvxzlghrocqyxxtdywpprkjsispwbguyrtftirytxqaffxjtkakjwdhqdm',
            'segment_2' => 'mrfnlljrbgcqayszjobqgaasmqajuuz',
            'segment_3' => 'hmobjvxcewndaiwekopzlrelkoqiyeqowjyrkljjlq',
            'segment_4' => 'bupcwpxytupzsarjoymalmukqtkxrjsrdqujasdhqervqeregkmlgllavjxbvepehuvbsdznwwcbzbuwibxxbgkxiiyznwvwfooeyxjswmvutjafpmrfsddth',
            'segment_5' => 'qjgyqkqlcksuvngnhgwubklmnwisyznxexmbkiemhrkujejcctcrsrsdfrjlyhulsqrbjdymskolnjnguxjekhnlspoopaumhjezagunpiaojhkyrpste',
            'segment_6' => 'vyslpkiggfouopsbdwrlybrxpvlgmomxnfdwaqrhsrzzdhjgucmvkfyefuojdyjcloahbcxxzkfimoiqzyqigeezjxgqmzobduxehzjhafeeotvnkpbvjhlteqdgsfdurzpvzyuctkjdqwvpdwpfvzkhknctdvxnsieturkqufytpgrkoprxlbdmafnbvyxkyppxxnqyhbyngubtqsiynqqrugardnldtzmqxfmqgbvjdivnkkuocip',
            'segment_7' => 'cetwojjsdtcqnibttnsmhrltjwbahkppbpaewmsdcqzeueihefhypuuybotysyplqcfoseosatldbfdtzfrpavmzziia',
            'segment_8' => 'yqsdlxvrqrwjzgodhzwqraibakpadfgajxedzuyfyusli',
            'segment_9' => 'poykzrionjzvxfchgypibppafgnnqbfpknkkojywxvuzarzdykodrzajiiqhtebpjjvpveixuyylbzkceyiixdevvyncsfkktgztqtjxzeygndttcdxykewhydxtldcvqvbqnrtbdwvnbxyxlidvyiocmvuribxabueheokosybvi',
            'segment_10' => 'efwvoytmfkmpoxyjjzcpkkotldjqfxmemvyytcqcsqilrdmkqwlmepbsommdxmfsxpqnhmrtzrltfumcyxjnymjhxqbldtatqlhocmwtwvqqpchukyjvtxbtnxlgfcwolumpysqswokyhtlsd',
            'segment_mrr' => 472946854.0,
            'segment_arr' => 1.06911,
            'segment_ltv' => 2.74,
            'email_unsubscribed_at' => '2024-11-23T22:11:28',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users'
payload = {
    "email": "rhstytlkeziesompgzhtkevfypkrelfwkhswlkylyiacrnjcrppetbbcaahiruvqgmezdfdakipznrxrotgoctijzkibaapokqjryfteuorgenjhorfbazefiaygvwpuvtqhkwpolmslgsnziufqwjlfimkqbyqdzplrfpjzpdeudrmas",
    "role": "admin",
    "name": "fkpcpgbydmytzkirwnawcsmnjygbd",
    "invitation_message": "yareuakquhklvkyclrrphppvzyoveymtokuavipfusrzdffexkqianenadzywzbrakgmrprxzwgvnfyswfewcxuldkzbsjydmoxsyndjeyzbfuktluuhelmivs",
    "password": "",
    "created_at": "2024-11-23T22:11:28",
    "is_blocked": "false",
    "verified": "1",
    "admin_accepted": "true",
    "sso_uid": "ldowcxljfown",
    "sso_avatar_url": "rgabtrnltgtrsuhadhpayxasxfnsdrxsvosfaizdvwqlbrrrukkfsbddexniiudmeowpndujfmidazunzkpfyjtzrcrrjzggexqtbinmgsleypjvxwxesssxeandsuyvvbgnunstui",
    "company": "kjnarojntmjeawxpjbpsssfpsvkpanhjrjtznjtvosdwnrqwvxhrrcfqfuvjnlygoohsnpydwjyncjhvqmgyvtpvwwqwshxksszkpzbelndvxdydpmjmirtldlgnyhbpzymhpyrkfhdxlehafwgduqexyrgivdmeuwvfcvijqyiisctwzfllkhgpniaknjkhxt",
    "segment_1": "mshzwqjlnebczctpgmlescvwszvlzyvcilkiweldnvcglduynpcdjnpejgcaosdqpsnhnqzduhswlxjpvvynillqfjrxcewonnzyrghqatvgxhkthztyauaklczkmtlzjbdmoptaionpqlvlbrlajngvelzcvxzlghrocqyxxtdywpprkjsispwbguyrtftirytxqaffxjtkakjwdhqdm",
    "segment_2": "mrfnlljrbgcqayszjobqgaasmqajuuz",
    "segment_3": "hmobjvxcewndaiwekopzlrelkoqiyeqowjyrkljjlq",
    "segment_4": "bupcwpxytupzsarjoymalmukqtkxrjsrdqujasdhqervqeregkmlgllavjxbvepehuvbsdznwwcbzbuwibxxbgkxiiyznwvwfooeyxjswmvutjafpmrfsddth",
    "segment_5": "qjgyqkqlcksuvngnhgwubklmnwisyznxexmbkiemhrkujejcctcrsrsdfrjlyhulsqrbjdymskolnjnguxjekhnlspoopaumhjezagunpiaojhkyrpste",
    "segment_6": "vyslpkiggfouopsbdwrlybrxpvlgmomxnfdwaqrhsrzzdhjgucmvkfyefuojdyjcloahbcxxzkfimoiqzyqigeezjxgqmzobduxehzjhafeeotvnkpbvjhlteqdgsfdurzpvzyuctkjdqwvpdwpfvzkhknctdvxnsieturkqufytpgrkoprxlbdmafnbvyxkyppxxnqyhbyngubtqsiynqqrugardnldtzmqxfmqgbvjdivnkkuocip",
    "segment_7": "cetwojjsdtcqnibttnsmhrltjwbahkppbpaewmsdcqzeueihefhypuuybotysyplqcfoseosatldbfdtzfrpavmzziia",
    "segment_8": "yqsdlxvrqrwjzgodhzwqraibakpadfgajxedzuyfyusli",
    "segment_9": "poykzrionjzvxfchgypibppafgnnqbfpknkkojywxvuzarzdykodrzajiiqhtebpjjvpveixuyylbzkceyiixdevvyncsfkktgztqtjxzeygndttcdxykewhydxtldcvqvbqnrtbdwvnbxyxlidvyiocmvuribxabueheokosybvi",
    "segment_10": "efwvoytmfkmpoxyjjzcpkkotldjqfxmemvyytcqcsqilrdmkqwlmepbsommdxmfsxpqnhmrtzrltfumcyxjnymjhxqbldtatqlhocmwtwvqqpchukyjvtxbtnxlgfcwolumpysqswokyhtlsd",
    "segment_mrr": 472946854,
    "segment_arr": 1.06911,
    "segment_ltv": 2.74,
    "email_unsubscribed_at": "2024-11-23T22:11:28"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "0a141548-a277-45fb-8f37-d01de218af89",
        "name": "Lawrence",
        "email": "miller.lelah@example.org",
        "role": "member",
        "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
        "avatar_small_url": "https://www.gravatar.com/avatar/20b61f91fcbe36e3413c90a644a44544?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Lawrence/60/F6EAC2/60542c",
        "counter_votes": 0,
        "counter_comments": 0,
        "counter_posts": 0,
        "counter_comment_votes": 0,
        "created_at": "2024-11-23T22:11:28.000000Z",
        "is_blocked": null,
        "verified": null,
        "admin_accepted": null,
        "sso_uid": null,
        "sso_avatar_url": null,
        "company": null,
        "segment_1": null,
        "segment_2": null,
        "segment_3": null,
        "segment_4": null,
        "segment_5": null,
        "segment_6": null,
        "segment_7": null,
        "segment_8": null,
        "segment_9": null,
        "segment_10": null,
        "segment_mrr": null,
        "segment_arr": null,
        "segment_ltv": null,
        "email_unsubscribed_at": null
    }
}
 

Example response (422):


{
    "message": "User already exists"
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "role": [
     "The selected role is invalid."
 ]
}
 

Request   

POST api/v1/users

Body Parameters

email  string optional  

Must be a valid email address. Must not be greater than 191 characters.

role  string  

Must be one of admin or member.

name  string optional  

Name for the user. Omit or null to automatically determine a name based on the email. Must not be greater than 100 characters.

invitation_message  string optional  

You can provide a custom invitation message. Omit or null to use the default message. Must not be greater than 1000 characters.

skip_email  string optional  

Provide a value to skip sending an email. Omit or null to send invitation email.

password  string optional  

Provide a password to skip sending an invitation. Omit or null to use an invitation (for which an email can be sent or not). Must not be greater than 100 characters. Must be at least 8 characters.

created_at  string optional  

The creation date of the user. Defaults to current timestamp if not provided. Must be a valid date.

is_blocked  string optional  

Whether the user is blocked from accessing the portal. Must be one of true, false, 0, or 1.

verified  string optional  

Whether the user's email is verified. Must be one of true, false, 0, or 1.

admin_accepted  string optional  

Whether the user is accepted by an admin. Must be one of true, false, 0, or 1.

sso_uid  string optional  

The user's SSO unique identifier. Must not be greater than 255 characters.

sso_avatar_url  string optional  

The URL of the user's avatar from SSO provider. Must be a valid URL. Must not be greater than 255 characters.

company  string optional  

The user's company name. Must not be greater than 255 characters.

segment_1  string optional  

Custom segment fields for user categorization. Must not be greater than 255 characters.

segment_2  string optional  

Must not be greater than 255 characters.

segment_3  string optional  

Must not be greater than 255 characters.

segment_4  string optional  

Must not be greater than 255 characters.

segment_5  string optional  

Must not be greater than 255 characters.

segment_6  string optional  

Must not be greater than 255 characters.

segment_7  string optional  

Must not be greater than 255 characters.

segment_8  string optional  

Must not be greater than 255 characters.

segment_9  string optional  

Must not be greater than 255 characters.

segment_10  string optional  

Must not be greater than 255 characters.

segment_mrr  number optional  

Monthly Recurring Revenue for the user.

segment_arr  number optional  

Annual Recurring Revenue for the user.

segment_ltv  number optional  

Lifetime Value of the user.

email_unsubscribed_at  string optional  

The date when the user unsubscribed from emails. Must be a valid date.

Get user

requires authentication

Retrieves the details of a specified user.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "b7d98d63-5c96-4301-9863-afc61f7489c1",
        "name": "Abdiel",
        "email": "lolita.rolfson@example.net",
        "role": "member",
        "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
        "avatar_small_url": "https://www.gravatar.com/avatar/44e1727b557cc995f0b10e98bdf31a40?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Abdiel/60/55CBCD/003537",
        "counter_votes": 0,
        "counter_comments": 0,
        "counter_posts": 0,
        "counter_comment_votes": 0,
        "created_at": "2024-11-23T22:11:28.000000Z",
        "is_blocked": null,
        "verified": null,
        "admin_accepted": null,
        "sso_uid": null,
        "sso_avatar_url": null,
        "company": null,
        "segment_1": null,
        "segment_2": null,
        "segment_3": null,
        "segment_4": null,
        "segment_5": null,
        "segment_6": null,
        "segment_7": null,
        "segment_8": null,
        "segment_9": null,
        "segment_10": null,
        "segment_mrr": null,
        "segment_arr": null,
        "segment_ltv": null,
        "email_unsubscribed_at": null
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Request   

GET api/v1/users/{id}

URL Parameters

id  string  

The ID of the user.

Update user

requires authentication

Updates the details of a specified user.

Example request:
curl --request PUT \
    "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"tvonrueden@example.net\",
    \"role\": \"admin\",
    \"name\": \"fwpmhzwl\",
    \"password\": \"ddzagzxi\",
    \"created_at\": \"2024-11-23T22:11:28\",
    \"is_blocked\": \"1\",
    \"verified\": \"0\",
    \"admin_accepted\": \"true\",
    \"sso_uid\": \"pcgmhtvqdyezgqaettqnnniediqpucbtmkmhjtqzzsqcwgonzeqggmuuvzorjgoxaeoajoucxriuicwrfdwurvfobsjwbwlqppbatxoealuayzrijmureujrqnsnppmbteplcopgotgklxuchbjozzgbmyudqwebnrljfphxntajczqsdndpkvrfgwcwkigpnqwedxwkliiywmtyrcmokuwhcawlvwbzqxirxfzg\",
    \"sso_avatar_url\": \"vxxiikvwgiawmepjcczyptnywghdnthmiffexsehfykpyxqopxjzwebzsdnhaiyrddqccnuzsfvhchhjoijxeirvhhfeixfarumteythdmxszoopbmqsupibakuwjnkguoye\",
    \"company\": \"mndvfbqfbkvgqxfjcuvfhjuwkbqthmtijbalvkqzjpwguxkvlf\",
    \"segment_1\": \"rynmsjzqdzzsdquxnfapwgsxxhthgbuazhvfpeizdmkoqljrdizibtrvbsdjczvljexeuxjuljkjjchjgcjdppjavyulrbfhldsyzsekvskjywckbfhwcmlgxtsqvslneotucuwraklqnidonemlhaqlkdjezpinbnthdklqrccnorryagunpycvcytpzpebvytwdkwwpwpglqtetqisjkpdjtmngpgguhtadunijzhsvxykkflb\",
    \"segment_2\": \"umbyrcrusrbgbeohrqnnpcwqknnsstqmpcyuhepzlncuplnounyanzsqybalrvkmrdvcllxmowevvswsjltcligskxjxkegtqvpvyqweipwqjjbhufnmzuaahiwkvdfuhivvfxmvgfh\",
    \"segment_3\": \"rqleljodifsh\",
    \"segment_4\": \"trhqewnaplhnrbmq\",
    \"segment_5\": \"iikijeohnullxxvchqxglqlsicfnpliynzmkzovubjhurkncfkkywzifemwqgewdaoufidenbwhmcvdflbigqfvmqgyphxmhzyqarxxdinrhxwshjfdvdifydcuybhz\",
    \"segment_6\": \"wsodtmnthxeriryewsnthcsutfmlnxeidxgjiybfzbvldwfdloxksavuycuzkouhyhkbzushga\",
    \"segment_7\": \"shekjozovgqqedcrvamvgqwqfuxacaynxgpbxlnijuyqbxevwkvefpextaycgwceyrmdbxnjooxvulnzzinpwrplsgmlnohzgyerzdcdwvrntjgihxxukzajceupjftwzeaxufxvxw\",
    \"segment_8\": \"wsuovmlwpxjrddsdkzlwcyjfowmwzoiqzbkicfhcdlnhksmlitowolqwklttjzwqcept\",
    \"segment_9\": \"yssuqhtzdapofxlqynbrccleclgytkripgpdmhxhflsdyirtcilqloswlnqzznbzvtugkbsgrhivrrapacsbcyfvryuev\",
    \"segment_10\": \"ezkgabnruirhpbjyfcjvwrrirviyhdxdwrbzquywvtommfdlkjvklxmdftdpyssivgugulavahuyepnxybgezxsoitdoyntmmolxupfvagrbwqmfnogznachurpakyirtjpucylffakhbgvkszliqgbkhemzquckjgapwqblydxnzlfzvmjrzrnbjbcjcgeqybysnlmrnitneqwzqmupnkynzonojpvjni\",
    \"segment_mrr\": 33770.488740565,
    \"segment_arr\": 1.5,
    \"segment_ltv\": 11691396,
    \"email_unsubscribed_at\": \"2024-11-23T22:11:28\"
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88"
);

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

let body = {
    "email": "tvonrueden@example.net",
    "role": "admin",
    "name": "fwpmhzwl",
    "password": "ddzagzxi",
    "created_at": "2024-11-23T22:11:28",
    "is_blocked": "1",
    "verified": "0",
    "admin_accepted": "true",
    "sso_uid": "pcgmhtvqdyezgqaettqnnniediqpucbtmkmhjtqzzsqcwgonzeqggmuuvzorjgoxaeoajoucxriuicwrfdwurvfobsjwbwlqppbatxoealuayzrijmureujrqnsnppmbteplcopgotgklxuchbjozzgbmyudqwebnrljfphxntajczqsdndpkvrfgwcwkigpnqwedxwkliiywmtyrcmokuwhcawlvwbzqxirxfzg",
    "sso_avatar_url": "vxxiikvwgiawmepjcczyptnywghdnthmiffexsehfykpyxqopxjzwebzsdnhaiyrddqccnuzsfvhchhjoijxeirvhhfeixfarumteythdmxszoopbmqsupibakuwjnkguoye",
    "company": "mndvfbqfbkvgqxfjcuvfhjuwkbqthmtijbalvkqzjpwguxkvlf",
    "segment_1": "rynmsjzqdzzsdquxnfapwgsxxhthgbuazhvfpeizdmkoqljrdizibtrvbsdjczvljexeuxjuljkjjchjgcjdppjavyulrbfhldsyzsekvskjywckbfhwcmlgxtsqvslneotucuwraklqnidonemlhaqlkdjezpinbnthdklqrccnorryagunpycvcytpzpebvytwdkwwpwpglqtetqisjkpdjtmngpgguhtadunijzhsvxykkflb",
    "segment_2": "umbyrcrusrbgbeohrqnnpcwqknnsstqmpcyuhepzlncuplnounyanzsqybalrvkmrdvcllxmowevvswsjltcligskxjxkegtqvpvyqweipwqjjbhufnmzuaahiwkvdfuhivvfxmvgfh",
    "segment_3": "rqleljodifsh",
    "segment_4": "trhqewnaplhnrbmq",
    "segment_5": "iikijeohnullxxvchqxglqlsicfnpliynzmkzovubjhurkncfkkywzifemwqgewdaoufidenbwhmcvdflbigqfvmqgyphxmhzyqarxxdinrhxwshjfdvdifydcuybhz",
    "segment_6": "wsodtmnthxeriryewsnthcsutfmlnxeidxgjiybfzbvldwfdloxksavuycuzkouhyhkbzushga",
    "segment_7": "shekjozovgqqedcrvamvgqwqfuxacaynxgpbxlnijuyqbxevwkvefpextaycgwceyrmdbxnjooxvulnzzinpwrplsgmlnohzgyerzdcdwvrntjgihxxukzajceupjftwzeaxufxvxw",
    "segment_8": "wsuovmlwpxjrddsdkzlwcyjfowmwzoiqzbkicfhcdlnhksmlitowolqwklttjzwqcept",
    "segment_9": "yssuqhtzdapofxlqynbrccleclgytkripgpdmhxhflsdyirtcilqloswlnqzznbzvtugkbsgrhivrrapacsbcyfvryuev",
    "segment_10": "ezkgabnruirhpbjyfcjvwrrirviyhdxdwrbzquywvtommfdlkjvklxmdftdpyssivgugulavahuyepnxybgezxsoitdoyntmmolxupfvagrbwqmfnogznachurpakyirtjpucylffakhbgvkszliqgbkhemzquckjgapwqblydxnzlfzvmjrzrnbjbcjcgeqybysnlmrnitneqwzqmupnkynzonojpvjni",
    "segment_mrr": 33770.488740565,
    "segment_arr": 1.5,
    "segment_ltv": 11691396,
    "email_unsubscribed_at": "2024-11-23T22:11:28"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->put(
    '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'tvonrueden@example.net',
            'role' => 'admin',
            'name' => 'fwpmhzwl',
            'password' => 'ddzagzxi',
            'created_at' => '2024-11-23T22:11:28',
            'is_blocked' => '1',
            'verified' => '0',
            'admin_accepted' => 'true',
            'sso_uid' => 'pcgmhtvqdyezgqaettqnnniediqpucbtmkmhjtqzzsqcwgonzeqggmuuvzorjgoxaeoajoucxriuicwrfdwurvfobsjwbwlqppbatxoealuayzrijmureujrqnsnppmbteplcopgotgklxuchbjozzgbmyudqwebnrljfphxntajczqsdndpkvrfgwcwkigpnqwedxwkliiywmtyrcmokuwhcawlvwbzqxirxfzg',
            'sso_avatar_url' => 'vxxiikvwgiawmepjcczyptnywghdnthmiffexsehfykpyxqopxjzwebzsdnhaiyrddqccnuzsfvhchhjoijxeirvhhfeixfarumteythdmxszoopbmqsupibakuwjnkguoye',
            'company' => 'mndvfbqfbkvgqxfjcuvfhjuwkbqthmtijbalvkqzjpwguxkvlf',
            'segment_1' => 'rynmsjzqdzzsdquxnfapwgsxxhthgbuazhvfpeizdmkoqljrdizibtrvbsdjczvljexeuxjuljkjjchjgcjdppjavyulrbfhldsyzsekvskjywckbfhwcmlgxtsqvslneotucuwraklqnidonemlhaqlkdjezpinbnthdklqrccnorryagunpycvcytpzpebvytwdkwwpwpglqtetqisjkpdjtmngpgguhtadunijzhsvxykkflb',
            'segment_2' => 'umbyrcrusrbgbeohrqnnpcwqknnsstqmpcyuhepzlncuplnounyanzsqybalrvkmrdvcllxmowevvswsjltcligskxjxkegtqvpvyqweipwqjjbhufnmzuaahiwkvdfuhivvfxmvgfh',
            'segment_3' => 'rqleljodifsh',
            'segment_4' => 'trhqewnaplhnrbmq',
            'segment_5' => 'iikijeohnullxxvchqxglqlsicfnpliynzmkzovubjhurkncfkkywzifemwqgewdaoufidenbwhmcvdflbigqfvmqgyphxmhzyqarxxdinrhxwshjfdvdifydcuybhz',
            'segment_6' => 'wsodtmnthxeriryewsnthcsutfmlnxeidxgjiybfzbvldwfdloxksavuycuzkouhyhkbzushga',
            'segment_7' => 'shekjozovgqqedcrvamvgqwqfuxacaynxgpbxlnijuyqbxevwkvefpextaycgwceyrmdbxnjooxvulnzzinpwrplsgmlnohzgyerzdcdwvrntjgihxxukzajceupjftwzeaxufxvxw',
            'segment_8' => 'wsuovmlwpxjrddsdkzlwcyjfowmwzoiqzbkicfhcdlnhksmlitowolqwklttjzwqcept',
            'segment_9' => 'yssuqhtzdapofxlqynbrccleclgytkripgpdmhxhflsdyirtcilqloswlnqzznbzvtugkbsgrhivrrapacsbcyfvryuev',
            'segment_10' => 'ezkgabnruirhpbjyfcjvwrrirviyhdxdwrbzquywvtommfdlkjvklxmdftdpyssivgugulavahuyepnxybgezxsoitdoyntmmolxupfvagrbwqmfnogznachurpakyirtjpucylffakhbgvkszliqgbkhemzquckjgapwqblydxnzlfzvmjrzrnbjbcjcgeqybysnlmrnitneqwzqmupnkynzonojpvjni',
            'segment_mrr' => 33770.488740565,
            'segment_arr' => 1.5,
            'segment_ltv' => 11691396.0,
            'email_unsubscribed_at' => '2024-11-23T22:11:28',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88'
payload = {
    "email": "tvonrueden@example.net",
    "role": "admin",
    "name": "fwpmhzwl",
    "password": "ddzagzxi",
    "created_at": "2024-11-23T22:11:28",
    "is_blocked": "1",
    "verified": "0",
    "admin_accepted": "true",
    "sso_uid": "pcgmhtvqdyezgqaettqnnniediqpucbtmkmhjtqzzsqcwgonzeqggmuuvzorjgoxaeoajoucxriuicwrfdwurvfobsjwbwlqppbatxoealuayzrijmureujrqnsnppmbteplcopgotgklxuchbjozzgbmyudqwebnrljfphxntajczqsdndpkvrfgwcwkigpnqwedxwkliiywmtyrcmokuwhcawlvwbzqxirxfzg",
    "sso_avatar_url": "vxxiikvwgiawmepjcczyptnywghdnthmiffexsehfykpyxqopxjzwebzsdnhaiyrddqccnuzsfvhchhjoijxeirvhhfeixfarumteythdmxszoopbmqsupibakuwjnkguoye",
    "company": "mndvfbqfbkvgqxfjcuvfhjuwkbqthmtijbalvkqzjpwguxkvlf",
    "segment_1": "rynmsjzqdzzsdquxnfapwgsxxhthgbuazhvfpeizdmkoqljrdizibtrvbsdjczvljexeuxjuljkjjchjgcjdppjavyulrbfhldsyzsekvskjywckbfhwcmlgxtsqvslneotucuwraklqnidonemlhaqlkdjezpinbnthdklqrccnorryagunpycvcytpzpebvytwdkwwpwpglqtetqisjkpdjtmngpgguhtadunijzhsvxykkflb",
    "segment_2": "umbyrcrusrbgbeohrqnnpcwqknnsstqmpcyuhepzlncuplnounyanzsqybalrvkmrdvcllxmowevvswsjltcligskxjxkegtqvpvyqweipwqjjbhufnmzuaahiwkvdfuhivvfxmvgfh",
    "segment_3": "rqleljodifsh",
    "segment_4": "trhqewnaplhnrbmq",
    "segment_5": "iikijeohnullxxvchqxglqlsicfnpliynzmkzovubjhurkncfkkywzifemwqgewdaoufidenbwhmcvdflbigqfvmqgyphxmhzyqarxxdinrhxwshjfdvdifydcuybhz",
    "segment_6": "wsodtmnthxeriryewsnthcsutfmlnxeidxgjiybfzbvldwfdloxksavuycuzkouhyhkbzushga",
    "segment_7": "shekjozovgqqedcrvamvgqwqfuxacaynxgpbxlnijuyqbxevwkvefpextaycgwceyrmdbxnjooxvulnzzinpwrplsgmlnohzgyerzdcdwvrntjgihxxukzajceupjftwzeaxufxvxw",
    "segment_8": "wsuovmlwpxjrddsdkzlwcyjfowmwzoiqzbkicfhcdlnhksmlitowolqwklttjzwqcept",
    "segment_9": "yssuqhtzdapofxlqynbrccleclgytkripgpdmhxhflsdyirtcilqloswlnqzznbzvtugkbsgrhivrrapacsbcyfvryuev",
    "segment_10": "ezkgabnruirhpbjyfcjvwrrirviyhdxdwrbzquywvtommfdlkjvklxmdftdpyssivgugulavahuyepnxybgezxsoitdoyntmmolxupfvagrbwqmfnogznachurpakyirtjpucylffakhbgvkszliqgbkhemzquckjgapwqblydxnzlfzvmjrzrnbjbcjcgeqybysnlmrnitneqwzqmupnkynzonojpvjni",
    "segment_mrr": 33770.488740565,
    "segment_arr": 1.5,
    "segment_ltv": 11691396,
    "email_unsubscribed_at": "2024-11-23T22:11:28"
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('PUT', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "00f47dbc-76a1-4844-a3e9-cee070e3e0df",
        "name": "Ruthe",
        "email": "kaden.kunde@example.org",
        "role": "member",
        "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
        "avatar_small_url": "https://www.gravatar.com/avatar/a01516a7aee31aac7021e375fea0a1ba?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Ruthe/60/FFDBCC/694536",
        "counter_votes": 0,
        "counter_comments": 0,
        "counter_posts": 0,
        "counter_comment_votes": 0,
        "created_at": "2024-11-23T22:11:28.000000Z",
        "is_blocked": null,
        "verified": null,
        "admin_accepted": null,
        "sso_uid": null,
        "sso_avatar_url": null,
        "company": null,
        "segment_1": null,
        "segment_2": null,
        "segment_3": null,
        "segment_4": null,
        "segment_5": null,
        "segment_6": null,
        "segment_7": null,
        "segment_8": null,
        "segment_9": null,
        "segment_10": null,
        "segment_mrr": null,
        "segment_arr": null,
        "segment_ltv": null,
        "email_unsubscribed_at": null
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Example response (422):


{
 "message": "The given data was invalid.",
 "errors": {
 "role": [
     "The selected role is invalid."
 ]
}
 

Request   

PUT api/v1/users/{id}

PATCH api/v1/users/{id}

URL Parameters

id  string  

The ID of the user.

Body Parameters

email  string optional  

Make null or omit to keep current value. Must be unique in the portal. Must be a valid email address.

role  string optional  

Make null or omit to keep current value. Must be one of admin or member.

name  string optional  

Make null or omit to keep current value. Must not be greater than 100 characters.

password  string optional  

Make null or omit to keep current value. Must not be greater than 100 characters. Must be at least 8 characters.

created_at  string optional  

The creation date of the user. Must be a valid date.

is_blocked  string optional  

Whether the user is blocked from accessing the portal. Must be one of true, false, 0, or 1.

verified  string optional  

Whether the user's email is verified. Must be one of true, false, 0, or 1.

admin_accepted  string optional  

Whether the user is accepted by an admin. Must be one of true, false, 0, or 1.

sso_uid  string optional  

The user's SSO unique identifier. Must not be greater than 255 characters.

sso_avatar_url  string optional  

The URL of the user's avatar from SSO provider. Must be a valid URL. Must not be greater than 255 characters.

company  string optional  

The user's company name. Must not be greater than 255 characters.

segment_1  string optional  

Custom segment fields for user categorization. Must not be greater than 255 characters.

segment_2  string optional  

Must not be greater than 255 characters.

segment_3  string optional  

Must not be greater than 255 characters.

segment_4  string optional  

Must not be greater than 255 characters.

segment_5  string optional  

Must not be greater than 255 characters.

segment_6  string optional  

Must not be greater than 255 characters.

segment_7  string optional  

Must not be greater than 255 characters.

segment_8  string optional  

Must not be greater than 255 characters.

segment_9  string optional  

Must not be greater than 255 characters.

segment_10  string optional  

Must not be greater than 255 characters.

segment_mrr  number optional  

Monthly Recurring Revenue for the user.

segment_arr  number optional  

Annual Recurring Revenue for the user.

segment_ltv  number optional  

Lifetime Value of the user.

email_unsubscribed_at  string optional  

The date when the user unsubscribed from emails. Must be a valid date.

Delete user

requires authentication

Deletes a specified user.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"delete_all_data\": true
}"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88"
);

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

let body = {
    "delete_all_data": true
};

fetch(url, {
    method: "DELETE",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'delete_all_data' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/users/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88'
payload = {
    "delete_all_data": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Request   

DELETE api/v1/users/{id}

URL Parameters

id  string  

The ID of the user.

Body Parameters

delete_all_data  boolean optional  

Set true or 1 to delete all data from this user. Otherwise, posts, comments, will remain with [User Deleted] as the username.

Votes

Manage votes on your posts.

List votes

requires authentication

Lists all votes of a post.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "created_at": "2020-06-09T14:40:38.000000Z",
            "voter": {
                "id": "2850e389-2827-4316-a50a-fcdcc6474b5d",
                "name": "Jordi",
                "email": "descubre@exploradoresdemartech.com",
                "role": "member",
                "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
                "avatar_small_url": "https://www.gravatar.com/avatar/72802d9f5cd0781807579a89a3947b75?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Jordi/60/CCE2CB/364c35",
                "counter_votes": 3,
                "counter_comments": 0,
                "counter_posts": 0,
                "counter_comment_votes": 0,
                "created_at": "2020-06-09T14:40:23.000000Z",
                "is_blocked": 0,
                "verified": false,
                "admin_accepted": 1,
                "sso_uid": null,
                "sso_avatar_url": null,
                "company": null,
                "segment_1": null,
                "segment_2": null,
                "segment_3": null,
                "segment_4": null,
                "segment_5": null,
                "segment_6": null,
                "segment_7": null,
                "segment_8": null,
                "segment_9": null,
                "segment_10": null,
                "segment_mrr": null,
                "segment_arr": null,
                "segment_ltv": null,
                "email_unsubscribed_at": null
            }
        },
        {
            "created_at": "2020-06-09T14:40:38.000000Z",
            "voter": {
                "id": "2850e389-2827-4316-a50a-fcdcc6474b5d",
                "name": "Jordi",
                "email": "descubre@exploradoresdemartech.com",
                "role": "member",
                "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
                "avatar_small_url": "https://www.gravatar.com/avatar/72802d9f5cd0781807579a89a3947b75?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Jordi/60/CCE2CB/364c35",
                "counter_votes": 3,
                "counter_comments": 0,
                "counter_posts": 0,
                "counter_comment_votes": 0,
                "created_at": "2020-06-09T14:40:23.000000Z",
                "is_blocked": 0,
                "verified": false,
                "admin_accepted": 1,
                "sso_uid": null,
                "sso_avatar_url": null,
                "company": null,
                "segment_1": null,
                "segment_2": null,
                "segment_3": null,
                "segment_4": null,
                "segment_5": null,
                "segment_6": null,
                "segment_7": null,
                "segment_8": null,
                "segment_9": null,
                "segment_10": null,
                "segment_mrr": null,
                "segment_arr": null,
                "segment_ltv": null,
                "email_unsubscribed_at": null
            }
        }
    ]
}
 

Request   

GET api/v1/posts/{key}/votes

URL Parameters

key  string  

The ID of the post.

Revoke vote

requires authentication

Revoke a user's vote for a post.

Example request:
curl --request DELETE \
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88"
);

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

fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->delete(
    '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Example response (422):


{
    "message": "Post is not voteable."
}
 

Example response (422):


{
    "message": "User has not voted yet."
}
 

Request   

DELETE api/v1/posts/{key}/votes/{user}

URL Parameters

key  string  

The ID of the post.

user  string  

The ID of the user.

Vote

requires authentication

Add the vote of a user to a post.

Example request:
curl --request POST \
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88"
);

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

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->post(
    '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/posts/0UFQQh/votes/8cbfbfd6-ecc3-4ec3-8b31-ea76b11c1f88'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "created_at": "2020-06-09T14:40:38.000000Z",
        "voter": {
            "id": "2850e389-2827-4316-a50a-fcdcc6474b5d",
            "name": "Jordi",
            "email": "descubre@exploradoresdemartech.com",
            "role": "member",
            "profile_url": "{YOUR-PORTAL-URL}/user/profile/123456",
            "avatar_small_url": "https://www.gravatar.com/avatar/72802d9f5cd0781807579a89a3947b75?s=60&d=https%3A%2F%2Fui-avatars.com%2Fapi%2F/Jordi/60/CCE2CB/364c35",
            "counter_votes": 3,
            "counter_comments": 0,
            "counter_posts": 0,
            "counter_comment_votes": 0,
            "created_at": "2020-06-09T14:40:23.000000Z",
            "is_blocked": 0,
            "verified": false,
            "admin_accepted": 1,
            "sso_uid": null,
            "sso_avatar_url": null,
            "company": null,
            "segment_1": null,
            "segment_2": null,
            "segment_3": null,
            "segment_4": null,
            "segment_5": null,
            "segment_6": null,
            "segment_7": null,
            "segment_8": null,
            "segment_9": null,
            "segment_10": null,
            "segment_mrr": null,
            "segment_arr": null,
            "segment_ltv": null,
            "email_unsubscribed_at": null
        }
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\User] ..."
}
 

Example response (404):


{
    "message": "No query results for model [App\\Post] ..."
}
 

Example response (422):


{
    "message": "Post is not voteable."
}
 

Example response (422):


{
    "message": "User has already voted for this post."
}
 

Request   

POST api/v1/posts/{key}/votes/{user}

URL Parameters

key  string  

The ID of the post.

user  string  

The ID of the user.

Widgets

API endpoints for managing widgets in your portal.

List widgets

requires authentication

Retrieves a collection of all widgets in your portal.

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/widgets" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/widgets"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/widgets',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/widgets'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": [
        {
            "id": "widget1",
            "name": "Feedback Widget",
            "type": "feedback",
            "created_at": "2023-01-01T00:00:00Z",
            "updated_at": "2023-01-01T00:00:00Z"
        },
        {
            "id": "widget2",
            "name": "Survey Widget",
            "type": "survey",
            "created_at": "2023-01-02T00:00:00Z",
            "updated_at": "2023-01-02T00:00:00Z"
        }
    ]
}
 

Request   

GET api/v1/widgets

Get widget

requires authentication

Retrieves the details of a specific widget by its key (ID).

Example request:
curl --request GET \
    --get "{YOUR_PORTAL_URL}/api/v1/widgets/widget1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "{YOUR_PORTAL_URL}/api/v1/widgets/widget1"
);

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$response = $client->get(
    '{YOUR_PORTAL_URL}/api/v1/widgets/widget1',
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = '{YOUR_PORTAL_URL}/api/v1/widgets/widget1'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "widget1",
        "name": "Feedback Widget",
        "type": "feedback",
        "created_at": "2023-01-01T00:00:00Z",
        "updated_at": "2023-01-01T00:00:00Z"
    }
}
 

Example response (404):


{
    "message": "No query results for model [App\\Widget] widget1"
}
 

Request   

GET api/v1/widgets/{key}

URL Parameters

key  string  

The unique identifier of the widget.