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 & 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 & 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 & 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 "https://www.smart-copy.ai/api/v1/texts" \ 70 -H "Authorization: Bearer sc_live_..." \ 71 -H "Content-Type: application/json" \ 72 -d '{"topic": "How heat pumps work", "length": 8000, "language": "en"}' 73 74# Track status (queued â researching â outlining â writing â generating_image â completed) 75curl "https://www.smart-copy.ai/api/v1/texts/TEXT_ID" \ 76 -H "Authorization: Bearer sc_live_..."</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'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 "id": "d92dfaf2-...", 92 "object": "text", 93 "order_id": "f4a286ea-...", 94 "status": "queued", 95 "topic": "...", 96 "length": 8000, 97 "price": 31.92, 98 "currency": "PLN", 99 "revisions_used": 0, 100 "revisions_limit": 3, 101 "created_at": "2026-08-10T12:00:00.000Z" 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>{ "object": "list", "data": [...], "has_more": bool, "next_created_before": "..." }</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>{"feedback": "what to change (10â5000 chars)"}</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>{"length": 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>"text_type": "PRODUCT_DESCRIPTION", "quantity": 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 & 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 "object": "balance", 135 "balance": 776.56, 136 "currency": "PLN", 137 "usd_rate": 3.7324, 138 "balance_usd": 208.06, 139 "auto_topup_enabled": 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 "event": "text.completed", 149 "created": "2026-08-10T12:34:56.000Z", 150 "data": { 151 "text": { 152 "id": "d92dfaf2-...", 153 "topic": "...", 154 "progress": "completed", 155 "price": 31.92, 156 "html": "<h1>...</h1>...", 157 "featured_image": { "url": "https://...", "alt": "..." } 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("crypto"); 161const expected = "sha256="
161 + 162 crypto.createHmac("sha256", process.env.WEBHOOK_SECRET) 163 .update(rawBody).digest("hex"); 164const valid = crypto.timingSafeEqual( 165 Buffer.from(expected), 166 Buffer.from(req.headers["x-smartcopy-signature"] || ""));</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 â "Your OAuth applications" (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'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>{ "error": "insufficient_balance", "error_description": "..." }</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© 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.