Dokumentacja dla programistów

API i serwer MCP GetLinkFast

Wyszukuj serwisy, wypełniaj koszyk i zamawiaj za kredyty bez otwierania panelu: ze skryptu, scenariusza Make lub n8n albo z agenta AI, takiego jak Claude czy Cursor. API i serwer MCP używają tego samego klucza i zwracają ten sam JSON.

Do czego to służy

  • Agencje i zespoły SEO: podłącz swoje narzędzia wewnętrzne i dashboardy raportowe do konta. Katalog, koszyk, zamówienia i statusy odczytasz w formacie JSON.
  • Agenci AI: poproś Claude Code lub Cursor: „znajdź 5 serwisów finansowych z DR 40+ i zamów”. Agent wyszukuje, pokazuje podsumowanie i zamawia dopiero po Twojej zgodzie.
  • Make, n8n, Zapier: wystarczy moduł HTTP i klucz.

API sprzedaje artykuł gościnny (guest_post), wstawienie linku (link_insertion) i pakiety SEO/GEO, wyłącznie za kredyty. Zakup kredytów i pozostałe oferty zostają w panelu.

Utwórz klucz

  1. Otwórz Panel → Dostęp do API.
  2. Nazwij klucz (na przykład „Agent Claude” lub „Raporty Make”) i wybierz jego uprawnienia. Na kluczu, który może zamawiać, możesz ustawić limit na zamówienie i limit na 24 godziny.
  3. Skopiuj klucz. Zaczyna się od glf_live_ i jest wyświetlany tylko raz: przechowujemy wyłącznie jego skrót.
  4. Wysyłaj go w nagłówku każdego żądania: Authorization: Bearer glf_live_…

Maksymalnie 10 aktywnych kluczy na organizację. Unieważniony klucz natychmiast przestaje działać, podobnie jak klucze członka, który opuszcza organizację. Trzymaj klucz poza repozytoriami kodu: kto go ma, działa w imieniu Twojej organizacji.

Uprawnienia klucza

Każdy klucz ma jedno lub kilka uprawnień. Żądanie bez wymaganego uprawnienia otrzymuje 403 insufficient_scope, a agent AI widzi tylko dozwolone narzędzia.

UprawnienieDaje dostęp doKto może je nadać
readKatalog, kategorie, konto i saldo, historia kredytów, zamówienia, wyceny pakietów.Zawsze włączone.
cartDodawanie, zmiana i usuwanie pozycji koszyka.Każdy członek organizacji.
purchaseZamawianie koszyka lub pakietu za kredyty. Obejmuje koszyk.Tylko właściciel organizacji.

Szybki start

Wszystkie ścieżki zaczynają się od https://www.getlinkfast.com/api/v1. Zachowaj www: adres bez www przekierowuje, a klient HTTP po przekierowaniu przestaje wysyłać nagłówek Authorization.

Kwoty są w euro bez VAT. Odpowiedzi są w JSON, pola w snake_case.

1. Odczytaj konto i saldo
curl https://www.getlinkfast.com/api/v1/account \
  -H "Authorization: Bearer glf_live_…"
2. Wyszukaj serwisy: DR 40 i więcej, po francusku, artykuł gościnny
curl "https://www.getlinkfast.com/api/v1/sites?dr_min=40&language=fr&product=guest_post&sort=dr&dir=desc&page_size=10" \
  -H "Authorization: Bearer glf_live_…"
3. Dodaj artykuł gościnny do koszyka
curl -X POST https://www.getlinkfast.com/api/v1/cart/items \
  -H "Authorization: Bearer glf_live_…" \
  -H "Content-Type: application/json" \
  -d '{"site_id":"8a1f0c3e-5b7d-4e2a-9c61-0f3b2d4e6a17","product_type":"guest_post","target_url":"https://www.example.com/invoicing","anchor":"invoicing software","topic":"How to choose invoicing software for a small business"}'

Zastąp site_id identyfikatorem serwisu z kroku 2. Nigdy nie wysyłaj ceny: serwer ją oblicza.

4. Zamów koszyk za kredyty
curl -X POST https://www.getlinkfast.com/api/v1/checkout \
  -H "Authorization: Bearer glf_live_…" \
  -H "Idempotency-Key: order-2026-10-14-001"

