Back to Docs
Sant

Documentation

0 articles
BASE URL

https://studio-api.naper.ai/api/v1

Authentication

Products

6 endpoints
GET

/api/v1/products

Auth

List Products

Retrieve a paginated list of products with optional search and filters.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (max 100) (Default: 25)
searchstringQueryOptionalSearch by product name or SKU
statusstringQueryOptionalFilter by status: publish, draft, pending, trash
categoryintegerQueryOptionalFilter by category ID
brandintegerQueryOptionalFilter by brand ID
orderbystringQueryOptionalSort field: id, date, modified, title, price (Default: id)
orderstringQueryOptionalSort direction: asc, desc (Default: desc)
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Premium T-Shirt",
    "slug": "premium-t-shirt",
    "status": "publish",
    "sku": "TSH-001",
    "regular_price": "49.90",
    "sale_price": null,
    "categories": [
      {
        "id": 1,
        "name": "Clothing"
      }
    ],
    "images": [
      {
        "id": 1,
        "src": "https://example.com/image.jpg"
      }
    ]
  }
]
GET

/api/v1/products/:id

Auth

Get Product

Retrieve a single product by its ID, including all attributes, categories, and images.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredProduct ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 1,
  "name": "Premium T-Shirt",
  "slug": "premium-t-shirt",
  "status": "publish",
  "type": "simple",
  "sku": "TSH-001",
  "regular_price": "49.90",
  "sale_price": null,
  "description": "<p>A premium quality t-shirt.</p>",
  "short_description": "Premium t-shirt",
  "categories": [
    {
      "id": 1,
      "name": "Clothing",
      "slug": "clothing"
    }
  ],
  "images": [
    {
      "id": 1,
      "src": "https://example.com/image.jpg",
      "alt": ""
    }
  ],
  "attributes": [
    {
      "id": 1,
      "name": "Color",
      "options": [
        "Red",
        "Blue"
      ]
    }
  ]
}
POST

/api/v1/products

Auth

Create Product

Create a new product. Requires at minimum a product name.

Parameters
NameTypeInRequiredDescription
namestringBodyRequiredProduct name
statusstringBodyOptionalProduct status: publish, draft, pending (Default: draft)
typestringBodyOptionalProduct type: simple, variable (Default: simple)
skustringBodyOptionalUnique SKU identifier
regular_pricestringBodyOptionalRegular price
sale_pricestringBodyOptionalSale price
descriptionstringBodyOptionalFull HTML description
short_descriptionstringBodyOptionalShort description excerpt
categoriesarrayBodyOptionalArray of { id: number } category objects
imagesarrayBodyOptionalArray of { src: string, alt?: string } image objects
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/products" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Premium T-Shirt", "status": "draft", "sku": "TSH-001", "regular_price": "49.90", "categories": [ { "id": 1 } ], "images": [ { "src": "https://example.com/image.jpg" } ]}'
Response
{
  "id": 1,
  "name": "Premium T-Shirt",
  "slug": "premium-t-shirt",
  "status": "draft",
  "sku": "TSH-001",
  "regular_price": "49.90"
}
PUT

/api/v1/products/:id

Auth

Update Product

Update an existing product. Only send the fields you want to change.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredProduct ID
namestringBodyOptionalProduct name
statusstringBodyOptionalProduct status
skustringBodyOptionalSKU identifier
regular_pricestringBodyOptionalRegular price
sale_pricestringBodyOptionalSale price
descriptionstringBodyOptionalFull description
categoriesarrayBodyOptionalCategory objects array
Request
curl -X PUT \
  "https://studio-api.naper.ai/api/v1/products/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Updated T-Shirt Name", "regular_price": "59.90"}'
Response
{
  "id": 1,
  "name": "Updated T-Shirt Name",
  "regular_price": "59.90"
}
DELETE

/api/v1/products/:id

Auth

Delete Product

Permanently delete a product by its ID.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredProduct ID
Request
curl -X DELETE \
  "https://studio-api.naper.ai/api/v1/products/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "deleted": true,
  "id": 1
}
POST

/api/v1/products/batch

Auth

Batch Operations

Create, update, and/or delete multiple products in a single request.

