API resource

Shopify blog

A connected Shopify store is not a posting target: it has a blog and a catalog. These calls write the blog (a store can hold several blogs, each with its own articles) and are the long form of the Blog endpoints, which pick the site and blog for you. They work on a WordPress site too, where a site has one blog. Blog, article and product ids are the store's own numeric ids. Connect a store with GET /v1/connect/shopify?shop=your-store.myshopify.com, or with an Admin API token (below).

Connect Shopify with an Admin API token

POST/v1/connect/shopify

Works on: Shopify

For a merchant who would rather not install an app: connect the store with the Admin API access token of a custom app they created in their Shopify admin (Settings, Apps and sales channels, Develop apps) with the read_content, write_content, read_products and write_products scopes. The token is checked against the store before anything is saved. Everyone else signs in: GET /v1/connect/shopify?shop=your-store.myshopify.com returns the link to Shopify's approval screen. Ad pixels can only be installed on a store connected by sign-in.

Body

shopstringrequired

The store address: your-store.myshopify.com, or the bare your-store prefix.

access_tokenstringrequired

The custom app's Admin API access token (starts with shpat_).

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/connect/shopify" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "shop": "your-store.myshopify.com",
    "access_token": "shpat_..."
  }'
Response 201
{
  "connected": true,
  "id": "acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H",
  "shop": "your-store.myshopify.com",
  "name": "Your Store"
}

List blogs

GET/v1/accounts/{accountId}/blogs

Works on: Shopify, WordPress

Lists blogs on the connected account. Shopify returns its store blogs with cursor pagination. A WordPress account represents one site and always returns exactly that one blog with nextCursor: null. limit is 1-50 (default 20). Treat nextCursor as opaque; pass it unchanged on the next request. Supported on Shopify (shopify) and WordPress (wordpress).

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

Query parameters

limitinteger

Page size (1-50).

cursorstring

Opaque cursor from a previous response. Omit for the first page.

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "blogs": [
    {
      "id": "string",
      "platform": "shopify",
      "title": "string",
      "handle": "string"
    }
  ],
  "nextCursor": "string"
}

Create a blog

POST/v1/accounts/{accountId}/blogs

Works on: Shopify, WordPress

Creates a blog on the connected store. The platform generates the URL handle from the title when omitted. Supported on Shopify (platform shopify). A WordPress connection is its existing site, so WordPress returns 405 for blog creation.

Path parameters

accountIdstringrequired

Connected Shopify account id.

Body

titlestringrequired

handlestring

URL slug. Generated from the title when omitted.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string"
  }'
Response 200
{
  "platform": "shopify",
  "blog": {
    "id": "string",
    "platform": "shopify",
    "title": "string",
    "handle": "string"
  }
}

Delete a blog

DELETE/v1/accounts/{accountId}/blogs/{blogId}

Works on: Shopify, WordPress

Deletes the blog AND every article in it. The delete happens on the platform and is permanent; Creator OS stores nothing to restore it from. Supported on Shopify (platform shopify). Disconnect a WordPress account instead of deleting its site; WordPress returns 405 here.

Path parameters

accountIdstringrequired

Connected Shopify account id.

blogIdstringrequired

Platform-native numeric blog id. Non-numeric values return 400.

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "ok": true
}

Get a blog

GET/v1/accounts/{accountId}/blogs/{blogId}

Works on: Shopify, WordPress

Fetches a single blog. Use the platform-native blogId returned by GET /v1/accounts/{accountId}/blogs: a Shopify numeric blog id, the WordPress.com numeric site id, or 1 for a self-hosted WordPress site. The self-hosted id is scoped to its connected account.

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "blog": {
    "id": "string",
    "platform": "shopify",
    "title": "string",
    "handle": "string"
  }
}

Update a blog

PATCH/v1/accounts/{accountId}/blogs/{blogId}

Works on: Shopify, WordPress

Partial-updates a blog. Send any subset of title and handle; at least one field is required (an empty body returns 400). Supported on Shopify (platform shopify). WordPress site settings are not writable through this API, so WordPress returns 405.

Path parameters

accountIdstringrequired

Connected Shopify account id.

blogIdstringrequired

Platform-native numeric blog id. Non-numeric values return 400.

Body

titlestring

handlestring

URL slug. Changing it changes the blog URL on the store.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string"
  }'
Response 200
{
  "platform": "shopify",
  "blog": {
    "id": "string",
    "platform": "shopify",
    "title": "string",
    "handle": "string"
  }
}

List blog articles