Odpowiedź zawiera id zamówienia, pobraną kwotę i pozostałe saldo. Następnie śledź postęp przez GET /orders/{id}.

Zamawianie za kredyty

API zamawia wyłącznie za kredyty i nigdy nie uruchamia płatności kartą. Kredyty doładowuje się w panelu.

Zamówienie obejmuje pozycje guest_post i link_insertion z koszyka. Pozostałe pozycje, dodane w panelu, zostają w koszyku i są wymienione w skipped_items.

Domyślnie brak limitu: jedyną granicą jest Twoje saldo. Na kluczu, który może zamawiać, ustaw limit na zamówienie i limit na kroczące 24 godziny. Zamówienie, które je przekracza, zostaje odrzucone (403 spending_limit_exceeded, z dostępną resztą), bez obciążenia.

Niewystarczające saldo: 402 insufficient_credits, z brakującą kwotą i linkiem do strony Kredyty, do przekazania osobie z Twojego zespołu. Nic nie zostaje pobrane.

Dalej wszystko działa jak w panelu: e-mail z potwierdzeniem i śledzenie na ekranie Zamówienia, gdzie zamówienie nosi nazwę klucza, który je złożył.

Nagłówek Idempotency-Key

  • Wymagany w POST /checkout i POST /packs/orders: od 8 do 128 drukowalnych znaków ASCII, bez spacji. Bez niego: 400 idempotency_key_required.
  • Jedna wartość to jeden zamiar zakupu. Ponowne wysłanie tej samej wartości zwraca pierwotne zamówienie (200, "replayed": true) bez drugiego obciążenia, nawet jeśli koszyk się od tego czasu zmienił.
  • Po przekroczeniu czasu lub awarii sieci ponów żądanie z tą samą wartością: nie zapłacisz dwa razy.
  • Dla nowego zakupu wygeneruj nową wartość, na przykład UUID.
  • Zarówno w POST /checkout, jak i w POST /packs/orders wartość użyta już przy innym zakupie zostaje odrzucona: 409 idempotency_conflict, bez obciążenia. Przy pakiecie odrzucona zostaje też ta sama wartość wysłana z inną treścią.
  • Po stronie MCP tę rolę pełni token potwierdzenia: nie musisz niczego generować.

Limity

  • 120 żądań na minutę na klucz do odczytu i tyle samo, osobno, dla koszyka: jedno nie uszczupla drugiego.
  • 10 wywołań na minutę na klucz do tras lub narzędzi zakupowych — łącznie z powtórzeniami, odmowami i krokiem podsumowania MCP.
  • 300 żądań HTTP na minutę na klucz na serwerze MCP. Każde wywołane narzędzie liczy się dodatkowo do limitu swojego uprawnienia.
  • Powyżej: 429 rate_limited. Czas oczekiwania w sekundach podaje nagłówek Retry-After w HTTP oraz details.retry_after_seconds w wyniku narzędzia MCP.
  • Maksymalnie 100 wyników na stronę (page_size).
  • Treść żądania: maksymalnie 1 MB.

Kody błędów

Każdy błąd ma tę samą postać. Sprawdzaj code: jest stabilny. message jest po angielsku i przeznaczony dla programisty; details wskazuje błędne pole lub kwoty.

