--- title: "Frazy: słowa kluczowe projektu (`getProjectKeywords`)" source: https://docs.senuto.com/modules/rank_tracker/rt-keywords-getProjectKeywords api: POST /api/rank_tracker/reports/keywords/getProjectKeywords --- # Frazy: słowa kluczowe projektu (`getProjectKeywords`) **`POST /api/rank_tracker/reports/keywords/getProjectKeywords`** Zwraca listę słów kluczowych przypisanych do projektu Rank Tracker (Monitoring) — wyłącznie pary `id` + `keyword`, wraz z metadanymi paginacji. Endpoint nie zwraca danych pozycyjnych ani czasowych; służy do pobrania pełnego zbioru fraz monitorowanych w projekcie. | Fraza | ID | | --- | --- | | jak wychowac szczeniaka | 690709 | | karma dla szczeniaka maltanczyka | 704922 | _projekt Rank Trackera, limit: 2, strona 2. Endpoint zwraca wyłącznie pary id + keyword. Wszystkie adresowalne pola wiersza._ --- ## Żądanie `POST` `/api/rank_tracker/reports/keywords/getProjectKeywords` Nagłówki: `Authorization: Bearer `, `Content-Type: application/json`. Parametry przekazuje się w ciele żądania (JSON). ### Struktura żądania **Podstawowy** ```jsonc filename="żądanie-podstawowe.jsonc" { "project_id": null } ``` **Rozszerzony** ```jsonc filename="żądanie-rozszerzone.jsonc" { "project_id": null, "limit": 2, "page": 2 } ``` **cURL** ```bash curl --location --request POST 'https://api.senuto.com/api/rank_tracker/reports/keywords/getProjectKeywords' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer $YOUR_TOKEN_HERE' \ --data-raw '{ "project_id": null, "limit": 2, "page": 2 }' ``` ### Parametry ```ts type GetProjectKeywordsRequest = { /** * **Wymagane**. ID projektu Rank Tracker (Monitoring). Pobierz przez * `/api/rank_tracker/management/projects/getMyActiveProjects`. * Walidacja: nonNegativeInteger + sprawdzenie uprawnień * (właściciel / rola admina / współdzielenie ACL). * Brak dostępu = `418` z komunikatem `Unauthorized access`. */ project_id: number; /** * Liczba słów kluczowych na stronę (paginacja). Nieujemna liczba całkowita. * Maksymalny limit po stronie kontrolera = 100. * @default 10 */ limit?: number; /** * Numer strony (paginacja). Nieujemna liczba całkowita. * @default 1 */ page?: number; } export default GetProjectKeywordsRequest ``` > **Ostrzeżenie:** > Jeśli pominiesz `limit`, paginacja używa wartości domyślnej `10` (od niej liczone jest `page_count`), ale pole `pagination.limit` w odpowiedzi zwraca wtedy `null` zamiast `10` — paginator zwraca surową wartość z żądania, a nie efektywny limit. Przy jawnie podanym `limit` (np. `limit: 2`) pole `pagination.limit` jest poprawne. > **Ostrzeżenie:** > Metoda to **`POST`** — kontroler oraz walidator czytają dane z **ciała żądania** (`getData`), nie z query stringu. Jedynym wymaganym parametrem jest **`project_id`**; jego pominięcie zwraca `418` z `invalid_data`. Brak dostępu do projektu (nie jesteś właścicielem, nie masz roli admina ani współdzielenia ACL) również zwraca `418` z komunikatem `Unauthorized access`. Wbrew starszej dokumentacji ta akcja **nie obsługuje** parametrów `date_min` / `date_max` — są one ignorowane i nie mają wpływu na wynik. ## Odpowiedź Po pomyślnym żądaniu otrzymujesz `data` (tablicę słów kluczowych) oraz `pagination`. Pole `count` w `pagination` to całkowita liczba słów kluczowych w projekcie. **Skrócona** ```json filename="przykładowa-odpowiedź (skrócona)" { "success": true, "data": [ { "id": 690709, "keyword": "jak wychowac szczeniaka" } ], "pagination": { "page_count": 47, "current_page": 2, "count": 94, "limit": 2 } } ``` **Pełna** ```json filename="przykładowa-odpowiedź (200)" { "success": true, "data": [ { "id": 690709, "keyword": "jak wychowac szczeniaka" }, { "id": 704922, "keyword": "karma dla szczeniaka maltanczyka" } ], "pagination": { "page_count": 47, "current_page": 2, "has_next_page": true, "has_prev_page": true, "count": 94, "limit": 2 } } ``` ### Struktura odpowiedzi ```ts type GetProjectKeywordsResponse = { /** `true` przy powodzeniu; przy błędzie `false` i koperta z `error` */ success: boolean; /** Zwrócone słowa kluczowe projektu */ data: ProjectKeyword[]; /** Metadane paginacji */ pagination: { page_count: number; current_page: number; has_next_page: boolean; has_prev_page: boolean; /** Całkowita liczba słów kluczowych w projekcie */ count: number; /** Efektywny limit; `null`, gdy `limit` nie został podany w żądaniu */ limit: number | null; }; } type ProjectKeyword = { /** ID słowa kluczowego w Rank Tracker */ id: number; /** Treść frazy */ keyword: string; } export default GetProjectKeywordsResponse ``` ## Błędy ```ts type ErrorResponse = { success: false; data: { error: { /** np. invalid_data, unauthorized, unknown */ type: string; message?: string; /** pole -> reguła -> komunikat (dla invalid_data) */ params?: Record>; }; }; } export default ErrorResponse ``` > **Błąd:** > **`418`** jest zwracane również w przypadku błędów walidacji oraz braku uprawnień — nie tylko przy ograniczaniu liczby żądań. Brak `project_id` → > `{"success":false,"data":{"error":{"type":"invalid_data","params":{"project_id":{"_required":"This field is required"}}}}}`. > Brak dostępu do projektu → > `{"success":false,"data":{"error":{"type":"unauthorized","message":"Unauthorized access"}}}`. ## Powiązane akcje - `getProjectKeywords` — lista słów kluczowych projektu (ta strona) - `getGroupKeywords` — lista słów kluczowych grupy (wymaga `group_id`) - `getData` — raport słów kluczowych z filtrowaniem i sortowaniem (`group_id` + `project_id`) - `getSerpHtml` — zapisany HTML SERP dla frazy (`keyword_id` + `date`) - `getBestKeywords` — najlepsze frazy projektu - `getProjectsStatus` — status projektów