MENU navbar-image

Introduction

The Shiny Reviews API allows you to interact with your Shiny Reviews project and attached reviews. Create, search, filter, or fetch, all your reviews.

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

Authenticating requests

To authenticate requests, include a query parameter token in the request.

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

You can retrieve your token by visiting your dashboard and going to your project settings.

Endpoints

Display project details

requires authentication

List all the details for the project. Requires a read token when "Public/unprotected" is enabled.

Example request:
curl --request GET \
    --get "https://demo.shiny-reviews.test/api/v1?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1"
);

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

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "code": "ib627lob1",
        "name": "Maggio, Heller and Schuppe",
        "description": "Laudantium voluptatibus voluptatum alias natus suscipit. Eaque id quo et et eius.",
        "domain": "https://www.gmail.com",
        "features": {
            "review-notification": true,
            "metafields": true,
            "sentiment-analysis": false,
            "review-approval": true,
            "public-unprotected": true,
            "domain-locked": false,
            "markdown": false
        },
        "review_stats": {
            "average": 0,
            "total_count": 0,
            "approved_count": 0
        },
        "ratings_style": "stars",
        "ratings_style_options": [
            1,
            2,
            3,
            4,
            5
        ]
    }
}
 

Request      

GET api/v1

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo

Display project details

requires authentication

List all the details for the project. Requires a read token when "Public/unprotected" is enabled.

Example request:
curl --request GET \
    --get "https://demo.shiny-reviews.test/api/v1/project?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1/project"
);

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

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "code": "qbxspizlg",
        "name": "Maggio, Heller and Schuppe",
        "description": "Laudantium voluptatibus voluptatum alias natus suscipit. Eaque id quo et et eius.",
        "domain": "https://www.gmail.com",
        "features": {
            "review-notification": true,
            "metafields": true,
            "sentiment-analysis": false,
            "review-approval": true,
            "public-unprotected": true,
            "domain-locked": false,
            "markdown": false
        },
        "review_stats": {
            "average": 0,
            "total_count": 0,
            "approved_count": 0
        },
        "ratings_style": "stars",
        "ratings_style_options": [
            1,
            2,
            3,
            4,
            5
        ]
    }
}
 

Request      

GET api/v1/project

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo

Approve a review

requires authentication

Used for approving reviews through emails. Requires a signed URL. Currently, this cannot be called directly.

Example request:
curl --request GET \
    --get "https://demo.shiny-reviews.test/api/v1/reviews/1/approve?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1/reviews/1/approve"
);

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

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 293,
        "rating": 0,
        "title": "Eos voluptas molestias aut laudantium voluptatibus voluptatum alias natus.",
        "body": "Odit eaque id quo et et eius voluptatem. Accusantium aliquam dicta et et labore voluptate doloremque voluptatem. Vitae porro voluptatum odio. Beatae numquam voluptate et omnis in. Blanditiis et laudantium aut porro et.",
        "metafields": null,
        "created_at": "2024-09-15T20:25:27.000000Z"
    }
}
 

Example response (302, authenticated user approved):



 

Example response (302, unauthenticated user approved):



 

Request      

GET api/v1/reviews/{review_id}/approve

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

review_id   integer   

The ID of the review. Example: 1

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo

List reviews

requires authentication

List all the reviews in the project. Results are paginated. Requires a read token when "Public/unprotected" is enabled.

Example request:
curl --request GET \
    --get "https://demo.shiny-reviews.test/api/v1/reviews?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"positive\": true,
    \"negative\": true
}"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1/reviews"
);

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

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

let body = {
    "positive": true,
    "negative": true
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "data": [
        {
            "id": 294,
            "rating": 0,
            "title": "Eos voluptas molestias aut laudantium voluptatibus voluptatum alias natus.",
            "body": "Odit eaque id quo et et eius voluptatem. Accusantium aliquam dicta et et labore voluptate doloremque voluptatem. Vitae porro voluptatum odio. Beatae numquam voluptate et omnis in. Blanditiis et laudantium aut porro et.",
            "metafields": null,
            "created_at": "2024-09-15T20:25:27.000000Z"
        },
        {
            "id": 295,
            "rating": 0,
            "title": "Aperiam blanditiis voluptatem officia magnam rerum minima.",
            "body": "Quam nisi quisquam sit quos. Laboriosam deleniti minima vitae assumenda rerum. Ut illum accusamus illo et et aperiam. Repellendus nostrum amet quo molestiae. Et ea numquam totam maxime ea provident magni quisquam.",
            "metafields": null,
            "created_at": "2024-09-15T20:25:27.000000Z"
        }
    ],
    "links": {
        "first": "/?page=1",
        "last": "/?page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "/?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "active": false
            }
        ],
        "path": "/",
        "per_page": 10,
        "to": 2,
        "total": 2
    }
}
 

Request      

GET api/v1/reviews

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo

Body Parameters

metafields   object  optional  
positive   boolean  optional  

Example: true

negative   boolean  optional  

Example: true

Store a review

requires authentication

Store a single review. Requires a write token.

Example request:
curl --request POST \
    "https://demo.shiny-reviews.test/api/v1/reviews?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"rating\": 1,
    \"title\": \"c\",
    \"body\": \"error\"
}"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1/reviews"
);

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

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

let body = {
    "rating": 1,
    "title": "c",
    "body": "error"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 296,
        "rating": 0,
        "title": "Voluptatibus eveniet voluptatem mollitia et magni nam cupiditate.",
        "body": "Voluptatem ea numquam eos architecto. Aspernatur dolore et dignissimos quibusdam consectetur eos voluptas molestias. Laudantium voluptatibus voluptatum alias natus suscipit. Eaque id quo et et eius. Vel accusantium aliquam dicta et et labore voluptate doloremque.",
        "metafields": null,
        "created_at": "2024-09-15T20:25:27.000000Z"
    }
}
 

Request      

POST api/v1/reviews

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo

Body Parameters

rating   integer   

Must be at least 0. Must not be greater than 5. Example: 1

title   string  optional  

Must not be greater than 255 characters. Example: c

body   string   

Example: error

metafields   object  optional  

Show a review

requires authentication

Show the details for a single review. Requires a read token when "Public/unprotected" is enabled.

Example request:
curl --request GET \
    --get "https://demo.shiny-reviews.test/api/v1/reviews/1?token=iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://demo.shiny-reviews.test/api/v1/reviews/1"
);

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

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

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "data": {
        "id": 297,
        "rating": 0,
        "title": "Eos voluptas molestias aut laudantium voluptatibus voluptatum alias natus.",
        "body": "Odit eaque id quo et et eius voluptatem. Accusantium aliquam dicta et et labore voluptate doloremque voluptatem. Vitae porro voluptatum odio. Beatae numquam voluptate et omnis in. Blanditiis et laudantium aut porro et.",
        "metafields": null,
        "created_at": "2024-09-15T20:25:27.000000Z"
    }
}
 

Request      

GET api/v1/reviews/{id}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   integer   

The ID of the review. Example: 1

Query Parameters

token   string   

Authentication key. Example: iT1fTUMRpZxgMaTxo1R2xyBc4KW8WF2abXF5hNNo