npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@smartlyqofficial/node

v0.1.43

Published

Official Node.js SDK for the SmartlyQ API - social posting, AI content generation, SEO, CRM, and more.

Readme

SmartlyQ Node.js SDK

npm

The official Node.js SDK for the SmartlyQ API - social posting and scheduling, AI content generation (articles, images, video, audio, presentations), SEO research, CRM, chatbots, and more, from one API key.

  • Fully typed - request and response types for every endpoint, generated from the OpenAPI spec.
  • Zero dependencies - built on the native fetch (Node 18+).
  • Batteries included - automatic retries with backoff, idempotency keys, request timeouts, typed errors.

Installation

npm install @smartlyqofficial/node

Quickstart

import SmartlyQ from '@smartlyqofficial/node';

const sq = new SmartlyQ({ apiKey: process.env.SMARTLYQ_API_KEY });

// Who am I?
const me = await sq.account.getMe();

// Generate an image with AI
const image = await sq.images.generate({ prompt: 'A minimalist product shot of a smart speaker' });

// Publish a social post
const post = await sq.social.createPost({
  text: 'Hello from the SmartlyQ SDK!',
  account_ids: ['acc_123'],
});

Get an API key from your Developer Dashboard. Keys look like sqk_live_... (production) or sqk_test_... (sandbox - free simulated responses, no charges).

Configuration

const sq = new SmartlyQ({
  apiKey: 'sqk_live_...',   // or set SMARTLYQ_API_KEY
  timeout: 60_000,           // per-request timeout in ms
  maxRetries: 2,             // automatic retries on 429/5xx
});

Per-request options are accepted as the last argument of every method:

await sq.social.createPost(body, {
  idempotencyKey: 'my-unique-key',  // safe retries for writes
  profileId: 'prof_123',            // act on behalf of a managed Profile
  timeout: 10_000,
});

Async jobs

Generation endpoints (articles, images, videos, audio) are asynchronous: they return a job. Poll it until it completes:

const { data } = await sq.videos.generate({ prompt: 'A 5s product teaser', model: 'standard' });

let job = await sq.jobs.get(data.job_id);
while (job.data.status === 'processing' || job.data.status === 'queued') {
  await new Promise((r) => setTimeout(r, 3000));
  job = await sq.jobs.get(data.job_id);
}
console.log(job.data.result);

Error handling

Every non-2xx response throws a typed SmartlyQError:

import { SmartlyQError } from '@smartlyqofficial/node';

try {
  await sq.articles.generate({ topic: 'AI trends' });
} catch (err) {
  if (err instanceof SmartlyQError) {
    console.error(err.status, err.code, err.message, err.requestId);
  }
}

API Reference

All methods below are available on the client. Full request/response documentation lives at docs.smartlyq.com.

Account

| Method | Endpoint | Description | | --- | --- | --- | | sq.account.getMe() | GET /me | Get current user profile | | sq.account.getMeUsage(query?) | GET /me/usage | Get usage summary | | sq.account.getMeBalance() | GET /me/balance | Get wallet balance | | sq.account.getBilling() | GET /me/billing | Billing overview |

Ads

| Method | Endpoint | Description | | --- | --- | --- | | sq.ads.listCampaigns(query?) | GET /ads/campaigns | List campaigns | | sq.ads.createCampaign(body) | POST /ads/campaigns | Create a campaign | | sq.ads.getCampaign(id) | GET /ads/campaigns/{id} | Get a campaign | | sq.ads.updateCampaign(id, body) | PATCH /ads/campaigns/{id} | Update a campaign | | sq.ads.deleteCampaign(id) | DELETE /ads/campaigns/{id} | Delete a campaign | | sq.ads.pauseCampaign(id) | POST /ads/campaigns/{id}/pause | Pause a campaign | | sq.ads.resumeCampaign(id) | POST /ads/campaigns/{id}/resume | Resume a campaign | | sq.ads.duplicateCampaign(id) | POST /ads/campaigns/{id}/duplicate | Duplicate a campaign | | sq.ads.archiveCampaign(id) | POST /ads/campaigns/{id}/archive | Archive a campaign | | sq.ads.bulkCampaignStatus(body) | POST /ads/campaigns/bulk-status | Bulk pause/resume campaigns | | sq.ads.listSets(query?) | GET /ads/ad-sets | List ad sets | | sq.ads.getSet(id) | GET /ads/ad-sets/{id} | Get an ad set | | sq.ads.deleteSet(id) | DELETE /ads/ad-sets/{id} | Delete an ad set | | sq.ads.pauseSet(id) | POST /ads/ad-sets/{id}/pause | Pause an ad set | | sq.ads.resumeSet(id) | POST /ads/ad-sets/{id}/resume | Resume an ad set | | sq.ads.duplicateSet(id) | POST /ads/ad-sets/{id}/duplicate | Duplicate an ad set | | sq.ads.archiveSet(id) | POST /ads/ad-sets/{id}/archive | Archive an ad set | | sq.ads.list(query?) | GET /ads/ads | List ads | | sq.ads.get(id) | GET /ads/ads/{id} | Get an ad | | sq.ads.delete(id) | DELETE /ads/ads/{id} | Delete an ad | | sq.ads.pause(id) | POST /ads/ads/{id}/pause | Pause an ad | | sq.ads.resume(id) | POST /ads/ads/{id}/resume | Resume an ad | | sq.ads.duplicate(id) | POST /ads/ads/{id}/duplicate | Duplicate an ad | | sq.ads.archive(id) | POST /ads/ads/{id}/archive | Archive an ad | | sq.ads.listAudiences(query?) | GET /ads/audiences | List audiences | | sq.ads.createAudience(body) | POST /ads/audiences | Create an audience | | sq.ads.listPixels(query?) | GET /ads/pixels | List pixels / conversion destinations | | sq.ads.listLeadForms(query?) | GET /ads/lead-forms | List lead forms | | sq.ads.createLeadForm(body) | POST /ads/lead-forms | Create a lead form | | sq.ads.listCreatives(query?) | GET /ads/creatives | List creatives | | sq.ads.createCreative(body) | POST /ads/creatives | Create a creative | | sq.ads.updateCreative(id, body) | PATCH /ads/creatives/{id} | Update a creative | | sq.ads.deleteCreative(id) | DELETE /ads/creatives/{id} | Delete a creative | | sq.ads.listAccounts() | GET /ads/accounts | List connected ad accounts | | sq.ads.accountsDiagnostics() | GET /ads/accounts/diagnostics | Account health and rate-limit diagnostics | | sq.ads.listAuditLog(query?) | GET /ads/audit-log | List audit log entries | | sq.ads.audienceEstimate(body) | POST /ads/estimate | Audience-size estimate | | sq.ads.syncAccounts() | POST /ads/sync | Trigger an account sync | | sq.ads.analytics(query?) | GET /ads/analytics | Ads performance analytics | | sq.ads.targetingSearch(query?) | GET /ads/targeting-search | Search Meta interest targeting | | sq.ads.listPagePosts(pageId, query?) | GET /ads/pages/{page_id}/posts | List a Page's organic posts |

