Link tags. spoo.tags lists, creates, updates and deletes the account's tags; each has a name, one of nine colours and an icon from the server's set. Tag ids are branded as TagId, the way link ids are UrlId, so a name can never be passed where an id belongs.
const launch = await spoo.tags.create({ name: "launch", color: "violet", icon: "rocket" });
await spoo.links.create({ long_url: "https://example.com/launch", tag_ids: [launch.id] });
await spoo.links.update(id, { tag_ids: [launch.id] }); // replaces the list; [] or null clears it
const tagged = await spoo.links.list({
filter: { tagNames: ["launch", "q3"], tagsMatch: "all" },
});
await spoo.links.bulk.updateTags(ids, { add: [launch.id], remove: [oldTag.id] });tag_ids on links.create and links.update (a whole-list replace, [] clears), tags: TagRef[] on Link and CreatedLink, tagIds, tagNames and tagsMatch on the list filter, and tag (names) or tagId (ids) on stats.get and stats.export. The per-link stats calls do not take them, since the API does not accept them there. Unknown colour or icon keys from a newer server pass through as strings.