MENU navbar-image

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."
    }
}
 

Request      

GET api/whoami

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
    }
}
 

Request      

GET api/style-guides/{uuid}/voice-profile

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

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."
    }
}
 

Request      

POST api/style-guides/{uuid}/voice-profile

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

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."
    }
}
 

Request      

PATCH api/style-guides/{uuid}/voice-profile

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

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."
    }
}
 

Request      

DELETE api/style-guides/{uuid}/voice-profile

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

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."
    }
}
 

Request      

POST api/style-guides/{uuid}/voice-profile/extract-from-samples

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

Body Parameters

samples   string[]     

Must not be greater than 200000 characters.

dry_run   boolean  optional    

Example: false

Idempotently provision a Stylus team for a sibling app's customer.

Behaviour:

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."
    }
}
 

Request      

POST api/teams/provision

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

Must be a valid email address. Must not be greater than 255 characters. Example: gbailey@example.net

name   string  optional    

Must not be greater than 255 characters. Example: m

source_product   string     

Must not be greater than 64 characters. Example: i

default_guide_name   string  optional    

Must not be greater than 255 characters. Example: y

webhook_url   string  optional    

Must be a valid URL. Must not be greater than 2048 characters. Example: http://www.ernser.org/harum-mollitia-modi-deserunt-aut-ab-provident-perspiciatis-quo.html

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."
    }
}
 

Request      

POST api/style-guides/{uuid}/signals

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

Body Parameters

source_product   string     

Must not be greater than 64 characters. Example: b

signals   object[]     

Must have at least 1 items. Must not have more than 500 items.

signal_type   string  optional    
rule_slug   string  optional    

Must not be greater than 255 characters. Example: b

snippet   string  optional    

Must not be greater than 10000 characters. Example: n

metadata   object  optional    
occurred_at   string  optional    

Must be a valid date. Example: 2026-09-04T06:58:41

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."
    }
}
 

Request      

GET api/style-guides/{uuid}/signals/summary

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

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."
}
 

Request      

GET api/style-guides/{uuid}/ground-truth-documents/{doc_id}/download

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   integer     

Example: 2

doc_id   string     

The ID of the doc. Example: architecto

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."
    }
}
 

Request      

PATCH api/style-guides/{uuid}/rules/{rule}

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   string     

The guide the change was assessed against. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

rule   integer     

The rule's id. Example: 16

Body Parameters

field   string     

One of name, description, example_usage, exceptions, slug, enabled. Example: architecto

value   string     

The new value. For enabled, "true" or "false". Example: architecto

actor   string  optional    

The product and person making the change, for the audit log. Example: architecto

reason   string  optional    

Why, recorded alongside the change. Example: architecto

expected_current   string  optional    

The value the caller believed it was replacing. Supply it and a rule edited by someone else in the meantime is refused rather than silently overwritten. Must not be greater than 20000 characters. Example: m

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": []
    }
]
 

Request      

GET api/style-guides

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

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"
    }
]
 

Request      

GET api/style-guides/list

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

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."
    }
}
 

Request      

GET api/style-guides/{uuid}

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   string     

The guide's UUID. Example: 550e8400-e29b-41d4-a716-446655440000

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."
    }
}
 

Request      

GET api/style-guides/{uuid}/validate

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

uuid   string     

The guide's UUID. Example: 6ff8f7f6-1eb3-3525-be4a-3932c805afed

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."
    }
}
 

Request      

POST api/style-guides

Headers

Authorization        

Example: Bearer 123|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

external_name   string     

Must not be greater than 255 characters. Example: b

internal_name   string  optional    

Must not be greater than 255 characters. Example: n

description   string  optional    

Must not be greater than 2000 characters. Example: Animi quos velit et fugiat.

client_name   string  optional    

Must not be greater than 255 characters. Example: d

public   boolean  optional    

Example: false

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"
    }
]
 

Request      

GET api/public-guides

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json