Przykład: niewystarczające saldo
{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this order. Nothing was debited. Ask a human to top up at credits_url, then retry with the same Idempotency-Key.",
    "details": {
      "missing_amount": 42,
      "credits_url": "https://www.getlinkfast.com/dashboard/credits"
    }
  }
}
KodHTTPCo oznacza
invalid_json400Treść żądania nie jest czytelnym JSON. Sprawdź składnię i nagłówek Content-Type: application/json.
idempotency_key_required400Brak nagłówka Idempotency-Key lub jest on niepoprawny na ścieżce zakupu. Wyślij wartość od 8 do 128 znaków.
invalid_api_key401Klucz brakujący, niepoprawny, nieznany lub unieważniony albo utworzony przez członka, który opuścił organizację. Sprawdź nagłówek Authorization: Bearer glf_live_….
insufficient_credits402Niewystarczające saldo. details.missing_amount podaje brakującą kwotę, details.credits_url stronę doładowania. Nic nie zostało pobrane.
insufficient_scope403Klucz nie ma uprawnienia wymaganego przez tę ścieżkę lub narzędzie. Utwórz klucz z tym uprawnieniem.
spending_limit_exceeded403Zamówienie przekracza limit klucza: na zamówienie (window: order) lub na 24 godziny (window: 24h). details.remaining podaje resztę. Nic nie zostało pobrane.
not_found404Nie znaleziono zasobu lub nie należy on do Twojej organizacji.
method_not_allowed405Serwer MCP: GET i DELETE nie są akceptowane. Wysyłaj każdą wiadomość JSON-RPC metodą POST.
organization_financial_hold409Zakupy w Twojej organizacji są zablokowane. Skontaktuj się z nami. Nic nie zostało pobrane.
page_already_sold409Strona z koszyka (wstawienie linku) została właśnie sprzedana. Usuń pozycję i zamów ponownie z nowym Idempotency-Key.
cart_already_ordered409Pozycja koszyka została już zamówiona w innym zakupie (panel lub inny Idempotency-Key). Odczytaj koszyk ponownie, zanim zamówisz z nową wartością.
idempotency_conflict409Ten Idempotency-Key został już użyty przy innym zakupie. Dla nowego zakupu użyj nowej wartości.
not_ready409Audyt nie jest jeszcze gotowy. Poczekaj na status ready w get_audit, a potem dodaj stronę.
full_pass_running409Pełny raport audytu jest jeszcze przygotowywany. Spróbuj ponownie za kilka minut. Nic nie zostało uruchomione.
limit_reached409Audyt ma już 8 stron dodanych przez Ciebie, wliczając analizy w toku. Nic nie zostało uruchomione.
already_present409Ta strona jest już w audycie lub jej analiza trwa. Nic nie zostało uruchomione.
already_ordered409Ten zaplanowany link jest już zamówiony i nie można go tu anulować.
not_cancellable409Tego linku nie można teraz anulować. Odczytaj go ponownie przez get_plan.
team_planned409Ten link zaplanował nasz zespół, a nie API: nie można go tu anulować. Aby go zmienić, właściciel konta kontaktuje się z pomocą techniczną.
payload_too_large413Treść żądania przekracza 1 MB.
invalid_parameter422Nieprawidłowy, powtórzony lub nieznany parametr zapytania. details.fields wskazuje każdy błędny parametr i przyczynę.
invalid_arguments422Nieprawidłowa kombinacja argumentów, np. ani domain, ani audit_id, albo oba naraz. details.field wskazuje pole. Nic nie zostało wykonane.
invalid_domain422Nieczytelna domena lub adres URL. Wyślij nazwę domeny, np. example.com.
own_network_domain422Ta domena należy do naszej sieci publikacji: nie można jej poddać audytowi. Nic nie zostało uruchomione.
invalid_body422Nieprawidłowe lub nieznane pole w treści. details.fields wskazuje każde błędne pole i przyczynę.
product_not_available_via_api422API sprzedaje artykuł gościnny i wstawienie linku. Pozostałe produkty zamawia się w panelu.
image_not_uploaded422Obraz wyróżniający musi zostać przesłany do GetLinkFast z panelu.
cart_empty422Żadnej pozycji koszyka nie można zamówić przez API. Nic nie zostało pobrane.
cart_invalid422Niektóre pozycje są niekompletne lub już niedostępne. details.items wymienia każdą pozycję i jej problemy. Nic nie zostało pobrane.
invalid_pack_input422Pakiet nie spełnia swoich reguł (details.reason). Nic nie zostało pobrane.
site_unavailable422Ten serwis nie istnieje lub nie jest już w sprzedaży.
target_page_required422Wstawienie linku wymaga page_id: weź go z listy stron serwisu.
target_page_not_found422Ta strona nie należy do tego serwisu.
target_page_sold422Ta strona została już sprzedana.
target_page_withdrawn422Ta strona nie jest już oferowana.
target_page_already_in_cart422Ta strona jest już w Twoim koszyku.
product_unavailable422Ten serwis nie sprzedaje tego produktu.
invalid_url422Nieczytelny adres. Wyślij pełny adres http(s), bez danych logowania i portu.
other_site422Ta strona nie należy do badanej domeny. Wyślij stronę z tej samej witryny.
invalid_keyword422Docelowe wyszukiwanie jest za długie: maksymalnie 120 znaków.
rate_limited429Zbyt wiele żądań dla tego klucza. Odczekaj liczbę sekund podaną w nagłówku Retry-After w HTTP lub w details.retry_after_seconds w wyniku narzędzia MCP.
audit_quota_exceeded429Ten klucz uruchomił już 10 audytów w ciągu ostatnich 24 godzin. Nic nie zostało uruchomione: spróbuj później.
internal_error500Błąd po naszej stronie, już zgłoszony zespołowi. Spróbuj później: zakup ponowiony z tym samym Idempotency-Key nigdy nie zostanie pobrany dwa razy.
engine_unavailable502Silnik audytu jest chwilowo nieosiągalny. Nic nie zostało uruchomione: spróbuj później.
packs_unavailable503Pakiety SEO/GEO nie są jeszcze dostępne.
confirmation_expiredNarzędzie MCPToken potwierdzenia wygasł albo koszyk, ceny lub klucz zmieniły się od podsumowania. Nic nie zostało pobrane: wywołaj narzędzie ponownie bez tokenu, aby otrzymać nowe podsumowanie.
purchase_unavailableNarzędzie MCPZakupy przez serwer MCP są chwilowo niedostępne. Nic nie zostało pobrane. Spróbuj później.
unknown_toolNarzędzie MCPNieznane narzędzie lub niedozwolone przez uprawnienia klucza. tools/list podaje dostępne narzędzia.
audit_failedNarzędzie MCPTen audyt się nie powiódł, więc plan jest niemożliwy. Uruchom nowy przez run_audit. Nic nie zostało wykonane.
audit_not_readyNarzędzie MCPTen audyt jeszcze się nie zakończył. Poczekaj na status ready przez get_audit, potem wywołaj plan_links ponownie. Nic nie zostało wykonane.
budget_too_lowNarzędzie MCPMiesięczny budżet jest poniżej minimum 100 € miesięcznie. Nic nie zostało wykonane.
start_date_too_farNarzędzie MCPData startu jest zbyt odległa. Komunikat podaje ostatnią dozwoloną datę. Nic nie zostało wykonane.
too_many_pagesNarzędzie MCPProjekt śledzi ograniczoną liczbę stron. Wyślij mniej nowych stron w target_urls. Nic nie zostało wykonane.
plan_existsNarzędzie MCPTa domena ma już zaplanowane, jeszcze niezamówione linki. Plany nigdy się nie łączą: usuń je przez cancel_planned_link i zacznij od nowa. Nic nie zostało wykonane.
pending_proposalsNarzędzie MCPNasz zespół analizuje proponowane linki dla tej domeny, więc na razie nie można dodać planu. details.count podaje ich liczbę, a details.retry_after datę, po której warto spróbować ponownie (jeśli do tego czasu nie zostaną zaplanowane, wygasną). W przeciwnym razie poproś właściciela konta o kontakt z pomocą techniczną. Nic nie zostało wykonane.
no_links_foundNarzędzie MCPŻadna strona z katalogu nie pasuje do tych stron przy tym miesięcznym budżecie. Spróbuj innych stron lub wyższego budżetu. Nic nie zostało wykonane.
plan_in_progressNarzędzie MCPTen plan jest właśnie zapisywany. Wywołaj plan_links ponownie z tym samym tokenem za kilka sekund, aby odczytać wynik.
plan_outcome_unknownNarzędzie MCPZapis został przerwany, a jego wynik jest nieznany. Nie potwierdzaj ponownie: odczytaj plan przez get_plan.
plan_conflictNarzędzie MCPPlan nie jest już aktualny w tej postaci: projekt domeny się zmienił, jego daty nie mieszczą się już w miesiącach budżetu (liczonych od potwierdzenia) albo jedna z jego witryn nie jest już dostępna dla tej domeny. details.reason mówi, który przypadek zaszedł. Nic nie zostało zapisane: wywołaj ponownie plan_links bez tokenu, aby otrzymać nowe podsumowanie.
plan_retryNarzędzie MCPInne wywołanie z tym tokenem zakończyło się bez zapisania planu. Wywołaj plan_links ponownie z tym samym tokenem, aby odczytać wynik.

