Introduction
Programmatic read and write access to your team's style guides.
This documentation aims to provide all the information you need to work with our API.
<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".
Most authenticated endpoints are marked with a requires authentication badge in the documentation below; treat the badge as a hint rather than a guarantee, and check each endpoint's description for what it requires.
Generate a token from your team's settings page. Tokens may also be passed as ?key=<token> for legacy compatibility.
Endpoints
Introspect the calling token.
requires authentication
Returns the token's team, name, last use, and abilities. Any valid token is accepted; no ability is required.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/whoami" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/whoami"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/style-guides/{uuid}/voice-profile
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/2/voice-profile" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/style-guides/{uuid}/voice-profile
Example request:
curl --request POST \
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "POST",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
PATCH api/style-guides/{uuid}/voice-profile
Example request:
curl --request PATCH \
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "PATCH",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE api/style-guides/{uuid}/voice-profile
Example request:
curl --request DELETE \
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
POST api/style-guides/{uuid}/voice-profile/extract-from-samples
Example request:
curl --request POST \
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile/extract-from-samples" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"samples\": [
\"b\"
],
\"dry_run\": false
}"
const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/voice-profile/extract-from-samples"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"samples": [
"b"
],
"dry_run": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Idempotently provision a Stylus team for a sibling app's customer.
Behaviour:
- Find or create the User by email. New users get a random password and email_verified_at = now() — the caller (sibling app) is responsible for having verified the email before invoking this.
- Find the user's owned personal team; create one if missing.
- For brand-new teams, also create a default style guide.
- Always issue a fresh scoped team token. Existing tokens are not revoked.
Example request:
curl --request POST \
"https://stylus.proofedapps.com/api/teams/provision" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"email\": \"gbailey@example.net\",
\"name\": \"m\",
\"source_product\": \"i\",
\"default_guide_name\": \"y\",
\"webhook_url\": \"http:\\/\\/www.ernser.org\\/harum-mollitia-modi-deserunt-aut-ab-provident-perspiciatis-quo.html\"
}"
const url = new URL(
"https://stylus.proofedapps.com/api/teams/provision"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"email": "gbailey@example.net",
"name": "m",
"source_product": "i",
"default_guide_name": "y",
"webhook_url": "http:\/\/www.ernser.org\/harum-mollitia-modi-deserunt-aut-ab-provident-perspiciatis-quo.html"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Ingest a batch of signals for a guide.
Body: { "signals": [ { "signal_type": "suggestion_rejected", "rule_slug": "no-em-dashes", // optional "snippet": "...some text...", // optional "metadata": {...}, // optional "occurred_at": "2026-05-14T..." // optional, defaults to now }, ... ], "source_product": "elizabeth" }
Example request:
curl --request POST \
"https://stylus.proofedapps.com/api/style-guides/2/signals" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"source_product\": \"b\",
\"signals\": [
{
\"rule_slug\": \"b\",
\"snippet\": \"n\",
\"occurred_at\": \"2026-09-04T06:58:41\"
}
]
}"
const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/signals"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"source_product": "b",
"signals": [
{
"rule_slug": "b",
"snippet": "n",
"occurred_at": "2026-09-04T06:58:41"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Aggregated analytics: counts by signal type, top rules by fire/rejection frequency, and a recency-windowed rejection rate.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/2/signals/summary" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/signals/summary"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/style-guides/{uuid}/ground-truth-documents/{doc_id}/download
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/2/ground-truth-documents/architecto/download" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/2/ground-truth-documents/architecto/download"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (403):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"message": "Invalid signature."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Rules
Update one rule of a guide, or of a guide it inherits.
requires authentication
Example request:
curl --request PATCH \
"https://stylus.proofedapps.com/api/style-guides/6ff8f7f6-1eb3-3525-be4a-3932c805afed/rules/16" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"field\": \"architecto\",
\"value\": \"architecto\",
\"actor\": \"architecto\",
\"reason\": \"architecto\",
\"expected_current\": \"m\"
}"
const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/6ff8f7f6-1eb3-3525-be4a-3932c805afed/rules/16"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"field": "architecto",
"value": "architecto",
"actor": "architecto",
"reason": "architecto",
"expected_current": "m"
};
fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (200):
{
"rule": {
"id": 12,
"slug": "punctuation/serial-comma"
},
"changed": {
"description": [
"old",
"new"
]
},
"inherited": false
}
Example response (409):
{
"error": {
"code": "stale",
"message": "The rule has changed since the assessment ran."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Style Guides
List style guides for the authenticated team.
requires authentication
Returns every style guide owned by the calling team, including sections, rules, glossary terms, preferred spellings, and inheritance.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200, success):
[
{
"id": 1,
"external_name": "Brand Guide",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"sections": [],
"glossary_terms": [],
"preferred_spellings": [],
"inherited_style_guides": []
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List style guide summaries.
requires authentication
Returns just id, external_name, and uuid for each guide on the team.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/list" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/list"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
[
{
"id": 1,
"external_name": "Brand Guide",
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a single style guide by UUID.
requires authentication
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/550e8400-e29b-41d4-a716-446655440000" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/550e8400-e29b-41d4-a716-446655440000"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"id": 1,
"external_name": "Brand",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"sections": [],
"inherited_style_guides": []
}
Example response (404):
{
"error": {
"code": "not_found",
"message": "Style guide not found."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Validate that a UUID corresponds to a guide the caller can access.
Authentication is optional. An anonymous request is answered as a pure existence check; a request that does present a credential is fully validated - a bad token returns 401, the guides:read ability is enforced, and team isolation applies.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/style-guides/6ff8f7f6-1eb3-3525-be4a-3932c805afed/validate" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/style-guides/6ff8f7f6-1eb3-3525-be4a-3932c805afed/validate"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
{
"success": true
}
Example response (404):
{
"error": {
"code": "not_found",
"message": "Style guide not found."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Create a new style guide for the calling team.
requires authentication
Used by sibling apps (Austen, Playbox) to create a per-project/workspace guide when an admin chooses "create a fresh guide" rather than reusing an existing one.
Example request:
curl --request POST \
"https://stylus.proofedapps.com/api/style-guides" \
--header "Authorization: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"external_name\": \"b\",
\"internal_name\": \"n\",
\"description\": \"Animi quos velit et fugiat.\",
\"client_name\": \"d\",
\"public\": false
}"
const url = new URL(
"https://stylus.proofedapps.com/api/style-guides"
);
const headers = {
"Authorization": "Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"external_name": "b",
"internal_name": "n",
"description": "Animi quos velit et fugiat.",
"client_name": "d",
"public": false
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
{
"error": {
"code": "unauthenticated",
"message": "A valid API token is required."
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List public style guides.
No authentication required. Returns guides explicitly marked public by their team.
Example request:
curl --request GET \
--get "https://stylus.proofedapps.com/api/public-guides" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://stylus.proofedapps.com/api/public-guides"
);
const headers = {
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());Example response (200):
[
{
"id": 1,
"external_name": "Public Demo",
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}
]
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.