Skip to main content

Astuto API (v1)

Download OpenAPI specification:Download

The Astuto API allows you to interact programmatically with the feedback space. You can manage Boards, Posts, Comments, Users, Votes, and more.

Get started

How to obtain an API key

You can obtain an API key only if you are an administrator or moderator of the feedback space. To get an API key, follow these steps:

  1. Log in to the feedback space.
  2. Click on your name in the top right corner and then click on Profile settings.
  3. In the API key section, click on the Generate API key button.
  4. Copy the API key and store it in a safe place. It cannot be shown again. If you lose it, you will have to generate a new one.

How to use the API key

To use the API key, you need to pass it in the Authorization header of your requests. The header must be in the following format:

Bearer {your-api-key}

The API endpoint path is /api/v1/.

Note: all API endpoints require authentication, so you must pass the API key in all your requests.

Moderator vs administrator API key

Moderators and administrators can do almost the same operations through the API. Some notable differences are:

  • Only administrators can impersonate other users (see the following section).
  • Only administrators can create Boards.
  • Moderators cannot block administrators, whereas administrators can block moderators.

The impersonation technique

Administrators can impersonate other users through the API. This is useful if you want to submit a post or cast a vote on behalf of another user.

Some endpoints accept an impersonated_user_id parameter. If you pass this parameter, the API will act as if the request was made by the user with the specified ID. For example, if you want to create a post on behalf of a user with ID 123, you can pass impersonated_user_id=123 in the request body.

Since you need to know the ID of the user you want to impersonate, this technique is usually used in combination with the Create/Get user endpoint. This endpoint creates a new user and returns its ID if it does not exist or it just returns the ID of the existing user. You can then use the returned ID to impersonate the user in other requests.

Rate limits

The API has rate limits to prevent abuse. The following limits are in place simultaneously:

  • 100 requests every 5 minutes per API key.
  • 100 requests every 5 minutes per IP address.

Boards

A Board is an entity that groups related Posts together.

List boards

List all boards.

Authorizations:
api_key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create board

Create a new board.

Note: requires admin role.

Authorizations:
api_key
Request Body schema: application/json
name
required
string

Name of the board

slug
string or null

URL-friendly identifier for the board (optional; if not provided, one will be created automatically from provided board name)

description
string or null

Description of the board (optional)

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "slug": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

Get board

Get the specified board.

Authorizations:
api_key
path Parameters
id
required
string

ID or slug of the board

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "name": "string",
  • "slug": "string",
  • "description": "string",
  • "created_at": "string",
  • "updated_at": "string"
}

Comments

A Comment can be written to reply to a Post or to another Comment. Moreover, administrators and moderators can mark a Comment as a "Post update": this is usually used to notify Users that some progress has been made in a Post.

List comments

List comments with optional filters. In particular, you may want to filter by post_id to get comments for a specific post. Comments are returned from newest to oldest.

Authorizations:
api_key
query Parameters
post_id
integer

Return only comments for the specified post.

limit
integer

Number of comments to return. Defaults to 100.

offset
integer

Offset the starting point of comments to return. Defaults to 0.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a comment

Create a new comment.

Authorizations:
api_key
Request Body schema: application/json
body
required
string

Content of the comment

post_id
required
integer

ID of the post the comment belongs to

parent_id
integer or null

ID of the parent comment if this is a comment reply

is_post_update
boolean or null

Whether the comment is a post update or not

impersonated_user_id
integer or null

ID of the user to impersonate (optional; requires admin role)

Responses

Request samples

Content type
application/json
{
  • "body": "string",
  • "post_id": 0,
  • "parent_id": 0,
  • "is_post_update": true,
  • "impersonated_user_id": 0
}

Response samples

Content type
application/json
{
  • "id": 0
}

Get a comment

Get a comment by id.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the comment.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "body": "string",
  • "post_id": 0,
  • "is_post_update": true,
  • "user": {
    },
  • "created_at": "string",
  • "updated_at": "string"
}

Update a comment

Update a comment by id.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the comment.

Request Body schema: application/json
body
required
string

Content of the comment

Responses

Request samples

