🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@robinpath/tiktok

Package Overview
Dependencies
Maintainers
4
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@robinpath/tiktok - npm Package Compare versions

Comparing version
0.1.1
to
0.3.0
+6
dist/index.d.ts
import type { ModuleAdapter } from "@robinpath/core";
declare const TiktokModule: ModuleAdapter;
export default TiktokModule;
export { TiktokModule };
export { TiktokFunctions, TiktokFunctionMetadata, TiktokModuleMetadata, TiktokCredentialTypes, } from "./tiktok.js";
//# sourceMappingURL=index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,YAAY,EAAE,aAQnB,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
import { TiktokFunctions, TiktokFunctionMetadata, TiktokModuleMetadata, TiktokCredentialTypes, configureTiktok, } from "./tiktok.js";
const TiktokModule = {
name: "tiktok",
functions: TiktokFunctions,
functionMetadata: TiktokFunctionMetadata,
moduleMetadata: TiktokModuleMetadata,
credentialTypes: TiktokCredentialTypes,
configure: configureTiktok,
global: false,
};
export default TiktokModule;
export { TiktokModule };
export { TiktokFunctions, TiktokFunctionMetadata, TiktokModuleMetadata, TiktokCredentialTypes, } from "./tiktok.js";
//# sourceMappingURL=index.js.map
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,MAAM,YAAY,GAAkB;IAClC,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,eAAe;IAC1B,gBAAgB,EAAE,sBAAsB;IACxC,cAAc,EAAE,oBAAoB;IACpC,eAAe,EAAE,qBAAqB;IACtC,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
/**
* RobinPath TikTok Module (Node port)
*
* TikTok Business / Marketing API v1.3 — campaigns and ads. Mirror of the
* PHP adapter for the WordPress plugin; shares the same credential
* contract, metadata shape, and error taxonomy so the visual editor
* renders both identically.
*
* Authentication is the `Access-Token` header (NOT `Authorization:
* Bearer`). Every write carries an `advertiser_id` — the module falls
* back to the credential's `advertiser_id` when the caller omits it.
*
* Credential type declared by this module:
* - tiktok : { access_token, advertiser_id? }
*/
import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core";
export declare function configureTiktok(h: ModuleHost): void;
export declare const TiktokFunctions: Record<string, BuiltinHandler>;
export declare const TiktokCredentialTypes: CredentialTypeSchema[];
export declare const TiktokFunctionMetadata: Record<string, FunctionMetadata>;
export declare const TiktokModuleMetadata: ModuleMetadata;
//# sourceMappingURL=tiktok.d.ts.map
{"version":3,"file":"tiktok.d.ts","sourceRoot":"","sources":["../src/tiktok.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAEnD;AA6RD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAI1D,CAAC;AAIF,eAAO,MAAM,qBAAqB,EAAE,oBAAoB,EA0BvD,CAAC;AAkCF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAsHnE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAqBlC,CAAC"}
/**
* RobinPath TikTok Module (Node port)
*
* TikTok Business / Marketing API v1.3 — campaigns and ads. Mirror of the
* PHP adapter for the WordPress plugin; shares the same credential
* contract, metadata shape, and error taxonomy so the visual editor
* renders both identically.
*
* Authentication is the `Access-Token` header (NOT `Authorization:
* Bearer`). Every write carries an `advertiser_id` — the module falls
* back to the credential's `advertiser_id` when the caller omits it.
*
* Credential type declared by this module:
* - tiktok : { access_token, advertiser_id? }
*/
// ── Module-local state (populated by configure hook) ────────────────────
const state = {};
function host() {
if (!state.host) {
throw new Error("TikTok module not initialized. Pass the adapter to rp.installModule() so its configure() hook runs first.");
}
return state.host;
}
export function configureTiktok(h) {
state.host = h;
}
// ── Constants ──────────────────────────────────────────────────────────
const API_BASE = "https://business-api.tiktok.com/open_api/v1.3/";
const CREDENTIAL_TYPE = "tiktok";
function errorReturn(error, code, extra = {}) {
return { error, code, ...extra };
}
function isErr(x) {
return (typeof x === "object" &&
x !== null &&
"error" in x &&
"code" in x);
}
async function resolveAuth(credentialSlug) {
if (!credentialSlug) {
return errorReturn("Credential slug is required.", "credential_not_found");
}
let fields;
try {
fields = await host().credentials.get(credentialSlug);
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found");
}
if (!fields) {
return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found");
}
const token = String(fields.access_token ?? "");
if (!token) {
return errorReturn("Credential has no `access_token` field.", "token_missing");
}
const defaultAdvertiser = String(fields.advertiser_id ?? "");
return { token, defaultAdvertiser };
}
// ── HTTP helper (normalized envelope, never throws for API errors) ─────
async function http(token, method, pathAndQuery, body) {
const url = API_BASE + pathAndQuery.replace(/^\/+/, "");
const headers = {
"Access-Token": token,
Accept: "application/json",
};
if (body !== undefined && body !== null) {
headers["Content-Type"] = "application/json";
}
const init = { method, headers };
if (body !== undefined && body !== null)
init.body = JSON.stringify(body);
let response;
try {
response = await fetch(url, init);
}
catch (e) {
return errorReturn(e instanceof Error ? e.message : String(e), "transport");
}
const raw = await response.text();
let decoded;
try {
decoded = raw ? JSON.parse(raw) : null;
}
catch {
decoded = { raw };
}
// TikTok always returns HTTP 200 even on errors; check `code` in envelope.
// { code: 0, message: "OK", data: {...}, request_id: "..." }
// { code: 40002, message: "Missing required field", request_id: "..." }
if (decoded && typeof decoded === "object") {
const env = decoded;
const apiCode = Number(env.code ?? -1);
if (apiCode === 0) {
return env.data !== undefined ? env.data : env;
}
if (apiCode > 0) {
const msg = typeof env.message === "string" ? env.message : `TikTok error ${apiCode}`;
let code = "tiktok_error";
if (apiCode === 40100 || apiCode === 40101 || apiCode === 40105) {
code = "unauthorized";
}
else if (apiCode === 40002) {
code = "fields_missing";
}
else if (apiCode === 50002) {
code = "rate_limited";
}
return errorReturn(msg, code, {
status: response.status,
tiktok_error: decoded,
});
}
}
if (response.status >= 200 && response.status < 300) {
return decoded ?? { ok: true };
}
return errorReturn(`TikTok returned HTTP ${response.status}.`, response.status === 429 ? "rate_limited" : "tiktok_error", { status: response.status, tiktok_error: decoded });
}
// ── Helpers ────────────────────────────────────────────────────────────
function asString(v) {
if (v === undefined || v === null)
return "";
return String(v);
}
function asOpts(v) {
return v && typeof v === "object" && !Array.isArray(v)
? v
: {};
}
/**
* TikTok GET endpoints serialise arrays/objects as JSON strings in the
* query string (NOT as repeated keys). Handle both scalars and structured
* values correctly.
*/
function buildTikTokQuery(opts) {
const params = new URLSearchParams();
for (const [k, v] of Object.entries(opts)) {
if (v === undefined || v === null)
continue;
if (typeof v === "object") {
params.set(k, JSON.stringify(v));
}
else {
params.set(k, String(v));
}
}
const qs = params.toString();
return qs ? `?${qs}` : "";
}
// ── Handlers: Campaigns ────────────────────────────────────────────────
const listCampaigns = async (args) => {
const cred = asString(args[0]);
const opts = asOpts(args[1]);
const auth = await resolveAuth(cred);
if (isErr(auth))
return auth;
const advertiserId = asString(opts.advertiser_id) || auth.defaultAdvertiser;
if (!advertiserId) {
return errorReturn("`advertiser_id` is required (or set it on the credential).", "advertiser_missing");
}
const query = { advertiser_id: advertiserId };
if (opts.filtering)
query.filtering = opts.filtering;
if (opts.fields)
query.fields = opts.fields;
if (opts.page !== undefined)
query.page = Number(opts.page) | 0;
if (opts.page_size !== undefined) {
const n = Math.max(1, Math.min(1000, Number(opts.page_size) | 0));
query.page_size = n;
}
return (await http(auth.token, "GET", `campaign/get/${buildTikTokQuery(query)}`));
};
// ── Handlers: Ads ──────────────────────────────────────────────────────
const getAd = async (args) => {
const cred = asString(args[0]);
const adIdRaw = args[1];
const opts = asOpts(args[2]);
const auth = await resolveAuth(cred);
if (isErr(auth))
return auth;
const advertiserId = asString(opts.advertiser_id) || auth.defaultAdvertiser;
if (!advertiserId) {
return errorReturn("`advertiser_id` is required (or set it on the credential).", "advertiser_missing");
}
// adId may be a single string or an array of ad IDs for bulk lookups.
const adIds = Array.isArray(adIdRaw)
? adIdRaw.map(String)
: adIdRaw !== undefined && adIdRaw !== null && adIdRaw !== ""
? [asString(adIdRaw)]
: [];
if (adIds.length === 0) {
return errorReturn("`adId` is required (string or array).", "fields_missing");
}
const query = {
advertiser_id: advertiserId,
filtering: { ad_ids: adIds },
};
if (opts.fields)
query.fields = opts.fields;
if (opts.page !== undefined)
query.page = Number(opts.page) | 0;
if (opts.page_size !== undefined) {
const n = Math.max(1, Math.min(1000, Number(opts.page_size) | 0));
query.page_size = n;
}
return (await http(auth.token, "GET", `ad/get/${buildTikTokQuery(query)}`));
};
const createAd = async (args) => {
const cred = asString(args[0]);
const input = args[1];
if (!input || typeof input !== "object") {
return errorReturn("`ad` payload is required (object).", "fields_missing");
}
const auth = await resolveAuth(cred);
if (isErr(auth))
return auth;
const body = { ...input };
if (!body.advertiser_id) {
if (!auth.defaultAdvertiser) {
return errorReturn("`advertiser_id` is required (or set it on the credential).", "advertiser_missing");
}
body.advertiser_id = auth.defaultAdvertiser;
}
if (!body.adgroup_id) {
return errorReturn("`adgroup_id` is required in the ad payload.", "fields_missing");
}
if (!body.creatives) {
return errorReturn("`creatives` is required — an array of creative objects.", "fields_missing");
}
return (await http(auth.token, "POST", "ad/create/", body));
};
// ── Exports: functions map ─────────────────────────────────────────────
export const TiktokFunctions = {
listCampaigns,
getAd,
createAd,
};
// ── Exports: credential types ──────────────────────────────────────────
export const TiktokCredentialTypes = [
{
slug: CREDENTIAL_TYPE,
title: "TikTok Business / Marketing API",
icon: "video",
fields: [
{
name: "access_token",
title: "Access Token",
type: "password",
required: true,
placeholder: "…",
description: "Long-lived access token from the TikTok for Business OAuth flow. Sent in the `Access-Token` header.",
},
{
name: "advertiser_id",
title: "Default Advertiser ID",
type: "text",
required: false,
placeholder: "1234567890123456789",
description: "Optional. Used as a fallback when methods omit `advertiser_id`. Find it in TikTok Ads Manager → Settings → Advertiser info.",
},
],
},
];
// ── Exports: metadata ──────────────────────────────────────────────────
const credentialParam = {
name: "credential",
title: "Credential",
description: "Slug of a saved `tiktok` credential.",
dataType: "string",
formInputType: "resource",
required: true,
allowExpression: true,
placeholder: "my_tiktok",
resource: {
type: "credential",
listFn: "credential.list",
modes: ["list", "expression"],
searchable: true,
filter: { type: CREDENTIAL_TYPE },
},
};
const commonErrors = {
credential_not_found: "No credential with that slug exists in the vault.",
token_missing: "The credential exists but has no `access_token` field.",
advertiser_missing: "No `advertiser_id` provided and the credential has no default.",
fields_missing: "Required field is missing from the payload.",
transport: "Network failure calling business-api.tiktok.com.",
tiktok_error: "TikTok returned an error — see `tiktok_error.code` and `.message`.",
rate_limited: "TikTok rate limited the request.",
unauthorized: "Access token is invalid, expired, or missing the required scope.",
};
export const TiktokFunctionMetadata = {
listCampaigns: {
title: "List campaigns",
summary: "List campaigns for an advertiser",
description: "Calls `GET /open_api/v1.3/campaign/get/`. Pass a `filtering` object to narrow by status, objective, budget, etc. TikTok serialises structured query params as JSON strings — the module handles that.",
group: "campaigns",
action: "query",
icon: "megaphone",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["tiktok", "campaign", "ads"],
parameters: [
credentialParam,
{
name: "options",
title: "Options",
description: "Recognized keys:\n advertiser_id : defaults to credential's advertiser_id\n filtering : { primary_status, campaign_ids: [...], objective_type, … }\n fields : ['campaign_id','campaign_name','status','budget',…]\n page : 1-indexed (default 1)\n page_size : 1–1000 (default 10)",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 6,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ list: [...], page_info: {page, page_size, total_number, total_page} }",
errors: commonErrors,
example: 'tiktok.listCampaigns "my_tiktok" {filtering: {primary_status: "STATUS_ENABLE"}, page_size: 50}',
},
getAd: {
title: "Get ad",
summary: "Look up one or more ads by ID",
description: "Calls `GET /open_api/v1.3/ad/get/` with a `filtering.ad_ids` filter. Pass either a single ad ID or an array of IDs.",
group: "ads",
action: "read",
icon: "target",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: true,
since: "1.0.0",
tags: ["tiktok", "ad", "read"],
parameters: [
credentialParam,
{
name: "adId",
title: "Ad ID(s)",
description: "A single ad ID string, or an array of ad IDs for bulk lookup.",
dataType: "any",
formInputType: "text",
required: true,
allowExpression: true,
placeholder: "1234567890123456789",
},
{
name: "options",
title: "Options",
description: "Recognized keys:\n advertiser_id : defaults to credential's advertiser_id\n fields : ['ad_id','ad_name','status','creative_material_mode',…]\n page, page_size",
dataType: "object",
formInputType: "json",
required: false,
allowExpression: true,
language: "json",
rows: 5,
advanced: true,
},
],
returnType: "object",
returnDescription: "{ list: [...], page_info: {...} }",
errors: commonErrors,
example: 'tiktok.getAd "my_tiktok" "1234567890123456789"',
},
createAd: {
title: "Create ad",
summary: "Create ads within an ad group",
description: "Calls `POST /open_api/v1.3/ad/create/`. Required fields: `adgroup_id` and `creatives` (an array of creative objects with `ad_name`, `ad_format`, `video_id` or `image_ids`, `ad_text`, `landing_page_url`, etc.).",
group: "ads",
action: "write",
icon: "plus",
capability: "manage_options",
sideEffects: ["makes_http_call"],
idempotent: false,
since: "1.0.0",
tags: ["tiktok", "ad", "create"],
parameters: [
credentialParam,
{
name: "ad",
title: "Ad payload",
description: "Fields:\n advertiser_id : defaults to credential\n adgroup_id : required — target ad group\n creatives : required — array of creative objects, e.g.\n [{\n ad_name, ad_format, ad_text,\n video_id | image_ids,\n call_to_action, landing_page_url,\n identity_id, identity_type\n }]",
dataType: "object",
formInputType: "json",
required: true,
allowExpression: true,
language: "json",
rows: 10,
placeholder: '{\n "adgroup_id": "…",\n "creatives": [\n { "ad_name": "Spring Sale", "ad_format": "SINGLE_VIDEO",\n "video_id": "…", "ad_text": "Shop now",\n "call_to_action": "SHOP_NOW",\n "landing_page_url": "https://example.com" }\n ]\n}',
},
],
returnType: "object",
returnDescription: "{ ad_ids: ['…', …] }",
errors: commonErrors,
example: 'tiktok.createAd "my_tiktok" {adgroup_id: "…", creatives: [{ad_name: "Test", ad_format: "SINGLE_VIDEO", video_id: "…", ad_text: "Shop", call_to_action: "SHOP_NOW", landing_page_url: "https://example.com"}]}',
},
};
export const TiktokModuleMetadata = {
slug: "tiktok",
title: "TikTok Ads",
summary: "List campaigns, fetch ads, and create ads via the TikTok Business / Marketing API",
description: "TikTok for Business / Marketing API v1.3 with bearer auth via the `Access-Token` header. Structured query parameters are serialised as JSON strings per TikTok's convention.\n\nAll methods accept `advertiser_id` either explicitly (in `options`) or as a credential default. Writes enforce required fields (`adgroup_id`, `creatives`) before hitting the network.\n\nFor operations not covered here (ad groups, reports, audiences, identities, creatives upload) drop to `http.*` with the same credential via `credential.field`.",
category: "marketing",
icon: "icon.svg",
color: "#FE2C55",
version: "0.2.0",
docsUrl: "https://docs.robinpath.com/modules/tiktok",
status: "stable",
requires: [],
minNodeVersion: "18.0.0",
credentialsType: CREDENTIAL_TYPE,
operationGroups: {
campaigns: { title: "Campaigns", description: "Ad campaigns.", order: 1 },
ads: { title: "Ads", description: "Individual ads within campaigns.", order: 2 },
},
methods: Object.keys(TiktokFunctions),
};
//# sourceMappingURL=tiktok.js.map
{"version":3,"file":"tiktok.js","sourceRoot":"","sources":["../src/tiktok.ts"],"names":[],"mappings":"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"}
+20
-10
{
"name": "@robinpath/tiktok",
"version": "0.1.1",
"version": "0.3.0",
"publishConfig": {

@@ -23,21 +23,31 @@ "access": "public"

"peerDependencies": {
"@robinpath/core": ">=0.20.0"
"@robinpath/core": ">=0.40.0"
},
"devDependencies": {
"@robinpath/core": "^0.30.1",
"@robinpath/core": "^0.40.0",
"typescript": "^5.6.0"
},
"description": "TikTok module for RobinPath.",
"description": "TikTok Business / Marketing API — list campaigns, fetch ads, create ads. Access-Token auth via the encrypted credential vault.",
"keywords": [
"tiktok",
"social media"
"ads",
"marketing",
"campaigns",
"social-media"
],
"license": "MIT",
"robinpath": {
"category": "social-media",
"type": "integration",
"auth": "api-key",
"functionCount": 17,
"baseUrl": "https://open.tiktokapis.com"
"category": "marketing",
"type": "module",
"auth": "credential-vault",
"credentialType": "tiktok",
"functionCount": 3,
"baseUrl": "https://business-api.tiktok.com/open_api/v1.3",
"language": "nodejs",
"platforms": [
"cloud",
"cli",
"desktop"
]
}
}

@@ -22,3 +22,3 @@ # @robinpath/tiktok

```bash
npm install @robinpath/tiktok
robinpath add @robinpath/tiktok
```

@@ -25,0 +25,0 @@