# Generating an authentication token

Before calling other endpoints, you need to generate an Authorization Bearer token. To retrieve your token, simply send your account credentials as body parameters.

This works just like logging into the Personr platform, but instead of being redirected to your dashboard, you will receive a token that allows you to authenticate and call other endpoints.

This token has a lifetime of 1 year, and is invalidated whenever a new token is generated.

The token is attached to the user credentials it was created with and as such it is recommended to create a service account for applications and use those credentials for token generation.&#x20;

***

## Generate a bearer token

<mark style="color:green;">`POST`</mark> `/api-token-generate`

Generate a token for use with other endpoints.&#x20;

**Header**

| Name         | Value                 |
| ------------ | --------------------- |
| Content-Type | `multipart/form-data` |

**Body**

| Name       | Type   | Description                                          |
| ---------- | ------ | ---------------------------------------------------- |
| `email`    | string | The email you use to login to the Personr account    |
| `password` | string | The password you use to login to the Personr account |

#### Request

{% tabs %}
{% tab title="cURL" %}

```sh
curl --location 'https://enterprise.personr.co/api/1.1/wf/api-token-generate' \
--form 'email="example@personr.co"' \
--form 'password="example123"'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
var axios = require('axios');
var FormData = require('form-data');
var data = new FormData();
data.append('email', 'example@personr.co');
data.append('password', 'example123');

var config = {
  method: 'post',
maxBodyLength: Infinity,
  url: 'https://enterprise.personr.co/api/1.1/wf/api-token-generate',
  headers: { 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
var form = new FormData();
form.append("email", "example@personr.co");
form.append("password", "example123");

var settings = {
  "url": "https://enterprise.personr.co/api/1.1/wf/api-token-generate",
  "method": "POST",
  "timeout": 0,
  "processData": false,
  "mimeType": "multipart/form-data",
  "contentType": false,
  "data": form
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require "uri"
require "net/http"

url = URI("https://enterprise.personr.co/api/1.1/wf/api-token-generate")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

request = Net::HTTP::Post.new(url)
form_data = [['email', 'example@personr.co'],['password', 'example123']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = "https://enterprise.personr.co/api/1.1/wf/api-token-generate"

payload={'email': 'example@personr.co',
'password': 'example123'}
files=[

]
headers = {}

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

print(response.text)
```

{% endtab %}
{% endtabs %}

**Response**

{% tabs %}
{% tab title="200" %}

```json
{
  "status": "success",
  "response": {
    "token": "bus|4242424242424x424242424242424242|4343434343434x434343434343434343",
    "user_id": "4242424242424x424242424242424242",
    "expires": 31536000
  }
}
```

{% endtab %}

{% tab title="400" %}

```json
{
    "statusCode": 400,
    "reason": "INVALID_LOGIN_CREDENTIALS",
    "message": "We didn’t find an account with those login credentials",
    }
```

{% endtab %}
{% endtabs %}

In the response, you'll receive:

* The bearer token
* The unique user id
* The expiration time of your token, expressed in seconds.&#x20;

{% hint style="info" %}
Remember to include your token in the header of every subsequent API call, in the format **Authorization: Bearer YOUR\_TOKEN**
{% endhint %}

{% hint style="info" %}
Don't forget to set up a workflow to renew your token before it expires.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://manual.personr.co/api-documentation/getting-started/generating-an-authentication-token.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