Parameters
NameTypeInRequiredDescription
createarrayBodyOptionalArray of product objects to create
updatearrayBodyOptionalArray of product objects to update (must include id)
deletearrayBodyOptionalArray of product IDs to delete
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/products/batch" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "create": [ { "name": "New Product", "sku": "NEW-001" } ], "update": [ { "id": 1, "regular_price": "39.90" } ], "delete": [ 99 ]}'
Response
{
  "create": [
    {
      "id": 2,
      "name": "New Product"
    }
  ],
  "update": [
    {
      "id": 1,
      "regular_price": "39.90"
    }
  ],
  "delete": [
    99
  ]
}

Categories

7 endpoints
GET

/api/v1/products/categories

Auth

List Categories

Retrieve a paginated list of product categories.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (Default: 25)
searchstringQueryOptionalSearch by category name
parentintegerQueryOptionalFilter by parent category ID
orderbystringQueryOptionalSort field: id, name, count (Default: id)
orderstringQueryOptionalSort direction: asc, desc (Default: asc)
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/categories" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Clothing",
    "slug": "clothing",
    "parent": 0,
    "count": 42,
    "description": "All clothing items"
  },
  {
    "id": 2,
    "name": "T-Shirts",
    "slug": "t-shirts",
    "parent": 1,
    "count": 18,
    "description": ""
  }
]
GET

/api/v1/products/categories/tree

Auth

Get Category Tree

Retrieve categories as a nested tree structure. Supports light mode for minimal data.

Parameters
NameTypeInRequiredDescription
modestringQueryOptionalResponse mode: full, light (Default: full)
flattenbooleanQueryOptionalReturn flat array instead of nested tree (Default: false)
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/categories/tree" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Clothing",
    "slug": "clothing",
    "parent": 0,
    "children": [
      {
        "id": 2,
        "name": "T-Shirts",
        "slug": "t-shirts",
        "parent": 1,
        "children": []
      },
      {
        "id": 3,
        "name": "Pants",
        "slug": "pants",
        "parent": 1,
        "children": []
      }
    ]
  }
]
GET

/api/v1/products/categories/:id

Auth

Get Category

Retrieve a single category by ID.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredCategory ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/categories/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 1,
  "name": "Clothing",
  "slug": "clothing",
  "parent": 0,
  "count": 42,
  "description": "All clothing items",
  "image": {
    "id": 1,
    "src": "https://example.com/cat.jpg"
  }
}
POST

/api/v1/products/categories

Auth

Create Category

Create a new product category.

Parameters
NameTypeInRequiredDescription
namestringBodyRequiredCategory name
slugstringBodyOptionalURL-friendly slug (auto-generated if omitted)
parentintegerBodyOptionalParent category ID (0 for top-level) (Default: 0)
descriptionstringBodyOptionalCategory description
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/products/categories" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Accessories", "parent": 0}'
Response
{
  "id": 4,
  "name": "Accessories",
  "slug": "accessories",
  "parent": 0
}
PUT

/api/v1/products/categories/:id

Auth

Update Category

Update an existing category.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredCategory ID
namestringBodyOptionalCategory name
parentintegerBodyOptionalParent category ID
descriptionstringBodyOptionalCategory description
Request
curl -X PUT \
  "https://studio-api.naper.ai/api/v1/products/categories/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Updated Category Name"}'
Response
{
  "id": 1,
  "name": "Updated Category Name",
  "slug": "clothing",
  "parent": 0
}
DELETE

/api/v1/products/categories/:id

Auth

Delete Category

Delete a category. Child categories are re-parented to the deleted category's parent.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredCategory ID
Request
curl -X DELETE \
  "https://studio-api.naper.ai/api/v1/products/categories/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "deleted": true,
  "id": 1
}
POST

/api/v1/products/categories/batch

Auth

Batch Operations

Create, update, and/or delete multiple categories in a single request.

Parameters
NameTypeInRequiredDescription
createarrayBodyOptionalArray of category objects to create
updatearrayBodyOptionalArray of category objects to update
deletearrayBodyOptionalArray of category IDs to delete
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/products/categories/batch" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "create": [ { "name": "New Category" } ], "update": [ { "id": 1, "name": "Renamed" } ], "delete": [ 99 ]}'
Response
{
  "create": [
    {
      "id": 5,
      "name": "New Category"
    }
  ],
  "update": [
    {
      "id": 1,
      "name": "Renamed"
    }
  ],
  "delete": [
    99
  ]
}

Attributes

4 endpoints
GET

/api/v1/products/attributes

Auth

List Attributes