GET/v1/accounts/{accountId}/blogs/{blogId}/articles

Works on: Shopify, WordPress

Lists the articles of a blog. Cursor-paginated: pass limit (1-50, default 20) and the cursor from a previous response's nextCursor; nextCursor is null when there are no more pages. Treat cursors as opaque and pass them unchanged. Supported on Shopify (shopify) and WordPress (wordpress). WordPress results include native status and include publishDate only for scheduled (future) posts.

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

Query parameters

limitinteger

Page size (1-50).

cursorstring

Opaque cursor from a previous response. Omit for the first page.

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419/articles" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "articles": [
    {
      "id": "string",
      "blogId": "121793282419",
      "platform": "shopify",
      "title": "string",
      "bodyHtml": "string",
      "handle": "string",
      "tags": [
        "string"
      ],
      "author": "string",
      "excerpt": "string",
      "image": {
        "url": "string",
        "altText": "string"
      },
      "isPublished": true,
      "publishedAt": "2026-10-10T00:00:00.000Z",
      "status": "publish",
      "publishDate": "2026-10-10T00:00:00.000Z",
      "createdAt": "2026-10-10T00:00:00.000Z",
      "updatedAt": "2026-10-10T00:00:00.000Z"
    }
  ],
  "nextCursor": "string"
}

Create a blog article

POST/v1/accounts/{accountId}/blogs/{blogId}/articles

Works on: Shopify, WordPress

Creates an article on the blog. Publishing behavior: - WordPress defaults to a draft when both publishing fields are omitted. - isPublished: false keeps the article as a draft and takes priority over a future publishDate. - A future publishDate schedules publication natively on the platform; the platform publishes it at that time with no Creator OS queue involved. - isPublished: true publishes immediately when there is no future publishDate.

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

Body

titlestringrequired

bodyHtmlstring

Article body as HTML.

handlestring

URL slug. Generated from the title when omitted.

tagsstring[]

Tag names. WordPress resolves existing names case-insensitively and creates missing tags.

authorstring

Shopify author display name, or numeric WordPress user id serialized as a string. Assigning another WordPress user may require elevated capability.

excerptstring

Short summary shown in blog listings.

imageobject

Featured image from a public URL. WordPress downloads it into the media library; JPEG, PNG, GIF and WebP are accepted up to 10 MB.

seoobject

Shopify only. Search-engine overrides mapped to global title_tag and description_tag metafields. WordPress rejects this field.

isPublishedboolean

Set false for a draft or true to publish. On WordPress false takes priority over a future publishDate; omission with no date defaults to draft.

publishDatestring

ISO 8601 datetime with offset (or Z). A future date schedules publication natively on the platform.

curl -X POST "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419/articles" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string"
  }'
Response 200
{
  "platform": "shopify",
  "article": {
    "id": "string",
    "blogId": "121793282419",
    "platform": "shopify",
    "title": "string",
    "bodyHtml": "string",
    "handle": "string",
    "tags": [
      "string"
    ],
    "author": "string",
    "excerpt": "string",
    "image": {
      "url": "string",
      "altText": "string"
    },
    "isPublished": true,
    "publishedAt": "2026-10-10T00:00:00.000Z",
    "status": "publish",
    "publishDate": "2026-10-10T00:00:00.000Z",
    "createdAt": "2026-10-10T00:00:00.000Z",
    "updatedAt": "2026-10-10T00:00:00.000Z"
  }
}

Delete a blog article

DELETE/v1/accounts/{accountId}/blogs/{blogId}/articles/{articleId}

Works on: Shopify, WordPress

Deletes the article. The delete happens on the platform and is permanent; Creator OS stores nothing to restore it from. On WordPress the post is force-deleted, while uploaded attachments and tags remain in the site's media library and taxonomy. Supported on Shopify (shopify) and WordPress (wordpress).

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

articleIdstringrequired

Platform-native numeric article id. Non-numeric values return 400.

curl -X DELETE "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419/articles/589234567890" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "ok": true
}

Get a blog article

GET/v1/accounts/{accountId}/blogs/{blogId}/articles/{articleId}

Works on: Shopify, WordPress

Fetches a single article. An article addressed through a blog it does not belong to is a 404 (code blog_article_not_found). Supported on Shopify (shopify) and WordPress (wordpress). WordPress returns its native status; publishedAt is present only for a published post and publishDate only for a scheduled post.

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

articleIdstringrequired

