Перейти до вмісту
ShopentlyLearn

Стаття

Читати статті та переглядати чернетки

GET/api/v1/addons/shopently.blog/posts/{post_id}

Автентифікація
Bearer
Доступно починаючи з
BASIC
Потрібний установлений модуль
shopently.blog · Версія контракту модуля 1
Потрібні дозволи
addon.shopently.blog:post_read

Приклади коду

Приклад запиту

cURL

: "${SHOPENTLY_SHOP_URL:?}"

curl --disable --globoff --fail-with-body --silent --show-error \
  --proto '=https' --connect-timeout 5 --max-time 30 \
  --request GET \
  --header "Authorization: Bearer ${SHOPENTLY_ACCESS_TOKEN:?}" \
  --url "${SHOPENTLY_SHOP_URL%/}"'/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851?locale=pl'

PHP

<?php
declare(strict_types=1);

$baseUrl = rtrim(getenv('SHOPENTLY_SHOP_URL') ?: '', '/');
$origin = parse_url($baseUrl);
if (!$origin || ($origin['scheme'] ?? '') !== 'https' || empty($origin['host']) ||
    isset($origin['user'], $origin['pass']) || isset($origin['user']) || isset($origin['path']) ||
    isset($origin['query']) || isset($origin['fragment'])) {
    throw new RuntimeException('SHOPENTLY_SHOP_URL must be an HTTPS origin');
}
$credential = getenv('SHOPENTLY_ACCESS_TOKEN') ?: '';
if ($credential === '' || strpbrk($credential, "\r\n") !== false) {
    throw new RuntimeException('Invalid credential');
}
$headers = [];
$headers[] = 'Authorization: Bearer ' . $credential;
$responseHeaders = [];
$handle = curl_init($baseUrl . '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851?locale=pl');
curl_setopt_array($handle, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => false,
    CURLOPT_PROTOCOLS => CURLPROTO_HTTPS,
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_SSL_VERIFYHOST => 2,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HEADERFUNCTION => static function ($handle, string $line) use (&$responseHeaders): int {
        if (str_contains($line, ':')) {
            [$name, $value] = explode(':', $line, 2);
            $responseHeaders[strtolower(trim($name))] = trim($value);
        }
        return strlen($line);
    },
]);
$raw = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
$error = curl_error($handle);
curl_close($handle);
if ($raw === false) {
    throw new RuntimeException('Transport error: ' . $error);
}
if ($status < 200 || $status >= 300) {
    throw new RuntimeException('HTTP ' . $status . '; request_id=' .
        ($responseHeaders['x-request-id'] ?? '') . '; retry_after=' . ($responseHeaders['retry-after'] ?? ''));
}
$result = $raw === '' ? null : json_decode($raw, true, 512, JSON_THROW_ON_ERROR | JSON_BIGINT_AS_STRING);
echo json_encode($result, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), PHP_EOL;

Python

from contextlib import ExitStack
import json
import os
from urllib.parse import urlsplit

import requests  # python -m pip install requests

base_url = os.environ["SHOPENTLY_SHOP_URL"].rstrip("/")
origin = urlsplit(base_url)
if origin.scheme != "https" or not origin.hostname or origin.username or origin.password or origin.path or origin.query or origin.fragment:
    raise ValueError("SHOPENTLY_SHOP_URL must be an HTTPS origin")
credential = os.environ['SHOPENTLY_ACCESS_TOKEN']
if not credential or "\r" in credential or "\n" in credential:
    raise ValueError("Invalid credential")
headers = {}
headers["Authorization"] = 'Bearer' + " " + credential
body = None
if body is not None:
    headers["Content-Type"] = "application/json"

with ExitStack() as stack:
    session = stack.enter_context(requests.Session())
    files = None
    if False:
        image = stack.enter_context(open(os.environ["SHOPENTLY_IMAGE_FILE"], "rb"))
        if os.fstat(image.fileno()).st_size > 5242880:
            raise ValueError("Image exceeds 5 MiB")
        files = {"file": ("article.png", image, "image/png")}
    response = session.request(
        'GET', base_url + '/api/v1/addons/shopently.blog/posts/2103ba96-2713-420b-b197-8a008730c851?locale=pl', headers=headers,
        data=body.encode("utf-8") if body is not None else None, files=files,
        timeout=(5, 30), allow_redirects=False,
    )
    if not 200 <= response.status_code < 300:
        raise RuntimeError(f"HTTP {response.status_code}; request_id={response.headers.get('X-Request-ID', '')}; retry_after={response.headers.get('Retry-After', '')}")
    if False:
        if response.headers.get("Content-Type") != "image/webp" or len(response.content) > 5242880:
            raise ValueError("Unexpected image response")
        with open(os.environ["SHOPENTLY_OUTPUT_FILE"], "xb") as output:
            output.write(response.content)
    else:
        result = response.json() if response.content else None
        print(json.dumps(result, ensure_ascii=False, indent=2))

Приклад відповіді 200