AI Captain

| Method | Endpoint | Description | | --- | --- | --- | | sq.captain.sendMessage(body) | POST /captain/messages | Send AI Captain message | | sq.captain.listConversations(query?) | GET /captain/conversations | List AI Captain conversations | | sq.captain.getConversation(conversationId) | GET /captain/conversations/{conversation_id} | Get AI Captain conversation |

Analytics

| Method | Endpoint | Description | | --- | --- | --- | | sq.analytics.getOverview(query?) | GET /analytics/overview | Get analytics overview | | sq.analytics.getPosts(query?) | GET /analytics/posts | Get post analytics | | sq.analytics.getAccount(accountId, query?) | GET /analytics/accounts/{account_id} | Get account analytics | | sq.analytics.dailyMetrics(query?) | GET /analytics/daily-metrics | Daily metrics | | sq.analytics.bestTime(query?) | GET /analytics/best-time | Best time to post | | sq.analytics.contentDecay(query?) | GET /analytics/content-decay | Content decay | | sq.analytics.postingFrequency(query?) | GET /analytics/posting-frequency | Posting frequency vs engagement | | sq.analytics.postTimeline(postId) | GET /analytics/posts/{post_id}/timeline | Post metric timeline | | sq.analytics.inboxVolume(query?) | GET /analytics/inbox/volume | Inbox volume | | sq.analytics.inboxHeatmap(query?) | GET /analytics/inbox/heatmap | Inbox heatmap | | sq.analytics.inboxSourceBreakdown(query?) | GET /analytics/inbox/source-breakdown | Inbox source breakdown | | sq.analytics.inboxResponseTime(query?) | GET /analytics/inbox/response-time | Inbox response time | | sq.analytics.inboxTopAccounts(query?) | GET /analytics/inbox/top-accounts | Inbox top accounts | | sq.analytics.inboxConversations(query?) | GET /analytics/inbox/conversations | Inbox conversation stats | | sq.analytics.inboxConversationDetail(conversationId) | GET /analytics/inbox/conversations/{conversation_id} | Conversation analytics | | sq.analytics.getYoutubeChannelInsights(query?) | GET /analytics/youtube/channel-insights | YouTube channel insights | | sq.analytics.getYoutubeDailyViews(query?) | GET /analytics/youtube/daily-views | YouTube daily views | | sq.analytics.getYoutubeVideoRetention(query?) | GET /analytics/youtube/video-retention | YouTube audience retention | | sq.analytics.getYoutubeDemographics(query?) | GET /analytics/youtube/demographics | YouTube viewer demographics |

Articles

| Method | Endpoint | Description | | --- | --- | --- | | sq.articles.generate(body) | POST /articles/generate | Generate article | | sq.articles.list(query?) | GET /articles | List articles | | sq.articles.get(articleId) | GET /articles/{article_id} | Get article | | sq.articles.delete(articleId) | DELETE /articles/{article_id} | Delete article |

Audio

| Method | Endpoint | Description | | --- | --- | --- | | sq.audio.textToSpeech(body) | POST /audio/text-to-speech | Text to speech | | sq.audio.speechToText(body) | POST /audio/speech-to-text | Speech to text | | sq.audio.get(audioId) | GET /audio/{audio_id} | Get audio |

Automations

| Method | Endpoint | Description | | --- | --- | --- | | sq.automations.list(query?) | GET /automations | List automations | | sq.automations.get(automationId) | GET /automations/{automation_id} | Get automation | | sq.automations.activate(automationId) | POST /automations/{automation_id}/activate | Activate automation | | sq.automations.deactivate(automationId) | POST /automations/{automation_id}/deactivate | Pause automation | | sq.automations.trigger(automationId, body?) | POST /automations/{automation_id}/trigger | Trigger automation | | sq.automations.duplicate(automationId) | POST /automations/{automation_id}/duplicate | Duplicate an automation | | sq.automations.listVersions(automationId) | GET /automations/{automation_id}/versions | List automation versions | | sq.automations.getVersion(automationId, version) | GET /automations/{automation_id}/versions/{version} | Get one automation version | | sq.automations.restoreVersion(automationId, version) | POST /automations/{automation_id}/versions/{version}/restore | Restore an automation version | | sq.automations.listRuns(automationId, query?) | GET /automations/{automation_id}/runs | List runs | | sq.automations.getRun(automationId, runId) | GET /automations/{automation_id}/runs/{run_id} | Get run |

