No description available.
Input
application/jsonname
string
Required
The pet's name. Basic Latin only for now: letters, digits, spaces and . , ! ? ' - and nothing else. ⚠ THE LEXICON CANNOT EXPRESS THAT — atproto lexicons have no pattern facet — so createPet.lua is where it is enforced and where the reasoning lives. In short: the leaderboard is public, which makes an unrestricted name string an attack surface (right-to-left overrides, stacking combining marks, zero-width impersonation) rather than a preference; and the two pixel faces disagree about the remaining punctuation, so anything outside this set renders one character in a different typeface mid-word. Leading and trailing whitespace is trimmed and internal runs are collapsed to a single space BEFORE the name is signed and stored.
maxLength: 64 bytesminLength: 1 bytesspecies
string
Required
No description available.
Output
application/jsonactive
boolean
Optional
Whether the new pet went straight onto the stage, or is waiting because the player is already at activePetCap. ABSENT when the server could not tell — never guess it, and never default it to true: a client that says 'it's on the stage!' about a pet that is not there sends the player looking for it. Only active pets earn, so this is the difference between a purchase that starts paying immediately and one that does not.
createdAt
stringdatetime
Optional
An RFC 3339 formatted timestamp.
error
string
Optional
Present instead of uri/createdAt when the pet was not created for an expected reason. A stable machine code the client branches on — add codes, never rename them.
unknown-species, missing-name, invalid-name, name-too-long, cannot-afford, not-purchasable, definitions-unavailablemessage
string
Optional
A sentence to show the player, accompanying `error`. Free to reword; do not branch on it.
uri
stringat-uri
Optional
An AT Protocol URI (e.g., at://did:plc:xyz/app.bsky.feed.post/abc).
Try It
Requests are sent directly from your browser. Some servers may block requests due to CORS.
View raw schema
{
"type": "procedure",
"input": {
"schema": {
"type": "object",
"required": [
"species",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The pet's name. Basic Latin only for now: letters, digits, spaces and . , ! ? ' - and nothing else. ⚠ THE LEXICON CANNOT EXPRESS THAT — atproto lexicons have no pattern facet — so createPet.lua is where it is enforced and where the reasoning lives. In short: the leaderboard is public, which makes an unrestricted name string an attack surface (right-to-left overrides, stacking combining marks, zero-width impersonation) rather than a preference; and the two pixel faces disagree about the remaining punctuation, so anything outside this set renders one character in a different typeface mid-word. Leading and trailing whitespace is trimmed and internal runs are collapsed to a single space BEFORE the name is signed and stored."
},
"species": {
"type": "string"
}
}
},
"encoding": "application/json"
},
"output": {
"schema": {
"type": "object",
"required": [],
"properties": {
"uri": {
"type": "string",
"format": "at-uri"
},
"error": {
"type": "string",
"description": "Present instead of uri/createdAt when the pet was not created for an expected reason. A stable machine code the client branches on — add codes, never rename them.",
"knownValues": [
"unknown-species",
"missing-name",
"invalid-name",
"name-too-long",
"cannot-afford",
"not-purchasable",
"definitions-unavailable"
]
},
"active": {
"type": "boolean",
"description": "Whether the new pet went straight onto the stage, or is waiting because the player is already at activePetCap. ABSENT when the server could not tell — never guess it, and never default it to true: a client that says 'it's on the stage!' about a pet that is not there sends the player looking for it. Only active pets earn, so this is the difference between a purchase that starts paying immediately and one that does not."
},
"message": {
"type": "string",
"description": "A sentence to show the player, accompanying `error`. Free to reword; do not branch on it."
},
"createdAt": {
"type": "string",
"format": "datetime"
}
}
},
"encoding": "application/json"
}
}