Retrieve all product attributes defined in the store.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (Default: 25)
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/attributes" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Color",
    "slug": "color",
    "type": "select",
    "order_by": "menu_order"
  },
  {
    "id": 2,
    "name": "Size",
    "slug": "size",
    "type": "select",
    "order_by": "menu_order"
  }
]
GET

/api/v1/products/attributes/:id

Auth

Get Attribute

Retrieve a single attribute by ID.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredAttribute ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/attributes/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 1,
  "name": "Color",
  "slug": "color",
  "type": "select"
}
POST

/api/v1/products/attributes

Auth

Create Attribute

Create a new product attribute.

Parameters
NameTypeInRequiredDescription
namestringBodyRequiredAttribute name
slugstringBodyOptionalURL-friendly slug
typestringBodyOptionalAttribute type: select, text (Default: select)
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/products/attributes" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Material", "type": "select"}'
Response
{
  "id": 3,
  "name": "Material",
  "slug": "material",
  "type": "select"
}
GET

/api/v1/products/:productId/attributes

Auth

Get Product Attributes

Retrieve all attribute values assigned to a specific product.

Parameters
NameTypeInRequiredDescription
productIdintegerPathRequiredProduct ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/products/:productId/attributes" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Color",
    "options": [
      "Red",
      "Blue",
      "Green"
    ],
    "visible": true,
    "variation": true
  },
  {
    "id": 2,
    "name": "Size",
    "options": [
      "S",
      "M",
      "L",
      "XL"
    ],
    "visible": true,
    "variation": true
  }
]

Templates

2 endpoints
GET

/api/v1/templates

Auth

List Templates

Retrieve a summary list of enrichment templates available to the store. Returns basic information about each template.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (Default: 25)
searchstringQueryOptionalSearch by template name
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/templates" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "SEO Description",
    "slug": "seo-description",
    "type": "enrichment",
    "status": "active"
  },
  {
    "id": 2,
    "name": "Full Catalog",
    "slug": "full-catalog",
    "type": "enrichment",
    "status": "active"
  }
]
GET

/api/v1/templates/:id

Auth

Get Template

Retrieve a template by ID. Returns the template's AI input fields (the fields that can be enriched). Use this to identify which fields a template targets before sending an enrichment request.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredTemplate ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/templates/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 1,
  "name": "SEO Description",
  "type": "enrichment",
  "ai_inputs": [
    "name",
    "short_description",
    "description",
    "seo"
  ]
}

Live Enrichment

4 endpoints
POST

/api/v1/live/events

Auth

Create Enrichment Event

Create an enrichment event with one or more subjects (products or categories). You can reference existing products by ID or send standalone product data for enrichment without having a product in the catalog. The event is processed asynchronously — poll the event status endpoint to track progress.

Parameters
NameTypeInRequiredDescription
typestringBodyRequiredEvent type. Use "enrichment" for AI enrichment.
titlestringBodyRequiredHuman-readable event title for tracking
subject_typestringBodyRequiredSubject type: "product" or "category"
subjectsarrayBodyRequiredArray of subjects to enrich (max 500). Each subject can have subject_id (existing product ID) and/or data (inline product data). For inline mode, omit subject_id and provide data with product info.
optionsobjectBodyOptionalEnrichment options — which fields to enrich. Available: name, short_description, long_description, attributes, brand, types, categories, seo, image_alt_text, variations, template_id.
user_payloadobjectBodyOptionalCustom metadata attached to the event (returned as-is in responses)
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/live/events" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "type": "enrichment", "title": "Enrich summer collection", "subject_type": "product", "subjects": [ { "subject_id": 42 }, { "subject_id": 108 }, { "data": { "name": "Blue Cotton T-Shirt", "sku": "BTS-001", "categories": [ "Clothing", "T-Shirts" ], "attributes": [ { "name": "Material", "value": "Cotton" } ] } } ], "options": { "short_description": true, "long_description": true, "seo": true, "template_id": 235 }}'
Response
{
  "id": 301,
  "event_type": "enrichment",
  "title": "Enrich summer collection",
  "status": "created",
  "source": "api",
  "expected_count": 3,
  "success_count": 0,
  "error_count": 0,
  "created_at": "2026-03-08T14:30:00.000Z",
  "subjects": [
    {
      "id": 1,
      "subject_type": "product",
      "subject_id": "42",
      "processed": false,
      "result": null
    },
    {
      "id": 2,
      "subject_type": "product",
      "subject_id": "108",
      "processed": false,
      "result": null
    },
    {
      "id": 3,
      "subject_type": "product",
      "subject_id": "3",
      "processed": false,
      "result": null
    }
  ]
}
GET

