Community library
Browse the Nodaro community library from TypeScript, clone shared characters, locations and objects into your account, favorite them, and report a listing.
Available on Nodaro Cloud · Business edition
client.community reads the community library, the shared collection of characters, locations and objects curated by the Nodaro team. You can browse and search it, read a listing, clone a listing into your own account, favorite it, and report it for moderation. The methods call the Community REST API. See Community library for the feature and its likeness and consent rules.
The community library exists on multi-user installs: Nodaro Cloud and Business edition. A single-user Community edition install answers every call with NotFoundError. A deployment that does not allow public work serves no listing: browse() and favorites() return empty lists, and get(), getFull() and clone() throw NotFoundError.
Methods
| Method | What it does |
|---|---|
browse(params?) | Browse and search the listings |
get(slug) | Read one listing |
getFull(slug) | Read one listing with its full public snapshot |
favorites() | List the listings you favorited |
clone(id, entityType) | Copy a listing into your account |
favorite(id) | Add or remove a favorite |
report(id, reason) | Report a listing for moderation |
Publishing is not part of the SDK: the SDK's personal and OAuth tokens cannot publish.
client.community
A listing is a CommunityCard. Its fields use snake_case, as the API sends them. CommunityEntityType is "character", "location" or "object".
browse(params?)
Returns a page of public listings and a nextCursor (GET /v1/community/browse). Pass nextCursor back as cursor for the next page; it is null on the last page.
browse(params?: BrowseCommunityParams): Promise<{ data: CommunityCard[]; nextCursor: string | null }>Prop
Type
const { data: listings, nextCursor } = await client.community.browse({
entityType: "character",
sort: "popular",
limit: 20,
})get(slug)
Reads one listing by its slug (GET /v1/community/detail/:slug).
get(slug: string): Promise<{ data: CommunityCard }>Prop
Type
const { data: listing } = await client.community.get("detective-mara")Throws NotFoundError when the listing does not exist or is no longer active.
getFull(slug)
Reads one listing with its full public snapshot: its images, voice and text, as a detail page shows them (GET /v1/community/detail/:slug/full).
getFull(slug: string): Promise<{ data: CommunityFullDetail }>Prop
Type
const { data: detail } = await client.community.getFull("detective-mara")favorites()
Lists the listings you favorited (GET /v1/community/favorites).
favorites(): Promise<{ data: CommunityCard[] }>const { data: favorites } = await client.community.favorites()clone(id, entityType)
Copies a listing into your library as an independent copy (POST /v1/community/listings/:id/clone). Its files are copied into your own storage, so the copy stays when the original changes or is removed. It returns the kind and id of your new asset.
clone(id: string, entityType: "character" | "location" | "object"): Promise<{ entityType: string; id: string }>Prop
Type
const { id: characterId } = await client.community.clone(listingId, "character")
const character = await client.characters.get(characterId)An OAuth token needs the assets:write scope. Throws StorageExceededError when your storage is full.
favorite(id)
Adds a listing to your favorites, or removes it when it is already there (POST /v1/community/listings/:id/favorite). It returns the new state.
favorite(id: string): Promise<{ favorited: boolean }>Prop
Type
const { favorited } = await client.community.favorite(listingId)report(id, reason)
Reports a listing for moderation (POST /v1/community/listings/:id/report).
report(id: string, reason: CommunityReportReason): Promise<{ ok: true }>Prop
Type
await client.community.report(listingId, "real_person_no_consent")client.keepers
client.keepers reads Nodaro Keepers, the shared shelf of characters, creatures, locations and objects that the platform's admins choose, and copies an item into your account. The methods call the Keepers routes. Reading the shelf needs no credential, so a guest can browse it. Reading and copying cost no credits.
catalog(params?)
Returns one page of the shelf: { data: KeeperCatalogItem[], next }.
catalog(params?: { kind?: KeeperKind; cursor?: string; limit?: number }): Promise<KeeperCatalogPage>Prop
Type
Each item is { id, kind, name, description, imageUrl, previewUrl, category, sort, createdAt }. previewUrl is a 480-pixel-wide copy of the main image, for a tile. category is the shelf heading and sort the shelf order. The shelf holds display fields only. It is cached for a minute, and one address can read it 60 times a minute.
const { data, next } = await client.keepers.catalog({ kind: "character" })copy(kind, id)
Copies a shelf item into your account and returns { id, name, kind, created }. id is your own row: read it with client.characters.get(id) and the other asset methods.
copy(kind: KeeperKind, id: string): Promise<CopyKeeperResult>- The copy holds the public text, the main image and the variant assets. Every file is copied into your own storage and counts against it.
- A premade or library voice is carried. A custom or cloned voice is reduced to its name and sample. The owner's picker selections, reference photos and trained-model fields are never carried.
- The copy goes into your default project. It does not change when the original changes.
- One copy per person and item: a later call returns the same copy with
created: false. A copy you archived comes back unarchived, and a copy you already have stays yours whether or not the item is still on the shelf. - Throws
NotFoundErrorfor an item that is not on the shelf when you have no copy of it, a413 storage_limit_exceededwhen its files do not fit your storage, andForbiddenErrorwithpersonal_space_disabledwhen your organization closed the personal space. - An OAuth app token needs the
assets:writescope.
const { id } = await client.keepers.copy("character", item.id)
const mine = await client.characters.get(id)Frequently asked questions
How do I copy a community character into my account?
Call client.community.clone with the listing id and the entity type, such as character. The copy is yours and does not change when the original does. It counts against your storage.
Can I publish to the community library with the SDK?
No. Publishing is not part of the SDK. The SDK can browse, read, clone, favorite and report listings.
Why does client.community answer 404 on my install?
The community library exists on Nodaro Cloud and on Business edition installs. A single-user Community edition install has no community routes and answers 404.
How do I report a listing that shows a real person without consent?
Call client.community.report with the listing id and the reason real_person_no_consent. The listing goes to moderation.
How do I use a Nodaro Keepers character from the SDK?
Read the shelf with client.keepers.catalog, then call client.keepers.copy with the item's kind and id. The copy is a character of your own, and it costs no credits.
Related
Community library
Characters
Locations
Community Library
Last updated on
Objects and creatures
Create objects and creatures, generate main images and variants, animate them, and make a creature talk from TypeScript with the Nodaro SDK.
Studio productions
Create Studio productions from a plan, edit them with operations, generate stills and clips, review planned frames, and share or copy them from TypeScript.