API reference
4 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.
Any member may read. This is the grounding an AI generation uses — brand description, audience, product context, tone, style rules, exemplars and the distilled learned memo.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
organizationIdstringRequiredAt least 1 character.
200BrandVoiceReadResultThe workspace's profile, or null
okbooleanRequiredprofileBrandVoiceProfile | any | nullRequiredNull when the workspace has never configured a profile — a legitimate answer, not an error.
idstringRequiredorganizationIdstringRequiredbrandDescriptionstringRequiredaudiencestringRequiredproductContextstringRequireddefaultTonestring | nullRequired"professional""casual""bold""friendly""thought_leader""playful""hype""punchy"nullstyleRulesobjectRequireddosstring[]At most 20 items. Defaults to [].
dontsstring[]At most 20 items. Defaults to [].
bannedPhrasesstring[]At most 20 items. Defaults to [].
emojiPolicystring"never""sparing""freely"hashtagPolicystring"never""sparing""freely"ctaPolicystring"never""when_relevant""always"languagestringAt most 100 characters. Defaults to "".
exemplarsobject[]RequiredlearnedMemostring | nullRequiredlearnedMemoVersionintegerRequiredBumped by the distillation job when it rewrites the memo, so a caller can tell whether a cached memo is stale. Never moved by a settings save.
learnedMemoUpdatedAtstring | nullRequiredISO 8601.
aiLearningEnabledbooleanRequireduseVoiceSamplesbooleanRequiredcreatedAtstringRequiredISO 8601.
updatedAtstringRequiredISO 8601.
curl -X GET "https://orbitwrite.com/api/v1/brand-voice?organizationId=organizationId" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY"{
"ok": true,
"profile": {
"id": "string",
"organizationId": "string",
"brandDescription": "string",
"audience": "string",
"productContext": "string",
"defaultTone": "professional",
"styleRules": {
"dos": [],
"donts": [],
"bannedPhrases": [],
"emojiPolicy": "never",
"hashtagPolicy": "never",
"ctaPolicy": "never",
"language": ""
},
"exemplars": [
{
"id": "string",
"text": "string",
"note": "string"
}
],
"learnedMemo": "string",
"learnedMemoVersion": 0,
"learnedMemoUpdatedAt": "string",
"aiLearningEnabled": true,
"useVoiceSamples": true,
"createdAt": "string",
"updatedAt": "string"
}
}Creates a profile carrying only the chosen tone. Any member may seed — it is part of onboarding — but an existing profile is never overwritten.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
organizationIdstringRequiredAt least 1 character.
defaultTonestringRequired"professional""casual""bold""friendly""thought_leader""playful""hype""punchy"200BrandVoiceSeedResultThe profile, and whether this call created it
okbooleanRequiredseededbooleanRequiredFalse when a profile already existed and was left untouched — so a caller isn't left assuming its tone was applied.
profileBrandVoiceProfile | any | nullRequiredidstringRequiredorganizationIdstringRequiredbrandDescriptionstringRequiredaudiencestringRequiredproductContextstringRequireddefaultTonestring | nullRequired"professional""casual""bold""friendly""thought_leader""playful""hype""punchy"nullstyleRulesobjectRequireddosstring[]At most 20 items. Defaults to [].
dontsstring[]At most 20 items. Defaults to [].
bannedPhrasesstring[]At most 20 items. Defaults to [].
emojiPolicystring"never""sparing""freely"hashtagPolicystring"never""sparing""freely"ctaPolicystring"never""when_relevant""always"languagestringAt most 100 characters. Defaults to "".
exemplarsobject[]RequiredlearnedMemostring | nullRequiredlearnedMemoVersionintegerRequiredBumped by the distillation job when it rewrites the memo, so a caller can tell whether a cached memo is stale. Never moved by a settings save.
learnedMemoUpdatedAtstring | nullRequiredISO 8601.
aiLearningEnabledbooleanRequireduseVoiceSamplesbooleanRequiredcreatedAtstringRequiredISO 8601.
updatedAtstringRequiredISO 8601.
curl -X POST "https://orbitwrite.com/api/v1/brand-voice" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organizationId": "string",
"defaultTone": "professional"
}'{
"ok": true,
"seeded": true,
"profile": {
"id": "string",
"organizationId": "string",
"brandDescription": "string",
"audience": "string",
"productContext": "string",
"defaultTone": "professional",
"styleRules": {
"dos": [],
"donts": [],
"bannedPhrases": [],
"emojiPolicy": "never",
"hashtagPolicy": "never",
"ctaPolicy": "never",
"language": ""
},
"exemplars": [
{
"id": "string",
"text": "string",
"note": "string"
}
],
"learnedMemo": "string",
"learnedMemoVersion": 0,
"learnedMemoUpdatedAt": "string",
"aiLearningEnabled": true,
"useVoiceSamples": true,
"createdAt": "string",
"updatedAt": "string"
}
}Requires brandVoice:update (owner/admin/manager). A full save of the content fields; learnedMemo and the AI toggles fall back to their stored values when omitted, so a partial client never wipes what the distillation job learned or silently turns learning off.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
brandDescriptionstringAt most 2000 characters. Defaults to "".
audiencestringAt most 2000 characters. Defaults to "".
productContextstringAt most 2000 characters. Defaults to "".
defaultTonestring | null"professional""casual""bold""friendly""thought_leader""playful""hype""punchy"nullstyleRulesobjectDefaults to {}.
dosstring[]At most 20 items. Defaults to [].
dontsstring[]At most 20 items. Defaults to [].
bannedPhrasesstring[]At most 20 items. Defaults to [].
emojiPolicystring"never""sparing""freely"hashtagPolicystring"never""sparing""freely"ctaPolicystring"never""when_relevant""always"languagestringAt most 100 characters. Defaults to "".
exemplarsobject[]At most 8 items. Defaults to [].
learnedMemostring | nullAt most 8000 characters.
aiLearningEnabledbooleanuseVoiceSamplesbooleanorganizationIdstringRequiredAt least 1 character.
200BrandVoiceUpdateResultThe saved profile
okbooleanRequiredprofileBrandVoiceProfileRequiredidstringRequiredorganizationIdstringRequiredbrandDescriptionstringRequiredaudiencestringRequiredproductContextstringRequireddefaultTonestring | nullRequired"professional""casual""bold""friendly""thought_leader""playful""hype""punchy"nullstyleRulesobjectRequireddosstring[]At most 20 items. Defaults to [].
dontsstring[]At most 20 items. Defaults to [].
bannedPhrasesstring[]At most 20 items. Defaults to [].
emojiPolicystring"never""sparing""freely"hashtagPolicystring"never""sparing""freely"ctaPolicystring"never""when_relevant""always"languagestringAt most 100 characters. Defaults to "".
exemplarsobject[]RequiredlearnedMemostring | nullRequiredlearnedMemoVersionintegerRequiredBumped by the distillation job when it rewrites the memo, so a caller can tell whether a cached memo is stale. Never moved by a settings save.
learnedMemoUpdatedAtstring | nullRequiredISO 8601.
aiLearningEnabledbooleanRequireduseVoiceSamplesbooleanRequiredcreatedAtstringRequiredISO 8601.
updatedAtstringRequiredISO 8601.
curl -X PUT "https://orbitwrite.com/api/v1/brand-voice" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organizationId": "string"
}'{
"ok": true,
"profile": {
"id": "string",
"organizationId": "string",
"brandDescription": "string",
"audience": "string",
"productContext": "string",
"defaultTone": "professional",
"styleRules": {
"dos": [],
"donts": [],
"bannedPhrases": [],
"emojiPolicy": "never",
"hashtagPolicy": "never",
"ctaPolicy": "never",
"language": ""
},
"exemplars": [
{
"id": "string",
"text": "string",
"note": "string"
}
],
"learnedMemo": "string",
"learnedMemoVersion": 0,
"learnedMemoUpdatedAt": "string",
"aiLearningEnabled": true,
"useVoiceSamples": true,
"createdAt": "string",
"updatedAt": "string"
}
}Requires brandVoice:update. Rewrites the learned memo from the workspace's generation history and bumps learnedMemoVersion.
A signed-in session only. The Orbitwrite app calls this; an API key is refused.
organizationIdstringRequiredAt least 1 character.
200BrandVoiceDistillResultThe refreshed memo
okbooleanRequiredmemostringRequiredversionintegerRequiredcountsobjectRequirededitedPairsintegerRequiredshippedUnchangedintegerRequiredrefineEventsintegerRequiredrejectionCommentsintegerRequired422ErrorLearning disabled for the workspace, or not enough signal
curl -X POST "https://orbitwrite.com/api/v1/brand-voice/distill" \
-H "Authorization: Bearer $ORBITWRITE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organizationId": "string"
}'{
"ok": true,
"memo": "string",
"version": 0,
"counts": {
"editedPairs": 0,
"shippedUnchanged": 0,
"refineEvents": 0,
"rejectionComments": 0
}
}