/api/v1/live/events

Auth

List Events

Retrieve a paginated list of enrichment events created via the API. Events from the dashboard (Data Center) are not included.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (Default: 25)
statusstringQueryOptionalFilter by status: created, running, waiting, finished, error, cancelled
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/live/events" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 301,
    "event_type": "enrichment",
    "title": "Enrich summer collection",
    "status": "finished",
    "expected_count": 3,
    "success_count": 3,
    "error_count": 0,
    "created_at": "2026-03-08T14:30:00.000Z"
  }
]
GET

/api/v1/live/events/:id

Auth

Get Event Details

Retrieve a single event with all its subjects and their results. Use this to poll for completion and retrieve enrichment results. Each subject includes its processed status, result data, and any error messages.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredEvent ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/live/events/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 301,
  "event_type": "enrichment",
  "title": "Enrich summer collection",
  "status": "finished",
  "expected_count": 3,
  "success_count": 3,
  "error_count": 0,
  "created_at": "2026-03-08T14:30:00.000Z",
  "subjects": [
    {
      "id": 1,
      "subject_type": "product",
      "subject_id": "42",
      "processed": true,
      "result": {
        "short_description": "AI-generated short description...",
        "description": "<p>AI-generated full description...</p>",
        "seo_data": {
          "title": "SEO Title",
          "description": "Meta description"
        }
      },
      "error_message": null
    }
  ]
}
PUT

/api/v1/live/events/:id

Auth

Update Event Status

Update the status or message of an event. Useful for marking events as cancelled.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredEvent ID
statusstringBodyOptionalNew status: created, running, waiting, finished, error, cancelled
messagestringBodyOptionalStatus message
Request
curl -X PUT \
  "https://studio-api.naper.ai/api/v1/live/events/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "status": "cancelled", "message": "No longer needed"}'
Response
{
  "id": 301,
  "status": "cancelled",
  "message": "No longer needed"
}

Import & Export

2 endpoints
POST

/api/v1/import-export/import

Auth

Import Products

Import products from a CSV file or structured data payload.

Parameters
NameTypeInRequiredDescription
sourcestringBodyRequiredImport source type: csv, json, shopify
dataarrayBodyRequiredArray of product data objects
optionsobjectBodyOptionalImport options (update_existing, skip_images)
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/import-export/import" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "source": "json", "data": [ { "name": "Product A", "sku": "SKU-A", "regular_price": "29.90" } ], "options": { "update_existing": true }}'
Response
{
  "imported": 1,
  "updated": 0,
  "skipped": 0,
  "errors": []
}
GET

/api/v1/import-export/export

Auth

Export Products

Export products data in the specified format.

Parameters
NameTypeInRequiredDescription
formatstringQueryOptionalExport format: csv, json (Default: json)
statusstringQueryOptionalFilter by product status
categoryintegerQueryOptionalFilter by category ID
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/import-export/export" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Product A",
    "sku": "SKU-A",
    "regular_price": "29.90",
    "status": "publish"
  }
]

Settings

2 endpoints
GET

/api/v1/settings

Auth

Get Settings

Retrieve all store settings.

Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/settings" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "store_name": "My Store",
  "currency": "BRL",
  "language": "pt-br",
  "ai_model": "default",
  "enrichment_auto_apply": false
}
PUT

/api/v1/settings

Auth

Update Settings

Update store settings. Only send the fields you want to change.

Parameters
NameTypeInRequiredDescription
store_namestringBodyOptionalStore display name
currencystringBodyOptionalCurrency code (ISO 4217)
languagestringBodyOptionalDefault language code
Request
curl -X PUT \
  "https://studio-api.naper.ai/api/v1/settings" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "store_name": "Updated Store Name", "currency": "USD"}'
Response
{
  "store_name": "Updated Store Name",
  "currency": "USD"
}

Media

1 endpoints
POST

/api/v1/media/upload

Auth

Upload File

Upload a media file. Accepts multipart/form-data with a file field.

