Базовий URL: https://www.getly.store. Усі ціни вказано в центах (напр., 1999 = $19.99).
GET/api/v1/productsread:products
Переглянути товари свого магазину
curl -X GET "https://www.getly.store/api/v1/products?page=1&limit=20" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": [
{
"id": "uuid",
"name": "Premium Icon Pack",
"slug": "premium-icon-pack-abc123",
"price": 1999,
"status": "active",
"category": { "id": "uuid", "name": "Design", "slug": "design" },
"images": [{ "url": "...", "altText": "..." }]
}
],
"total": 42,
"page": 1,
"limit": 20,
"hasMore": true
}
POST/api/v1/productswrite:products
Створити новий товар у своєму магазині
curl -X POST "https://www.getly.store/api/v1/products" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "My New Product",
"description": "A great digital product",
"price": 29.99,
"categoryId": "uuid",
"status": "active",
"tags": ["design", "icons"],
"images": [{ "url": "https://cdn.getly.store/...png", "altText": "cover" }],
"files": [{ "fileUrl": "https://cdn.getly.store/files/.../abc.zip", "fileName": "pack.zip", "fileSize": 10485760, "fileType": "application/zip" }]
}'
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"name": "My New Product",
"slug": "my-new-product-abc123",
"price": 2999,
"status": "active",
"createdAt": "2025-01-15T10:30:00Z"
}
}
GET/api/v1/products/:idread:products
Отримати деталі товару за ID
curl -X GET "https://www.getly.store/api/v1/products/{id}" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"name": "Premium Icon Pack",
"price": 1999,
"images": [...],
"files": [...],
"reviews": [...]
}
}
PATCH/api/v1/products/:idwrite:products
Оновити наявний товар
curl -X PATCH "https://www.getly.store/api/v1/products/{id}" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Updated Name", "price": 39.99 }'
Відповідь · application/json
{
"success": true,
"data": { "id": "uuid", "name": "Updated Name", "price": 3999 }
}
DELETE/api/v1/products/:idwrite:products
Архівуйте (м'яке видалення) товар. Він перестає бути публічним; наявні замовлення й завантаження продовжують працювати.
curl -X DELETE "https://www.getly.store/api/v1/products/{id}" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": { "id": "uuid", "status": "archived" },
"message": "Product archived"
}
POST/api/v1/products/:id/fileswrite:products
Додайте до товару файл для завантаження. Для малих файлів використовуйте multipart, а для файлів до 2 ГБ підмаршрут presign + прямий PUT до R2. Також можна передати масив files[] у POST /api/v1/products, щоб додати файли одразу під час створення.
# Direct upload (multipart) - best for files under ~4MB:
curl -X POST "https://www.getly.store/api/v1/products/{id}/files" \
-H "Authorization: Bearer gk_your_api_key" \
-F "file=@/path/to/your-file.zip"
# Large files (up to 2GB) - 3 steps:
# 1) get a presigned upload URL
curl -X POST "https://www.getly.store/api/v1/products/{id}/files/presign" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "fileName": "pack.zip", "fileSize": 524288000, "fileType": "application/zip" }'
# 2) PUT the bytes straight to R2 (use the returned uploadUrl)
curl -X PUT "<uploadUrl>" --data-binary "@/path/to/pack.zip" \
-H "Content-Length: 524288000"
# 3) attach the uploaded object (use the returned fileUrl)
curl -X POST "https://www.getly.store/api/v1/products/{id}/files" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "fileUrl": "<fileUrl>", "fileName": "pack.zip", "fileSize": 524288000, "fileType": "application/zip" }'
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"fileName": "pack.zip",
"fileUrl": "https://cdn.getly.store/files/.../abc.zip",
"fileSize": 524288000,
"fileType": "application/zip",
"version": "1.0",
"isLatest": true,
"createdAt": "2026-06-02T10:30:00Z"
}
}
POST/api/v1/uploads/images/presignwrite:products
Отримайте попередньо підписану URL-адресу, щоб завантажити зображення товару (макс. 10 МБ; png, jpeg, webp, gif, avif). Обов'язково, щоб товар міг вийти в продаж.
# Images are uploaded in 3 steps - there is no direct multipart route.
# 1) ask for a presigned URL (max 10MB; png, jpeg, webp, gif or avif)
curl -X POST "https://www.getly.store/api/v1/uploads/images/presign" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "fileName": "cover.png", "fileSize": 184320, "contentType": "image/png" }'
# 2) PUT the raw bytes to the returned uploadUrl (expires in 1h) with the
# returned uploadHeaders. Content-Length MUST equal the fileSize you declared.
# Send Content-Type equal to the declared type (curl --data-binary alone sends
# a form type; Getly corrects it when the image is attached, but send it anyway).
curl -X PUT "<uploadUrl>" --data-binary "@/path/to/cover.png" \
-H "Content-Type: image/png" -H "Content-Length: 184320"
# 3) reference the returned publicUrl when you create or update the product.
# An image is REQUIRED before a product can go live.
curl -X PATCH "https://www.getly.store/api/v1/products/{id}" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "images": ["<publicUrl>"] }'
Відповідь · application/json
{
"success": true,
"data": {
"uploadUrl": "https://<bucket>.r2.cloudflarestorage.com/...",
"uploadHeaders": { "Content-Type": "image/png" },
"publicUrl": "https://cdn.getly.store/images/.../abc.png",
"expiresIn": 3600
}
}
GET/api/v1/products/:id/keysread:products
Перелічіть пул ліцензійних ключів товару: лічильники (доступні/видані/очікують) і маскований список із розбиттям на сторінки. Ключ відкритим текстом ніколи не повертається.
curl -X GET "https://www.getly.store/api/v1/products/{id}/keys?limit=50&offset=0" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"keyPoolEnabled": true,
"keyPoolLowThreshold": 5,
"counts": { "available": 12, "issued": 40, "waiting": 0 },
"keys": [
{ "id": "uuid", "masked": "ABCD…WXYZ", "status": "available", "issuedAt": null, "orderItemId": null, "refunded": false }
],
"limit": 50,
"offset": 0,
"total": 52
}
}
POST/api/v1/products/:id/keyswrite:products
Вставте власні ключі, ваучери або унікальні URL у пул товару, по одному на елемент масиву. Дублікати й порожні значення повідомляються, а не мовчки відкидаються; покупці, які чекали, одразу отримують ключ.
curl -X POST "https://www.getly.store/api/v1/products/{id}/keys" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "keys": ["ABCD-1234-EFGH-5678", "IJKL-9012-MNOP-3456"] }'
Відповідь · application/json
{
"success": true,
"data": {
"added": 2,
"duplicates": 0,
"duplicatesInInput": 0,
"tooLong": 0,
"blank": 0,
"filled": 1
}
}
DELETE/api/v1/products/:id/keys/:keyIdwrite:products
Видаліть непроданий ключ із пулу. Виданий ключ є записом про продаж, тож його не можна видалити: 409 key_not_available.
curl -X DELETE "https://www.getly.store/api/v1/products/{id}/keys/{keyId}" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": { "id": "uuid", "removed": true }
}
GET/api/v1/ordersread:orders
Переглянути замовлення з позиціями з вашого магазину
curl -X GET "https://www.getly.store/api/v1/orders?page=1&limit=20" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": [
{
"id": "uuid",
"orderId": "uuid",
"price": 2999,
"order": { "status": "completed", "buyer": { "name": "John" } },
"product": { "name": "Premium Pack" }
}
],
"total": 156,
"page": 1
}
GET/api/v1/orders/:idread:orders
Отримати деталі замовлення (лише позиції з вашого магазину)
curl -X GET "https://www.getly.store/api/v1/orders/{id}" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"status": "completed",
"total": 5999,
"buyer": { "name": "John", "email": "[email protected]" },
"items": [...]
}
}
GET/api/v1/storeread:store
Отримати інформацію про свій магазин
curl -X GET "https://www.getly.store/api/v1/store" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"name": "My Store",
"slug": "my-store",
"description": "...",
"totalSales": 250,
"totalRevenue": 450000,
"badges": [...]
}
}
PATCH/api/v1/storewrite:store
Оновити назву магазину, опис, сайт і socialLinks
curl -X PATCH "https://www.getly.store/api/v1/store" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "description": "Updated store description" }'
Відповідь · application/json
{
"success": true,
"data": { "id": "uuid", "name": "My Store", "description": "Updated store description" }
}
GET/api/v1/analyticsread:analytics
Отримайте аналітику продажів вашого магазину
curl -X GET "https://www.getly.store/api/v1/analytics" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"totalSales": 250,
"totalRevenue": 450000,
"monthlySales": 42,
"monthlyRevenue": 75000,
"averageOrderValue": 1800,
"productCount": 15,
"totalDownloads": 1200,
"salesByMonth": [
{ "month": "2025-01", "sales": 38, "revenue": 68000 }
]
}
}
GET/api/v1/webhook-endpointswebhooks:manage
Перелічіть endpoint-и вебхуків вашого магазину
curl -X GET "https://www.getly.store/api/v1/webhook-endpoints" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"url": "https://example.com/webhooks",
"events": ["sale.completed"],
"isActive": true
}
],
"nextCursor": null
}
}
POST/api/v1/webhook-endpointswebhooks:manage
Зареєструйте новий endpoint вебхука
curl -X POST "https://www.getly.store/api/v1/webhook-endpoints" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks",
"events": ["sale.completed", "product.updated"]
}'
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"url": "https://example.com/webhooks",
"events": ["sale.completed", "product.updated"],
"secret": "abcdef1234567890..."
}
}
POST/api/v1/postswrite:posts
Створіть допис блогу автора з Markdown. Встановіть crosspostMuhamor у true, щоб показати його також у спільноті Getly Creators на Muhamor: копія посилається на ваш допис як на оригінал, а допис лише для підписників потрапляє туди тільки як анонс.
curl -X POST "https://www.getly.store/api/v1/posts" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7b1f0c2e-post-1" \
-d '{
"title": "How I made my icon pack",
"contentMarkdown": "## The idea\n\nIt started with...",
"status": "published",
"crosspostMuhamor": true
}'
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"title": "How I made my icon pack",
"slug": "how-i-made-my-icon-pack",
"status": "published",
"crosspostMuhamor": true
}
}
GET/api/v1/public/products/{slug}public
Публічний, без API-ключа: картка активного товару за його slug (назва, ціна в центах з урахуванням чинної знижки, обкладинка, магазин). 404 для всього, що не продається. 60 запитів на хвилину з одного IP.
curl "https://www.getly.store/api/v1/public/products/premium-icon-pack-abc123"
Відповідь · application/json
{
"success": true,
"data": {
"slug": "premium-icon-pack-abc123",
"name": "Premium Icon Pack",
"shortDescription": "120 line icons",
"priceCents": 1999,
"currency": "USD",
"avgRating": 4.8,
"reviewCount": 12,
"imageUrl": "https://cdn.getly.store/images/.../cover.webp",
"store": { "name": "Pixel Studio", "slug": "pixel-studio" },
"urls": { "product": "https://www.getly.store/product/premium-icon-pack-abc123" }
}
}
POST/api/v1/billing/planswrite:billing
Створіть регулярний план для ВАШОГО власного товару (Getly Billing). amount у цілих центах (мін. 50), intervalUnit day/week/month/year, intervalCount 1–52. Потрібна схвалена заявка на Billing: до того часу 403 billing_not_approved. GET повертає список планів; GET/PATCH /{id} читає й редагує один.
curl -X POST "https://www.getly.store/api/v1/billing/plans" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Pro", "amount": 1900, "intervalUnit": "month", "externalId": "pro-monthly" }'
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"name": "Pro",
"amount": 1900,
"currency": "usd",
"interval": { "unit": "month", "count": 1 },
"externalId": "pro-monthly",
"isActive": true
}
}
POST/api/v1/billing/checkoutwrite:billing
Створіть розміщену сторінку підписки для одного клієнта, дійсну 24 години. customerRef - це ваш власний id клієнта, він повертається в кожному вебхуку billing.* як externalCustomerRef. Клієнт платить карткою (поновлюється сама) або криптою (один період за раз).
curl -X POST "https://www.getly.store/api/v1/billing/checkout" \
-H "Authorization: Bearer gk_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "planId": "uuid", "customerRef": "user_8841",
"successUrl": "https://your-app.com/welcome",
"cancelUrl": "https://your-app.com/pricing" }'
Відповідь · application/json
{
"success": true,
"data": {
"url": "https://www.getly.store/billing/subscribe/uuid?t=…",
"expiresAt": "2026-09-09T09:00:00.000Z"
}
}
GET/api/v1/billing/subscriptions/{id}read:billing
Перевірка статусу, яку ваш бекенд виконує перед наданням доступу. status: active, past_due (поновлення карткою не вдалося, процесор повторює спробу), canceled, expired (минув період, оплачений криптою). Вважайте active і past_due такими, що мають доступ до currentPeriodEnd. Endpoint списку фільтрує за status, customerRef і planId.
curl "https://www.getly.store/api/v1/billing/subscriptions/uuid" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": {
"id": "uuid",
"customerRef": "user_8841",
"status": "active",
"paymentMethod": "stripe",
"currentPeriodEnd": "2026-10-08T09:14:00.000Z",
"cancelAtPeriodEnd": false,
"plan": { "name": "Pro", "amount": 1900, "interval": { "unit": "month", "count": 1 } }
}
}
POST/api/v1/billing/subscriptions/{id}/cancelwrite:billing
Зупиніть поновлення наприкінці оплаченого періоду, ніколи не миттєве відключення. Ви отримаєте billing.subscription.canceled, коли період завершиться (картка), або billing.subscription.expired (крипта). 409 subscription_not_cancellable, якщо вже завершено.
curl -X POST "https://www.getly.store/api/v1/billing/subscriptions/uuid/cancel" \
-H "Authorization: Bearer gk_your_api_key"
Відповідь · application/json
{
"success": true,
"data": { "id": "uuid", "status": "active", "cancelAtPeriodEnd": true, "currentPeriodEnd": "2026-10-08T09:14:00.000Z" }
}