Calendar

| Method | Endpoint | Description | | --- | --- | --- | | sq.calendar.listEventTypes() | GET /calendar/event-types | List booking pages | | sq.calendar.listSlots(query?) | GET /calendar/slots | List open slots | | sq.calendar.createBooking(body) | POST /calendar/bookings | Take a booking | | sq.calendar.cancelBooking(id, body?) | POST /calendar/bookings/{id}/cancel | Cancel a booking |

Chatbot

| Method | Endpoint | Description | | --- | --- | --- | | sq.chatbots.list(query?) | GET /chatbots | List chatbots | | sq.chatbots.create(body) | POST /chatbots | Create chatbot | | sq.chatbots.get(id) | GET /chatbots/{id} | Get chatbot | | sq.chatbots.update(id, body) | PATCH /chatbots/{id} | Update chatbot | | sq.chatbots.delete(id) | DELETE /chatbots/{id} | Delete chatbot | | sq.chatbots.train(id) | POST /chatbots/{id}/train | Start chatbot training | | sq.chatbots.getTrainStatus(id) | GET /chatbots/{id}/train-status | Get chatbot training status | | sq.chatbots.sendMessage(id, body) | POST /chatbots/{id}/messages | Send chatbot message | | sq.chatbots.listConversations(id, query?) | GET /chatbots/{id}/conversations | List chatbot conversations | | sq.chatbots.getConversationMessages(id, convId) | GET /chatbots/{id}/conversations/{conv_id}/messages | Get conversation messages |

Comments

| Method | Endpoint | Description | | --- | --- | --- | | sq.comments.list(query?) | GET /social/comments | List comments | | sq.comments.replyTo(commentId, body) | POST /social/comments/{comment_id}/reply | Reply to a comment | | sq.comments.hide(commentId) | POST /social/comments/{comment_id}/hide | Hide or unhide a comment | | sq.comments.moderate(commentId, body) | POST /social/comments/{comment_id}/moderate | Approve or reject a comment | | sq.comments.like(commentId) | POST /social/comments/{comment_id}/like | Like a comment | | sq.comments.unlike(commentId) | DELETE /social/comments/{comment_id}/like | Unlike a comment | | sq.comments.delete(commentId) | DELETE /social/comments/{comment_id} | Delete a comment | | sq.comments.getPost(postId) | GET /social/comments/{post_id} | Get one post's comments (threaded) |

Content

| Method | Endpoint | Description | | --- | --- | --- | | sq.content.rewrite(body) | POST /content/rewrite | Rewrite content | | sq.content.generateCaption(body?) | POST /content/caption | Generate a social caption |

CRM

| Method | Endpoint | Description | | --- | --- | --- | | sq.crm.deleteContact(id) | DELETE /contacts/{id} | Delete contact | | sq.crm.updateCustomField(id, body) | PATCH /custom-fields/{id} | Update custom field | | sq.crm.bulkImportContacts(body) | POST /contacts/bulk | Bulk import contacts | | sq.crm.contactChannels(id) | GET /contacts/{id}/channels | Contact channels |

CRM Companies

| Method | Endpoint | Description | | --- | --- | --- | | sq.crmCompanies.list(query?) | GET /companies | List companies | | sq.crmCompanies.create(body) | POST /companies | Create a company | | sq.crmCompanies.get(id) | GET /companies/{id} | Get a company | | sq.crmCompanies.update(id, body) | PATCH /companies/{id} | Update a company | | sq.crmCompanies.delete(id) | DELETE /companies/{id} | Delete a company | | sq.crmCompanies.linkContact(id, body) | POST /companies/{id}/contacts | Link a contact to a company | | sq.crmCompanies.unlinkContact(id, body) | DELETE /companies/{id}/contacts | Unlink a contact from a company |

CRM Contacts

| Method | Endpoint | Description | | --- | --- | --- | | sq.contacts.list(query?) | GET /contacts | List contacts | | sq.contacts.create(body) | POST /contacts | Create or upsert a contact | | sq.contacts.get(id) | GET /contacts/{id} | Get a contact | | sq.contacts.update(id, body) | PATCH /contacts/{id} | Update a contact | | sq.contacts.addTags(id, body) | POST /contacts/{id}/tags | Add tags to a contact | | sq.contacts.removeTags(id, body) | DELETE /contacts/{id}/tags | Remove tags from a contact | | sq.contacts.listNotes(id) | GET /contacts/{id}/notes | List contact notes | | sq.contacts.addNote(id, body) | POST /contacts/{id}/notes | Add a note to a contact | | sq.contacts.updateNote(id, noteId, body) | PATCH /contacts/{id}/notes/{note_id} | Edit a contact note | | sq.contacts.deleteNote(id, noteId) | DELETE /contacts/{id}/notes/{note_id} | Delete a contact note | | sq.contacts.enroll(id, body) | POST /contacts/{id}/enroll | Enroll a contact in an automation | | sq.contacts.addMessage(id, body) | POST /contacts/{id}/messages | Log a message on a contact's timeline | | sq.contacts.setField(id, slug, body) | PUT /contacts/{id}/fields/{slug} | Set one custom field | | sq.contacts.clearField(id, slug) | DELETE /contacts/{id}/fields/{slug} | Clear one custom field |

CRM Custom Fields

| Method | Endpoint | Description | | --- | --- | --- | | sq.customFields.list() | GET /custom-fields | List custom fields | | sq.customFields.create(body) | POST /custom-fields | Create a custom field | | sq.customFields.delete(id) | DELETE /custom-fields/{id} | Delete a custom field |

CRM Opportunities

