@robinpath/tiktok
Advanced tools
| 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"} |
+422
| /** | ||
| * 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" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/tiktok | ||
| ```bash | ||
| npm install @robinpath/tiktok | ||
| robinpath add @robinpath/tiktok | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
37564
901.97%10
400%463
Infinity%2
100%