---
title: "Dodaj firmę odczytaną ze strony (wtyczka)"
method: POST
path: "/leads/capture"
tags: ["Wtyczka Chrome"]
---

# Dodaj firmę odczytaną ze strony (wtyczka)

`POST /leads/capture`

## Request

- Base URL: `https://outreachpilot.pl/api/v1`
- URL: `https://outreachpilot.pl/api/v1/leads/capture`
- Auth: HTTP bearer

Tworzy lead z danych, które użytkownik zobaczył i poprawił w popupie wtyczki. Zapis idzie tą samą ścieżką co aplikacja: dedupe (domena, NIP, e-mail, telefon, nazwa i miasto), atomowe naliczenie limitu leadów i przypisanie do klienta agencji (`workspace_id`). Pochodzenie danych trafia do rejestru art. 14 RODO: źródło `manual`, szczegół `wtyczka_chrome` (albo `wtyczka_chrome:google_maps`), adres strony i czas zapisu. Adres źródła sprawdzamy tą samą polityką co wtyczka: LinkedIn i serwisy zabraniające scrapingu są odrzucane (422). Przy poprawnym NIP uzupełniamy puste pola z rejestru (CEIDG dla jednoosobowych działalności, KRS dla spółek; wspólny budżet zapytań, najwyżej kilka sekund): REGON, PKD, województwo, adres, miasto i status firmy; nigdy nie nadpisujemy tego, co podał użytkownik, i nie przenosimy danych osobowych właściciela. Duplikat zwraca 409 `duplicate_lead` z `existing_lead_id`.

**Wymagany zakres klucza:** `extension:write`.

## Request body

- object
  - `kind` 'website' | 'google_maps', required: `website` = strona firmowa, `google_maps` = wizytówka miejsca w Mapach Google.
  - `source_url` string, required: Adres strony, z której odczytano dane (zapisujemy go w rejestrze pochodzenia danych, art. 14 RODO). Musi być adresem dozwolonym przez politykę wtyczki: nigdy LinkedIn ani serwisy zabraniające scrapingu.
  - `captured_at` string, date-time: Chwila odczytu strony przez wtyczkę (ISO 8601). Zapisujemy ją przy leadzie, gdy mieści się w ostatniej dobie.
  - `company_name` string: Nazwa firmy.
  - `email` string: Adres e-mail (unikalny w Twojej bazie).
  - `phone` string: Telefon.
  - `website` string: Strona WWW firmy (adres lub sama domena).
  - `nip` string: NIP. Sprawdzamy sumę kontrolną; przy poprawnym NIP uzupełniamy puste pola z rejestru (CEIDG, KRS).
  - `regon` string: REGON (9 lub 14 cyfr, z sumą kontrolną).
  - `krs` string: Numer KRS (10 cyfr), jeśli strona go podaje.
  - `address` string: Adres.
  - `city` string: Miasto.
  - `industry` string: Branża lub kategoria (w Mapach Google: kategoria wizytówki).
  - `rating` number: Ocena z Map Google (tylko `google_maps`).
  - `reviews` integer: Liczba opinii z Map Google.
  - `facebook_url` string: Profil firmy na Facebooku (sam adres).
  - `instagram_url` string: Profil firmy na Instagramie (sam adres).
  - `linkedin_company_url` string: Strona firmy na LinkedIn (linkedin.com/company/...). Zapisujemy sam adres: nigdy go nie otwieramy ani nie pobieramy. Adresy profili osób odrzucamy.
  - `tags` string[]: Tagi (maks. 20).
  - `workspace_id` string: Klient agencji, do ktorego trafia zapis (ID z `GET /workspaces`, klient musi byc aktywny). Bez pola: "Moja firma".

## Response `201`

Utworzono.