| Method | Endpoint | Description | | --- | --- | --- | | sq.opportunities.listPipelines() | GET /pipelines | List pipelines | | sq.opportunities.createPipeline(body) | POST /pipelines | Create a pipeline | | sq.opportunities.list(query?) | GET /opportunities | List opportunities | | sq.opportunities.create(body) | POST /opportunities | Create an opportunity | | sq.opportunities.get(id) | GET /opportunities/{id} | Get an opportunity | | sq.opportunities.update(id, body) | PATCH /opportunities/{id} | Update an opportunity | | sq.opportunities.delete(id) | DELETE /opportunities/{id} | Delete an opportunity | | sq.opportunities.updateStatus(id, body) | POST /opportunities/{id}/status | Update opportunity status |

CRM Tags

| Method | Endpoint | Description | | --- | --- | --- | | sq.crmTags.list() | GET /tags | List tags | | sq.crmTags.create(body) | POST /tags | Create a tag | | sq.crmTags.rename(body) | POST /tags/rename | Rename a tag | | sq.crmTags.merge(body) | POST /tags/merge | Merge tags | | sq.crmTags.delete(body) | POST /tags/delete | Delete a tag |

CRM Tasks

| Method | Endpoint | Description | | --- | --- | --- | | sq.crmTasks.list(query?) | GET /tasks | List tasks | | sq.crmTasks.create(body) | POST /tasks | Create a task | | sq.crmTasks.get(id) | GET /tasks/{id} | Get a task | | sq.crmTasks.update(id, body) | PATCH /tasks/{id} | Update a task | | sq.crmTasks.delete(id) | DELETE /tasks/{id} | Delete a task | | sq.crmTasks.logTime(id, body) | POST /tasks/{id}/time | Log time on a task |

Direct Messages

| Method | Endpoint | Description | | --- | --- | --- | | sq.messages.listConversations(query?) | GET /social/conversations | List DM conversations | | sq.messages.list(conversationId, query?) | GET /social/conversations/{conversation_id}/messages | List messages in a conversation | | sq.messages.send(conversationId, body) | POST /social/conversations/{conversation_id}/messages | Send a direct message | | sq.messages.markConversationRead(conversationId) | POST /social/conversations/{conversation_id}/read | Mark a conversation read | | sq.messages.delete(conversationId, messageId) | DELETE /social/conversations/{conversation_id}/messages/{message_id} | Delete a sent message | | sq.messages.reactTo(conversationId, messageId, body) | POST /social/conversations/{conversation_id}/messages/{message_id}/reactions | React to a message | | sq.messages.removeReaction(conversationId, messageId) | DELETE /social/conversations/{conversation_id}/messages/{message_id}/reactions | Remove a message reaction |

Images

| Method | Endpoint | Description | | --- | --- | --- | | sq.images.generate(body) | POST /images/generate | Generate image | | sq.images.list(query?) | GET /images | List images | | sq.images.get(imageId) | GET /images/{image_id} | Get image | | sq.images.delete(imageId) | DELETE /images/{image_id} | Delete image |

Jobs

| Method | Endpoint | Description | | --- | --- | --- | | sq.jobs.list(query?) | GET /jobs | List jobs | | sq.jobs.get(jobId) | GET /jobs/{job_id} | Get job | | sq.jobs.cancel(jobId, body?) | POST /jobs/{job_id}/cancel | Cancel job |

Logs

| Method | Endpoint | Description | | --- | --- | --- | | sq.logs.list(query?) | GET /logs | List developer logs |

Media

| Method | Endpoint | Description | | --- | --- | --- | | sq.media.list(query?) | GET /media | List media | | sq.media.get(mediaId) | GET /media/{media_id} | Get media | | sq.media.delete(mediaId) | DELETE /media/{media_id} | Delete media | | sq.media.getUploadUrl(body) | POST /media/upload-url | Get presigned upload URL | | sq.media.confirmUpload(mediaId) | POST /media/{media_id}/confirm | Confirm a presigned upload | | sq.media.uploadDirect(body) | POST /media/upload-direct | Upload a file directly |

Presentations

| Method | Endpoint | Description | | --- | --- | --- | | sq.presentations.generate(body) | POST /presentations/generate | Generate presentation | | sq.presentations.list(query?) | GET /presentations | List presentations | | sq.presentations.get(presentationId) | GET /presentations/{presentation_id} | Get presentation | | sq.presentations.delete(presentationId) | DELETE /presentations/{presentation_id} | Delete presentation |

Profiles

| Method | Endpoint | Description | | --- | --- | --- | | sq.profiles.list(query?) | GET /profiles | List profiles | | sq.profiles.create(body) | POST /profiles | Create a profile | | sq.profiles.get(id) | GET /profiles/{id} | Get a profile | | sq.profiles.update(id, body) | PATCH /profiles/{id} | Update a profile | | sq.profiles.delete(id, body) | DELETE /profiles/{id} | Delete a profile | | sq.profiles.listAccounts(id) | GET /profiles/{id}/accounts | List a profile's connected accounts | | sq.profiles.pause(id) | POST /profiles/{id}/pause | Pause a profile | | sq.profiles.resume(id) | POST /profiles/{id}/resume | Resume a profile | | sq.profiles.createConnectLink(id, body?) | POST /profiles/{id}/connect-link | Create a hosted connect link | | sq.profiles.createConnectUrl(id, platform, body?) | POST /profiles/{id}/connect/{platform} | Get a raw connect URL for one platform | | sq.profiles.getAccountBilling() | GET /me/account-billing | Account billing summary |

Reviews

| Method | Endpoint | Description | | --- | --- | --- | | sq.reviews.list(query?) | GET /reviews | List reviews | | sq.reviews.replyTo(reviewId, body) | POST /reviews/{review_id}/reply | Reply to review | | sq.reviews.deleteReply(reviewId) | DELETE /reviews/{review_id}/reply | Delete review reply | | sq.reviews.sync(body?) | POST /reviews/sync | Sync reviews |

