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.jsonSzybki start
- Utwórz klucz w panelu: smart-copy.ai/developers (zaznacz „”, jeśli chcesz budować integrację bez kosztów — pełna walidacja, symulowane odpowiedzi).
- Adres bazowy:
https://www.smart-copy.ai/api/v1 - 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
| Rodzaj | Prefiks | Opis |
|---|---|---|
| Klucz osobisty | sc_live_ | Pełny dostęp do konta (server-to-server). Tworzony w panelu, pokazywany raz. |
| Klucz testowy | sc_test_ | Te same walidacje i kształty odpowiedzi; zamówienia symulowane (nagłówek X-SmartCopy-Test: true), zero kosztów. |
| OAuth 2.0 | sc_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-KeydoPOST /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).
| Parametr | Typ | Opis |
|---|---|---|
topic | string, wymagane | Temat, 3–300 znaków. |
length | number, wymagane | Długość w znakach, 500–300000 (2000 zn. ≈ 1 strona). |
language | string | pl | en
(domyślnie pl)
|
text_type | string | ARTICLE, BLOG_POST, COMPANY_TEXT, PRODUCT_DESCRIPTION, CATEGORY_DESCRIPTION, REPORT, ANALYSIS, SOCIAL_MEDIA, EMAIL_MARKETING, OTHER |
guidelines | string | Wytyczne: ton, grupa docelowa, co uwzględnić. |
keywords | string[] | Frazy SEO, max 10. |
links | object[] | Linki SEO do wplecenia: [{url, anchor?}], max 5. |
source_urls | string[] | Własne źródła do researchu, max 10. |
source_mode | string | auto | web | academic | hybrid (academic = źródła naukowe) |
generate_image | boolean | Obraz wyróżniający AI (domyślnie true, w cenie). |
outline_approval | boolean | true = pisanie rusza po akceptacji konspektu w panelu (status awaiting_outline_approval). |
wp_site_id | string | Witryna WP do auto-publikacji (GET /wp-sites). |
wp_status | string | draft | publish | future (future wymaga wp_scheduled_at) |
wp_scheduled_at | string (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
| Parametr | Typ | Opis |
|---|---|---|
niche | string | Opis tematyki (min. 20 znaków). Opcjonalny, jeśli podasz site_profile albo wp_site_id z zapisanym profilem — inaczej 422 insufficient_site_info. |
site_profile | object | {title, tagline, categories[], recent_posts[], excerpts[]} — auto-wykrycie tematyki z witryny. |
texts_per_week | number | 1–7 (domyślnie 2) |
target_length | number | 3000–30000 (domyślnie 8000) |
text_type | string | BLOG_POST | ARTICLE | COMPANY_TEXT |
with_images | boolean | domyślnie true |
wp_site_id, wp_status | string | Doką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).
| Endpoint | Opis |
|---|---|
GET https://www.smart-copy.ai/oauth/authorize | Ekran 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/token | Wymiana 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/revoke | Unieważ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": "..." }| HTTP | error | Opis |
|---|---|---|
| 400 | invalid_request | Błędne parametry (opis w error_description, przy batchu z prefiksem texts[i]). |
| 401 | invalid_token | Brak/nieprawidłowy/odwołany token. |
| 402 | insufficient_balance | Za mało środków (pola price i balance w odpowiedzi). |
| 403 | insufficient_scope / revision_limit_reached / plan_limit_reached | Brak uprawnienia albo wyczerpany limit. |
| 404 | not_found | Zasób nie istnieje. |
| 409 | conflict | Operacja niemożliwa w bieżącym stanie (np. rewizja tekstu w trakcie generowania). |
| 422 | insufficient_site_info | Autoblog: nie dało się wykryć tematyki — podaj niche. |
| 429 | rate_limit_exceeded | Limit 120/min przekroczony (nagłówek Retry-After). |
Pytania? support@smart-copy.ai