Platform-native numeric article id. Non-numeric values return 400.

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419/articles/589234567890" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "article": {
    "id": "string",
    "blogId": "121793282419",
    "platform": "shopify",
    "title": "string",
    "bodyHtml": "string",
    "handle": "string",
    "tags": [
      "string"
    ],
    "author": "string",
    "excerpt": "string",
    "image": {
      "url": "string",
      "altText": "string"
    },
    "isPublished": true,
    "publishedAt": "2026-10-10T00:00:00.000Z",
    "status": "publish",
    "publishDate": "2026-10-10T00:00:00.000Z",
    "createdAt": "2026-10-10T00:00:00.000Z",
    "updatedAt": "2026-10-10T00:00:00.000Z"
  }
}

Update a blog article

PATCH/v1/accounts/{accountId}/blogs/{blogId}/articles/{articleId}

Works on: Shopify, WordPress

Partial-updates an article. Send any subset of the create fields (title, bodyHtml, handle, tags, author, excerpt, image, seo, isPublished, publishDate); at least one field is required (an empty body returns 400). isPublished and publishDate behave as on create: isPublished: false unpublishes back to a draft and a future publishDate schedules publication natively on the platform. Omitting both fields preserves the current WordPress status. Omitting image preserves the current featured image; removal is not supported.

Path parameters

accountIdstringrequired

Connected Shopify or WordPress account id.

blogIdstringrequired

Platform-native numeric blog/site id returned by the list operation.

articleIdstringrequired

Platform-native numeric article id. Non-numeric values return 400.

Body

titlestring

bodyHtmlstring

Article body as HTML.

handlestring

URL slug of the article.

tagsstring[]

Replaces the full tag-name list. WordPress resolves existing names case-insensitively and creates missing tags.

authorstring

Shopify author display name, or numeric WordPress user id serialized as a string. Assigning another WordPress user may require elevated capability.

excerptstring

Short summary shown in blog listings.

imageobject

Featured image from a public URL. WordPress downloads it into the media library; JPEG, PNG, GIF and WebP are accepted up to 10 MB. Omit to preserve it; null removal is not supported.

seoobject

Shopify only. Search-engine overrides mapped to global title_tag and description_tag metafields. WordPress rejects this field.

isPublishedboolean

Set false to move to draft or true to publish. On WordPress false takes priority over a future publishDate; omission preserves status unless publishDate is sent.

publishDatestring

ISO 8601 datetime with offset (or Z). A future date schedules publication natively on the platform.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/blogs/121793282419/articles/589234567890" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string"
  }'
Response 200
{
  "platform": "shopify",
  "article": {
    "id": "string",
    "blogId": "121793282419",
    "platform": "shopify",
    "title": "string",
    "bodyHtml": "string",
    "handle": "string",
    "tags": [
      "string"
    ],
    "author": "string",
    "excerpt": "string",
    "image": {
      "url": "string",
      "altText": "string"
    },
    "isPublished": true,
    "publishedAt": "2026-10-10T00:00:00.000Z",
    "status": "publish",
    "publishDate": "2026-10-10T00:00:00.000Z",
    "createdAt": "2026-10-10T00:00:00.000Z",
    "updatedAt": "2026-10-10T00:00:00.000Z"
  }
}

List products

GET/v1/accounts/{accountId}/products

Works on: Shopify, WordPress

Lists the products on the connected store in the platform's default order, each with its variants, options and images. Cursor-paginated: pass limit (1-50, default 20) and the cursor from a previous response's nextCursor; nextCursor is null when there are no more pages. Filter with status and/or query (the platform's product search syntax, e.g. title:*shirt* vendor:Acme tag:summer). Supported on Shopify (platform shopify); accounts on other platforms return 400.

Path parameters

accountIdstringrequired

Connected Shopify account id.

Query parameters

limitinteger

Page size (1-50).

cursorstring

Opaque cursor from a previous response. Omit for the first page.

statusstring

Only products in this status. One of: active, draft, archived.

querystring

Platform product search syntax, passed through verbatim (Shopify: title, vendor, product_type, tag, sku, handle, created_at, updated_at, ...).

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/products" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "products": [
    {
      "id": "string",
      "platform": "shopify",
      "title": "string",
      "handle": "string",
      "descriptionHtml": "string",
      "vendor": "string",
      "productType": "string",
      "tags": [
        "string"
      ],
      "status": "active",
      "featuredImage": {
        "url": "string",
        "altText": "string"
      },
      "images": [
        {}
      ],
      "options": [
        {}
      ],
      "variants": [
        {}
      ],
      "seo": {
        "title": "string",
        "description": "string"
      },
      "totalInventory": 0,
      "onlineStoreUrl": "string",
      "createdAt": "2026-10-10T00:00:00.000Z",
      "updatedAt": "2026-10-10T00:00:00.000Z",
      "publishedAt": "2026-10-10T00:00:00.000Z"
    }
  ],
  "nextCursor": "string"
}