SEO

| Method | Endpoint | Description | | --- | --- | --- | | sq.seo.keywordResearch(body) | POST /seo/keyword-research | Keyword research | | sq.seo.serp(body) | POST /seo/serp | Live SERP lookup | | sq.seo.keywordDifficulty(body) | POST /seo/keyword-difficulty | Keyword difficulty | | sq.seo.rankedKeywords(body) | POST /seo/ranked-keywords | Ranked keywords (rank tracking) | | sq.seo.domainOverview(body) | POST /seo/domain-overview | Domain rank overview | | sq.seo.competitors(body) | POST /seo/competitors | Organic competitors | | sq.seo.backlinksSummary(body) | POST /seo/backlinks-summary | Backlink profile summary | | sq.seo.audit(body) | POST /seo/audit | On-page SEO audit | | sq.seo.backlinkProspects(body) | POST /seo/backlink-prospects | Backlink prospects (link gap) | | sq.seo.referringDomains(body) | POST /seo/referring-domains | Referring domains | | sq.seo.backlinkAnchors(body) | POST /seo/backlink-anchors | Backlink anchors | | sq.seo.spamScore(body) | POST /seo/spam-score | Backlink spam score | | sq.seo.rankHistory(body) | POST /seo/rank-history | Historical rank overview | | sq.seo.siteAudit(body) | POST /seo/site-audit | Deep site audit | | sq.seo.brandLookup(body) | POST /seo/brand-lookup | AI Visibility: brand lookup | | sq.seo.promptExplorer(body) | POST /seo/prompt-explorer | AI Visibility: prompt explorer | | sq.seo.aiAudit(body) | POST /seo/ai-audit | AI Visibility Audit (async) |

Shorts

| Method | Endpoint | Description | | --- | --- | --- | | sq.shorts.generate(body?) | POST /shorts/generate | Generate viral shorts from a long video | | sq.shorts.list(query?) | GET /shorts | List shorts jobs | | sq.shorts.get(uid) | GET /shorts/{uid} | Get shorts job + clips |

Social