Parameters
NameTypeInRequiredDescription
fileFileBodyRequiredThe file to upload (multipart/form-data)
altstringBodyOptionalAlt text for the image
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/media/upload" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "id": 1,
  "src": "https://cdn.naper.ai/uploads/image.jpg",
  "alt": "Product image",
  "mime_type": "image/jpeg",
  "file_size": 245760
}

Integrations

1 endpoints
GET

/api/v1/integrations

Auth

List Integrations

Retrieve all configured integrations for the store.

Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/integrations" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "platform": "shopify",
    "name": "My Shopify Store",
    "status": "active",
    "connected_at": "2025-01-10T00:00:00Z"
  }
]

Webhooks

3 endpoints
GET

/api/v1/webhooks

Auth

List Webhooks

Retrieve all registered webhooks for the store.

Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/webhooks" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "event": "product.updated",
    "url": "https://example.com/webhook",
    "status": "active"
  }
]
POST

/api/v1/webhooks

Auth

Create Webhook

Register a new webhook subscription for a specific event.

Parameters
NameTypeInRequiredDescription
eventstringBodyRequiredEvent to subscribe: product.created, product.updated, product.deleted, enrichment.completed
urlstringBodyRequiredURL to receive the webhook POST
secretstringBodyOptionalShared secret for signature verification
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/webhooks" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "event": "product.updated", "url": "https://example.com/webhook", "secret": "whsec_..."}'
Response
{
  "id": 1,
  "event": "product.updated",
  "url": "https://example.com/webhook",
  "status": "active"
}
DELETE

/api/v1/webhooks/:id

Auth

Delete Webhook

Remove a webhook subscription.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredWebhook ID
Request
curl -X DELETE \
  "https://studio-api.naper.ai/api/v1/webhooks/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "deleted": true,
  "id": 1
}

API Keys

3 endpoints
GET

/api/v1/api-keys

Auth

List API Keys

Retrieve all API keys for the store. Secret keys are masked.

Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/api-keys" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "name": "Production Key",
    "key_prefix": "nap_live_...abc",
    "scopes": [
      "products:read",
      "products:write"
    ],
    "created_at": "2025-01-10T00:00:00Z"
  }
]
POST

/api/v1/api-keys

Auth

Create API Key

Generate a new API key. The full key is only returned once at creation time.

Parameters
NameTypeInRequiredDescription
namestringBodyRequiredDescriptive name for the key
scopesarrayBodyRequiredPermission scopes: products:read, products:write, products:delete, categories:read, categories:write
Request
curl -X POST \
  "https://studio-api.naper.ai/api/v1/api-keys" \
  -H "Authorization: Bearer <YOUR_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Production Key", "scopes": [ "products:read", "products:write" ]}'
Response
{
  "id": 1,
  "name": "Production Key",
  "key": "nap_live_sk_abc123...full_key_here",
  "scopes": [
    "products:read",
    "products:write"
  ]
}
DELETE

/api/v1/api-keys/:id

Auth

Revoke API Key

Permanently revoke an API key. This action cannot be undone.

Parameters
NameTypeInRequiredDescription
idintegerPathRequiredAPI Key ID
Request
curl -X DELETE \
  "https://studio-api.naper.ai/api/v1/api-keys/:id" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "deleted": true,
  "id": 1
}

Reviews

1 endpoints
GET

/api/v1/reviews

Auth

List Reviews

Retrieve product reviews with optional filters.

Parameters
NameTypeInRequiredDescription
pageintegerQueryOptionalPage number (Default: 1)
per_pageintegerQueryOptionalItems per page (Default: 25)
product_idintegerQueryOptionalFilter by product ID
ratingintegerQueryOptionalFilter by rating (1-5)
Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/reviews" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
[
  {
    "id": 1,
    "product_id": 42,
    "reviewer": "Jane Doe",
    "rating": 5,
    "review": "Excellent product!",
    "date": "2025-01-15T10:30:00Z"
  }
]

Statistics

1 endpoints
GET

/api/v1/stats

Auth

Get Dashboard Stats

Retrieve store statistics including product counts, enrichment metrics, and usage data.

Request
curl -X GET \
  "https://studio-api.naper.ai/api/v1/stats" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
Response
{
  "products": {
    "total": 1250,
    "published": 980,
    "draft": 270
  },
  "categories": {
    "total": 45
  },
  "enrichment": {
    "total_drafts": 500,
    "applied": 420,
    "pending": 80
  },
  "credits": {
    "remaining": 95,
    "used_this_month": 55
  }
}