Article
Lire les articles et prévisualiser les brouillons
GET/api/v1/addons/shopently.blog/posts/{post_id}
- Authentification
Bearer- Disponible à partir de
- BASIC
- Module installé requis
shopently.blog· Version du contrat du module 1- Autorisations requises
addon.shopently.blog:post_read
Exemples de code
Exemple de requête
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))
Exemple de réponse 200
{
"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"
}
}
Vue d’ensemble
Animez le blog de votre boutique avec des articles HTML, des photos, des auteurs et des métadonnées pour les moteurs de recherche. Enregistrez des brouillons, préparez des traductions et publiez immédiatement ou à une heure choisie dans un fuseau précis. Gérez les commentaires et leur modération dans le panneau ; un générateur externe peut utiliser l’API avec les autorisations accordées.
BASIC · api.enabled · addons.use(shopently.blog) · addon.shopently.blog:post_read
Paramètres
Paramètres de chemin
post_idChaîneObligatoireArticle
format:"uuid"
Paramètres de requête
localeChaîneObligatoireLangue sélectionnée pour cette requête.
minLength:2maxLength:35Contraintes
pattern"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
Cette opération n'accepte pas de corps JSON.
Réponses
Réponse 200
dataObjetChamps supplémentaires: NonObligatoireDonnées d'une réponse réussie.
Champs ·
dataauthor_idChaîne nullObligatoireAuteur
Chaîne:format:"uuid"comments_modeChaîneObligatoireCommentaires
Contraintes
enum["inherit", "open", "closed"]
content_htmlChaîneObligatoireContenu
maxLength:50000cover_altChaîneObligatoireTexte alternatif
maxLength:250cover_captionChaîneObligatoireLégende de la photo
maxLength:500cover_media_idChaîne nullObligatoirePhoto de couverture
Chaîne:format:"uuid"draft_revision_idChaîneObligatoireRévision du brouillon
format:"uuid"excerptChaîneObligatoireContenu
maxLength:1000first_published_atChaîne nullObligatoirePremière publication
Chaîne:format:"date-time"idChaîneObligatoireIdentifiant de ressource ; conserver la valeur renvoyée.
format:"uuid"last_published_atChaîne nullObligatoireDernière publication
Chaîne:format:"date-time"localeChaîneObligatoireLangue sélectionnée pour cette requête.
minLength:2maxLength:35Contraintes
pattern"^[a-zA-Z]{2,3}(?:-[a-zA-Z0-9]{2,8})*$"
meta_descriptionChaîneObligatoireDescription pour les moteurs de recherche dans la langue sélectionnée.
maxLength:160meta_keywordsTableau <Chaîne> ObligatoireMots-clés pour les moteurs de recherche dans la langue sélectionnée.
maxItems:20Tableau:minLength:1maxLength:50meta_titleChaîneObligatoireTitre pour les moteurs de recherche dans la langue sélectionnée.
maxLength:70public_numberEntierObligatoireNuméro
minimum:1publish_atChaîne nullObligatoireDate de publication
Chaîne:format:"date-time"publish_timezoneChaîne nullObligatoireFuseau horaire
Chaîne:maxLength:64published_revision_idChaîne nullObligatoireRévision (Publié)
Chaîne:format:"uuid"schedule_stateChaîne nullObligatoirePublication programmée
Contraintes · Chaîne 1
enum["armed", "requires_confirmation"]
scheduled_revision_idChaîne nullObligatoireRévision (Programmé)
Chaîne:format:"uuid"slugChaîneObligatoireSegment du chemin URL dans la langue sélectionnée.
maxLength:160statusChaîneObligatoireStatut accepté par cette opération précise.
Contraintes
enum["draft", "scheduled", "published", "archived"]
titleChaîneObligatoireTitre dans la langue sélectionnée.
maxLength:200updated_atChaîneObligatoireDate et heure de la dernière modification.
format:"date-time"versionEntierObligatoireVersion de ressource utilisée pour le contrôle de concurrence.
minimum:1maximum:9223372036854775807
metaObjetChamps supplémentaires: NonObligatoireMétadonnées de la réponse.
Champs ·
metarequest_idChaîneObligatoireIdentifiant de demande ; dans les métadonnées, identifiant de la requête HTTP.
minLength:1maxLength:100
Statut HTTP
200- Réponse réussie Schéma
400- Requête invalide
401- Authentification requise
403- Accès refusé
404- Ressource introuvable
409- Conflit de version
422- Échec de validation
429- Limite de requêtes dépassée
Autres statuts HTTP (7)
405- Méthode non autorisée
413- Requête trop volumineuse
415- Format non pris en charge
500- Erreur du serveur
502- Erreur de passerelle API
503- Service indisponible
504- Délai de passerelle dépassé
Catalogue des erreurs: ErrorResponse
En-têtes
401
WWW-AuthenticateChaîneFacultatifSchéma d'authentification exigé par le serveur.
405
AllowChaîneFacultatifMéthodes HTTP prises en charge par cette ressource.
429, 503
Retry-AfterEntierFacultatifDélai minimal avant une nouvelle tentative, en secondes.
minimum:0