API
Serwis TextBookers udostępnia RESTowe API umożliwiające dostęp do niektórych funkcjonalności serwisu. Autoryzacja dokonywana jest za pomocą standardu OAuth. Wszelkie zapytania należy wykonywać poprzez HTTPS. Bez użycia tego protokołu login, hasło, ID klienta oraz tajny klucz będą publicznie dostępne.
Logowanie
Aby mieć możliwość zalogowania do API, należy zarejestrować aplikację korzystającą z API, podając jej adres URI. Możesz zarejestrować wiele aplikacji.
- Przejdź do ustawień.
- Przejdź do API.
- Wybierz 'dodaj aplikację'.
- Podaj adres swojej aplikacji (np. http://mojserwis.pl).
Po pomyślnej rejestracji zostanie wyświetlone ID klienta i tajny klucz, które posłużą do logowania.
Przed rozpoczęciem korzystania z API musisz się do niego zalogować. Służy do tego wywołanie:
GET https://www.textbookers.com/oauth/v2/token?client_id=ID_KLIENTA&client_secret=TAJNY_KLUCZ&grant_type=password&username=TWOJ_EMAIL&password=TWOJE_HASLO
ID_KLIENTA i TAJNY_KLUCZ znajdziesz w szczegółach zarejestrowanej aplikacji. TWOJ_EMAIL i TWOJE_HASLO to login i hasło do Twojego konta w serwisie TextBookers.
Odpowiedź
{
"access_token": "TOKEN",
"expires_in": 3600,
"token_type": "bearer",
"scope": null,
"refresh_token": "refresh token"
}
Do każdego z wywołań poniżej należy dodać parametr access_token o wartości otrzymanej w odpowiedzi, np.:
GET https://www.textbookers.com/api/user?access_token=TOKEN
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$r = $client->get('oauth/v2/token', [
'query' => [
'client_id' => 'ID_KLIENTA',
'client_secret' => 'TAJNY_KLUCZ',
'grant_type' => 'password',
'username' => 'TWOJ_EMAIL',
'password' => 'TWOJE_HASLO'
]
]);
$loginData = $r->json();
Wywołania
Wywołania mogą składać się z filtrów, placeholderów i danych zapytania. Wszelkie filtry dodawane są do zapytania (np. ?order=123), parametry są umieszczane w miejscach placeholderów (np. {id}), natomiast dane zapytania przekazywane są w formacie JSON w ciele (body) zapytania.
Pobierz listę tekstów
GET /api/articles
Domyślnie pobierane są zatwierdzone teksty. Listę tekstów można filtrować za pomocą filtrów, które można dodać do parametrów zapytania.
Filtry
Nazwa | Format/Wartość | Opis |
---|---|---|
id | \d+ | ID tekstu. |
order | \d+ | ID zlecenia. |
project | \d+ | ID projektu. |
creationStatus | to-accept | Status tekstu. |
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID tekstu. |
order | model | Zlecenie, w ramach którego został napisany tekst. |
title | string | Tytuł tekstu. |
content | string | Treść tekstu. |
rate | integer | Ocena wystawiona przez klienta. |
rateDesc | string | Uzasadnienie oceny klienta. |
ratedAt | datetime | Kiedy wystawiono ocenę tekstu |
correctionReason | string | Co jest wg zleceniodawcy do poprawienia w tekście |
complaintReason | string | Uzasadnienie reklamacji. |
utilized | boolean | Czy tekst został wykorzystany przez klienta. |
autoAccepted | boolean | Czy tekst został zatwierdzony automatycznie przez system. |
project | model | Projekt, do którego należy tekst. |
userNote | string | Własna notatka klienta. |
Przykład
<?php
/**
* Pobranie tekstów do akceptacji z wybranego zlecenia
*/
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$orderId = 'należy pobrać ID zlecenia';
$r = $client->get('api/articles', [
'query' => [
'order' => $orderId,
'creationStatus' => 'to-accept',
'access_token' => $token
]
]);
$articles = $r->json();
Zmień dane tekstu
PATCH /api/articles/{id}
Możliwe jest zmienienie statusu tekstu na zatwierdzony (accepted) lub odrzucony (rejected). Zmiana jest możliwa tylko w przypadku tekstów, które są gotowe do zatwierdzenia. Zmiana statusu już zatwierdzonego tekstu spowoduje błąd. Można też oznaczyć tekst jako wykorzystany lub jako niewykorzystany.
Parametry
Nazwa | Typ | Opis |
---|---|---|
id | int | ID zlecenia |
Dane zapytania
Nazwa | Typ/Wartość | Wymagany | Opis |
---|---|---|---|
creationStatus | accepted|rejected | nie | Status tekstu. |
utilized | utilized|not-utilized | nie | Czy tekst został wykorzystany. |
rate | [1-6] | nie | Ocena jako chcemy wystawić. |
rateDesc | [a-zA-Z ]+ | nie | Uzasadnienie do wystawianej oceny. |
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID tekstu. |
order | model | Zlecenie, w ramach którego został napisany tekst. |
title | string | Tytuł tekstu. |
content | string | Treść tekstu. |
rate | integer | Ocena wystawiona przez klienta. |
rateDesc | string | Uzasadnienie oceny klienta. |
ratedAt | datetime | Kiedy wystawiono ocenę tekstu |
correctionReason | string | Co jest wg zleceniodawcy do poprawienia w tekście |
complaintReason | string | Uzasadnienie reklamacji. |
utilized | boolean | Czy tekst został wykorzystany przez klienta. |
autoAccepted | boolean | Czy tekst został zatwierdzony automatycznie przez system. |
project | model | Projekt, do którego należy tekst. |
userNote | string | Własna notatka klienta. |
Przykład
<?php
/* Akceptowanie gotowych tekstów z podanego zlecenia */
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$articleId = 'należy pobrać ID tekstu';
$r = $client->patch('api/articles/' . $articleId, [
'query' => ['access_token' => $token],
'json' => [
'creationStatus' => 'accepted'
]
]);
Pobierz listę copywriterów
GET /api/copywriters
Pobiera copywriterów, którzy wykonują zlecenia o podanych parametrach i nie są obciążeni dużą ilością zleceń.
Filtry
Nazwa | Format/Wartość | Opis |
---|---|---|
language | [a-z]{2} | Symbol języka (pl, en, de). |
subject | \d+ | ID tematu zleceń. |
articleType | \d+ | ID typu tekstów. |
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
copywriterRate | float | Średnia ocena copywritera. |
copywriterRates | collection | Tablica ocen copywritera wg typów tekstów w formacie [<język> => [<id typu> => <ocena>, <id typu> => <ocena>...]...]. |
copywriterName | string | Nazwa copywritera. |
id | integer | ID użytkownika. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$subjectId = 'należy pobrać ID tematu';
$articleTypeId = 'należy pobrać ID typu tekstu';
$r = $client->get('api/copywriters', [
'query' => [
'language' => 'pl',
'subject' => $subjectId,
'articleType' => $articleTypeId,
'access_token' => $token
]
]);
$copywriters = $r->json();
Pobierz listę zleceń
GET /api/orders
Pobiera listę zleceń spełniających podane w filtrach kryteria.
Filtry
Nazwa | Format/Wartość | Opis |
---|---|---|
id | \d+ | ID zlecenia. |
project | \d+ | ID projektu. |
status | (incomplete|\d+) | Status zlecenia. Możliwe wartości: 0 - zlecenia w toku, 1 - w pełni zrealizowane, 2 - zrealizowane częściowo, 3 - niezrealizowane, incomplete - zl. posiadające status 2 lub 3. |
offset | \d+ | Offset. |
limit | \d+ | Limit. |
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID zlecenia. |
createdAt | datetime | Data dodania zlecenia. |
deadline | datetime | Termin realizacji zlecenia. |
individual | boolean | Czy zlecenie będzie zrealizowane przez jednego copywritera. |
author | model | Copywriter wybrany przez klienta. |
minChars | integer | Minimalna liczba znaków w pojedynczym tekście. |
keywords | collection | Słowa kluczowe, które muszą znaleźć się w tekstach. |
totalCost | float | Koszt całego zlecenia w punktach. |
language | string | Język tekstów. |
articlesCount | integer | Liczba zamówionych tekstów. |
acceptedCount | integer | Liczba zatwierdzonych tekstów. |
toAcceptCount | integer | Liczba tekstów oczekujących na zatwierdzenie. |
rejectedCount | integer | Liczba tekstów oczekujących na poprawę (odrzuconych przez klienta). |
status | integer | Status zlecenia: 0 - w trakcie realizacji, 1 - wykonane, 2 - wykonane częściowo, 3 - niewykonane w ogóle 4 - zgłoszone do sprawdzenia dla moderatora |
orderDescription | string | Opis zamówienia. |
subject | model | Temat tekstów. |
project | model | Projekt, do którego domyślnie trafią teksty. |
articleType | model | Typ pisanych tekstów. |
Przykład
<?php
/**
* Pobranie zakończonych zleceń, w ramach których nie wszystkie teksty
* zostały napisane
*/
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$r = $client->get('api/orders', [
'query' => [
'status' => 'incomplete',
'access_token' => $token
]
]);
$orders = $r->json();
Dodaj nowe zlecenie
POST /api/orders
Dane zapytania
Nazwa | Typ/Wartość | Wymagany | Opis |
---|---|---|---|
language | string | tak | Język zlecenia (pl, en, de). |
subject | integer | tak | ID tematu zlecenia. |
articleType | integer | tak | ID typu pisanych tekstów. |
keywords | array | tak | Tablica ze słowami kluczowymi. |
minChars | integer | tak | Minimalna liczba znaków w pojedynczym tekście. |
articlesCount | integer | tak | Liczba zamówionych tekstów. |
project | integer | tak | ID projektu, do którego domyślnie trafią teksty. |
orderDescription | string | nie | Opis zlecenia. |
author | integer | nie | ID copywritera, który ma wykonać zlecenie. Copywritera można wybrać tylko wtedy, gdy podany w zleceniu typ tekstu posiada parametr individual=1. |
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
minChars | integer | Minimalna liczba znaków w pojedynczym tekście. |
keywords | collection | Słowa kluczowe, które muszą znaleźć się w tekstach. |
language | string | Język tekstów. |
articlesCount | integer | Liczba zamówionych tekstów. |
subject | model | Temat tekstów. |
project | model | Projekt, do którego domyślnie trafią teksty. |
reportReason | string | - |
moderatorReportComment | string | - |
articleType | model | Typ pisanych tekstów. |
id | integer | ID zlecenia. |
createdAt | datetime | Data dodania zlecenia. |
deadline | datetime | Termin realizacji zlecenia. |
individual | boolean | Czy zlecenie będzie zrealizowane przez jednego copywritera. |
author | model | Copywriter wybrany przez klienta. |
totalCost | float | Koszt całego zlecenia w punktach. |
acceptedCount | integer | Liczba zatwierdzonych tekstów. |
toAcceptCount | integer | Liczba tekstów oczekujących na zatwierdzenie. |
rejectedCount | integer | Liczba tekstów oczekujących na poprawę (odrzuconych przez klienta). |
status | integer | Status zlecenia: 0 - w trakcie realizacji, 1 - wykonane, 2 - wykonane częściowo, 3 - niewykonane w ogóle 4 - zgłoszone do sprawdzenia dla moderatora |
orderDescription | string | Opis zamówienia. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$subjectId = 'należy pobrać ID tematu';
$articleTypeId = 'należy pobrać ID typu tekstu';
$projectId = 'należy pobrać ID projektu';
$r = $client->post('api/orders', [
'query' => ['access_token' => $token],
'json' => [
'language' => 'pl',
'subject' => $subjectId,
'articleType' => $articleTypeId,
'keywords' => ['słowo 1', 'słowo 2'], // zawsze tablica
'minChars' => 300,
'articlesCount' => 2,
'project' => $projectId,
'orderDescription' => 'Dodatkowy opis zlecenia'
]
]);
$newOrderData = $r->json();
Pobierz dane zlecenia
GET /api/orders/{id}
Pobierz dane zlecenia o podanym ID.
Parametry
Nazwa | Typ | Opis |
---|---|---|
id | int | ID zlecenia |
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
minChars | integer | Minimalna liczba znaków w pojedynczym tekście. |
keywords | collection | Słowa kluczowe, które muszą znaleźć się w tekstach. |
language | string | Język tekstów. |
articlesCount | integer | Liczba zamówionych tekstów. |
subject | model | Temat tekstów. |
project | model | Projekt, do którego domyślnie trafią teksty. |
reportReason | string | - |
moderatorReportComment | string | - |
articleType | model | Typ pisanych tekstów. |
id | integer | ID zlecenia. |
createdAt | datetime | Data dodania zlecenia. |
deadline | datetime | Termin realizacji zlecenia. |
individual | boolean | Czy zlecenie będzie zrealizowane przez jednego copywritera. |
author | model | Copywriter wybrany przez klienta. |
totalCost | float | Koszt całego zlecenia w punktach. |
acceptedCount | integer | Liczba zatwierdzonych tekstów. |
toAcceptCount | integer | Liczba tekstów oczekujących na zatwierdzenie. |
rejectedCount | integer | Liczba tekstów oczekujących na poprawę (odrzuconych przez klienta). |
status | integer | Status zlecenia: 0 - w trakcie realizacji, 1 - wykonane, 2 - wykonane częściowo, 3 - niewykonane w ogóle 4 - zgłoszone do sprawdzenia dla moderatora |
orderDescription | string | Opis zamówienia. |
express | boolean | - |
copyrights | boolean | - |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$orderId = 'należy pobrać ID zlecenia';
$r = $client->get('api/orders/' . $orderId, [
'query' => ['access_token' => $token]
]);
$orderData = $r->json();
Pobierz listę projektów
GET /api/projects
Pobiera listę projektów należących do użytkownika.
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID projektu. |
name | string | Nazwa projektu. |
default | boolean | Czy projekt jest domyślny. |
archived | boolean | Czy projekt znajduje się w archiwum. |
createdAt | datetime | Data utworzenia projektu. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$r = $client->get('api/projects', [
'query' => ['access_token' => $token]
]);
$projects = $r->json();
Dodaj nowy projekt
POST /api/projects
Dane zapytania
Nazwa | Typ/Wartość | Wymagany | Opis |
---|---|---|---|
name | string | tak | Nazwa projektu |
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
name | string | Nazwa projektu. |
id | integer | ID projektu. |
default | boolean | Czy projekt jest domyślny. |
archived | boolean | Czy projekt znajduje się w archiwum. |
createdAt | datetime | Data utworzenia projektu. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$name = 'Nazwa projektu';
$r = $client->post('api/projects', [
'query' => ['access_token' => $token],
'json' => [
'name' => $name,
],
]);
$project = $r->json();
Usuń istniejący projekt
DELETE /api/projects/{id}
Parametry
Nazwa | Typ | Opis |
---|---|---|
id | int | ID projektu |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$projectId = 'należy pobrać ID projektu';
$r = $client->delete(sprintf('api/projects/%d', $projectId), [
'query' => ['access_token' => $token],
]);
$r->getStatusCode();
Zmień dane projektu
PATCH /api/projects/{id}
Parametry
Nazwa | Typ | Opis |
---|---|---|
id | int | ID projektu |
Dane zapytania
Nazwa | Typ/Wartość | Wymagany | Opis |
---|---|---|---|
name | string | nie | Nowa nazwa projektu |
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
name | string | Nazwa projektu. |
id | integer | ID projektu. |
default | boolean | Czy projekt jest domyślny. |
archived | boolean | Czy projekt znajduje się w archiwum. |
createdAt | datetime | Data utworzenia projektu. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$projectId = 'należy pobrać ID projektu';
$name = 'Nowa nazwa projektu';
$r = $client->patch(sprintf('api/projects/%d', $projectId), [
'query' => ['access_token' => $token],
'json' => [
'name' => $name,
],
]);
$project = $r->json();
Pobierz listę dostępnych tematów zleceń
GET /api/subjects
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID tematu. |
name | string | Nazwa tematu. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$r = $client->get('api/subjects', [
'query' => ['access_token' => $token]
]);
$subjets = $r->json();
Pobierz listę dostępnych typów tekstów
GET /api/types
Odpowiedź
Tablica obiektów:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID typu tekstu. |
name | string | Nazwa typu tekstu. |
description | string | Opis typu tekstu. |
costPl | float | Cena za 1000 znaków dla j. polskiego. |
costEn | float | Cena za 1000 znaków dla j. angielskiego. |
costDe | float | Cena za 1000 znaków dla j. niemieckiego. |
individual | boolean | Czy zarealizację zlecenia dla tego typu odpowiada jeden copywriter. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$r = $client->get('api/types', [
'query' => ['access_token' => $token]
]);
$types = $r->json();
Pobierz dane użytkownika
GET /api/user
Pobierz dane użytkownika.
Odpowiedź
Obiekt:
Nazwa | Typ | Opis |
---|---|---|
id | integer | ID użytkownika. |
points | float | Punkty wykupione na zakup tekstów. |
firstName | string | Imię. |
lastName | string | Nazwisko |
companyName | string | Nazwa firmy. |
address | string | Adres. |
postalCode | string | Kod pocztowy. |
city | string | Miejscowość. |
nip | string | NIP. |
iban | string | Numer konta bankowego IBAN. |
notifyCreated | boolean | Czy powiadamiać mailem o tekstach utworzonych przez copywritera. |
legalForm | string | Forma prawna (osoba prywatna czy firma) |
identityNo | string | Nr PESEL. |
createdAt | datetime | Data rejestracji. |
Przykład
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
$token = 'należy pobrać token';
$r = $client->get('api/user', [
'query' => ['access_token' => $token]
]);
$userData = $r->json();
Przykłady
Wznowienie zlecenia
<?php
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://www.textbookers.com/']);
// Pobieranie tokenu
try {
$r = $client->get('oauth/v2/token', [
'query' => [
'client_id' => 'ID_KLIENTA',
'client_secret' => 'TAJNY_KLUCZ',
'grant_type' => 'password',
'username' => 'TWOJ_EMAIL',
'password' => 'TWOJE_HASLO'
]
]);
} catch (GuzzleHttp\Exception\ClientException $e) {
// obsługa błędu
}
$authData = $r->json();
$token = $authData['access_token'];
// Pobieranie niezrealizowanych zleceń
$r = $client->get('api/orders', [
'query' => [
'status' => 'incomplete',
'access_token' => $token
]
]);
if ($r->getStatusCode() != 200) {
// obsługa błędu
}
$orders = $r->json();
// Wznawianie zleceń
foreach ($orders as $o) {
$newOrder = [
'language' => $o['language'],
'subject' => $o['subject']['id'],
'articleType' => $o['articleType']['id'],
'keywords' => $o['keywords'],
'minChars' => $o['minChars'],
'articlesCount' => $o['articlesCount'] - $o['acceptedCount'],
'project' => $o['project']['id'],
'orderDescription' => $o['orderDescription']
];
$r = $client->post('api/orders', [
'body' => $newOrder,
'query' => ['access_token' => $token]
]);
if ($r->getStatusCode() != 201) {
// obsługa błędu
}
}