Dokumentacja API

Wszystko, co robi panel Smart-Copy, możesz zrobić przez API: zamawiać researchowane teksty AI z obrazami, publikować je na WordPressie (od razu, jako szkic albo z kalendarza), prowadzić serie autobloga i odbierać webhooki. Rozliczenie z salda konta.

Specyfikacja OpenAPI 3.1

Cały kontrakt API w jednym pliku — do wygenerowania klienta w dowolnym języku, zaimportowania do Postmana albo podania narzędziom AI. Dostępny bez tokenu.

/api/v1/openapi.json

Szybki start

  1. Utwórz klucz w panelu: smart-copy.ai/developers (zaznacz „”, jeśli chcesz budować integrację bez kosztów — pełna walidacja, symulowane odpowiedzi).
  2. Adres bazowy: https://www.smart-copy.ai/api/v1
  3. Autoryzacja nagłówkiem: Authorization: Bearer sc_live_...
# Zamów tekst 8000 znaków z obrazem
curl -X POST "https://www.smart-copy.ai/api/v1/texts" \
  -H "Authorization: Bearer sc_live_..." \
  -H "Content-Type: application/json" \
  -d '{"topic": "Jak działa pompa ciepła", "length": 8000, "language": "pl"}'

# Śledź status (queued → researching → outlining → writing → generating_image → completed)
curl "https://www.smart-copy.ai/api/v1/texts/TEXT_ID" \
  -H "Authorization: Bearer sc_live_..."

W panelu (zakładka API) znajdziesz też interaktywną konsolę z koszykiem żądań, generatorem kodu (cURL / Node.js / Python / PHP) i historią wywołań.

Uwierzytelnianie

RodzajPrefiksOpis
Klucz osobistysc_live_Pełny dostęp do konta (server-to-server). Tworzony w panelu, pokazywany raz.
Klucz testowysc_test_Te same walidacje i kształty odpowiedzi; zamówienia symulowane (nagłówek X-SmartCopy-Test: true), zero kosztów.
OAuth 2.0sc_at_Tokeny dostępowe wydawane aplikacjom trzecim za zgodą użytkownika — sekcja OAuth poniżej.
  • Limit: 120 żądań/min na token (HTTP 429 + nagłówek Retry-After).
  • Idempotencja: dodaj nagłówek Idempotency-Key do POST /texts — powtórzone żądanie z tym samym kluczem zwróci zapisaną odpowiedź bez ponownego pobrania środków.
  • Waluta rozliczeń: PLN (kurs USD w /balance ma charakter poglądowy).

Teksty

POST/v1/texts

Zamawia wygenerowanie tekstu. Cena naliczana degresywnie za 1000 znaków: 1,99 zł do 5 000 znaków, 1,19 zł za znaki 5 001–15 000, 0,69 zł powyżej — z sufitem 29 zł za tekst; pobierana z salda przy złożeniu (dokładną kwotę zwraca POST /v1/estimate). Batch: zamiast pojedynczego obiektu wyślij pole texts z tablicą (max 500) — jedno zamówienie, wspólna płatność. Opisy produktów (text_type PRODUCT_DESCRIPTION) zamawiane razem w jednym żądaniu mają rabat ilościowy: od 25 −25%, od 100 −45%, od 500 −60% (odpowiedź zwraca bulk_discount).

ParametrTypOpis
topicstring, wymaganeTemat, 3–300 znaków.
lengthnumber, wymaganeDługość w znakach, 500–300000 (2000 zn. ≈ 1 strona).
languagestringpl | en (domyślnie pl)
text_typestring ARTICLE, BLOG_POST, COMPANY_TEXT, PRODUCT_DESCRIPTION, CATEGORY_DESCRIPTION, REPORT, ANALYSIS, SOCIAL_MEDIA, EMAIL_MARKETING, OTHER
guidelinesstringWytyczne: ton, grupa docelowa, co uwzględnić.
keywordsstring[]Frazy SEO, max 10.
linksobject[]Linki SEO do wplecenia: [{url, anchor?}], max 5.
source_urlsstring[]Własne źródła do researchu, max 10.
source_modestring auto | web | academic | hybrid (academic = źródła naukowe)
generate_imagebooleanObraz wyróżniający AI (domyślnie true, w cenie).
outline_approvalbooleantrue = pisanie rusza po akceptacji konspektu w panelu (status awaiting_outline_approval).
wp_site_idstringWitryna WP do auto-publikacji (GET /wp-sites).
wp_statusstring draft | publish | future (future wymaga wp_scheduled_at)
wp_scheduled_atstring (ISO 8601)Data publikacji, min. 5 minut w przyszłości.
Odpowiedź 201:
{
  "id": "d92dfaf2-...",
  "object": "text",
  "order_id": "f4a286ea-...",
  "status": "queued",
  "topic": "...",
  "length": 8000,
  "price": 31.92,
  "currency": "PLN",
  "revisions_used": 0,
  "revisions_limit": 3,
  "created_at": "2026-08-10T12:00:00.000Z"
}

GET/v1/texts/:id

Status i wynik. Statusy: queued, researching, outlining, awaiting_outline_approval, writing (z polem section {current, total}), generating_image, completed, failed (środki zwrócone automatycznie). Po ukończeniu odpowiedź zawiera html, featured_image {url, alt} i wp_publications.

GET/v1/texts

Lista tekstów. Parametry: limit (1–100, domyślnie 20), created_before (kursor czasowy z pola next_created_before), wp_site_id (filtr per witryna). Odpowiedź: { "object": "list", "data": [...], "has_more": bool, "next_created_before": "..." } — pole next_created_before pojawia się tylko, gdy has_more = true.