JSON
{
  "data": {
    "author_id": "341494e0-caab-4f47-a8ff-f6795c42a775",
    "comments_mode": "open",
    "content_html": "<h2>Porównaj właściwości</h2><p>Sprawdź opis produktu i wybierz wariant odpowiedni do swoich potrzeb.</p>",
    "cover_alt": "Niebieska ilustracja poradnika",
    "cover_caption": "Ilustracja redakcyjna",
    "cover_media_id": "e8663afe-3c38-461c-a142-a980085630af",
    "draft_revision_id": "8c4af6da-63f4-42aa-8b37-57c703fa0af7",
    "excerpt": "Praktyczny poradnik zakupowy.",
    "first_published_at": null,
    "id": "2103ba96-2713-420b-b197-8a008730c851",
    "last_published_at": null,
    "locale": "pl",
    "meta_description": "Praktyczne wskazówki dotyczące wyboru produktu.",
    "meta_keywords": [
      "poradnik",
      "wybór"
    ],
    "meta_title": "Jak wybrać produkt",
    "public_number": 1,
    "publish_at": null,
    "publish_timezone": null,
    "published_revision_id": null,
    "schedule_state": null,
    "scheduled_revision_id": null,
    "slug": "jak-wybrac-produkt",
    "status": "draft",
    "title": "Jak wybrać produkt",
    "updated_at": "2026-10-07T23:17:44.320869Z",
    "version": 1
  },
  "meta": {
    "request_id": "c85f6074-44e5-4d74-a117-fb631879fb7d"
  }
}

Огляд

Ведіть блог магазину зі статтями HTML, фотографіями, авторами та метаданими для пошукових систем. Зберігайте чернетки, готуйте переклади й публікуйте відразу або в обраний час певного часового поясу. Керуйте коментарями й модерацією в панелі; зовнішній генератор може використовувати API з наданими правами.

BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:post_read

Параметри

Параметри шляху

post_idРядокОбов’язкове

Стаття

format: "uuid"
Приклад: "2103ba96-2713-420b-b197-8a008730c851"

Параметри запиту

localeРядокОбов’язкове

Мова, вибрана для цього запиту.

minLength: 2maxLength: 35
Обмеження
pattern
"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
Приклад: "pl"

Ця операція не приймає тіло JSON.

Відповіді

Відповідь 200

dataОб’єктДодаткові поля: НіОбов’язкове

Дані успішної відповіді.

Поля · data
author_idРядок nullОбов’язкове

Автор

Рядок:format: "uuid"
comments_modeРядокОбов’язкове

Коментарі

Обмеження
enum
["inherit", "open", "closed"]
content_htmlРядокОбов’язкове

Зміст

maxLength: 50000
cover_altРядокОбов’язкове

Альтернативний текст

maxLength: 250
cover_captionРядокОбов’язкове

Підпис до фото

maxLength: 500
cover_media_idРядок nullОбов’язкове

Фото обкладинки

Рядок:format: "uuid"
draft_revision_idРядокОбов’язкове

Версія чернетки

format: "uuid"
excerptРядокОбов’язкове

Вступ

maxLength: 1000
first_published_atРядок nullОбов’язкове

Перша публікація

Рядок:format: "date-time"
idРядокОбов’язкове

Ідентифікатор ресурсу; зберігайте його в отриманому вигляді.

format: "uuid"
last_published_atРядок nullОбов’язкове

Остання публікація

Рядок:format: "date-time"
localeРядокОбов’язкове

Мова, вибрана для цього запиту.

minLength: 2maxLength: 35
Обмеження
pattern
"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
meta_descriptionРядокОбов’язкове

Опис для пошукових систем вибраною мовою.

maxLength: 160
meta_keywordsМасив <Рядок> Обов’язкове

Ключові слова для пошукових систем вибраною мовою.

maxItems: 20
Масив:minLength: 1maxLength: 50
meta_titleРядокОбов’язкове

Заголовок для пошукових систем вибраною мовою.

maxLength: 70
public_numberЦіле числоОбов’язкове

Номер

minimum: 1
publish_atРядок nullОбов’язкове

Дата публікації

Рядок:format: "date-time"
publish_timezoneРядок nullОбов’язкове

Часовий пояс

Рядок:maxLength: 64
published_revision_idРядок nullОбов’язкове

Версія (Опубліковано)

Рядок:format: "uuid"
schedule_stateРядок nullОбов’язкове

Запланована публікація

Обмеження · Рядок 1
enum
["armed", "requires_confirmation"]
scheduled_revision_idРядок nullОбов’язкове

Версія (Заплановано)

Рядок:format: "uuid"
slugРядокОбов’язкове

Сегмент шляху URL вибраною мовою.

maxLength: 160
statusРядокОбов’язкове

Статус, допустимий для цієї конкретної операції.

Обмеження
enum
["draft", "scheduled", "published", "archived"]
titleРядокОбов’язкове

Заголовок вибраною мовою.

maxLength: 200
updated_atРядокОбов’язкове

Час останнього оновлення.

format: "date-time"
versionЦіле числоОбов’язкове

Версія ресурсу для контролю одночасних змін.

minimum: 1maximum: 9223372036854775807
metaОб’єктДодаткові поля: НіОбов’язкове

Метадані відповіді.

Поля · meta
request_idРядокОбов’язкове

Ідентифікатор звернення; у метаданих відповіді ідентифікує запит HTTP.

minLength: 1maxLength: 100
Приклад відповіді

Статус HTTP

200
Успішна відповідь Схема
400
Некоректний запит
401
Потрібна автентифікація
403
Доступ заборонено
404
Ресурс не знайдено
409
Конфлікт версій
422
Помилка валідації
429
Перевищено ліміт запитів
Інші статуси HTTP (7)
405
Метод не дозволено
413
Завеликий запит
415
Непідтримуваний формат
500
Помилка сервера
502
Помилка шлюзу API
503
Сервіс недоступний
504
Перевищено час очікування

Каталог помилок: ErrorResponse

Заголовки

401

WWW-AuthenticateРядокНеобов’язкове

Схема автентифікації, потрібна серверу.

405

AllowРядокНеобов’язкове

Методи HTTP, підтримувані цим ресурсом.

429, 503

Retry-AfterЦіле числоНеобов’язкове

Мінімальна затримка перед повтором у секундах.

minimum: 0