- object
  - `data` LeadCaptureResult, required
    - `lead` object, required
      - `id` string, required
      - `email` string, nullable, required
      - `first_name` string, nullable, required
      - `last_name` string, nullable, required
      - `job_title` string, nullable, required
      - `phone` string, nullable, required
      - `linkedin_url` string, nullable, required
      - `company_name` string, nullable, required
      - `company_nip` string, nullable, required
      - `company_regon` string, nullable, required
      - `company_website` string, nullable, required
      - `company_city` string, nullable, required
      - `company_voivodeship` string, nullable, required
      - `company_address` string, nullable, required
      - `company_industry` string, nullable, required
      - `company_pkd` string, nullable, required
      - `company_country` string, nullable, required: ISO 3166-1 alpha-2; `null` = Polska.
      - `status` 'nowy' | 'w_kampanii' | 'odpowiedzial' | 'zainteresowany' | 'brak_zainteresowania' | 'odrzucony', required
      - `source` 'ceidg' | 'krs' | 'google_maps' | 'pkt' | 'firmy_net' | 'panorama' | 'osm' | 'linkedin' | 'import_csv' | 'manual', required
      - `tags` string[], required
      - `notes` string, nullable, required
      - `ai_score` integer, nullable, required: Ocena AI 1-10 albo `null`.
      - `email_status` 'valid' | 'risky' | 'invalid' | 'unknown', nullable, required: Wynik weryfikacji adresu (sonda SMTP): `valid` zweryfikowany, `risky` ryzykowny (catch-all), `invalid` nieprawidłowy, `unknown` nie udało się sprawdzić, `null` nie sprawdzono.
      - `email_verified_at` string, nullable, required: Data i czas ISO 8601 (UTC).
      - `website_status` 'has' | 'none_confirmed' | 'unknown', nullable, required
      - `registry_status` 'active' | 'suspended' | 'deleted' | 'liquidation' | 'bankrupt' | 'unknown', nullable, required: Status firmy w CEIDG/KRS.
      - `origin` object, nullable, required: Skąd i kiedy pozyskaliśmy dane (art. 14 RODO).
        - `source` string, required
        - `source_detail` string
        - `acquired_at` string, required: Data i czas ISO 8601 (UTC).
        - `source_url` string
      - `times_contacted` integer, required
      - `times_opened` integer, required
      - `times_clicked` integer, required
      - `times_replied` integer, required
      - `last_contacted_at` string, nullable, required: Data i czas ISO 8601 (UTC).
      - `created_at` string, required: Data i czas ISO 8601 (UTC).
      - `updated_at` string, required: Data i czas ISO 8601 (UTC).
    - `url` string, required: Adres leada w aplikacji.
    - `quota` object, required
      - `remaining` integer, required: Ile leadów możesz jeszcze dodać (miesięcznie i dziennie dla kont bez subskrypcji).
      - `limited_by` 'monthly' | 'daily', nullable, required
    - `registry` object, required: Wynik sprawdzenia NIP w rejestrach (tylko gdy podano poprawny NIP).
      - `source` 'ceidg' | 'krs', nullable, required: Z którego rejestru uzupełniliśmy dane po NIP; `null` = nie uzupełniano (brak NIP, brak wpisu albo rejestr chwilowo niedostępny).
      - `filled` string[], required: Pola leada uzupełnione z rejestru.
      - `status` string, nullable, required: Status firmy w rejestrze (active, suspended, deleted, liquidation, bankrupt, unknown).

## Other responses

- `400`: Nieprawidłowe żądanie. Kody: `invalid_request`.
- `401`: Brak, zły, odwołany lub wygasły klucz (`missing_api_key`, `invalid_api_key`, `api_key_revoked`, `api_key_expired`, `account_inactive`).
- `402`: Wyczerpany limit leadów. Kody: `lead_limit_reached`.
- `403`: Plan nie obejmuje API (`plan_upgrade_required`, odpowiedź zawiera informacje o planie; nie dotyczy tras wtyczki z kluczem `extension:*`) albo klucz nie ma wymaganego zakresu (`insufficient_scope`).
- `409`: Konflikt. Kody: `duplicate_lead`.
- `422`: Błąd walidacji. Kody: `validation_error`.
- `429`: Przekroczono limit żądań (`rate_limit_exceeded`). Zobacz nagłówek `Retry-After`.

---

[API](https://skmtc.dev/outreachpilot/apis/outreachpilot-api.md) · [All operations](https://skmtc.dev/outreachpilot/apis/outreachpilot-api/llms.txt) · [OpenAPI document](https://skmtc.dev/outreachpilot/apis/outreachpilot-api/revisions/2262dabfb07c?raw)