Serwer MCP

Serwer MCP daje Twojemu agentowi AI te same funkcje co API, z tym samym kluczem. Jego adres: https://www.getlinkfast.com/api/mcp.

Claude Code

Jedno polecenie w terminalu:

Terminal — Claude Code
claude mcp add --transport http getlinkfast https://www.getlinkfast.com/api/mcp --header "Authorization: Bearer glf_live_…"

Cursor

W ~/.cursor/mcp.json. Unikaj pliku .cursor/mcp.json w projekcie: często trafia do repozytorium, razem z kluczem.

~/.cursor/mcp.json
{
  "mcpServers": {
    "getlinkfast": {
      "url": "https://www.getlinkfast.com/api/mcp",
      "headers": {
        "Authorization": "Bearer glf_live_…"
      }
    }
  }
}

Claude Desktop

Claude Desktop nie wysyła niestandardowych nagłówków do zdalnego serwera, więc nie może przekazać Twojego klucza. Połączy się natywnie przez połączenie OAuth, planowane w jednej z kolejnych wersji. Dziś używaj Claude Code lub Cursor: wysyłają klucz w nagłówku Authorization.

Narzędzia

Agent widzi tylko narzędzia dozwolone przez uprawnienia klucza: klucz bez prawa do zamawiania nie ma żadnego narzędzia zakupu.