| Method | Endpoint | Description | | --- | --- | --- | | sq.social.listAccounts() | GET /social/accounts | List social accounts | | sq.social.listPosts(query?) | GET /social/posts | List social posts | | sq.social.createPost(body) | POST /social/posts | Create post (publish immediately) | | sq.social.schedulePost(body) | POST /social/posts/schedule | Schedule post | | sq.social.getPost(postId) | GET /social/posts/{post_id} | Get social post | | sq.social.updatePost(postId, body) | PATCH /social/posts/{post_id} | Update social post | | sq.social.deletePost(postId) | DELETE /social/posts/{post_id} | Delete social post | | sq.social.updateAccount(accountId, body) | PATCH /social/accounts/{account_id} | Rename account | | sq.social.disconnectAccount(accountId) | DELETE /social/accounts/{account_id} | Disconnect a social account | | sq.social.getAccountHealth(accountId) | GET /social/accounts/{account_id}/health | Account health | | sq.social.getAccountReconnectUrl(accountId) | GET /social/accounts/{account_id}/reconnect-url | Account reconnect URL | | sq.social.pauseAccount(accountId) | POST /social/accounts/{account_id}/pause | Pause posting to an account | | sq.social.resumeAccount(accountId) | POST /social/accounts/{account_id}/resume | Resume posting to an account | | sq.social.retryPost(postId, body) | POST /social/posts/{post_id}/retry | Retry publishing a post | | sq.social.connectAccountStatus(platform) | GET /social/connect/{platform} | Poll headless connection status | | sq.social.connectAccount(platform, body?) | POST /social/connect/{platform} | Start headless account connection | | sq.social.listQueues() | GET /social/queues | List queues | | sq.social.createQueue(body) | POST /social/queues | Create queue | | sq.social.getQueue(queueId) | GET /social/queues/{queue_id} | Get queue | | sq.social.updateQueue(queueId, body) | PUT /social/queues/{queue_id} | Update queue | | sq.social.deleteQueue(queueId) | DELETE /social/queues/{queue_id} | Delete queue | | sq.social.getQueueNextSlot(queueId) | GET /social/queues/{queue_id}/next-slot | Get next open slot | | sq.social.previewQueueSlots(queueId, query?) | GET /social/queues/{queue_id}/preview | Preview upcoming slots | | sq.social.unpublishPost(postId, body?) | POST /social/posts/{post_id}/unpublish | Unpublish post | | sq.social.validatePost(body) | POST /social/validate/post | Validate post content | | sq.social.validateMedia(body) | POST /social/validate/media | Validate media URL | | sq.social.stopPostRecycle(postId) | DELETE /social/posts/{post_id}/recycle | Stop recycling | | sq.social.bulkSchedulePosts(body) | POST /social/posts/bulk | Bulk schedule posts | | sq.social.validateBulkBatch(body) | POST /social/posts/bulk/validate | Validate a bulk batch | | sq.social.bulkAccountHealth() | GET /social/accounts/health | Bulk account health | | sq.social.accountFollowerStats(query?) | GET /social/accounts/follower-stats | Follower stats | | sq.social.tiktokCreatorInfo(accountId) | GET /social/accounts/{account_id}/tiktok/creator-info | TikTok creator info | | sq.social.moveAccount(accountId, body) | POST /social/accounts/{account_id}/move | Move account to profile | | sq.social.listAccountGroups() | GET /social/account-groups | List account groups | | sq.social.createAccountGroup(body) | POST /social/account-groups | Create account group | | sq.social.getAccountGroup(groupId) | GET /social/account-groups/{group_id} | Get account group | | sq.social.updateAccountGroup(groupId, body) | PUT /social/account-groups/{group_id} | Update account group | | sq.social.deleteAccountGroup(groupId) | DELETE /social/account-groups/{group_id} | Delete account group | | sq.social.getConversation(conversationId) | GET /social/conversations/{conversation_id} | Get conversation | | sq.social.updateConversation(conversationId, body) | PATCH /social/conversations/{conversation_id} | Archive / reopen conversation | | sq.social.searchConversations(query?) | GET /social/conversations/search | Search conversations | | sq.social.pinterestBoards(accountId) | GET /social/accounts/{account_id}/pinterest/boards | Pinterest boards | | sq.social.createPinterestBoard(accountId, body) | POST /social/accounts/{account_id}/pinterest/boards | Create a Pinterest board | | sq.social.youtubePlaylists(accountId) | GET /social/accounts/{account_id}/youtube/playlists | YouTube playlists | | sq.social.instagramPublishingLimit(accountId) | GET /social/accounts/{account_id}/instagram/publishing-limit | Instagram publishing limit | | sq.social.gmbPerformance(accountId, query?) | GET /social/accounts/{account_id}/gmb/performance | Google Business performance | | sq.social.gmbSearchKeywords(accountId, query?) | GET /social/accounts/{account_id}/gmb/search-keywords | Google Business search keywords | | sq.social.redditSearch(accountId, query?) | GET /social/accounts/{account_id}/reddit/search | Reddit search | | sq.social.redditFeed(accountId, query?) | GET /social/accounts/{account_id}/reddit/feed | Reddit feed | | sq.social.redditSubreddits(accountId) | GET /social/accounts/{account_id}/reddit/subreddits | Subscribed subreddits | | sq.social.redditSubredditRules(accountId, subreddit) | GET /social/accounts/{account_id}/reddit/subreddits/{subreddit}/rules | Subreddit rules | | sq.social.instagramStories(accountId) | GET /social/accounts/{account_id}/instagram/stories | Instagram stories | | sq.social.facebookPostReactions(accountId, query?) | GET /social/accounts/{account_id}/facebook/post-reactions | Facebook post reactions | | sq.social.instagramStoryInsights(accountId, storyId, query?) | GET /social/accounts/{account_id}/instagram/stories/{story_id}/insights | Instagram story insights | | sq.social.xRetweet(accountId, body) | POST /social/accounts/{account_id}/x/retweets | Retweet on X | | sq.social.xUnretweet(accountId, tweetId) | DELETE /social/accounts/{account_id}/x/retweets/{tweet_id} | Undo retweet | | sq.social.editPublishedPost(postId, body) | POST /social/posts/{post_id}/edit | Edit published post | | sq.social.updatePostMetadata(postId, body) | POST /social/posts/{post_id}/update-metadata | Update YouTube metadata | | sq.social.syncExternalPosts(body) | POST /social/posts/sync-external | Sync external posts | | sq.social.accountInsights(accountId) | GET /social/accounts/{account_id}/insights | Live account insights | | sq.social.gmbLocations(accountId, query?) | GET /social/accounts/{account_id}/gmb/locations | List Google locations | | sq.social.gmbLocation(accountId, query?) | GET /social/accounts/{account_id}/gmb/location | Get business info | | sq.social.gmbUpdateLocation(accountId, body) | PATCH /social/accounts/{account_id}/gmb/location | Update business info | | sq.social.gmbAttributes(accountId) | GET /social/accounts/{account_id}/gmb/attributes | Get attributes | | sq.social.gmbUpdateAttributes(accountId, body) | PUT /social/accounts/{account_id}/gmb/attributes | Update attributes | | sq.social.gmbAttributeMetadata(accountId) | GET /social/accounts/{account_id}/gmb/attributes/metadata | Available attributes | | sq.social.gmbMedia(accountId) | GET /social/accounts/{account_id}/gmb/media | List media | | sq.social.gmbCreateMedia(accountId, body) | POST /social/accounts/{account_id}/gmb/media | Add photo | | sq.social.gmbDeleteMedia(accountId, body) | DELETE /social/accounts/{account_id}/gmb/media | Delete media | | sq.social.gmbFoodMenus(accountId) | GET /social/accounts/{account_id}/gmb/food-menus | Get food menus | | sq.social.gmbUpdateFoodMenus(accountId, body) | PUT /social/accounts/{account_id}/gmb/food-menus | Update food menus | | sq.social.gmbPlaceActions(accountId) | GET /social/accounts/{account_id}/gmb/place-actions | List place-action links | | sq.social.gmbCreatePlaceAction(accountId, body) | POST /social/accounts/{account_id}/gmb/place-actions | Create place-action link | | sq.social.gmbUpdatePlaceAction(accountId, body) | PATCH /social/accounts/{account_id}/gmb/place-actions | Update place-action link | | sq.social.gmbDeletePlaceAction(accountId, body) | DELETE /social/accounts/{account_id}/gmb/place-actions | Delete place-action link | | sq.social.gmbVerifications(accountId) | GET /social/accounts/{account_id}/gmb/verifications | List verifications | | sq.social.gmbVerificationOptions(accountId, body?) | POST /social/accounts/{account_id}/gmb/verifications/options | Verification options | | sq.social.redditSubredditInfo(accountId, subreddit) | GET /social/accounts/{account_id}/reddit/subreddits/{subreddit} | Subreddit info + eligibility | | sq.social.xMentions(accountId, query?) | GET /social/accounts/{account_id}/x/mentions | X mentions | | sq.social.sendTypingIndicator(conversationId) | POST /social/conversations/{conversation_id}/typing | Typing indicator | | sq.social.commentPrivateReply(commentId, body) | POST /social/comments/{comment_id}/private-reply | Private reply (comment-to-DM) | | sq.social.getMessengerMenu(accountId) | GET /social/accounts/{account_id}/messenger/menu | Get Messenger menu | | sq.social.setMessengerMenu(accountId, body) | PUT /social/accounts/{account_id}/messenger/menu | Set Messenger menu | | sq.social.deleteMessengerMenu(accountId) | DELETE /social/accounts/{account_id}/messenger/menu | Delete Messenger menu | | sq.social.getIceBreakers(accountId) | GET /social/accounts/{account_id}/instagram/ice-breakers | Get ice breakers | | sq.social.setIceBreakers(accountId, body) | PUT /social/accounts/{account_id}/instagram/ice-breakers | Set ice breakers | | sq.social.deleteIceBreakers(accountId) | DELETE /social/accounts/{account_id}/instagram/ice-breakers | Delete ice breakers | | sq.social.facebookPageInsights(accountId, query?) | GET /social/accounts/{account_id}/facebook/page-insights | Facebook page insights | | sq.social.instagramAudience(accountId, query?) | GET /social/accounts/{account_id}/instagram/audience | Instagram audience demographics | | sq.social.connectOptions(accountId) | GET /social/accounts/{account_id}/connect-options | Connection target options | | sq.social.connectSelect(accountId, body) | POST /social/accounts/{account_id}/connect-select | Select connection target | | sq.social.getFacebookPage(accountId) | GET /social/accounts/{account_id}/facebook/page | Get Facebook page details | | sq.social.updateFacebookPage(accountId, body) | PATCH /social/accounts/{account_id}/facebook/page | Update Facebook page details | | sq.social.getFacebookPageSettings(accountId) | GET /social/accounts/{account_id}/facebook/page/settings | Get Facebook page settings | | sq.social.updateFacebookPageSettings(accountId, body) | PATCH /social/accounts/{account_id}/facebook/page/settings | Update Facebook page settings | | sq.social.setFacebookPagePicture(accountId, body) | POST /social/accounts/{account_id}/facebook/page/picture | Set Facebook page profile picture | | sq.social.setFacebookPageCover(accountId, body) | POST /social/accounts/{account_id}/facebook/page/cover | Set Facebook page cover photo | | sq.social.getFacebookReelLimit(accountId) | GET /social/accounts/{account_id}/facebook/reel-limit | Get Facebook Reel limit | | sq.social.updateYoutubePlaylist(accountId, playlistId, body) | PATCH /social/accounts/{account_id}/youtube/playlists/{playlist_id} | Update a YouTube playlist | | sq.social.listMentions(accountId, query?) | GET /social/accounts/{account_id}/mentions | List mentions | | sq.social.replyToMention(accountId, mentionId, body) | POST /social/accounts/{account_id}/mentions/{mention_id}/reply | Reply to a mention | | sq.social.listRedditFlairs(accountId, subreddit) | GET /social/accounts/{account_id}/reddit/subreddits/{subreddit}/flairs | List subreddit post flairs |

