Indexing API Google — dla kogo jest i jak je wdrożyć [2026]
Indexing API to interfejs Google do powiadamiania o dodanych, zaktualizowanych i usuniętych stronach, ale wyłącznie z ofertami pracy (
JobPosting) albo transmisjami na żywo (BroadcastEventwVideoObject). Jeśli prowadzisz portal z ogłoszeniami o pracę lub serwis z transmisjami, ten tutorial przeprowadzi Cię przez setup i da gotowy skrypt. Jeśli prowadzisz bloga, sklep albo stronę firmową, Indexing API nie jest dla Ciebie, a niżej piszę, czego użyć zamiast niego.
TL;DR — Indexing API Google w 5 punktach
| # | Co | Detale |
|---|---|---|
| 1. Zakres | Tylko strony z JobPosting lub BroadcastEvent w VideoObject | według dokumentacji Google |
| 2. Setup | Projekt Google Cloud + włączone Indexing API + konto usługi | klucz JSON |
| 3. Search Console | Konto usługi jako właściciel usługi | bez tego API odrzuca zgłoszenia |
| 4. Limit | 200 zgłoszeń publish dziennie na projekt | odnawia się o północy czasu pacyficznego |
| 5. Endpoint | urlNotifications.publish z {url, type: URL_UPDATED} | zakres OAuth indexing |
Czym jest Indexing API i do czego służy
Indexing API to programowy interfejs Google, którym właściciel witryny informuje Google, że strona została dodana, zaktualizowana albo usunięta. Google może wtedy zaplanować jej ponowne pobranie. Interfejs pozwala też sprawdzić, kiedy Google ostatnio otrzymał powiadomienie o danym adresie, i łączyć do 100 wywołań w jednym żądaniu HTTP.
Zakres według dokumentacji Google
Dokumentacja Google mówi wprost:
"The Indexing API can only be used to crawl pages with either
JobPostingorBroadcastEventembedded in aVideoObject."
Uzasadnienie jest praktyczne: oferty pracy i transmisje na żywo żyją krótko, więc wyniki wyszukiwania muszą szybko odzwierciedlać ich dodanie i zniknięcie. Ta sama dokumentacja zastrzega, że wszystkie zgłoszenia przechodzą kontrolę antyspamową, a próby nadużyć, w tym obchodzenie limitu przez wiele kont, mogą skończyć się odebraniem dostępu.
Kiedy Indexing API ma sens?
| Sytuacja | Czy używać? | Dlaczego |
|---|---|---|
Portal z ofertami pracy (JobPosting) | ✅ TAK | Zakres przewidziany w dokumentacji |
Serwis z transmisjami na żywo (BroadcastEvent) | ✅ TAK | Zakres przewidziany w dokumentacji |
| Oferta pracy wygasła lub została usunięta | ✅ TAK | URL_DELETED informuje Google, że strony już nie ma |
| Blog, sklep, strona usługowa | ❌ NIE | Poza zakresem API; użyj mapy witryny i Sprawdzania adresu URL |
| Migracja lub nowa domena bez ofert pracy | ❌ NIE | Poza zakresem API; zob. jak przyspieszyć indeksowanie |
Setup krok po kroku
Krok 1: Google Cloud Console — projekt + API
- Otwórz console.cloud.google.com
- Utwórz nowy projekt (np.
seo-indexing-tools) - W menu wybierz APIs & Services → Library
- Wyszukaj
Indexing APIi kliknij Enable - Zostaniesz przekierowany do panelu API, co potwierdza włączenie
Krok 2: Konto usługi + klucz JSON
- Otwórz stronę Service accounts w Google Cloud Console i wybierz projekt
- Kliknij Create Service Account, podaj nazwę (np.
seo-indexing-bot) i opis - Sekcja uprawnień konta usługi jest opcjonalna; przejdź dalej
- W sekcji Create key wybierz format JSON i kliknij Create
- Plik JSON pobierze się automatycznie i jest jedyną kopią klucza. Przechowuj go bezpiecznie i nie commituj do repozytorium
Adres e-mail konta usługi znajdziesz w polu client_email pobranego pliku JSON. Ma format nazwa@projekt-id.iam.gserviceaccount.com; użyjesz go w kroku 3.
Krok 3: Google Search Console — konto usługi jako właściciel
- Potwierdź własność witryny w Search Console dowolną obsługiwaną metodą (usługa domeny albo usługa z prefiksem URL)
- Otwórz Search Console i wybierz usługę, dla której potwierdziłeś własność
- Dodaj adres e-mail konta usługi z kroku 2 jako właściciela (delegowanego)
- Zatwierdź
Dokumentacja Google wymaga statusu właściciela; niższe uprawnienia nie wystarczą do wysyłania zgłoszeń.
Krok 4: Test setupu — pierwszy request
from google.oauth2 import service_account
from googleapiclient.discovery import build
CREDENTIALS_PATH = "/path/to/gsc-service-account.json"
SCOPES = ["https://www.googleapis.com/auth/indexing"]
credentials = service_account.Credentials.from_service_account_file(
CREDENTIALS_PATH, scopes=SCOPES
)
service = build("indexing", "v3", credentials=credentials)
response = service.urlNotifications().publish(body={
"url": "https://twoja-domena.pl/oferty-pracy/123",
"type": "URL_UPDATED"
}).execute()
print(response)
Oczekiwana odpowiedź:
{
"urlNotificationMetadata": {
"url": "https://twoja-domena.pl/oferty-pracy/123",
"latestUpdate": {
"url": "https://twoja-domena.pl/oferty-pracy/123",
"type": "URL_UPDATED",
"notifyTime": "2026-05-03T20:14:32.123456Z"
}
}
}
Odpowiedź potwierdza przyjęcie powiadomienia. Nie oznacza, że strona została już pobrana ani zaindeksowana.
Najczęstsze błędy:
403 Permission denied→ konto usługi nie jest właścicielem usługi w Search Console (krok 3)403z informacją, że API nie jest używane w projekcie → Indexing API nie zostało włączone w Google Cloud (krok 1)400 Invalid argument→ nieprawidłowy adres URL (musi być pełny, z protokołem)
Skrypt Python do zgłoszeń zbiorczych
Skrypt zgłasza adresy z pliku tekstowego, pilnuje dziennego limitu, ponawia próbę przy błędach 5xx i zapisuje log do JSON. Przeznaczony do stron z ofertami pracy lub transmisjami na żywo.
#!/usr/bin/env python3
"""Zbiorcze zgłoszenia do Indexing API — wzór dla domyślnego limitu 200/dzień."""
import json
import sys
import time
from datetime import date
from pathlib import Path
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
CREDENTIALS_PATH = Path("/path/to/gsc-service-account.json")
SCOPES = ["https://www.googleapis.com/auth/indexing"]
RATE_LIMIT_SLEEP = 0.5 # 0.5 s między requestami = ~120 req/min
DAILY_QUOTA = 200
def submit_url(service, url: str) -> dict:
"""Zgłaszamy 1 URL z ponowieniem przy 5xx."""
body = {"url": url, "type": "URL_UPDATED"}
for attempt in range(5):
try:
return service.urlNotifications().publish(body=body).execute()
except HttpError as e:
if e.resp.status >= 500:
time.sleep(2 ** attempt)
continue
raise
raise RuntimeError(f"Failed after 5 retries: {url}")
def main(urls_file: str) -> None:
urls = Path(urls_file).read_text().splitlines()
urls = [u.strip() for u in urls if u.strip() and not u.startswith("#")]
if len(urls) > DAILY_QUOTA:
print(f"WARN: {len(urls)} URLs > daily quota {DAILY_QUOTA}. Truncating.")
urls = urls[:DAILY_QUOTA]
creds = service_account.Credentials.from_service_account_file(
CREDENTIALS_PATH, scopes=SCOPES
)
service = build("indexing", "v3", credentials=creds, cache_discovery=False)
results = []
for i, url in enumerate(urls, 1):
print(f"[{i}/{len(urls)}] {url}")
try:
response = submit_url(service, url)
results.append({"url": url, "status": "OK", "response": response})
except Exception as e:
results.append({"url": url, "status": "ERROR", "error": str(e)})
time.sleep(RATE_LIMIT_SLEEP)
log_path = Path(f"indexing-log-{date.today().isoformat()}.json")
log_path.write_text(json.dumps(results, indent=2))
ok_count = sum(1 for r in results if r["status"] == "OK")
print(f"\nDone: {ok_count}/{len(urls)} OK. Log: {log_path}")
if __name__ == "__main__":
main(sys.argv[1] if len(sys.argv) > 1 else "urls.txt")
Format pliku urls.txt
https://twoja-domena.pl/oferty-pracy/123
https://twoja-domena.pl/oferty-pracy/124
# komentarze są ignorowane
https://twoja-domena.pl/transmisje/konferencja-2026
Uruchomienie
python3 indexing_bulk.py urls.txt
Wynik to log JSON ze wszystkimi requestami i odpowiedziami. Możesz go wczytać do dashboardu albo po prostu sprawdzić, które adresy zwróciły błąd.
Czego Indexing API nie załatwi
Powiadomienie prosi Google o pobranie strony. Nie gwarantuje indeksacji ani pozycji.
Sytuacje, w których Indexing API nie pomoże
- Strona ma
noindexw meta robots — Google pobierze stronę, ale jej nie zaindeksuje. Najpierw napraw<meta name="robots">. - Robots.txt blokuje URL — Googlebot w ogóle nie pobierze strony. Sprawdź robots.txt.
- Strona ma mało wartościowej treści — Google może ją pobrać i uznać, że nie warto jej indeksować.
- Duplikat bez jasnego kanonicznego adresu — Google sam wybierze wersję do indeksu. Skonfiguruj
<link rel="canonical">. - Strona nie jest ofertą pracy ani transmisją — wtedy API w ogóle nie jest właściwym narzędziem.
Czego używać dla pozostałych stron
| Narzędzie | Cel | Kiedy |
|---|---|---|
| Sitemap.xml | Mapa adresów do pobrania | Każda witryna, podstawowy sygnał o nowych i zmienionych stronach |
| Sprawdzanie adresu URL w Search Console | Diagnoza pojedynczej strony i prośba o zaindeksowanie | Pojedyncze ważne strony |
| Linkowanie wewnętrzne | Ścieżka dotarcia do nowych stron | Każda nowa strona powinna mieć link z już zaindeksowanej |
| IndexNow (Bing/Yandex) | Powiadomienia dla wyszukiwarek wspierających protokół | Uzupełnienie po stronie Binga |
Protokół IndexNow według strony projektu wspierają Microsoft Bing, Naver, Seznam.cz, Yandex i Yep (Google na tej liście nie figuruje), a Microsoft deklaruje, że pomaga on utrzymać aktualność informacji także w odpowiedziach AI; co z tego jest udokumentowane, a co jest tylko deklaracją, rozdzielamy w artykule o Bingu, Copilocie i Microsoft Ads w wyszukiwaniu AI.
FAQ — najczęstsze pytania
Czy mogę używać Indexing API dla strony klienta?
Tak, jeśli strona klienta zawiera oferty pracy lub transmisje na żywo. Konto usługi musi być właścicielem w usłudze Search Console klienta, co wymaga jego zgody. Pamiętaj, że limit 200 zgłoszeń dziennie dotyczy projektu Google Cloud, więc kilku klientów w jednym projekcie dzieli ten sam limit.
Co to jest typ URL_DELETED?
urlNotifications.publish przyjmuje też type: URL_DELETED. Informuje on Google, że strona została usunięta z serwera, żeby Google usunął ją z indeksu i przestał ją pobierać. Dla portalu z ofertami pracy to typowy przypadek: oferta wygasła, strona zwraca 404 lub 410, a API przyspiesza zniknięcie jej z wyników.
Jak sprawdzić, czy Google otrzymał powiadomienie?
Endpoint urlNotifications.getMetadata zwraca czas ostatniego powiadomienia o danym adresie (latestUpdate.notifyTime). To potwierdza przyjęcie sygnału, nie indeksację. Stan indeksacji sprawdzisz w Search Console narzędziem Sprawdzanie adresu URL.
Czy mogę zgłaszać ten sam URL co tydzień, żeby poprawić pozycję?
Nie. Powiadomienie ma sens, gdy strona jest nowa, istotnie się zmieniła albo została usunięta. Powtarzanie zgłoszeń bez zmian zużywa limit i nie wpływa na ranking.
Co dalej
- Sprawdź, czy Twoje strony mieszczą się w zakresie — jeśli nie masz ofert pracy ani transmisji na żywo, zacznij od mapy witryny i linkowania wewnętrznego.
- Portal z ofertami pracy — wykonaj kroki 1-3 i podepnij skrypt pod publikację oraz wygaśnięcie oferty (
URL_UPDATEDprzy dodaniu,URL_DELETEDprzy usunięciu). - Czytaj dalej:
Zamów audyt SEO
Twoja strona ma wiele adresów w mapie witryny, a w indeksie Google jest ich niewiele? W bezpłatnym audycie SEO sprawdzamy indeksowanie, robots.txt, mapę witryny, przekierowania i kanonikalizację. Raport z priorytetami dostajesz w 48 godzin roboczych.