Get a product

GET/v1/accounts/{accountId}/products/{productId}

Works on: Shopify, WordPress

Fetches a single product with its variants, options and images. productId is the platform's numeric product id from GET /v1/accounts/{accountId}/products, not a Creator OS id. Supported on Shopify (platform shopify); accounts on other platforms return 400.

Path parameters

accountIdstringrequired

Connected Shopify account id.

productIdstringrequired

Platform-native numeric product id. Non-numeric values return 400.

curl "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/products/8214569812345" \
  -H "Authorization: Bearer $CREATOROS_API_KEY"
Response 200
{
  "platform": "shopify",
  "product": {
    "id": "string",
    "platform": "shopify",
    "title": "string",
    "handle": "string",
    "descriptionHtml": "string",
    "vendor": "string",
    "productType": "string",
    "tags": [
      "string"
    ],
    "status": "active",
    "featuredImage": {
      "url": "string",
      "altText": "string"
    },
    "images": [
      {
        "url": "string",
        "altText": "string"
      }
    ],
    "options": [
      {
        "name": "string",
        "values": []
      }
    ],
    "variants": [
      {
        "id": "string",
        "title": "string",
        "sku": "string",
        "barcode": "string",
        "price": "string",
        "compareAtPrice": "string",
        "inventoryQuantity": 0,
        "availableForSale": true,
        "selectedOptions": []
      }
    ],
    "seo": {
      "title": "string",
      "description": "string"
    },
    "totalInventory": 0,
    "onlineStoreUrl": "string",
    "createdAt": "2026-10-10T00:00:00.000Z",
    "updatedAt": "2026-10-10T00:00:00.000Z",
    "publishedAt": "2026-10-10T00:00:00.000Z"
  }
}

Update a product

PATCH/v1/accounts/{accountId}/products/{productId}

Works on: Shopify, WordPress

Partial-updates a product. Send any subset of title, descriptionHtml, handle, vendor, productType, tags, status, seo and variants; at least one field is required (an empty body returns 400). tags replaces the full tag list. variants updates the price and compare-at price of the listed variant ids only; other variants are untouched, and a variant id that does not belong to the product is a 400. Responds with the product as it is after the update. Supported on Shopify (platform shopify); accounts on other platforms return 400.

Path parameters

accountIdstringrequired

Connected Shopify account id.

productIdstringrequired

Platform-native numeric product id. Non-numeric values return 400.

Body

titlestring

descriptionHtmlstring

Product description as HTML.

handlestring

URL slug of the product.

vendorstring

productTypestring

tagsstring[]

Replaces the full tag list.

statusstring

archived hides the product everywhere; draft keeps it editable but unpublished.

seoobject

Search-engine title and description overrides.

variantsobject[]

Price changes per variant. Only the listed variants change.

curl -X PATCH "https://creatoros-production-5658.up.railway.app/v1/accounts/acc_Sh4Vp9Kz2Ny7Tx3Lm1Rc6Wb5Js8Df0Ga4Ue7Ki2Oq3H/products/8214569812345" \
  -H "Authorization: Bearer $CREATOROS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "string"
  }'
Response 200
{
  "platform": "shopify",
  "product": {
    "id": "string",
    "platform": "shopify",
    "title": "string",
    "handle": "string",
    "descriptionHtml": "string",
    "vendor": "string",
    "productType": "string",
    "tags": [
      "string"
    ],
    "status": "active",
    "featuredImage": {
      "url": "string",
      "altText": "string"
    },
    "images": [
      {
        "url": "string",
        "altText": "string"
      }
    ],
    "options": [
      {
        "name": "string",
        "values": []
      }
    ],
    "variants": [
      {
        "id": "string",
        "title": "string",
        "sku": "string",
        "barcode": "string",
        "price": "string",
        "compareAtPrice": "string",
        "inventoryQuantity": 0,
        "availableForSale": true,
        "selectedOptions": []
      }
    ],
    "seo": {
      "title": "string",
      "description": "string"
    },
    "totalInventory": 0,
    "onlineStoreUrl": "string",
    "createdAt": "2026-10-10T00:00:00.000Z",
    "updatedAt": "2026-10-10T00:00:00.000Z",
    "publishedAt": "2026-10-10T00:00:00.000Z"
  }
}