POST/v1/texts/:id/revision

Bezpłatna poprawka ukończonego tekstu. Body: {"feedback": "co poprawić (10–5000 znaków)"} . Limit 3 rewizje/tekst (403 revision_limit_reached po wyczerpaniu). Po ukończeniu rewizji wysyłamy webhook text.completed z revised: true.

POST/v1/estimate

Wycena bez tworzenia zamówienia. Body: {"length": 8000} → cena, strony, saldo i sufficient_balance. Dla paczki opisów produktów dodaj "text_type": "PRODUCT_DESCRIPTION", "quantity": 100 → cena jednostkowa z rabatem, total_price i bulk_discount.

Autoblog

Serie treści: Smart-Copy planuje klaster ~20 tematów (research konkurencji + profil witryny, jeśli dostępny), pisze teksty w zadanym rytmie i publikuje na WordPressie. Każdy tekst rozliczany z salda przed generowaniem; brak środków wstrzymuje serię.

POST/v1/plans

ParametrTypOpis
nichestringOpis tematyki (min. 20 znaków). Opcjonalny, jeśli podasz site_profile albo wp_site_id z zapisanym profilem — inaczej 422 insufficient_site_info.
site_profileobject{title, tagline, categories[], recent_posts[], excerpts[]} — auto-wykrycie tematyki z witryny.
texts_per_weeknumber1–7 (domyślnie 2)
target_lengthnumber3000–30000 (domyślnie 8000)
text_typestringBLOG_POST | ARTICLE | COMPANY_TEXT
with_imagesbooleandomyślnie true
wp_site_id, wp_statusstringDokąd publikować; wp_status: publish | draft.

Pozostałe: GET /v1/plans (opcjonalnie ?wp_site_id=), GET /v1/plans/:id (z listą pozycji i statusami), POST /v1/plans/:id/pause i POST /v1/plans/:id/resume. Statusy serii: planning, active, paused, completed.

Saldo i witryny

GET/v1/balance

{
  "object": "balance",
  "balance": 776.56,
  "currency": "PLN",
  "usd_rate": 3.7324,
  "balance_usd": 208.06,
  "auto_topup_enabled": false
}

GET/v1/wp-sites

Witryny WordPress podłączone do konta: id, name, base_url, auth_type (connector | app-password), verified, last_poll_at (żywy sygnał połączenia wtyczki).

Webhooki

Skonfiguruj adres webhooka przy kluczu API (panel → API) albo przy aplikacji OAuth. Zdarzenia: text.completed (także po rewizji, z revised: true), text.failed (z refunded: true — środki wróciły na saldo), outline.ready. Dostawa: POST JSON, retry z wykładniczym odstępem do 5 prób.

POST twoj-adres
X-SmartCopy-Event: text.completed
X-SmartCopy-Signature: sha256=3f5c9a...

{
  "event": "text.completed",
  "created": "2026-08-10T12:34:56.000Z",
  "data": {
    "text": {
      "id": "d92dfaf2-...",
      "topic": "...",
      "progress": "completed",
      "price": 31.92,
      "html": "<h1>...</h1>...",
      "featured_image": { "url": "https://...", "alt": "..." }
    }
  }
}

Weryfikacja podpisu (HMAC-SHA256 sekretu whsec_ z surowego body):

const crypto = require("crypto");
const expected = "sha256=" +
  crypto.createHmac("sha256", process.env.WEBHOOK_SECRET)
        .update(rawBody).digest("hex");
const valid = crypto.timingSafeEqual(
  Buffer.from(expected),
  Buffer.from(req.headers["x-smartcopy-signature"] || ""));

OAuth 2.0

Buduj aplikacje działające na kontach użytkowników Smart-Copy (integracje SaaS, Make.com, Zapier, panele agencji). Przepływ: authorization code + PKCE (S256). Aplikację rejestrujesz w panelu → API → „” (publiczna z PKCE albo poufna z sekretem).

EndpointOpis
GET https://www.smart-copy.ai/oauth/authorizeEkran zgody. Parametry: client_id, redirect_uri, response_type=code, scope (spacja/plus), state, code_challenge, code_challenge_method=S256.
POST https://www.smart-copy.ai/api/oauth/tokenWymiana kodu (grant_type=authorization_code + code_verifier) i odświeżanie (grant_type=refresh_token). JSON albo form-urlencoded. Access ważny 2 h; refresh 60 dni z rotacją — ponowne użycie zrotowanego refresha unieważnia wszystkie tokeny aplikacji (ochrona przed kradzieżą).
POST https://www.smart-copy.ai/api/oauth/revokeUnieważnienie tokenu (RFC 7009).

Zakresy (scopes): texts:read, texts:write (zamówienia płatne z salda użytkownika), balance:read, wp:read, plans:read, plans:write. Użytkownik widzi i cofa dostęp w panelu („”).

Błędy

{ "error": "insufficient_balance", "error_description": "..." }
HTTPerrorOpis
400invalid_requestBłędne parametry (opis w error_description, przy batchu z prefiksem texts[i]).
401invalid_tokenBrak/nieprawidłowy/odwołany token.
402insufficient_balanceZa mało środków (pola price i balance w odpowiedzi).
403insufficient_scope / revision_limit_reached / plan_limit_reachedBrak uprawnienia albo wyczerpany limit.
404not_foundZasób nie istnieje.
409conflictOperacja niemożliwa w bieżącym stanie (np. rewizja tekstu w trakcie generowania).
422insufficient_site_infoAutoblog: nie dało się wykryć tematyki — podaj niche.
429rate_limit_exceededLimit 120/min przekroczony (nagłówek Retry-After).

Pytania? support@smart-copy.ai