PhoenixDevelopers

Skill API reference

On this page

The public third-party runtime is phoenix-declarative-v1. phoenix-skill-v1 is its inspectable source-container format. All values below describe the validator used by the Skill Store, not a proposed JavaScript SDK.

Who this is for: skill authors and administrators checking exact runtime and review contracts.

Manifest fields

FieldType and exact constraint
schemaNumber 1
runtimeString phoenix-declarative-v1
appIdapp- plus 36 lowercase hexadecimal/hyphen characters; must match your registered listing
version, minFirmwarePlain X.Y.Z, nonnegative safe integer components, no leading zeros or prerelease suffix
nameNonblank string, at most 60 characters
descriptionNonblank string, at most 1200 characters
releaseNotesString, at most 1200 characters; may be empty
permissionsUnique array containing display, optionally speech; no other values
launchNamesUp to 3 unique lowercase aliases, 3–40 letters/spaces, starting with a letter, no repeated or edge spaces; reserved commands refused
examplesOptional array, up to 4 nonblank strings, at most 300 characters each
supportUrl, reportUrlOptional HTTPS URLs, at most 500 characters; no credentials
startPageExisting page ID
pages1–16 page objects

Text rejects control characters except tab, newline and carriage return. IDs of pages start with a lowercase letter and contain only lowercase letters, digits or hyphens, up to 32 characters. Unknown object fields are rejected. Reserved aliases include stop, cancel, settings, restore, home assistant, agent mode, sleep, wake up, main menu, volume and jibo; the validator remains authoritative.

Cards and buttons

Every page has exactly id, title, text, buttons. Title is nonblank and at most 60 characters; text is at most 600 and may be empty. Buttons is an array of at most 3 objects, each with a nonblank label of at most 28 characters and an action.

{"id":"welcome","title":"Welcome","text":"Choose a button.","buttons":[{"label":"Next","action":{"type":"show","page":"about"}},{"label":"Hello","action":{"type":"speak","text":"Hello, friend."}},{"label":"Close","action":{"type":"close"}}]}
ActionParametersResult on the declarative manager
showtype: "show", page: string identifying an existing pageChanges the visible card
speaktype: "speak", text: string (nonblank, at most 300 characters)Requests speech; card stays open; requires speech
closetype: "close" onlyCloses the skill

Actions are data, not JavaScript functions; they have no Promise or return value available to the author. The example's computer-only createPreview(skill) returns an object with start() → page, tap(index) → {speech, page}, and stop() → null. It reports events rather than playing audio. tap throws for a missing button or unsupported action and refuses speech without permission.

JavaScript API availability

These often-requested spellings are not exported by this runtime. Do not copy them into a submitted skill expecting execution.

Proposed APICurrent supported equivalent or boundary
jibo.tts.say(text)Declarative speak action; no JS return value
jibo.screen / UI cards and buttonspages plus show / close actions
jibo.listen.ask(...)Unavailable; no microphone/listen permission
jibo.lookAt(...)Unavailable; no motion permission
jibo.anim.play(...)Unavailable; no animation permission
jibo.storageUnavailable; no persistent storage permission
jibo.httpUnavailable; no network permission or domain allowlist in this runtime
onStart, onUtterance, onStopNo author callbacks; manager-owned lifecycle

Native apps have a different trust and execution model. Operator review does not turn a declarative bundle into a native app, and publisher approval never authorizes arbitrary execution.

Source bundle contract

.phskill is UTF-8 JSON, either a plain validated declarative package or this container:

{"format":"phoenix-skill-v1","files":[{"path":"skill.json","text":"{...the complete declarative manifest...}"},{"path":"index.js","text":"// Optional computer-only preview source"}]}

files contains 1–5 unique entries with exactly path and text. Paths are fixed: skill.json (required), index.js, test.mjs, README.md, LICENSE. No nested paths, symlinks, external references or binary files. The full source container and canonical package each fit in the server's artifact limit (64 KiB by default). Strict JSON rejects duplicate keys and invalid UTF-8. JSON escaping expands source size, so use the kit's actual byte count rather than adding file lengths.

A ZIP may contain one skill folder with skill.json. The browser includes the fixed source paths, skips packaging metadata such as package.json, and shows how many files it kept. It refuses ambiguous manifests, unsafe paths, unsupported/encrypted archives, oversized output and bad CRCs. The server validates the resulting container again. ZIP is an authoring convenience, not the installable format.

Publisher HTTP API

All paths below start with /api/skill-store. Use your signed-in browser session, not operator credentials. Mutations must be same-origin. Responses are JSON; errors have {error: "code"} and an appropriate HTTP status. The SDK never contains private signing keys.

Method and pathInputResponse
POST /publisher/apply{displayName, reason}Publisher dashboard with pending identity
GET /publisherNoneOwn publisher, apps, releases, submissions, feedback, limits and usage
POST /publisher/apps{name, description}New listing and server-assigned appId in id
POST /publisher/skill-releasesRaw .phskill bytes, Content-Type: application/vnd.phoenix.skillUnsigned submission: id, status, descriptor, source/artifact/material SHA-256
POST /publisher/releases{appId, package} for legacy data-only JSONSame exact-bundle review gate
POST /publisher/theme-releasesRaw .phtheme, Content-Type: application/vnd.phoenix.menu-themeValidated theme submission
PUT /publisher/listing{appId, visibility: "public"} after publicationUpdated listing

Check GET /publisher after every mutation. Pending bytes are not available in the public catalog or install APIs. Corrections use a higher version, including after rejection. Uploads are bounded and never retried automatically by this kit.

Administrator review HTTP API

These routes require an active administrator account. The browser Admin Review Queue uses the same service path as operator tooling.

Method and pathPurpose
GET /operatorPublisher applications and limits
POST /operator/publisher{publisherId, status: "approved" or "rejected", reason}
GET /operator/submissionsAll submission summaries
GET /operator/submissions/:idManifest, permissions, scope, prior approval, changed fields and file hashes
GET /operator/submissions/:id/file?path=skill.jsonInert JSON response with file text, byte length and SHA-256; themes may return normalized PNG base64
GET /operator/submissions/:id/material?part=sourceExact retained source download; part=normalized returns installable data
POST /operator/submissions/:id/decisionExact material/state-pinned review decision

A decision body contains materialHash, expectedState (pending or approved), decision, reason (1–1200 characters), testSummary (1–2400), method (human or agent) and a unique requestId (8–100 letters/digits/underscore/hyphen). Decisions are approve, approve_publish, request_changes, reject, and publish for already-approved bytes. Every decision records actor, method, time and hashes. State, roles, scope, version and artifact integrity are rechecked before signing. A stale review cannot publish changed bytes.

Runnable complete example · Publishing guide