# Integrate Rev AI's Sentiment Analysis API with a Node.js Application

**By Vikram Vaswani, Developer Advocate - Apr 19, 2022**

## Introduction

[Sentiment analysis](https://en.wikipedia.org/wiki/Sentiment_analysis) attempts to identify the emotional content in a text document and qualify it as positive, negative, or neutral. It is useful in a number of different scenarios, including

- Tracking customer support satisfaction levels from customer agent interactions or written complaints
- Analyzing political sentiment based on reactions to public speeches
- Understanding student engagement and attitudes in class
- Scoring leads based on sales team member interactions with prospects
- Understanding witness attitudes in depositions


Rev AI offers a [Sentiment Analysis API](/api/sentiment-analysis) that provides additional speech insights by analyzing sentiments in a given transcript. As an application developer, you can use this API to obtain qualitative information about the feelings expressed in a transcribed conversation and then build applications to act on those insights.

This tutorial explains how to integrate the Rev AI Sentiment Analysis API into your Node.js application.

## Assumptions

This tutorial assumes that:

- You have a Rev AI account and access token. If not, [sign up for a free account](https://www.rev.ai/auth/signup) and [generate an access token](/get-started#step-1-get-your-access-token).
- You have a properly-configured Node.js development environment with Node.js v16.x or v17.x. If not, [download and install Node.js](https://nodejs.org/en/download/) for your operating system.
- You have a JSON transcript generated from the [Asynchronous Speech-to-Text API](/api/asynchronous). If not, use this [example JSON transcript](https://www.rev.ai/FTC_Sample_1_Transcript.json).


## Step 1: Install Axios

The Sentiment Analysis API is a REST API and, as such, you will need an HTTP client to interact with it. This tutorial uses [Axios](https://axios-http.com/), a popular Promise-based HTTP client for Node.js.

Begin by installing Axios into your application directory:


```bash
npm install axios
```

Within your application code, initialize Axios as below:


```javascript
const axios = require('axios');
const token = '<REVAI_ACCESS_TOKEN>';

// create a client
const http = axios.create({
  baseURL: 'https://api.rev.ai/sentiment_analysis/v1/',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  }
});
```

Here, the Axios HTTP client is initialized with the base endpoint for the Sentiment Analysis API, which is `https://api.rev.ai/sentiment_analysis/v1/`.

Every request to the API must be in JSON format and must include an `Authorization` header containing your API access token. The code shown above also attaches these required headers to the client.

## Step 2: Submit transcript for sentiment analysis

To perform sentiment analysis on a transcript, you must begin by submitting an HTTP POST request containing the transcript content, in either plaintext or JSON, to the API endpoint at `https://api.rev.ai/sentiment_analysis/v1/jobs`.

The code listings below perform this operation using the HTTP client initialized in [Step 1](#step-1-install-axios), for both plaintext and JSON transcripts:


```javascript
const submitSentimentAnalysisJobText = async (textData) => {
  return await http.post(`jobs`,
    JSON.stringify({
      text: textData
    }))
    .then(response => response.data)
    .catch(console.error);
};

const submitSentimentAnalysisJobJson = async (jsonData) => {
  return await http.post(`jobs`,
    JSON.stringify({
      json: jsonData
    }))
    .then(response => response.data)
    .catch(console.error);
};
```

If you were to inspect the return value of the functions shown above, here is an example of what you would see:


```json
{
  id: 'Sz6Fc4g6CqDM',
  created_on: '2022-03-04T06:49:44.049Z',
  status: 'in_progress',
  type: 'sentiment_analysis'
}
```

The API response contains a job identifier (`id` field). This job identifier will be required to check the job status and obtain the job result.

[Learn more about submitting a sentiment analysis job in the API reference guide](/api/sentiment-analysis).

## Step 3: Check job status

Sentiment analysis jobs usually complete within 10-20 seconds. To check the status of the job, you must submit an HTTP GET request to the API endpoint at `https://api.rev.ai/sentiment_analysis/v1/jobs/<ID>`, where `<ID>` is a placeholder for the job identifier.

The code listing below demonstrates this operation:


```javascript
const getSentimentAnalysisJobStatus = async (jobId) => {
  return await http.get(`jobs/${jobId}`)
    .then(response => response.data)
    .catch(console.error);
};
```

Here is an example of the API response to the previous request after the job has completed:


```json
{
  id: 'Sz6Fc4g6CqDM',
  created_on: '2022-03-04T06:49:44.049Z',
  completed_on: '2022-03-04T06:49:49.472Z',
  word_count: 3,
  status: 'completed',
  type: 'sentiment_analysis'
}
```

[Learn more about retrieving the status of a sentiment analysis job in the API reference guide](/api/sentiment-analysis).

## Step 4: Retrieve sentiment analysis report

Once the sentiment analysis job's `status` changes to `completed`, you can retrieve the results by submitting an HTTP GET request to the API endpoint at `https://api.rev.ai/sentiment_analysis/v1/jobs/<ID>/result`, where `<ID>` is a placeholder for the job identifier.

The code listing below demonstrates this operation:


```javascript
const getSentimentAnalysisJobResult = async (jobId) => {
  return await http.get(`jobs/${jobId}/result`,
    { headers: { 'Accept': 'application/vnd.rev.sentiment.v1.0+json' } })
    .then(response => response.data)
    .catch(console.error);
};
```

If the job status is `completed`, the return value of the above function is a JSON-encoded response containing a sentence-wise sentiment analysis report. If the job status is not `completed`, the function will return an error instead.

Here is an example of the sentiment analysis report returned from a completed job:


```json
{
  messages: [
    {
      content: 'I dislike tabs in code.',
      score: -0.801,
      sentiment: 'negative',
      offset: 0,
      length: 23
    },
    ...
  ]
}
```

It’s also possible to filter the result set to return only positive, negative, or neutral messages by adding a [`filter_for` query parameter](/api/sentiment-analysis) to the request.

[Learn more about obtaining a sentiment analysis report in the API reference guide](/api/sentiment-analysis).

## Step 5: Create and test a simple application

Using the code samples shown previously, it's possible to create a simple application that accepts a plaintext document and returns its sentiment, as shown below:


```javascript
const main = async (textData) => {
  const job = await submitSentimentAnalysisJobText(textData);
  console.log(`Job submitted with id: ${job.id}`);

  await new Promise((resolve, reject) => {
    const interval = setInterval(() => {
      getSentimentAnalysisJobStatus(job.id)
        .then(r => {
          console.log(`Job status: ${r.status}`);
          if (r.status !== 'in_progress') {
            clearInterval(interval);
            resolve(r);
          }
        })
        .catch(e => {
          clearInterval(interval);
          reject(e);
        });
    }, 15000);
  });

  const jobResult = await getSentimentAnalysisJobResult(job.id);
  console.log(jobResult);
};

main("I dislike tabs in code. But I love jam on toast.");
```

This example application begins by invoking the `main()` function with two sentences of text, representing the input to be analyzed. The `main()` function first submits this data to the Sentiment Analysis API using the `submitSentimentAnalysisJobText()` method. It then uses `setInterval()` to repeatedly poll the API every 15 seconds to obtain the status of the job. Once the job status is no longer `in_progress`, it uses the `getSentimentAnalysisJobResult()` method to retrieve the job result and prints it to the console.

Here is an example of the output returned by the code above:


```json
  messages: [
    {
      content: 'I dislike tabs in code.',
      score: -0.801,
      sentiment: 'negative',
      offset: 0,
      length: 23
    },
    {
      content: 'But I love jam on toast.',
      score: 0.6,
      sentiment: 'positive',
      offset: 24,
      length: 24
    }
  ]
}
```

The code listing above polls the API repeatedly to check the status of the sentiment analysis job. This is presented only for illustrative purposes and is **strongly recommended against** in production scenarios. For production scenarios, use [webhooks](/api/sentiment-analysis/webhooks) to asynchronously receive notifications once the sentiment analysis job completes.

## Next steps

Learn more about the topics discussed in this tutorial by visiting the following links:

- Documentation: [Sentiment Analysis API reference](/api/sentiment-analysis)
- Documentation: [Sentiment Analysis API webhooks](/api/sentiment-analysis/webhooks)
- Tutorial: [Get Started with Sentiment Analysis](/api/sentiment-analysis/get-started)
- Tutorial: [Get Started with Rev AI Webhooks](/resources/tutorials/get-started-api-webhooks)