read
search_sitesget_sitelist_site_pageslist_categoriesget_accountlist_ordersget_orderget_auditquote_packlist_auditsget_plan
cart
get_cartadd_to_cartupdate_cart_itemremove_cart_itemadd_audit_pagerun_auditcancel_planned_link
purchase
checkoutorder_packplan_links

Zakup w dwóch krokach

  1. Agent wywołuje checkout lub order_pack bez confirmation_token: nic nie zostaje pobrane. Otrzymuje podsumowanie (pozycje, suma, saldo po obciążeniu, pozostały limit) i confirmation_token.
  2. Pokazuje Ci to podsumowanie. Jeśli się zgodzisz, wywołuje narzędzie ponownie z confirmation_token: zamówienie zostaje złożone i pobrane.
  3. Token jest ważny 10 minut. Jeśli w międzyczasie zmieni się koszyk, cena lub klucz, zostaje odrzucony (confirmation_expired), a agent powtarza krok 1. Ponowne wywołanie z tym samym tokenem po awarii zwraca to samo zamówienie, bez drugiego obciążenia.

Klient pisany ręcznie

Serwer jest bezsesyjny: każda wiadomość JSON-RPC idzie metodą POST, a odpowiedź przychodzi w JSON. Wysyłaj Accept: application/json, text/event-stream i Content-Type: application/json, inaczej serwer odpowie 406. GET i DELETE zwracają 405.

Wylistuj narzędzia swojego klucza
curl -X POST https://www.getlinkfast.com/api/mcp \
  -H "Authorization: Bearer glf_live_…" \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Audyt i planowanie

Agent może zrobić audyt strony, a potem rozłożyć linki na kilka miesięcy na podstawie raportu. Cztery kroki, z narzędziami serwera MCP.

  1. run_audit uruchamia pełny audyt domeny: kontrole techniczne, widoczność w ChatGPT i strony, na których link by pomógł. Potrwa to kilka minut. Nic nie jest pobierane, a raport odblokowuje się limitem audytów organizacji, jeśli ją ma. Limit: 10 audytów na klucz na 24 godziny; ponowna prośba o tę samą domenę w ciągu godziny zwraca istniejący audyt.
  2. get_audit zwraca status i bieżący etap, a potem raport w summary, gdy status zmieni się na ready. Wywołuj go co 30–60 sekund. list_audits wypisuje audyty organizacji, od najnowszego.
  3. plan_links buduje kalendarz z gotowego audytu: miesięczny budżet w euro bez VAT (co najmniej 100 €), od 2 do 12 miesięcy oraz opcjonalnie data startu i strony docelowe. Tak jak przy zakupie, są dwa kroki. Bez tokenu nic nie jest zapisywane: agent dostaje kalendarz (linki, daty wysyłki, suma) i confirmation_token ważny 10 minut. Po Twojej zgodzie wywołuje narzędzie ponownie z tymi samymi polami i tokenem, a plan zostaje zapisany.
  4. get_plan śledzi każdy link: stronę docelową, anchor, cenę i stan (zaplanowany, zamówiony, opublikowany, anulowany lub nieudany, z przyczyną niepowodzenia, np. insufficient_credits). cancel_planned_link anuluje link zaplanowany przez API albo wszystkie jeszcze niezamówione linki domeny. Linki zaplanowane przez nasz zespół pozostają na miejscu: team_planned dla jednego linku, skipped_team_planned dla ich liczby.