Content type
application/json
{
  • "body": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

Delete a comment

Delete a comment by id.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the comment.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Mark comment as post update

Mark a comment as a post update.

Note: email notification to post followers will NOT be sent when using this endpoint. To send email notifications, use the "Create a comment" endpoint with the "is_post_update" parameter set to true.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the comment.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Unmark comment as post update

Unmark a comment as a post update.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the comment.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Post Statuses

A Post Status is a label that can be assigned to a Post to indicate its current status (e.g. "In progress", "Completed", etc.).

List post statuses

List all post statuses.

Authorizations:
api_key

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Posts

A Post is a piece of content that can be created by Users. It usually represents ideas, suggestions, feedback or reports from your Users. Posts must be associated with a Board and can have Comments.

List posts

List posts with optional filters. Posts are returned from newest to oldest.

Authorizations:
api_key
query Parameters
limit
integer

Number of posts to return. Defaults to 20.

offset
integer

Offset the starting point of posts to return. Defaults to 0.

board_id
integer

If specified, only posts from this board will be returned.

user_id
integer

If specified, only posts from this user will be returned.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create post

Create a new post.

Authorizations:
api_key
Request Body schema: application/json
title
required
string

Title of the post

description
string

Content of the post

board_id
required
integer

ID of the board where the post will be created

impersonated_user_id
integer or null

ID of the user to impersonate (optional; requires admin role)

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "description": "string",
  • "board_id": 0,
  • "impersonated_user_id": 0
}

Response samples

Content type
application/json
{
  • "id": 0
}

Get a post

Get a post by id.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "title": "string",
  • "description": "string",
  • "board": {
    },
  • "post_status": {
    },
  • "user": {
    },
  • "approval_status": "string",
  • "slug": "string",
  • "created_at": "string",
  • "updated_at": "string"
}

Update a post

Update a post.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Request Body schema: application/json
title
string

New title of the post

description
string

New content of the post

Responses

Request samples

Content type
application/json
{
  • "title": "string",
  • "description": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

Delete a post

Delete a post by id.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Update post board

Move post to another board.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Request Body schema: application/json
board_id
required
integer

ID of the new board

Responses

Request samples

Content type
application/json
{
  • "board_id": 0
}

Response samples

Content type
application/json
{
  • "id": 0
}

Update post status

Update post status.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Request Body schema: application/json
post_status_id
required
integer

ID of the new post status. Send null if you want to remove current status.

impersonated_user_id
integer or null

ID of the user to impersonate (optional; requires admin role)

Responses

Request samples

Content type
application/json
{
  • "post_status_id": 0,
  • "impersonated_user_id": 0
}

Response samples

Content type
application/json
{
  • "id": 0
}

Approve post

Approve a post that is pending approval.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Reject post

Reject a post that is pending approval.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the post.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Users

A User is a person who interacts with the feedback space. Users can create and vote Posts, write Comments, and more.

List users

List users with optional filters. Users are returned from newest to oldest.

Authorizations:
api_key
query Parameters
limit
integer

Number of users to return. Defaults to 50.

offset
integer

Offset the starting point of users to return. Defaults to 0.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create/get user

Create a new user or, if it already exists, get it.

This endpoint is useful for the impersonation technique.
In the case of creation, a password will be randomly generated so the user will be able to log in using an OAuth provider or by email after resetting the password.
The full_name parameter is optional, but it is recommended to provide it if you are creating a new user.

Authorizations:
api_key
Request Body schema: application/json
email
required
string

Email of the user

full_name
string

Full name of the user

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "full_name": "string"
}

Response samples

Content type
application/json
{
  • "id": 0
}

Get user

Get a user by id.

Authorizations:
api_key
path Parameters
id
required
string

User ID

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "email": "string",
  • "full_name": "string",
  • "created_at": "string",
  • "updated_at": "string"
}

Get user by email

Get a user by email. You can specify email both as a query parameter or in the request body.

Authorizations:
api_key
query Parameters
email
required
string

User email

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "email": "string",
  • "full_name": "string",
  • "created_at": "string",
  • "updated_at": "string"
}

Block user

Block a user.

Authorizations:
api_key
path Parameters
id
required
string

User ID

Responses

Response samples

Content type
application/json
{
  • "id": 0
}

Votes

A Vote is a way for Users to express their agreement/support for a Post.

List votes

List votes with optional filters. In particular, you may want to filter by post_id to get votes for a specific post. Votes are returned from newest to oldest.

Authorizations:
api_key
query Parameters
post_id
integer

Return only votes for the specified post.

limit
integer

Limit the number of votes returned. Defaults to 100.

offset
integer

Offset the starting point of votes to return. Defaults to 0.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Create a vote

Create a new vote.

Authorizations:
api_key
Request Body schema: application/json
post_id
required
integer

ID of the post the vote belongs to

Responses

Request samples

Content type
application/json
{
  • "post_id": 0
}

Response samples

Content type
application/json
{
  • "id": 0
}

Show a vote

Show a vote by ID.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the vote to show.

Responses

Response samples

Content type
application/json
{
  • "id": 0,
  • "post_id": 0,
  • "user": {
    },
  • "created_at": "string",
  • "updated_at": "string"
}

Delete a vote

Delete a vote by ID.

Authorizations:
api_key
path Parameters
id
required
integer

ID of the vote to delete.

Responses

Response samples

Content type
application/json
{
  • "id": 0
}