# Autentifikacija

> Sukurkite verslo prieigos raktą programėlėje, siųskite jį kaip bearer prieigos raktą ir supraskite jo apimtį bei galiojimą.

Kiekviena užklausa į F-sąskaita API autentifikuojama **verslo prieigos raktu** (Business token). Prieigos raktas identifikuoja vieną jūsų paskyros verslą, ir kiekviena sąskaita faktūra, išlaidų dokumentas ar profilis, su kuriuo dirbate, priklauso tam verslui.

## Sukurkite prieigos raktą

1. Prisijunkite prie [app.fsaskaita.lt](https://app.fsaskaita.lt) kaip naudotojas, galintis valdyti verslą.
2. Atidarykite **Nustatymai**, tada **Integracijos**, tada **API**.
3. Suteikite prieigos raktui pavadinimą, iš kurio aišku, kur jis naudojamas, pavyzdžiui `accounting-sync`, ir sukurkite jį.
4. Iš karto nusikopijuokite prieigos raktą. Jis parodomas tik vieną kartą. Vėliau sąraše matomas tik jo pavadinimas.

Prieigos raktai pasiekiami tik planuose, kuriuose įtraukta API funkcija. Jei vietoj formos skiltyje rodomas pranešimas apie plano atnaujinimą, dabartinis planas jos neapima.

## Naudokite prieigos raktą

Siųskite jį antraštėje `Authorization` ir visada prašykite JSON:

```bash tab="cURL" tab-group="request"
curl https://app.fsaskaita.lt/api/profile \
  -H "Authorization: Bearer $FSASKAITA_TOKEN" \
  -H "Accept: application/json"
```

```js tab="JavaScript" tab-group="request"
const response = await fetch('https://app.fsaskaita.lt/api/profile', {
  headers: {
    Authorization: `Bearer ${process.env.FSASKAITA_TOKEN}`,
    Accept: 'application/json',
  },
});

console.log(response.status, await response.json());
```

```go tab="Go" tab-group="request"
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://app.fsaskaita.lt/api/profile", nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("FSASKAITA_TOKEN"))
	req.Header.Set("Accept", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()

	body, _ := io.ReadAll(res.Body)
	fmt.Println(res.Status, string(body))
}
```

```python tab="Python" tab-group="request"
import os

import requests

response = requests.get(
    "https://app.fsaskaita.lt/api/profile",
    headers={
        "Authorization": f"Bearer {os.environ['FSASKAITA_TOKEN']}",
        "Accept": "application/json",
    },
)

print(response.status_code, response.json())
```

```java tab="Java" tab-group="request"
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class GetProfile {
    public static void main(String[] args) throws Exception {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://app.fsaskaita.lt/api/profile"))
            .header("Authorization", "Bearer " + System.getenv("FSASKAITA_TOKEN"))
            .header("Accept", "application/json")
            .GET()
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode() + " " + response.body());
    }
}
```

```csharp tab="C#" tab-group="request"
using System.Net.Http.Headers;

using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("FSASKAITA_TOKEN"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.GetAsync("https://app.fsaskaita.lt/api/profile");
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");
```

Sėkmingas atsakymas aprašo verslą, kuriam priklauso prieigos raktas:

```json
{
  "data": {
    "business_id": "9c1f7b2e-3a6d-4d5e-9f0a-2b7c8d9e0f11",
    "business_title": "Pavyzdys, MB",
    "business_type": "small_partnership",
    "address": "Gedimino pr. 1, Vilnius",
    "vat_code": "LT100001234567",
    "company_name": "Pavyzdys, MB",
    "company_code": "305000001"
  }
}
```

Jei verslas registruotas kaip individuali veikla, profilyje vietoj `company_name` ir `company_code` pateikiami `individual_activity_id`, `first_name` ir `last_name`.

## Kodėl svarbi Accept antraštė

Programos klaidos bet kuriuo atveju grąžinamos JSON formatu. Tačiau be `Accept: application/json` trūkstamas arba panaikintas prieigos raktas gauna HTML peradresavimą į prisijungimo puslapį, o užklausų limitą viršijusi užklausa – HTML klaidos puslapį. Su šia antrašte gausite `401 {"message":"Unauthenticated."}` ir `429 {"message":"Too Many Attempts."}`.

## Apimtis ir galiojimas

- Prieigos raktas suteikia pilną prieigą prie savo verslo. Atskirų teisių pagal galinius taškus nėra.
- Prieigos raktų galiojimas nesibaigia. Raktą panaikinsite ištrynę jį tame pačiame nustatymų puslapyje; užklausos su ištrintu raktu gauna `401`.
- Jei jūsų paskyroje yra keli verslai, kiekvienam sukurkite atskirą prieigos raktą.
- Visi vieno verslo prieigos raktai dalijasi tuo pačiu 60 užklausų per minutę limitu.

## Laikykite jį paslaptyje

Su prieigos raktu elkitės kaip su slaptažodžiu. Saugokite jį paslapčių tvarkyklėje arba aplinkos kintamajame, niekada – repozitorijoje ar naršyklės pusės programoje. Jei prieigos raktas nutekėjo, ištrinkite jį programėlėje ir sukurkite naują.
