PageSourceSearch

https://www.smart-copy.ai/docs/api

html smart-copy.ai collected 2026-10-05 12:38:20 UTC 84,933 bytes, 218 lines download raw bytes

1<!DOCTYPE html><html lang="en-US" class="scroll-smooth"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="x-ua-compatible" content="IE=edge"><title>API Documentation - Smart-Copy.ai</title><meta name="description" content="Smart-Copy.ai public API — order AI texts, Autoblog, webhooks and OAuth 2.0. Endpoint reference with examples."><meta name="language" content="en-US"><link rel="canonical" href="https://www.smart-copy.ai/docs/api"><link rel="alternate" hreflang="en" href="https://www.smart-copy.ai/docs/api"><link rel="alternate" hreflang="pl" href="https://www.smart-copy.ai/pl/docs/api"><link rel="alternate" hreflang="x-default" href="https://www.smart-copy.ai/docs/api"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:title" content="API Documentation - Smart-Copy.ai"><meta property="og:description" content="Smart-Copy.ai public API — order AI texts, Autoblog, webhooks and OAuth 2.0. Endpoint reference with examples."><meta property="og:url" content="https://www.smart-copy.ai/docs/api"><meta property="og:image" content="https://www.smart-copy.ai/og-default.png"><meta property="og:locale" content="en_US"><meta property="og:locale:alternate" content="pl_PL"><!-- Twitter --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="API Documentation - Smart-Copy.ai"><meta name="twitter:description" content="Smart-Copy.ai public API — order AI texts, Autoblog, webhooks and OAuth 2.0. Endpoint reference with examples."><meta name="twitter:image" content="https://www.smart-copy.ai/og-default.png"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"><!-- Set theme class BEFORE first paint to avoid FOUC -->
1<script>
2      (function () {
3        try {
4          var stored = localStorage.getItem("theme");
5          var prefersDark =
6            window.matchMedia &&
7            window.matchMedia("(prefers-color-scheme: dark)").matches;
8          if (stored === "dark" || (!stored && prefersDark)) {
9            document.documentElement.classList.add("dark");
10          }
11        } catch (e) {}
12      })();
13    </script>
13<!-- Google Consent Mode v2 -->
13<script>
14      window.dataLayer = window.dataLayer || [];
15      function gtag() {
16        dataLayer.push(arguments);
17      }
18      gtag("consent", "default", {
19        ad_storage: "denied",
20        ad_user_data: "denied",
21        ad_personalization: "denied",
22        analytics_storage: "denied",
23        functionality_storage: "granted",
24        personalization_storage: "denied",
25        security_storage: "granted",
26        wait_for_update: 500,
27      });
28    </script>
28<!-- GA4 -->
vendor: 63 bytes, line 28
28<script async src="https://www.googletagmanager.com/gtag/js?id=
28G-0LK02F2HBW
vendor: 11 bytes, line 28
28"></script>
28<script>
29      gtag("js", new Date());
30      gtag("config", "G-0LK02F2HBW", {
31        anonymize_ip: true,
32        send_page_view: true,
33      });
34    </script>
34<!-- Re-apply a previously saved consent choice ASAP (within wait_for_update window) -->
34<script>
35      (function () {
36        try {
37          var c = JSON.parse(localStorage.getItem("cookie-consent") || "null");
38          if (c && typeof gtag === "function") {
39            gtag("consent", "update", {
40              analytics_storage: c.analytics ? "granted" : "denied",
41              ad_storage: c.marketing ? "granted" : "denied",
42              ad_user_data: c.marketing ? "granted" : "denied",
43              ad_personalization: c.marketing ? "granted" : "denied",
44            });
45          }
46        } catch (e) {}
47      })();
48    </script>
48<link rel="stylesheet" href="/_astro/index.Dm7PH-Gv.css">
49<style>.docs[data-astro-cid-ovyzdvsb] pre[data-astro-cid-ovyzdvsb]{background:#0f172a;color:#6ee7b7;border-radius:.75rem;padding:1rem 1.25rem;overflow-x:auto;font-size:.8rem;line-height:1.55}.docs[data-astro-cid-ovyzdvsb] code[data-astro-cid-ovyzdvsb].inline{background:#7c3aed1a;color:#7c3aed;padding:.1rem .35rem;border-radius:.3rem;font-size:.85em;overflow-wrap:anywhere}.dark .docs[data-astro-cid-ovyzdvsb] code[data-astro-cid-ovyzdvsb].inline{background:#a78bfa26;color:#c4b5fd}.docs[data-astro-cid-ovyzdvsb] table[data-astro-cid-ovyzdvsb]{width:100%;font-size:.85rem;border-collapse:collapse;display:block;overflow-x:auto}.docs[data-astro-cid-ovyzdvsb] th[data-astro-cid-ovyzdvsb],.docs[data-astro-cid-ovyzdvsb] td[data-astro-cid-ovyzdvsb]{overflow-wrap:anywhere;text-align:left;padding:.45rem .75rem;border-bottom:1px solid rgba(148,163,184,.25);vertical-align:top}.docs[data-astro-cid-ovyzdvsb] th[data-astro-cid-ovyzdvsb]{font-weight:600;font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:#64748b}.docs[data-astro-cid-ovyzdvsb] .endpoint[data-astro-cid-ovyzdvsb]{font-family:ui-monospace,monospace;font-weight:600;font-size:.95rem}.docs[data-astro-cid-ovyzdvsb] .method[data-astro-cid-ovyzdvsb]{display:inline-block;padding:.1rem .5rem;border-radius:.35rem;font-size:.7rem;font-weight:700;margin-right:.5rem;vertical-align:2px}.docs[data-astro-cid-ovyzdvsb] .get[data-astro-cid-ovyzdvsb]{background:#d1fae5;color:#047857}.docs[data-astro-cid-ovyzdvsb] .post[data-astro-cid-ovyzdvsb]{background:#dbeafe;color:#1d4ed8}.dark .docs[data-astro-cid-ovyzdvsb] .get[data-astro-cid-ovyzdvsb]{background:#0478574d;color:#6ee7b7}.dark .docs[data-astro-cid-ovyzdvsb] .post[data-astro-cid-ovyzdvsb]{background:#1d4ed84d;color:#93c5fd}.docs[data-astro-cid-ovyzdvsb] section[data-astro-cid-ovyzdvsb]{scroll-margin-top:5rem}
50</style></head> <body class="min-h-screen flex flex-col"> <header class="fixed top-0 left-0 right-0 z-50 bg-white/80 dark:bg-gray-900/90 backdrop-blur-lg border-b border-gray-200 dark:border-gray-700"> <nav class="container-custom"> <div class="flex items-center justify-between h-16"> <!-- Logo --> <a href="/" class="flex items-center gap-2.5 group"> <div class="w-10 h-10 bg-gradient-to-br from-purple-600 to-indigo-600 rounded-xl flex items-center justify-center group-hover:scale-110 transition-transform"> <svg class="w-6 h-6 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M12 2L9.5 9.5L2 12l7.5 2.5L12 22l2.5-7.5L22 12l-7.5-2.5L12 2z"></path> </svg> </div> <div class="flex flex-col"> <span class="text-xl font-bold bg-gradient-to-r from-purple-600 to-indigo-600 bg-clip-text text-transparent leading-tight">
51Smart-Copy.ai
52</span> <span class="text-[11px] font-medium text-gray-500 dark:text-gray-400 tracking-wider leading-tight"> Your AI Copywriter </span> </div> </a> <!-- Desktop Navigation --> <div class="hidden md:flex items-center gap-6"> <a href="/" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Home </a><a href="/#pricing" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Pricing </a><a href="/blog" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Blog </a> <!-- AI Tools Dropdown (CSS hover + JS click for mobile/keyboard) --> <div class="relative group" data-dropdown="tools"> <button type="button" data-dropdown-trigger aria-haspopup="true" aria-expanded="false" class="flex items-center gap-1.5 text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> AI Tools <svg class="w-4 h-4 transition-transform duration-200 group-hover:rotate-180 data-[open=true]:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </button> <div data-dropdown-menu class="absolute top-full left-1/2 -translate-x-1/2 mt-3 w-80 bg-white dark:bg-gray-800 rounded-2xl shadow-2xl border border-gray-200 dark:border-gray-700 overflow-hidden opacity-0 invisible translate-y-2 group-hover:opacity-100 group-hover:visible group-hover:translate-y-0 data-[open=true]:opacity-100 data-[open=true]:visible data-[open=true]:translate-y-0 transition-all duration-150"> <div class="absolute -top-2 left-1/2 -translate-x-1/2 w-4 h-4 bg-white dark:bg-gray-800 border-l border-t border-gray-200 dark:border-gray-700 rotate-45"></div> <div class="relative p-2"> <a href="/ai-copywriter" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-indigo-500 to-purple-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg class="w-5 h-5 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M12 19l7-7 3 3-7 7-3-3z M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z M2 2l7.586 7.586 M11 11a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"></path> </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> AI Copywriter </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"> Marketing &amp; sales copy </div> </div> </a><a href="/ai-product-description-generator" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg class="w-5 h-5 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M9 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z M20 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path> </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Product Description Generator </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"> Unique descriptions for e-commerce </div> </div> </a><a href="/ai-seo-content-writer" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-blue-500 to-cyan-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg class="w-5 h-5 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 21l-4.35-4.35 M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z"></path> </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> AI SEO Writer </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"> SEO-optimized content </div> </div> </a><a href="/mobile-app" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-violet-500 to-fuchsia-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg class="w-5 h-5 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z M11 18h2"></path> </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Mobile app </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"> Android: order and read texts on your phone </div> </div> </a> </div> <div class="border-t border-gray-100 dark:border-gray-700 p-3"> <a href="/register" class="flex items-center justify-center gap-2 w-full py-2.5 bg-gradient-to-r from-purple-600 to-indigo-600 text-white rounded-xl text-sm font-semibold hover:from-purple-700 hover:to-indigo-700 transition-all"> Try Smart-Copy.ai </a> </div> </div> </div> <!-- Automations Dropdown --> <div class="relative group" data-dropdown="automations"> <button type="button" data-dropdown-trigger aria-haspopup="true" aria-expanded="false" class="flex items-center gap-1.5 text-gray-600 dark:text-gray-300 hover:text-purple-600 dar
52k:hover:text-purple-400 transition-colors font-medium"> Automations <svg class="w-4 h-4 transition-transform duration-200 group-hover:rotate-180 data-[open=true]:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </button> <div data-dropdown-menu class="absolute top-full right-0 mt-3 w-[560px] max-w-[92vw] bg-white dark:bg-gray-800 rounded-2xl shadow-2xl border border-gray-200 dark:border-gray-700 overflow-hidden opacity-0 invisible translate-y-2 group-hover:opacity-100 group-hover:visible group-hover:translate-y-0 data-[open=true]:opacity-100 data-[open=true]:visible data-[open=true]:translate-y-0 transition-all duration-150"> <div class="grid grid-cols-2 gap-1 p-3"> <a href="/autoblogging" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-purple-500 to-pink-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-rocket w-5 h-5 text-white">  <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"></path> <path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"></path> <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"></path> <path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Autoblog </span> <span class="text-[10px] font-semibold px-1.5 py-0.5 rounded-full bg-purple-100 dark:bg-purple-900/40 text-purple-700 dark:text-purple-300 whitespace-nowrap"> Built in </span> </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Built into the dashboard — nothing external to connect. Give it a niche (or let it read one from your site) and it plans a 20-topic cluster, writes at your pace and publishes to WordPress. </div> </div> </a><a href="/wordpress-plugin" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-blue-500 to-sky-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-globe w-5 h-5 text-white">  <circle cx="12" cy="12" r="10"></circle> <path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path> <path d="M2 12h20"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> WordPress </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Free plugin: order and publish texts without leaving wp-admin. The featured image is set automatically; publish now, as a draft or on a schedule. </div> </div> </a><a href="/woocommerce-product-descriptions" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-fuchsia-500 to-purple-600 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-shopping-cart w-5 h-5 text-white">  <circle cx="8" cy="21" r="1"></circle> <circle cx="19" cy="21" r="1"></circle> <path d="M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> WooCommerce </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> The same plugin, a screen for shops: select the products without a description, set the length once and the descriptions land on the product pages. Main and short description handled separately. </div> </div> </a><a href="/integrations/baselinker" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-teal-500 to-cyan-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-boxes w-5 h-5 text-white">  <path d="M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"></path> <path d="m7 16.5-4.74-2.85"></path> <path d="m7 16.5 5-3"></path> <path d="M7 16.5v5.17"></path> <path d="M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"></path> <path d="m17 16.5-5-3"></path> <path d="m17 16.5 4.74-2.85"></path> <path d="M17 16.5v5.17"></path> <path d="M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"></path> <path d="M12 8 7.26 5.15"></path> <path d="m12 8 4.74-2.85"></path> <path d="M12 13.5V8"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Baselinker (Base) </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Connect your catalogue with a token from your own account, map the fields and collect descriptions — written straight back to the products. Skips the ones already described. </div> </div> </a><a href="/integrations/shoper" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-rose-500 to-amber-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-store w-5 h-5 text-white">  <path d="M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5"></path> <path d="M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244"></path> <path d="M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Shoper </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Connect your store with an API token or admin login, map the fields and collect descriptions — written straight back to the products. Skips the ones already described. </div> </div> </a><a href="/integrations/zapier" class="flex items-start gap-3 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-orange-500 to-red-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-zap w-5 h-5 text-white">  <path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Zapier </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> New Completed Text and New Failed Text triggers plus a Create Text action — connect Smart-Copy to 8,000 apps. </div> </div> </a> </div> <div class="border-t border-gray-100 dark:border-gray-700 p-3"> <a href="/automations" class="flex items-center justify-center gap-2 w-full py-2.5 bg-gradient-to-r from-purple-600 to-indigo-600 text-white rounded-xl text-sm font-semibold hover:from-purple-700 hover:to-indigo-700 transition-all"> See all automations </a> </div> </div> </div> <!-- API Dropdown --> <div class="relative group" data-dropdown="api"> <button type="button" data-dropdown-trigger aria-haspopup="true" aria-expanded="false" class="flex items-center gap-1.5 text-gray-600 dark:text-gray-300 hover:text-purple-600 dar
52k:hover:text-purple-400 transition-colors font-medium"> API <svg class="w-4 h-4 transition-transform duration-200 group-hover:rotate-180 data-[open=true]:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </button> <div data-dropdown-menu class="absolute top-full right-0 mt-3 w-80 bg-white dark:bg-gray-800 rounded-2xl shadow-2xl border border-gray-200 dark:border-gray-700 overflow-hidden opacity-0 invisible translate-y-2 group-hover:opacity-100 group-hover:visible group-hover:translate-y-0 data-[open=true]:opacity-100 data-[open=true]:visible data-[open=true]:translate-y-0 transition-all duration-150"> <div class="p-2"> <a href="/content-api" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-indigo-500 to-blue-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-code w-5 h-5 text-white">  <path d="m16 18 6-6-6-6"></path> <path d="m8 6-6 6 6 6"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> REST API </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Personal keys and OAuth 2.0, single and batch orders, HMAC-signed webhooks, test keys for free integration work. </div> </div> </a><a href="/docs/api" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-violet-500 to-purple-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-file-text w-5 h-5 text-white">  <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path> <path d="M14 2v5a1 1 0 0 0 1 1h5"></path> <path d="M10 9H8"></path> <path d="M16 13H8"></path> <path d="M16 17H8"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Documentation </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> Full endpoint reference — quickstart, auth, requests and responses, error codes. </div> </div> </a><a href="/webhooks" class="flex items-center gap-4 p-3 rounded-xl hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors"> <div class="w-10 h-10 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-xl flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-webhook w-5 h-5 text-white">  <path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"></path> <path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"></path> <path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"></path>  </svg> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Webhooks </div> <div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5 line-clamp-2"> text.completed, text.failed and outline.ready events land on your endpoint — signed, with retries. </div> </div> </a> </div> <div class="border-t border-gray-100 dark:border-gray-700 p-3"> <a href="/docs/api" class="flex items-center justify-center gap-2 w-full py-2.5 bg-gradient-to-r from-purple-600 to-indigo-600 text-white rounded-xl text-sm font-semibold hover:from-purple-700 hover:to-indigo-700 transition-all"> Read the API docs </a> </div> </div> </div> </div> <!-- Right side: theme + lang + auth --> <div class="hidden md:flex items-center gap-2"> <!-- Theme Toggle --> <button type="button" data-theme-toggle aria-label="Toggle theme" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors text-gray-600 dark:text-gray-400"> <svg data-theme-icon="light" class="w-5 h-5 hidden dark:block" viewB
52ox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> <svg data-theme-icon="dark" class="w-5 h-5 dark:hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path> </svg> </button> <!-- Auth (login/register — auth-aware swap happens after hydration) --> <div data-auth-nav class="flex items-center gap-2"> <a href="/login" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium px-3"> Sign In </a> <a href="/register" class="btn-primary"> Sign Up </a> </div> <!-- Language Switcher --> <a href="#" data-lang-switcher data-target-locale="pl" title="Przełącz na Polski" class="flex items-center gap-2 px-3 py-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400"> <svg class="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="12" cy="12" r="10"></circle> <line x1="2" y1="12" x2="22" y2="12"></line> <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"></path> </svg> <span class="text-sm font-medium">PL</span> </a> </div> <!-- Mobile Menu Button --> <button type="button" data-mobile-toggle aria-label="Menu" aria-expanded="false" class="md:hidden p-2 text-gray-600 dark:text-gray-300"> <svg data-mobile-icon="menu" class="w-6 h-6" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> <svg data-mobile-icon="close" class="w-6 h-6 hidden" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <line x1="18" y1="6" x2="6" y2="18"></line> <line x1="6" y1="6" x2="18" y2="18"></line> </svg> </button> </div> <!-- Mobile Menu --> <!-- Kafelki trzech sekcji (AI, automatyzacje, API) daja 15 pozycji i ~1200 px
53         wysokosci, wiec plaska lista wyjezdzala poza ekran telefonu i chowala
54         przyciski auth na samym dole. Stad: CTA na gorze, sekcje zwiniete w
55         <details>, a cale menu ograniczone do viewportu z wlasnym scrollem. --> <div data-mobile-menu class="md:hidden border-t border-gray-200 dark:border-gray-700 py-4 hidden max-h-[calc(100dvh-4rem)] overflow-y-auto overscroll-contain"> <div class="flex flex-col gap-4"> <div class="flex gap-2"> <a href="/login" class="btn-secondary flex-1 justify-center"> Sign In </a> <a href="/register" class="btn-primary flex-1 justify-center"> Sign Up </a> </div> <a href="/" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Home </a><a href="/#pricing" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Pricing </a><a href="/blog" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium"> Blog </a> <details class="group/acc border-t border-gray-100 dark:border-gray-700 pt-3"> <summary class="flex cursor-pointer list-none items-center justify-between px-2 text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 [&::-webkit-details-marker]:hidden"> AI Tools <svg class="w-4 h-4 transition-transform duration-200 group-open/acc:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </summary> <div class="space-y-3 pt-3"> <a href="/ai-copywriter" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-indigo-500 to-purple-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg class="w-4 h-4 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M12 19l7-7 3 3-7 7-3-3z M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z M2 2l7.586 7.586 M11 11a2 2 0 1 1 0-4 2 2 0 0 1 0 4z"></path> </svg> </div> <div> <div class="font-semibold text-gray-900 dark:text-white text-sm"> AI Copywriter </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Marketing &amp; sales copy </div> </div> </a><a href="/ai-product-description-generator" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg class="w-4 h-4 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M9 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z M20 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path> </svg> </div> <div> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Product Description Generator </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Unique descriptions for e-commerce </div> </div> </a><a href="/ai-seo-content-writer" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-blue-500 to-cyan-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg class="w-4 h-4 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 21l-4.35-4.35 M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16z"></path> </svg> </div> <div> <div class="font-semibold text-gray-900 dark:text-white text-sm"> AI SEO Writer </div> <div class="text-xs text-gray-500 dark:text-gray-400"> SEO-optimized content </div> </div> </a><a href="/mobile-app" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-violet-500 to-fuchsia-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg class="w-4 h-4 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z M11 18h2"></path> </svg> </div> <div> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Mobile app </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Android: order and read texts on your phone </div> </div> </a> </div> </details> <details class="group/acc border-t border-gray-100 dark:border-gray-700 pt-3"> <summary class="flex cursor-pointer list-none items-center justify-between px-2 text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 [&::-webkit-details-marker]:hidden"> Automations <svg class="w-4 h-4 transition-transform duration-200 group-open/acc:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </summary> <div class="space-y-3 pt-3"> <a href="/autoblogging" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-purple-500 to-pink-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-rocket w-4 h-4 text-white">  <path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"></path> <path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"></path> <path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"></path> <path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Autoblog </span> <span class="text-[10px] font-semibold px-1.5 py-0.5 rounded-full bg-purple-100 dar
55k:bg-purple-900/40 text-purple-700 dark:text-purple-300 whitespace-nowrap"> Built in </span> </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Built into the dashboard — nothing external to connect. Give it a niche (or let it read one from your site) and it plans a 20-topic cluster, writes at your pace and publishes to WordPress. </div> </div> </a><a href="/wordpress-plugin" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-blue-500 to-sky-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-globe w-4 h-4 text-white">  <circle cx="12" cy="12" r="10"></circle> <path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path> <path d="M2 12h20"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> WordPress </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Free plugin: order and publish texts without leaving wp-admin. The featured image is set automatically; publish now, as a draft or on a schedule. </div> </div> </a><a href="/woocommerce-product-descriptions" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-fuchsia-500 to-purple-600 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-shopping-cart w-4 h-4 text-white">  <circle cx="8" cy="21" r="1"></circle> <circle cx="19" cy="21" r="1"></circle> <path d="M2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> WooCommerce </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400"> The same plugin, a screen for shops: select the products without a description, set the length once and the descriptions land on the product pages. Main and short description handled separately. </div> </div> </a><a href="/integrations/baselinker" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-teal-500 to-cyan-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-boxes w-4 h-4 text-white">  <path d="M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z"></path> <path d="m7 16.5-4.74-2.85"></path> <path d="m7 16.5 5-3"></path> <path d="M7 16.5v5.17"></path> <path d="M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z"></path> <path d="m17 16.5-5-3"></path> <path d="m17 16.5 4.74-2.85"></path> <path d="M17 16.5v5.17"></path> <path d="M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z"></path> <path d="M12 8 7.26 5.15"></path> <path d="m12 8 4.74-2.85"></path> <path d="M12 13.5V8"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Baselinker (Base) </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Connect your catalogue with a token from your own account, map the fields and collect descriptions — written straight back to the products. Skips the ones already described. </div> </div> </a><a href="/integrations/shoper" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-rose-500 to-amber-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-store w-4 h-4 text-white">  <path d="M15 21v-5a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v5"></path> <path d="M17.774 10.31a1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.451 0 1.12 1.12 0 0 0-1.548 0 2.5 2.5 0 0 1-3.452 0 1.12 1.12 0 0 0-1.549 0 2.5 2.5 0 0 1-3.77-3.248l2.889-4.184A2 2 0 0 1 7 2h10a2 2 0 0 1 1.653.873l2.895 4.192a2.5 2.5 0 0 1-3.774 3.244"></path> <path d="M4 10.95V19a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8.05"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Shoper </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Connect your store with an API token or admin login, map the fields and collect descriptions — written straight back to the products. Skips the ones already described. </div> </div> </a><a href="/integrations/zapier" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-orange-500 to-red-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-zap w-4 h-4 text-white">  <path d="M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"></path>  </svg> </div> <div class="min-w-0"> <div class="flex items-center gap-1.5 flex-wrap"> <span class="font-semibold text-gray-900 dark:text-white text-sm"> Zapier </span>  </div> <div class="text-xs text-gray-500 dark:text-gray-400"> New Completed Text and New Failed Text triggers plus a Create Text action — connect Smart-Copy to 8,000 apps. </div> </div> </a> </div> </details> <details class="group/acc border-t border-gray-100 dark:border-gray-700 pt-3"> <summary class="flex cursor-pointer list-none items-center justify-between px-2 text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 [&::-webkit-details-marker]:hidden"> API <svg class="w-4 h-4 transition-transform duration-200 group-open/acc:rotate-180" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <polyline points="6 9 12 15 18 9"></polyline> </svg> </summary> <div class="space-y-3 pt-3"> <a href="/content-api" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-indigo-500 to-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-code w-4 h-4 text-white">  <path d="m16 18 6-6-6-6"></path> <path d="m8 6-6 6 6 6"></path>  </svg> </div> <div class="min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> REST API </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Personal keys and OAuth 2.0, single and batch orders, HMAC-signed webhooks, test keys for free integration work. </div> </div> </a><a href="/docs/api" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-violet-500 to-purple-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-file-text w-4 h-4 text-white">  <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"></path> <path d="M14 2v5a1 1 0 0 0 1 1h5"></path> <path d="M10 9H8"></path> <path d="M16 13H8"></path> <path d="M16 17H8"></path>  </svg> </div> <div class="min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Documentation </div> <div class="text-xs text-gray-500 dark:text-gray-400"> Full endpoint reference — quickstart, auth, requests and responses, error codes. </
55div> </div> </a><a href="/webhooks" class="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> <div class="w-9 h-9 bg-gradient-to-br from-emerald-500 to-teal-500 rounded-lg flex items-center justify-center flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" class="lucide lucide-webhook w-4 h-4 text-white">  <path d="M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2"></path> <path d="m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06"></path> <path d="m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8"></path>  </svg> </div> <div class="min-w-0"> <div class="font-semibold text-gray-900 dark:text-white text-sm"> Webhooks </div> <div class="text-xs text-gray-500 dark:text-gray-400"> text.completed, text.failed and outline.ready events land on your endpoint — signed, with retries. </div> </div> </a> </div> </details> <a href="#" data-lang-switcher data-target-locale="pl" class="border-t border-gray-100 dark:border-gray-700 pt-3 text-center text-sm text-gray-500 dark:text-gray-400 hover:text-purple-600 dark:hover:text-purple-400"> Przełącz na Polski </a> </div> </div> </nav> </header> <!-- Spacer so content doesn't sit under the fixed header --> <div class="h-16" aria-hidden="true"></div> 
55<script type="module">const c=document.querySelector("[data-theme-toggle]");c?.addEventListener("click",()=>{const t=document.documentElement.classList.toggle("dark");localStorage.setItem("theme",t?"dark":"light")});const d=document.querySelector("[data-mobile-toggle]"),l=document.querySelector("[data-mobile-menu]"),i=document.querySelector("[data-mobile-icon=menu]"),u=document.querySelector("[data-mobile-icon=close]");d?.addEventListener("click",()=>{const t=l?.classList.toggle("hidden")===!1;d.setAttribute("aria-expanded",t?"true":"false"),i?.classList.toggle("hidden",t),u?.classList.toggle("hidden",!t)});document.querySelectorAll("[data-dropdown]").forEach(t=>{const o=t.querySelector("[data-dropdown-trigger]"),a=t.querySelector("[data-dropdown-menu]");o?.addEventListener("click",e=>{e.stopPropagation();const n=a?.dataset.open==="true";a&&(a.dataset.open=n?"false":"true"),o.setAttribute("aria-expanded",n?"false":"true")}),document.addEventListener("click",e=>{!t.contains(e.target)&&a&&(a.dataset.open="false",o?.setAttribute("aria-expanded","false"))})});document.querySelectorAll("[data-lang-switcher]").forEach(t=>{t.addEventListener("click",o=>{o.preventDefault();const a=t.dataset.targetLocale==="pl"?"pl":"en",{pathname:e,search:n,hash:r}=window.location;let s;a==="pl"?s=e.startsWith("/pl")?e:`/pl${e==="/"?"":e}`:s=e.startsWith("/pl/")?e.slice(3):e==="/pl"?"/":e,window.location.href=`${s}${n}${r}`})});(async()=>{const t=document.querySelector("[data-auth-nav]");if(t)try{const o=await fetch("/api/auth/me",{credentials:"include"});if(!o.ok)return;const a=await o.json(),e=a?.user??a;if(!e?.email)return;const n=e.role==="ADMIN",r={dashboard:t.dataset.lDashboard??"Dashboard",admin:t.dataset.lAdmin??"Admin",logout:t.dataset.lLogout??"Logout"};t.innerHTML=`
56        <a href="/dashboard" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium px-3">${r.dashboard}</a>
57        ${n?`<a href="/admin" class="text-gray-600 dark:text-gray-300 hover:text-purple-600 dark:hover:text-purple-400 transition-colors font-medium px-3">${r.admin}</a>`:""}
58        <span class="text-sm text-gray-600 dark:text-gray-400">${e.firstName||e.email}</span>
59        <button type="button" data-logout class="btn-secondary text-sm">${r.logout}</button>
60      `,t.querySelector("[data-logout]")?.addEventListener("click",async()=>{await fetch("/api/auth/logout",{method:"POST",credentials:"include"}).catch(()=>{}),window.location.href="/"})}catch{}})();</script>
60 <nav aria-label="Breadcrumb" class="border-b border-gray-100 dark:border-gray-800 bg-gray-50/60 dark:bg-gray-900/40"> <div class="container-custom"> <ol class="flex items-center gap-1.5 py-2.5 text-xs sm:text-sm text-gray-500 dark:text-gray-400 overflow-x-auto whitespace-nowrap"> <li class="flex items-center gap-1.5 flex-shrink-0">  <a href="/" class="hover:text-purple-600 dark:hover:text-purple-400 transition-colors inline-flex items-center gap-1"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" aria-hidden="true" class="lucide lucide-house w-3.5 h-3.5">  <path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"></path> <path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>  </svg> <span>Home</span> </a> </li><li class="flex items-center gap-1.5 flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" aria-hidden="true" class="lucide lucide-chevron-right w-3.5 h-3.5 text-gray-300 dark:text-gray-600 flex-shrink-0">  <path d="m9 18 6-6-6-6"></path>  </svg> <a href="/content-api" class="hover:text-purple-600 dark:hover:text-purple-400 transition-colors inline-flex items-center gap-1">  <span>API</span> </a> </li><li class="flex items-center gap-1.5 flex-shrink-0"> <svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" width="24" height="24" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" fill="none" viewBox="0 0 24 24" aria-hidden="true" class="lucide lucide-chevron-right w-3.5 h-3.5 text-gray-300 dark:text-gray-600 flex-shrink-0">  <path d="m9 18 6-6-6-6"></path>  </svg> <span class="font-medium text-gray-700 dark:text-gray-300 truncate max-w-[200px] sm:max-w-xs" aria-current="page"> Documentation </span> </li> </ol> </div> </nav> 
60<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.smart-copy.ai/"},{"@type":"ListItem","position":2,"name":"API","item":"https://www.smart-copy.ai/content-api"},{"@type":"ListItem","position":3,"name":"Documentation","item":"https://www.smart-copy.ai/docs/api"}]}</script>
60 <main class="flex-1"> <div class="min-h-screen bg-gradient-to-br from-gray-50 to-white dark:from-gray-900 dark:to-gray-800 py-16" data-astro-cid-ovyzdvsb><div class="container-custom max-w-5xl docs" data-astro-cid-ovyzdvsb><h1 class="text-4xl md:text-5xl font-bold text-gray-900 dark:text-white mb-3" data-astro-cid-ovyzdvsb>API Documentation</h1><p class="text-gray-600 dark:text-gray-300 mb-8 max-w-3xl" data-astro-cid-ovyzdvsb>Everything the Smart-Copy dashboard does is available via API: order researched AI texts with images, publish them to WordPress (immediately, as drafts or scheduled), run autoblogging series and receive webhooks. Billed from your account balance.</p><div class="card bg-white dark:bg-gray-800 p-5 mb-10 text-sm flex flex-wrap gap-x-6 gap-y-2" data-astro-cid-ovyzdvsb><a href="#quickstart" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Quick start</a><a href="#auth" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Authentication</a><a href="#texts" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Texts</a><a href="#plans" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Autoblog</a><a href="#misc" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Balance &amp; sites</a><a href="#webhooks" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Webhooki</a><a href="#oauth" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>OAuth 2.0</a><a href="#errors" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>Errors</a><a href="/api/v1/openapi.json" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>OpenAPI</a></div><div class="space-y-12" data-astro-cid-ovyzdvsb><section class="card bg-purple-50 dark:bg-purple-900/20 border-purple-200 dark:border-purple-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-xl font-bold text-gray-900 dark:text-white mb-2" data-astro-cid-ovyzdvsb>OpenAPI 3.1 specification</h2><p class="text-gray-700 dark:text-gray-300 mb-4" data-astro-cid-ovyzdvsb>The whole API contract in a single file — generate a client in any language, import it into Postman or hand it to AI tooling. Available without a token.</p><a href="/api/v1/openapi.json" class="btn btn-primary inline-flex items-center gap-2" data-astro-cid-ovyzdvsb>
61/api/v1/openapi.json
62</a></section><section id="quickstart" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>Quick start</h2><ol class="list-decimal pl-6 space-y-2 text-gray-700 dark:text-gray-300 mb-4" data-astro-cid-ovyzdvsb><li data-astro-cid-ovyzdvsb>
63Create a key in the dashboard: <a href="https://www.smart-copy.ai/developers" class="text-primary-600 dark:text-primary-400" data-astro-cid-ovyzdvsb>
64smart-copy.ai/developers
65</a> 
66(tick "Test key" to build your integration at zero cost —
67                  full validation, simulated responses).
68</li><li data-astro-cid-ovyzdvsb>Base URL: <code class="inline" data-astro-cid-ovyzdvsb>https://www.smart-copy.ai/api/v1</code></li><li data-astro-cid-ovyzdvsb>Authorise with the header: <code class="inline" data-astro-cid-ovyzdvsb>Authorization: Bearer sc_live_...</code></li></ol><pre data-astro-cid-ovyzdvsb># Order an 8000-character text with an image
69curl -X POST &quot;https://www.smart-copy.ai/api/v1/texts&quot; \
70  -H &quot;Authorization: Bearer sc_live_...&quot; \
71  -H &quot;Content-Type: application/json&quot; \
72  -d &#39;{&quot;topic&quot;: &quot;How heat pumps work&quot;, &quot;length&quot;: 8000, &quot;language&quot;: &quot;en&quot;}&#39;
73
74# Track status (queued → researching → outlining → writing → generating_image → completed)
75curl &quot;https://www.smart-copy.ai/api/v1/texts/TEXT_ID&quot; \
76  -H &quot;Authorization: Bearer sc_live_...&quot;</pre><p class="text-sm text-gray-500 dark:text-gray-400 mt-3" data-astro-cid-ovyzdvsb>The dashboard (API tab) also offers an interactive console with a request builder, code generator (cURL / Node.js / Python / PHP) and a call history.</p></section><section id="auth" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>Authentication</h2><table data-astro-cid-ovyzdvsb><thead data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><th data-astro-cid-ovyzdvsb>Kind</th><th data-astro-cid-ovyzdvsb>Prefix</th><th data-astro-cid-ovyzdvsb>Description</th></tr></thead><tbody class="text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>Personal key</td><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>sc_live_</code></td><td data-astro-cid-ovyzdvsb>
76Full account access (server-to-server). Created in the dashboard, shown once.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>Test key</td><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>sc_test_</code></td><td data-astro-cid-ovyzdvsb>Same validations and response shapes; orders are simulated (X-SmartCopy-Test: true header), zero cost.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>OAuth 2.0</td><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>sc_at_</code></td><td data-astro-cid-ovyzdvsb>Access tokens issued to third-party apps with the user&#39;s consent — see the OAuth section below.</td></tr></tbody></table><ul class="list-disc pl-6 mt-4 space-y-1 text-sm text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><li data-astro-cid-ovyzdvsb>Rate limit: 120 requests/min per token (HTTP 429 with a Retry-After header).</li><li data-astro-cid-ovyzdvsb>
77Idempotency: send an <code class="inline" data-astro-cid-ovyzdvsb>Idempotency-Key</code> header with <code class="inline" data-astro-cid-ovyzdvsb>POST /texts</code> — a retried request
78                  with the same key returns the stored response without
79                  charging again.
80</li><li data-astro-cid-ovyzdvsb>Billing currency: PLN (the USD rate in /balance is indicative).</li></ul></section><section id="texts" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>Texts</h2><p class="endpoint mb-2" data-astro-cid-ovyzdvsb><span class="method post" data-astro-cid-ovyzdvsb>POST</span>/v1/texts
81</p><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>Orders a text. Price is billed degressively per 1000 characters: 1.99 PLN up to 5,000 characters, 1.19 PLN for characters 5,001–15,000, 0.69 PLN above — capped at 29 PLN per text; charged from the balance on placement (POST /v1/estimate returns the exact amount). Batch: send a texts array (max 500) instead of a single object — one order, one charge. Product descriptions (text_type PRODUCT_DESCRIPTION) ordered together in one request get a volume discount: 25+ −25%, 100+ −45%, 500+ −60% (the response includes bulk_discount).</p><table class="mb-4" data-astro-cid-ovyzdvsb><thead data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><th data-astro-cid-ovyzdvsb>Parameter</th><th data-astro-cid-ovyzdvsb>Type</th><th data-astro-cid-ovyzdvsb>Description</th></tr></thead><tbody class="text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>topic</code></td><td data-astro-cid-ovyzdvsb>string, required</td><td data-astro-cid-ovyzdvsb>Topic, 3–300 chars.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>length</code></td><td data-astro-cid-ovyzdvsb>number, required</td><td data-astro-cid-ovyzdvsb>Length in characters, 500–300000 (2000 chars ≈ 1 page).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>language</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>pl</code> | <code class="inline" data-astro-cid-ovyzdvsb>en</code> 
82(default pl)
83</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>text_type</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>
84ARTICLE, BLOG_POST, COMPANY_TEXT, PRODUCT_DESCRIPTION,
85                  CATEGORY_DESCRIPTION, REPORT, ANALYSIS, SOCIAL_MEDIA,
86                  EMAIL_MARKETING, OTHER
87</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>guidelines</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>Guidelines: tone, audience, what to cover.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>keywords</code></td><td data-astro-cid-ovyzdvsb>string[]</td><td data-astro-cid-ovyzdvsb>
87SEO keywords, max 10.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>links</code></td><td data-astro-cid-ovyzdvsb>object[]</td><td data-astro-cid-ovyzdvsb>SEO links to weave in: [{url, anchor?}], max 5.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>source_urls</code></td><td data-astro-cid-ovyzdvsb>string[]</td><td data-astro-cid-ovyzdvsb>Your own research sources, max 10.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>source_mode</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>
88auto | web | academic | hybrid (academic = scholarly sources)</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>generate_image</code></td><td data-astro-cid-ovyzdvsb>boolean</td><td data-astro-cid-ovyzdvsb>AI featured image (default true, included).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>outline_approval</code></td><td data-astro-cid-ovyzdvsb>boolean</td><td data-astro-cid-ovyzdvsb>true = writing starts after outline approval in the dashboard (awaiting_outline_approval status).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>wp_site_id</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>WP site for auto-publication (GET /wp-sites).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>wp_status</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>
89draft | publish | future (future requires wp_scheduled_at)</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>wp_scheduled_at</code></td><td data-astro-cid-ovyzdvsb>string (ISO 8601)</td><td data-astro-cid-ovyzdvsb>Publication date, at least 5 minutes ahead.</td></tr></tbody></table><pre data-astro-cid-ovyzdvsb>Response 201:
90{
91  &quot;id&quot;: &quot;d92dfaf2-...&quot;,
92  &quot;object&quot;: &quot;text&quot;,
93  &quot;order_id&quot;: &quot;f4a286ea-...&quot;,
94  &quot;status&quot;: &quot;queued&quot;,
95  &quot;topic&quot;: &quot;...&quot;,
96  &quot;length&quot;: 8000,
97  &quot;price&quot;: 31.92,
98  &quot;currency&quot;: &quot;PLN&quot;,
99  &quot;revisions_used&quot;: 0,
100  &quot;revisions_limit&quot;: 3,
101  &quot;created_at&quot;: &quot;2026-08-10T12:00:00.000Z&quot;
102}</pre><p class="endpoint mt-8 mb-2" data-astro-cid-ovyzdvsb><span class="method get" data-astro-cid-ovyzdvsb>GET</span>/v1/texts/:id
103</p><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>Status and result. Statuses: queued, researching, outlining, awaiting_outline_approval, writing (with a section {current, total} field), generating_image, completed, failed (funds refunded automatically). Once completed, the response includes html, featured_image {url, alt} and wp_publications.</p><p class="endpoint mt-6 mb-2" data-astro-cid-ovyzdvsb><span class="method get" data-astro-cid-ovyzdvsb>GET</span>/v1/texts
104</p><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>
105List texts. Parameters: <code class="inline" data-astro-cid-ovyzdvsb>limit</code> 
106(1–100, default 20), <code class="inline" data-astro-cid-ovyzdvsb>created_before</code> 
107(time cursor from next_created_before), <code class="inline" data-astro-cid-ovyzdvsb>wp_site_id</code> (per-site filter).
108                Response:  <code class="inline" data-astro-cid-ovyzdvsb>{ &quot;object&quot;: &quot;list&quot;, &quot;data&quot;: [...], &quot;has_more&quot;: bool, &quot;next_created_before&quot;: &quot;...&quot; }</code> 
109— <code class="inline" data-astro-cid-ovyzdvsb>next_created_before</code> is present
110                only when <code class="inline" data-astro-cid-ovyzdvsb>has_more</code> is true.
111</p><p class="endpoint mt-6 mb-2" data-astro-cid-ovyzdvsb><span class="method post" data-astro-cid-ovyzdvsb>POST</span>/v1/texts/:id/revision
112</p><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>
113Free revision of a completed text. Body: <code class="inline" data-astro-cid-ovyzdvsb>{&quot;feedback&quot;: &quot;what to change (10–5000 chars)&quot;}</code>
114. Limit: 3 revisions/text (403 revision_limit_reached once
115                exhausted). When done we send a text.completed webhook with
116                revised: true.
117</p><p class="endpoint mt-6 mb-2" data-astro-cid-ovyzdvsb><span class="method post" data-astro-cid-ovyzdvsb>POST</span>/v1/estimate
118</p><p class="text-sm text-gray-600 dark:text-gray-300" data-astro-cid-ovyzdvsb>
119Price estimate without creating an order. Body: <code class="inline" data-astro-cid-ovyzdvsb>{&quot;length&quot;: 8000}</code> → price,
120                pages, balance and <code class="inline" data-astro-cid-ovyzdvsb>sufficient_balance</code>. For a batch of
121                product descriptions add <code class="inline" data-astro-cid-ovyzdvsb>&quot;text_type&quot;: &quot;PRODUCT_DESCRIPTION&quot;, &quot;quantity&quot;: 100</code> 
122→ discounted unit price, <code class="inline" data-astro-cid-ovyzdvsb>total_price</code> 
123and <code class="inline" data-astro-cid-ovyzdvsb>bulk_discount</code>.
124</p></section><section id="plans" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>
125Autoblog
126</h2><p class="text-sm text-gray-600 dark:text-gray-300 mb-4" data-astro-cid-ovyzdvsb>
126Content series: Smart-Copy plans a ~20-topic cluster (competitor research + site profile when available), writes texts at the chosen pace and publishes to WordPress. Each text is billed from the balance before generation; insufficient funds pause the series.</p><p class="endpoint mb-2" data-astro-cid-ovyzdvsb><span class="method post" data-astro-cid-ovyzdvsb>POST</span>/v1/plans
127</p><table class="mb-4" data-astro-cid-ovyzdvsb><thead data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><th data-astro-cid-ovyzdvsb>Parameter</th><th data-astro-cid-ovyzdvsb>Type</th><th data-astro-cid-ovyzdvsb>Description</th></tr></thead><tbody class="text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>niche</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>Topic description (min. 20 chars). Optional when site_profile or a wp_site_id with a stored profile is provided — otherwise 422 insufficient_site_info.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>site_profile</code></td><td data-astro-cid-ovyzdvsb>object</td><td data-astro-cid-ovyzdvsb>{title, tagline, categories[], recent_posts[], excerpts[]} — automatic topic detection from the site.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>texts_per_week</code></td><td data-astro-cid-ovyzdvsb>number</td><td data-astro-cid-ovyzdvsb>1–7 (default 2)</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>target_length</code></td><td data-astro-cid-ovyzdvsb>number</td><td data-astro-cid-ovyzdvsb>3000–30000 (default 8000)</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>text_type</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>BLOG_POST | ARTICLE | COMPANY_TEXT</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>with_images</code></td><td data-astro-cid-ovyzdvsb>boolean</td><td data-astro-cid-ovyzdvsb>default true</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>wp_site_id</code>, <code class="inline" data-astro-cid-ovyzdvsb>wp_status</code></td><td data-astro-cid-ovyzdvsb>string</td><td data-astro-cid-ovyzdvsb>Where to publish; wp_status: publish | draft.</td></tr></tbody></table><p class="text-sm text-gray-600 dark:text-gray-300" data-astro-cid-ovyzdvsb>
128Also: <code class="inline" data-astro-cid-ovyzdvsb>GET /v1/plans</code> (optionally
129                ?wp_site_id=), <code class="inline" data-astro-cid-ovyzdvsb>GET /v1/plans/:id</code> 
130(with items and statuses), <code class="inline" data-astro-cid-ovyzdvsb>POST /v1/plans/:id/pause</code> and <code class="inline" data-astro-cid-ovyzdvsb>POST /v1/plans/:id/resume</code>. Series
131                statuses: planning, active, paused, completed.
132</p></section><section id="misc" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>Balance &amp; sites</h2><p class="endpoint mb-2" data-astro-cid-ovyzdvsb><span class="method get" data-astro-cid-ovyzdvsb>GET</span>/v1/balance
133</p><pre data-astro-cid-ovyzdvsb>{
134  &quot;object&quot;: &quot;balance&quot;,
135  &quot;balance&quot;: 776.56,
136  &quot;currency&quot;: &quot;PLN&quot;,
137  &quot;usd_rate&quot;: 3.7324,
138  &quot;balance_usd&quot;: 208.06,
139  &quot;auto_topup_enabled&quot;: false
140}</pre><p class="endpoint mt-6 mb-2" data-astro-cid-ovyzdvsb><span class="method get" data-astro-cid-ovyzdvsb>GET</span>/v1/wp-sites
141</p><p class="text-sm text-gray-600 dark:text-gray-300" data-astro-cid-ovyzdvsb>WordPress sites connected to the account: id, name, base_url, auth_type (connector | app-password), verified, last_poll_at (live plugin heartbeat).</p></section><section id="webhooks" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>
142Webhooki
143</h2><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>Configure a webhook URL on an API key (dashboard → API) or on an OAuth application. Events: text.completed (also after revisions, with revised: true), text.failed (with refunded: true — funds returned to the balance), outline.ready. Delivery: JSON POST, exponential retry up to 5 attempts.</p><pre data-astro-cid-ovyzdvsb>POST your-endpoint
144X-SmartCopy-Event: text.completed
145X-SmartCopy-Signature: sha256=3f5c9a...
146
147{
148  &quot;event&quot;: &quot;text.completed&quot;,
149  &quot;created&quot;: &quot;2026-08-10T12:34:56.000Z&quot;,
150  &quot;data&quot;: {
151    &quot;text&quot;: {
152      &quot;id&quot;: &quot;d92dfaf2-...&quot;,
153      &quot;topic&quot;: &quot;...&quot;,
154      &quot;progress&quot;: &quot;completed&quot;,
155      &quot;price&quot;: 31.92,
156      &quot;html&quot;: &quot;&lt;h1&gt;...&lt;/h1&gt;...&quot;,
157      &quot;featured_image&quot;: { &quot;url&quot;: &quot;https://...&quot;, &quot;alt&quot;: &quot;...&quot; }
158    }
159  }
160}</pre><p class="text-sm text-gray-600 dark:text-gray-300 mt-3 mb-2" data-astro-cid-ovyzdvsb>Signature verification (HMAC-SHA256 of the raw body with your whsec_ secret):</p><pre data-astro-cid-ovyzdvsb>const crypto = require(&quot;crypto&quot;);
161const expected = &quot;sha256=&quot;
161 +
162  crypto.createHmac(&quot;sha256&quot;, process.env.WEBHOOK_SECRET)
163        .update(rawBody).digest(&quot;hex&quot;);
164const valid = crypto.timingSafeEqual(
165  Buffer.from(expected),
166  Buffer.from(req.headers[&quot;x-smartcopy-signature&quot;] || &quot;&quot;));</pre></section><section id="oauth" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>
167OAuth 2.0
168</h2><p class="text-sm text-gray-600 dark:text-gray-300 mb-3" data-astro-cid-ovyzdvsb>Build applications operating on Smart-Copy user accounts (SaaS integrations, Make.com, Zapier, agency dashboards). Flow: authorization code + PKCE (S256). Register your app in the dashboard → API → &quot;Your OAuth applications&quot; (public with PKCE or confidential with a secret).</p><table class="mb-4" data-astro-cid-ovyzdvsb><thead data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><th data-astro-cid-ovyzdvsb>Endpoint</th><th data-astro-cid-ovyzdvsb>Description</th></tr></thead><tbody class="text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>GET https://www.smart-copy.ai/oauth/authorize</code></td><td data-astro-cid-ovyzdvsb>Consent screen. Params: client_id, redirect_uri, response_type=code, scope (space/plus separated), state, code_challenge, code_challenge_method=S256.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>POST https://www.smart-copy.ai/api/oauth/token</code></td><td data-astro-cid-ovyzdvsb>Code exchange (grant_type=authorization_code + code_verifier) and refresh (grant_type=refresh_token). JSON or form-urlencoded. Access valid 2 h; refresh 60 days with rotation — reusing a rotated refresh token revokes all of the app&#39;s tokens (theft protection).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>POST https://www.smart-copy.ai/api/oauth/revoke</code></td><td data-astro-cid-ovyzdvsb>Token revocation (RFC 7009).</td></tr></tbody></table><p class="text-sm text-gray-600 dark:text-gray-300" data-astro-cid-ovyzdvsb>
169Scopes: <code class="inline" data-astro-cid-ovyzdvsb>texts:read</code>, <code class="inline" data-astro-cid-ovyzdvsb>texts:write</code> (orders billed from
170                the user's balance), <code class="inline" data-astro-cid-ovyzdvsb>balance:read</code>, <code class="inline" data-astro-cid-ovyzdvsb>wp:read</code>, <code class="inline" data-astro-cid-ovyzdvsb>plans:read</code>, <code class="inline" data-astro-cid-ovyzdvsb>plans:write</code>. Users can view and
171                revoke access in the dashboard ("Connected applications").
172</p></section><section id="errors" class="card bg-white dark:bg-gray-800 p-6" data-astro-cid-ovyzdvsb><h2 class="text-2xl font-bold text-gray-900 dark:text-white mb-4" data-astro-cid-ovyzdvsb>Errors</h2><pre class="mb-4" data-astro-cid-ovyzdvsb>{ &quot;error&quot;: &quot;insufficient_balance&quot;, &quot;error_description&quot;: &quot;...&quot; }</pre><table data-astro-cid-ovyzdvsb><thead data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><th data-astro-cid-ovyzdvsb>HTTP</th><th data-astro-cid-ovyzdvsb><code class="inline" data-astro-cid-ovyzdvsb>error</code></th><th data-astro-cid-ovyzdvsb>Description</th></tr></thead><tbody class="text-gray-700 dark:text-gray-300" data-astro-cid-ovyzdvsb><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>400</td><td data-astro-cid-ovyzdvsb>invalid_request</td><td data-astro-cid-ovyzdvsb>Invalid parameters (details in error_description, prefixed texts[i] for batches).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>401</td><td data-astro-cid-ovyzdvsb>invalid_token</td><td data-astro-cid-ovyzdvsb>Missing/invalid/revoked token.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>402</td><td data-astro-cid-ovyzdvsb>insufficient_balance</td><td data-astro-cid-ovyzdvsb>Not enough funds (price and balance fields included).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>403</td><td data-astro-cid-ovyzdvsb>insufficient_scope / revision_limit_reached / plan_limit_reached</td><td data-astro-cid-ovyzdvsb>Missing scope or an exhausted limit.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>404</td><td data-astro-cid-ovyzdvsb>not_found</td><td data-astro-cid-ovyzdvsb>Resource not found.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>409</td><td data-astro-cid-ovyzdvsb>conflict</td><td data-astro-cid-ovyzdvsb>Operation impossible in the current state (e.g. revising a text still generating).</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>422</td><td data-astro-cid-ovyzdvsb>insufficient_site_info</td><td data-astro-cid-ovyzdvsb>Autoblog: topic could not be detected — provide niche.</td></tr><tr data-astro-cid-ovyzdvsb><td data-astro-cid-ovyzdvsb>429</td><td data-astro-cid-ovyzdvsb>rate_limit_exceeded</td><td data-astro-cid-ovyzdvsb>120/min limit exceeded (Retry-After header).</td></tr></tbody></table><p class="text-sm text-gray-500 dark:text-gray-400 mt-4" data-astro-cid-ovyzdvsb>
173Questions? <strong data-astro-cid-ovyzdvsb>[email protected]</strong></p></section></div></div></div> </main> <footer class="bg-gray-900 text-gray-300"> <div class="container-custom py-12"> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-6 gap-8"> <div class="lg:col-span-2"> <a href="/" class="flex items-center gap-2 mb-4"> <div class="w-10 h-10 bg-gradient-to-br from-purple-600 to-indigo-600 rounded-xl flex items-center justify-center"> <svg class="w-6 h-6 text-white" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M12 2L9.5 9.5L2 12l7.5 2.5L12 22l2.5-7.5L22 12l-7.5-2.5L12 2z"></path> </svg> </div> <span class="text-xl font-bold text-white">Smart-Copy.ai</span> </a> <p class="text-sm text-gray-400 mb-4 mr-4"> Create professional content in seconds with artificial intelligence. Save time and boost your productivity. </p> <p class="text-xs uppercase tracking-wider text-gray-500 mb-2"> Get the app </p> <a href="https://play.google.com/store/apps/details?id=ai.smartcopy.app" target="_blank" rel="noopener" aria-label="Get Smart-Copy.ai on Google Play" class="inline-flex items-center gap-3 rounded-xl bg-black text-white border border-gray-700 hover:bg-gray-900 transition-colors shadow-lg px-4 py-2 ">
173 <svg class="w-6 h-6" viewBox="0 0 24 24" aria-hidden="true"> <path fill="#00d7fe" d="M3.6 2.3c-.3.3-.5.8-.5 1.4v16.6c0 .6.2 1.1.5 1.4l.1.1 9.3-9.3v-.2L3.7 2.2l-.1.1z"></path> <path fill="#ffce00" d="M16.1 15.6 13 12.5v-.2l3.1-3.1.1.1 3.7 2.1c1.1.6 1.1 1.6 0 2.2l-3.7 2.1-.1-.1z"></path> <path fill="#ff3a44" d="M16.2 15.5 13 12.3l-9.3 9.4c.3.4.9.4 1.6 0l10.9-6.2"></path> <path fill="#00f076" d="M16.2 9.2 5.3 3c-.7-.4-1.3-.3-1.6 0l9.3 9.3 3.2-3.1z"></path> </svg> <span class="flex flex-col leading-none text-left"> <span class="text-[9px] uppercase tracking-wide text-gray-300"> GET IT ON </span> <span class="text-base font-semibold mt-0.5"> Google Play </span> </span> </a> </div> <div> <h3 class="text-white font-semibold mb-4"> Product </h3> <ul class="space-y-2"> <li> <a href="/#features" class="text-sm hover:text-purple-400 transition-colors"> Features </a> </li><li> <a href="/#pricing" class="text-sm hover:text-purple-400 transition-colors"> Pricing </a> </li><li> <a href="/#faq" class="text-sm hover:text-purple-400 transition-colors"> FAQ </a> </li><li> <a href="/blog" class="text-sm hover:text-purple-400 transition-colors"> Blog </a> </li><li> <a href="/ai-copywriter" class="text-sm hover:text-purple-400 transition-colors"> AI Copywriter </a> </li><li> <a href="/ai-product-description-generator" class="text-sm hover:text-purple-400 transition-colors"> AI Product Description Generator </a> </li><li> <a href="/ai-seo-content-writer" class="text-sm hover:text-purple-400 transition-colors"> AI SEO Writer </a> </li><li> <a href="/mobile-app" class="text-sm hover:text-purple-400 transition-colors"> Android app </a> </li> </ul> </div> <div> <h3 class="text-white font-semibold mb-4"> Automations </h3> <ul class="space-y-2"> <li> <a href="/autoblogging" class="text-sm hover:text-purple-400 transition-colors"> Autoblog </a> </li><li> <a href="/wordpress-plugin" class="text-sm hover:text-purple-400 transition-colors"> WordPress </a> </li><li> <a href="/woocommerce-product-descriptions" class="text-sm hover:text-purple-400 transition-colors"> WooCommerce </a> </li><li> <a href="/integrations/baselinker" class="text-sm hover:text-purple-400 transition-colors"> Baselinker (Base) </a> </li><li> <a href="/integrations/shoper" class="text-sm hover:text-purple-400 transition-colors"> Shoper </a> </li><li> <a href="/integrations/zapier" class="text-sm hover:text-purple-400 transition-colors"> Zapier </a> </li><li> <a href="/automations" class="text-sm hover:text-purple-400 transition-colors"> See all automations </a> </li> </ul> </div> <div> <h3 class="text-white font-semibold mb-4"> API </h3> <ul class="space-y-2"> <li> <a href="/content-api" class="text-sm hover:text-purple-400 transition-colors"> REST API </a> </li><li> <a href="/docs/api" class="text-sm hover:text-purple-400 transition-colors"> Documentation </a> </li><li> <a href="/webhooks" class="text-sm hover:text-purple-400 transition-colors"> Webhooks </a> </li> </ul> </div> <div> <h3 class="text-white font-semibold mb-4"> Legal </h3> <ul class="space-y-2"> <li> <a href="/terms" class="text-sm hover:text-purple-400 transition-colors"> Terms of Service </a> </li><li> <a href="/privacy" class="text-sm hover:text-purple-400 transition-colors"> Privacy Policy </a> </li><li> <a href="/cookies" class="text-sm hover:text-purple-400 transition-colors"> Cookies </a> </li><li> <a href="/support" class="text-sm hover:text-purple-400 transition-colors"> Support </a> </li> </ul> </div> </div> <div class="border-t border-gray-800 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center gap-4"> <div class="flex flex-col sm:flex-row items-center gap-2 sm:gap-4 text-sm text-gray-400"> <p>
174&copy; 2026 Smart-Copy.ai. All rights reserved. </p> <span class="hidden sm:inline text-gray-600">|</span> <p> Design, development and deployment:  <a href="https://www.karol-leszczynski.pl" target="_blank" rel="noopener" class="text-gray-300 hover:text-purple-400 transition-colors">
175Karol Leszczyński
176</a> </p> </div> <div class="flex items-center gap-2 text-sm text-gray-400"> <svg class="w-4 h-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path> <polyline points="22,6 12,13 2,6"></polyline> </svg>  <a href="/support" class="hover:text-purple-400 transition-colors"> Contact </a> </div> </div> </div> </footer> <!-- Cookie consent banner — lets visitors grant Google Consent Mode v2 (analytics/ads). --> <div id="cookie-banner" style="display:none" role="dialog" aria-live="polite" aria-label="Cookie consent" class="fixed bottom-0 inset-x-0 z-[60] p-4 sm:p-5 bg-white dark:bg-gray-900 border-t border-gray-200 dark:border-gray-700 shadow-2xl"> <div class="max-w-5xl mx-auto flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4"> <p class="text-sm text-gray-700 dark:text-gray-300 flex-1"> We use cookies to analyze traffic and improve the site. You can accept all or keep only the necessary ones. <a href="/cookies" class="underline hover:text-purple-600 dar
176k:hover:text-purple-400 ml-1"> Learn more </a> </p> <div class="flex gap-2 shrink-0"> <button id="cookie-reject" type="button" class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"> Only necessary </button> <button id="cookie-accept" type="button" class="px-4 py-2 text-sm font-semibold rounded-lg bg-purple-600 text-white hover:bg-purple-700 transition-colors"> Accept all </button> </div> </div> </div> 
176<script>
177      (function () {
178        var KEY = "cookie-consent";
179        var TS = "cookie-consent-timestamp";
180        var banner = document.getElementById("cookie-banner");
181        function apply(s) {
182          if (typeof gtag === "function") {
183            gtag("consent", "update", {
184              analytics_storage: s.analytics ? "granted" : "denied",
185              ad_storage: s.marketing ? "granted" : "denied",
186              ad_user_data: s.marketing ? "granted" : "denied",
187              ad_personalization: s.marketing ? "granted" : "denied",
188            });
189          }
190        }
191        function show() {
192          if (banner) banner.style.display = "block";
193        }
194        function hide() {
195          if (banner) banner.style.display = "none";
196        }
197        function decide(analytics, marketing) {
198          var s = { necessary: true, analytics: analytics, marketing: marketing };
199          try {
200            localStorage.setItem(KEY, JSON.stringify(s));
201            localStorage.setItem(TS, new Date().toISOString());
202          } catch (e) {}
203          apply(s);
204          hide();
205        }
206        var saved = null;
207        try {
208          saved = JSON.parse(localStorage.getItem(KEY) || "null");
209        } catch (e) {}
210        if (!saved) show(); // first visit → ask; returning choice was re-applied in <head>
211        var a = document.getElementById("cookie-accept");
212        var r = document.getElementById("cookie-reject");
213        if (a) a.addEventListener("click", function () { decide(true, true); });
214        if (r) r.addEventListener("click", function () { decide(false, false); });
215        window.addEventListener("cookie-consent:show-banner", show);
216        window.addEventListener("cookie-consent:cleared", show);
217      })();
218    </script>
218 </body> </html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.