Saltar al contenido
ShopentlyLearn

Listar · Artículos

Leer artículos y previsualizar borradores

GET/api/v1/addons/shopently.blog/posts

Autenticación
Bearer
Disponible desde
BASIC
Módulo instalado requerido
shopently.blog · Versión del contrato del módulo 1
Permisos necesarios
addon.shopently.blog:post_read

Ejemplos de código

Ejemplo de solicitud

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?limit=10&locale=pl&status=draft'

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?limit=10&locale=pl&status=draft');
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?limit=10&locale=pl&status=draft', 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))

Ejemplo de respuesta 200

JSON
{
  "data": [
    {
      "author_name": "Store editorial team",
      "cover_alt": "Niebieska ilustracja poradnika",
      "cover_media_id": "e8663afe-3c38-461c-a142-a980085630af",
      "first_published_at": null,
      "id": "2103ba96-2713-420b-b197-8a008730c851",
      "public_number": 1,
      "publish_at": null,
      "status": "draft",
      "title": "Jak wybrać produkt",
      "updated_at": "2026-10-07T23:17:44.320869Z",
      "version": 1
    }
  ],
  "meta": {
    "pagination": {
      "has_more": false,
      "limit": 10,
      "next_cursor": null
    },
    "request_id": "56b810d9-7dfa-4bc5-8928-0af90d80dbda"
  }
}

Vista general

Administra el blog de tu tienda con artículos HTML, fotos, autores y metadatos para buscadores. Guarda borradores, prepara traducciones y publica de inmediato o a una hora elegida en una zona horaria específica. Administra los comentarios y su moderación en el panel; un generador externo puede usar la API con los permisos que otorgues.

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

Parámetros

Parámetros de consulta

localeCadena de textoObligatorio

Idioma seleccionado para esta solicitud.

minLength: 2maxLength: 35
Restricciones
pattern
"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
Ejemplo: "pl"
limitNúmero enteroOpcional

Número máximo de registros en esta página.

minimum: 1maximum: 100
Valor predeterminado: 50Ejemplo: 10
cursorCadena de texto nullOpcional

Valor de continuación opaco devuelto por la página anterior.

Cadena de texto:maxLength: 512
statusCadena de texto nullOpcional

Estado admitido por esta operación concreta.

Restricciones · Cadena de texto 1
enum
["draft", "scheduled", "published", "archived"]
Ejemplo: "draft"
titleCadena de texto nullOpcional

Título en el idioma seleccionado.

Cadena de texto:maxLength: 200
author_idCadena de texto nullOpcional

Autor

Cadena de texto:format: "uuid"
publish_fromCadena de texto nullOpcional

Publicado desde

Cadena de texto:format: "date-time"
publish_toCadena de texto nullOpcional

Publicado antes de

Cadena de texto:format: "date-time"

Esta operación no acepta un cuerpo JSON.

Respuestas

Respuesta 200

dataLista <ObjetoCampos adicionales: No> Obligatorio

Contenido de una respuesta correcta.

maxItems: 100
Campos · data

ObjetoCampos adicionales: No

author_nameCadena de textoObligatorio

Autor

maxLength: 160
cover_altCadena de textoObligatorio

Texto alternativo

maxLength: 250
cover_media_idCadena de texto nullObligatorio

Foto de portada

Cadena de texto:format: "uuid"
first_published_atCadena de texto nullObligatorio

Primera publicación

Cadena de texto:format: "date-time"
idCadena de textoObligatorio

Identificador del recurso; consérvalo tal como se devuelve.

format: "uuid"
public_numberNúmero enteroObligatorio

Número

minimum: 1
publish_atCadena de texto nullObligatorio

Fecha de publicación

Cadena de texto:format: "date-time"
statusCadena de textoObligatorio

Estado admitido por esta operación concreta.

Restricciones
enum
["draft", "scheduled", "published", "archived"]
titleCadena de textoObligatorio

Título en el idioma seleccionado.

maxLength: 200
updated_atCadena de textoObligatorio

Momento de la última actualización.

format: "date-time"
versionNúmero enteroObligatorio

Versión del recurso utilizada para controlar cambios simultáneos.

minimum: 1maximum: 9223372036854775807
metaObjetoCampos adicionales: NoObligatorio

Metadatos de la respuesta.

Campos · meta
paginationObjetoCampos adicionales: NoObligatorio

Metadatos de la paginación por cursor.

Campos · pagination
has_moreBooleanoObligatorio

Indica si hay otra página disponible.

limitNúmero enteroObligatorio

Número máximo de registros en esta página.

minimum: 1maximum: 100
next_cursorCadena de texto nullObligatorio

Valor de continuación para la página siguiente, o null.

Cadena de texto:maxLength: 512
request_idCadena de textoObligatorio

Identificador de la solicitud; en los metadatos de respuesta identifica la solicitud HTTP.

minLength: 1maxLength: 100
Ejemplo de respuesta

Estado HTTP

200
Respuesta correcta Esquema
400
Solicitud no válida
401
Autenticación necesaria
403
Permiso denegado
404
Recurso no encontrado
409
Conflicto de versión
422
Error de validación
429
Límite de solicitudes excedido
Otros estados HTTP (7)
405
Método no permitido
413
Solicitud demasiado grande
415
Formato no compatible
500
Error del servidor
502
Error de la puerta de enlace API
503
Servicio no disponible
504
Tiempo de espera agotado

Catálogo de errores: ErrorResponse

Cabeceras

401

WWW-AuthenticateCadena de textoOpcional

Esquema de autenticación exigido por el servidor.

405

AllowCadena de textoOpcional

Métodos HTTP admitidos por este recurso.

429, 503

Retry-AfterNúmero enteroOpcional

Espera mínima antes de reintentar, en segundos.

minimum: 0