Przejdź do treści
arduralab
·9 min

Indexing API Google — dla kogo jest i jak je wdrożyć [2026]

MG
Marcin Godula

Współzałożyciel & Head of SEO/Tech

Specjalista SEO, GEO i web development z ponad 15-letnim doświadczeniem. Pomaga firmom B2B budować widoczność w wyszukiwarkach klasycznych i AI.

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 (BroadcastEvent w VideoObject). 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

#CoDetale
1. ZakresTylko strony z JobPosting lub BroadcastEvent w VideoObjectwedług dokumentacji Google
2. SetupProjekt Google Cloud + włączone Indexing API + konto usługiklucz JSON
3. Search ConsoleKonto usługi jako właściciel usługibez tego API odrzuca zgłoszenia
4. Limit200 zgłoszeń publish dziennie na projektodnawia się o północy czasu pacyficznego
5. EndpointurlNotifications.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 JobPosting or BroadcastEvent embedded in a VideoObject."

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?

SytuacjaCzy używać?Dlaczego
Portal z ofertami pracy (JobPosting)✅ TAKZakres przewidziany w dokumentacji
Serwis z transmisjami na żywo (BroadcastEvent)✅ TAKZakres przewidziany w dokumentacji
Oferta pracy wygasła lub została usunięta✅ TAKURL_DELETED informuje Google, że strony już nie ma
Blog, sklep, strona usługowa❌ NIEPoza zakresem API; użyj mapy witryny i Sprawdzania adresu URL
Migracja lub nowa domena bez ofert pracy❌ NIEPoza zakresem API; zob. jak przyspieszyć indeksowanie

Setup krok po kroku

Krok 1: Google Cloud Console — projekt + API

  1. Otwórz console.cloud.google.com
  2. Utwórz nowy projekt (np. seo-indexing-tools)
  3. W menu wybierz APIs & Services → Library
  4. Wyszukaj Indexing API i kliknij Enable
  5. Zostaniesz przekierowany do panelu API, co potwierdza włączenie

Krok 2: Konto usługi + klucz JSON

  1. Otwórz stronę Service accounts w Google Cloud Console i wybierz projekt
  2. Kliknij Create Service Account, podaj nazwę (np. seo-indexing-bot) i opis
  3. Sekcja uprawnień konta usługi jest opcjonalna; przejdź dalej
  4. W sekcji Create key wybierz format JSON i kliknij Create
  5. 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

  1. Potwierdź własność witryny w Search Console dowolną obsługiwaną metodą (usługa domeny albo usługa z prefiksem URL)
  2. Otwórz Search Console i wybierz usługę, dla której potwierdziłeś własność
  3. Dodaj adres e-mail konta usługi z kroku 2 jako właściciela (delegowanego)
  4. 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)
  • 403 z 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

  1. Strona ma noindex w meta robots — Google pobierze stronę, ale jej nie zaindeksuje. Najpierw napraw <meta name="robots">.
  2. Robots.txt blokuje URL — Googlebot w ogóle nie pobierze strony. Sprawdź robots.txt.
  3. Strona ma mało wartościowej treści — Google może ją pobrać i uznać, że nie warto jej indeksować.
  4. Duplikat bez jasnego kanonicznego adresu — Google sam wybierze wersję do indeksu. Skonfiguruj <link rel="canonical">.
  5. 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ędzieCelKiedy
Sitemap.xmlMapa adresów do pobraniaKażda witryna, podstawowy sygnał o nowych i zmienionych stronach
Sprawdzanie adresu URL w Search ConsoleDiagnoza pojedynczej strony i prośba o zaindeksowaniePojedyncze ważne strony
Linkowanie wewnętrzneŚcieżka dotarcia do nowych stronKaż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

  1. 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.
  2. Portal z ofertami pracy — wykonaj kroki 1-3 i podepnij skrypt pod publikację oraz wygaśnięcie oferty (URL_UPDATED przy dodaniu, URL_DELETED przy usunięciu).
  3. 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.

Potrzebujesz pomocy z tym tematem?

Zamów bezpłatny audyt i dowiedz się, jak możemy pomóc Twojej firmie rosnąć w internecie.

Bezpłatna wycena