Zapis planu niczego nie pobiera. Każdy link jest pobierany w kredytach w dniu wysyłki, po cenie odczytanej ponownie tego dnia, podczas codziennego porannego przebiegu (około 06:20 UTC). Jeśli tego dnia brakuje salda, link nie jest zamawiany i w get_plan ma status nieudanego. Linku już zamówionego nie da się anulować.

Uprawnienia: run_audit i cancel_planned_link wymagają cart, plan_links wymaga purchase, a get_audit, list_audits i get_plan wymagają read. Limity wydatków klucza obowiązują także dla zaplanowanych linków.

W panelu strona Delegowanie pokazuje te linki w bloku „Zaplanowane linki”. Właściciel organizacji może tam usunąć linki zaplanowane przez API. Linki zaplanowane przez nasz zespół są tylko do odczytu.

Dokumentacja referencyjna

Każda ścieżka z jej uprawnieniem i odpowiadającym jej narzędziem MCP. Parametry, schematy odpowiedzi i błędy dla każdej ścieżki: opis OpenAPI 3.1.

ŚcieżkaUprawnienieNarzędzie MCPDo czego służy
GET /sitesreadsearch_sitesWyszukiwanie w katalogu: metryki, cena, kategoria, język, produkt; sortowanie i stronicowanie.
GET /sites/{id}readget_siteJeden serwis: metryki, ceny i zasady publikacji.
GET /sites/{id}/pagesreadlist_site_pagesStrony serwisu otwarte na wstawienie linku, z ceną i ruchem z Google.
GET /categoriesreadlist_categoriesKategorie i ich id, do filtra category.
GET /accountreadget_accountOrganizacja, saldo kredytów, uprawnienia i limity klucza, wydatki z 24 godzin.
GET /credits/transactionsreadbrakHistoria kredytów.
GET /ordersreadlist_ordersTwoje zamówienia, z filtrem po statusie i dacie.
GET /orders/{id}readget_orderJedno zamówienie i jego pozycje, ze statusem.
GET /cart/itemscartget_cartKoszyk: pozycje, aktualne ceny i problemy blokujące.
POST /cart/itemscartadd_to_cartDodanie artykułu gościnnego lub wstawienia linku.
PATCH /cart/items/{id}cartupdate_cart_itemUzupełnienie lub zmiana briefu pozycji.
DELETE /cart/items/{id}cartremove_cart_itemUsunięcie pozycji.
GET /audits/{id}readget_auditOdczytać audyt: status, bieżący etap, potem raport.
POST /audits/{id}/pagescartadd_audit_pageDodaje stronę do wzmocnienia do gotowego audytu (maksymalnie 8). Analiza trwa od 1 do 4 minut: śledź ją przez get_audit. Nic nie jest pobierane.
POST /checkoutpurchasecheckoutZamówienie koszyka za kredyty.
POST /packs/quotereadquote_packWycena pakietu SEO/GEO, bez obciążenia.
POST /packs/orderspurchaseorder_packZamówienie pakietu SEO/GEO za kredyty.
Tylko serwer MCPcartrun_auditUruchomić pełny audyt domeny. Nic nie jest pobierane.
Tylko serwer MCPreadlist_auditsWypisać audyty organizacji, od najnowszego.
Tylko serwer MCPpurchaseplan_linksZaplanować linki na 2–12 miesięcy na podstawie audytu, w dwóch krokach. Zapis niczego nie pobiera.
Tylko serwer MCPreadget_planOdczytać zaplanowane linki domeny: data wysyłki i status każdego.
Tylko serwer MCPcartcancel_planned_linkAnulować jeden zaplanowany link albo wszystkie jeszcze niezamówione linki domeny.

Pytanie o API? Napisz do nas, odpowie Ci osoba z zespołu.