URLs

| Method | Endpoint | Description | | --- | --- | --- | | sq.urls.shorten(body) | POST /urls/shorten | Shorten URL | | sq.urls.list(query?) | GET /urls | List short URLs | | sq.urls.get(urlId) | GET /urls/{url_id} | Get short URL | | sq.urls.delete(urlId) | DELETE /urls/{url_id} | Delete short URL | | sq.urls.getStats(urlId) | GET /urls/{url_id}/stats | Get short URL stats | | sq.urls.updateShort(id, body) | PATCH /urls/{id} | Update a short URL |

Videos

| Method | Endpoint | Description | | --- | --- | --- | | sq.videos.listModels() | GET /videos/models | List available video models | | sq.videos.generate(body) | POST /videos/generate | Generate video | | sq.videos.list(query?) | GET /videos | List videos | | sq.videos.get(videoId) | GET /videos/{video_id} | Get video | | sq.videos.delete(videoId) | DELETE /videos/{video_id} | Delete video | | sq.videos.generateHook(body?) | POST /videos/hook | Generate a viral hook line | | sq.videos.suggestBroll(body) | POST /videos/broll-suggest | Suggest B-roll moments | | sq.videos.suggestEmphasis(body) | POST /videos/emphasis | Suggest on-screen emphasis | | sq.videos.generateViralThumbnail(body) | POST /videos/viral-thumbnail | Generate a viral thumbnail |

Webhooks

| Method | Endpoint | Description | | --- | --- | --- | | sq.webhooks.list() | GET /webhooks | List webhooks | | sq.webhooks.create(body) | POST /webhooks | Create webhook | | sq.webhooks.update(id, body) | PUT /webhooks/{id} | Update webhook | | sq.webhooks.delete(id) | DELETE /webhooks/{id} | Delete webhook | | sq.webhooks.listLogs(query?) | GET /webhooks/logs | List webhook delivery logs | | sq.webhooks.test(id) | POST /webhooks/{id}/test | Send test webhook | | sq.webhooks.replayDelivery(id) | POST /webhooks/deliveries/{id}/replay | Replay a webhook delivery |

WhatsApp

| Method | Endpoint | Description | | --- | --- | --- | | sq.whatsApp.sendWhatsAppMessage(body) | POST /whatsapp/messages | Send a WhatsApp message | | sq.whatsApp.listWhatsAppTemplates(query?) | GET /whatsapp/templates | List message templates | | sq.whatsApp.createWhatsAppTemplate(body) | POST /whatsapp/templates | Create a message template | | sq.whatsApp.getWhatsAppBusinessProfile(query?) | GET /whatsapp/business-profile | Get business profile | | sq.whatsApp.updateWhatsAppBusinessProfile(body) | PATCH /whatsapp/business-profile | Update business profile | | sq.whatsApp.listWhatsAppPhoneNumbers(query?) | GET /whatsapp/phone-numbers | List phone numbers | | sq.whatsApp.listWhatsAppFlows(query?) | GET /whatsapp/flows | List flows | | sq.whatsApp.createWhatsAppFlow(body) | POST /whatsapp/flows | Create a flow | | sq.whatsApp.getWhatsAppFlow(flowId, query?) | GET /whatsapp/flows/{flow_id} | Get flow | | sq.whatsApp.updateWhatsAppFlow(flowId, body) | PATCH /whatsapp/flows/{flow_id} | Update flow | | sq.whatsApp.deleteWhatsAppFlow(flowId, query?) | DELETE /whatsapp/flows/{flow_id} | Delete flow | | sq.whatsApp.getWhatsAppFlowJson(flowId, query?) | GET /whatsapp/flows/{flow_id}/json | Get flow JSON asset | | sq.whatsApp.uploadWhatsAppFlowJson(flowId, body) | PUT /whatsapp/flows/{flow_id}/json | Upload flow JSON | | sq.whatsApp.getWhatsAppFlowPreview(flowId, query?) | GET /whatsapp/flows/{flow_id}/preview | Get flow preview URL | | sq.whatsApp.publishWhatsAppFlow(flowId, body) | POST /whatsapp/flows/{flow_id}/publish | Publish flow | | sq.whatsApp.deprecateWhatsAppFlow(flowId, body) | POST /whatsapp/flows/{flow_id}/deprecate | Deprecate flow | | sq.whatsApp.getWhatsAppBlockedUsers(query?) | GET /whatsapp/block-users | List blocked users | | sq.whatsApp.blockWhatsAppUsers(body) | POST /whatsapp/block-users | Block users | | sq.whatsApp.unblockWhatsAppUsers(body) | DELETE /whatsapp/block-users | Unblock users | | sq.whatsApp.listWhatsAppSandboxSessions() | GET /whatsapp/sandbox/sessions | List your sandbox sessions | | sq.whatsApp.createWhatsAppSandboxSession(body) | POST /whatsapp/sandbox/sessions | Start a sandbox activation | | sq.whatsApp.deleteWhatsAppSandboxSession(sessionId) | DELETE /whatsapp/sandbox/sessions/{session_id} | Revoke a sandbox session | | sq.whatsApp.sendWhatsAppSandboxMessage(sessionId) | POST /whatsapp/sandbox/sessions/{session_id}/send | Send the sandbox template | | sq.whatsApp.getWhatsAppNumberBridgeStatus(senderId) | GET /whatsapp/numbers/{sender_id}/bridge | Bridge status | | sq.whatsApp.startWhatsAppNumberBridge(senderId) | POST /whatsapp/numbers/{sender_id}/bridge | Bridge an owned number onto WhatsApp | | sq.whatsApp.requestWhatsAppNumberBridgeCode(senderId, body?) | POST /whatsapp/numbers/{sender_id}/bridge/request-code | Request a verification code | | sq.whatsApp.verifyWhatsAppNumberBridge(senderId, body) | POST /whatsapp/numbers/{sender_id}/bridge/verify | Submit the verification code | | sq.whatsApp.getTemplate(name, query?) | GET /whatsapp/templates/{name} | Get a WhatsApp template | | sq.whatsApp.updateTemplate(name, body) | PATCH /whatsapp/templates/{name} | Update a WhatsApp template | | sq.whatsApp.deleteTemplate(name, query?) | DELETE /whatsapp/templates/{name} | Delete a WhatsApp template | | sq.whatsApp.updateProfilePhoto(body) | POST /whatsapp/business-profile/photo | Set the WhatsApp profile photo | | sq.whatsApp.getDisplayName(query?) | GET /whatsapp/business-profile/display-name | Get the WhatsApp display name | | sq.whatsApp.updateDisplayName(body) | POST /whatsapp/business-profile/display-name | Request a WhatsApp display-name change | | sq.whatsApp.listTemplateLibrary(query?) | GET /whatsapp/template-library | Browse the shared template library | | sq.whatsApp.createTemplateFromLibrary(body) | POST /whatsapp/templates/from-library | Adopt a library template |

Workspaces

| Method | Endpoint | Description | | --- | --- | --- | | sq.workspaces.list() | GET /workspaces | List workspaces (sub-accounts) | | sq.workspaces.create(body) | POST /workspaces | Create a workspace (sub-account) | | sq.workspaces.bulkAction(body) | POST /workspaces/bulk | Bulk sub-account action | | sq.workspaces.get(id) | GET /workspaces/{id} | Get a workspace (sub-account) | | sq.workspaces.delete(id, body) | DELETE /workspaces/{id} | Delete a workspace (sub-account) | | sq.workspaces.disableSaas(id, body?) | POST /workspaces/{id}/disable-saas | Disable SaaS mode for a workspace | | sq.workspaces.pause(id) | POST /workspaces/{id}/pause | Pause (suspend) a workspace | | sq.workspaces.resume(id) | POST /workspaces/{id}/resume | Resume a paused workspace | | sq.workspaces.getSubscription(id) | GET /workspaces/{id}/subscription | Get a sub-account's subscription | | sq.workspaces.getWallet(id) | GET /workspaces/{id}/wallet | Get a sub-account's wallet balance | | sq.workspaces.listSaasPlans() | GET /saas/plans | List SaaS plans | | sq.workspaces.getSaasPlan(id) | GET /saas/plans/{id} | Get a SaaS plan |

Regeneration

This SDK is generated from the SmartlyQ OpenAPI spec. When the spec changes, CI regenerates the client, README, and tests, bumps the version, and publishes to npm automatically.

License

MIT