Skip to content
Join our Slack

List themes

GET
/v1/themes
curl --request GET \
--url https://platform.fomr.io/v1/themes \
--header 'Authorization: Bearer <token>'

Lists the themes a form can use: the system themes fomr provides, then the themes of the organization, each with its design properties. Pass a theme ID as styles.theme_id when creating a form or replacing its draft. Needs forms:read or templates:read. Costs 1 API credit.

Default Response

Media typeapplication/json
object
data
required

The system themes, then the themes of the organization, each group oldest first.

Array<object>
object
id
required

The ID of the theme, as styles.theme_id carries it.

string format: uuid
/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$/
name
required
Any of:
string
is_system
required

Whether this is a theme of the fomr catalog, offered to every organization, rather than one the organization owns.

boolean
is_new_form_default
required

Whether this is the theme a new form receives. It is also the theme null in styles.theme_id applies. Exactly one theme has it.

boolean
properties
required

The design properties of the theme. A form keeps its own overrides on top of them in styles.override_properties.

object
font

Font family name.

string
background_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
background_url
Any of:
string format: uri
<= 1000 characters
text_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
secondary_text_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
primary_color
Any of:
string
option_colors
Any of:
string
primary_text_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
border_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
shadow_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
dimmed_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
error_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
input_background_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
input_text_color
Any of:
string
/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/
form_width
Any of:
string
Allowed values: xs sm md lg xl
form_size
Any of:
string
Allowed values: xs sm md lg xl
form_spacing
Any of:
string
Allowed values: xs sm md lg xl
form_align_x
Any of:
string
Allowed values: left center right
form_align_y
Any of:
string
Allowed values: top center
is_form_background_color
Any of:
Any of:
number
Allowed values: 0 1
is_form_background_blur
Any of:
Any of:
number
Allowed values: 0 1
border_radius
Any of:
string
Allowed values: none small full
border_shadow
Any of:
string
Allowed values: none small large
logo_url
Any of:
string format: uri
<= 1000 characters
logo_align_x
Any of:
string
Allowed values: left center right
is_logo_hidden
Any of:
Any of:
number
Allowed values: 0 1
logo_width
Any of:
integer
>= 32 <= 4096
is_logo_full_width
Any of:
Any of:
number
Allowed values: 0 1
page_actions_show_back_button
Any of:
Any of:
number
Allowed values: 0 1
page_actions_show_button_arrows
Any of:
Any of:
number
Allowed values: 0 1
page_actions_alignment
Any of:
string
Allowed values: left center right justify
select_options_layout
Any of:

Option layout: list, bordered, or inline; applies only when is_select_options_layout_override is true.

string
Allowed values: list bordered inline
font_id
Any of:
string
<= 100 characters

Example

{
"data": [
{
"properties": {
"form_width": "xs",
"form_size": "xs",
"form_spacing": "xs",
"form_align_x": "left",
"form_align_y": "top",
"is_form_background_color": 0,
"is_form_background_blur": 0,
"border_radius": "none",
"border_shadow": "none",
"logo_align_x": "left",
"is_logo_hidden": 0,
"is_logo_full_width": 0,
"page_actions_show_back_button": 0,
"page_actions_show_button_arrows": 0,
"page_actions_alignment": "left",
"select_options_layout": "list"
}
}
]
}

Default Response

Media typeapplication/json
object
code
required

The stable code to branch on.

string
Allowed values: INVALID_INPUT UNAUTHORIZED PERSONAL_ACCESS_TOKEN_EXPIRED PERSONAL_ACCESS_TOKEN_REVOKED PLAN_LIMIT_REACHED PRO_FEATURE_REQUIRED FORBIDDEN FORM_PUBLISH_EMAIL_UNVERIFIED ORGANIZATION_MEMBER_BLOCKED PERSONAL_ACCESS_TOKEN_NOT_PERMITTED NOT_FOUND FORM_NOT_PUBLISHED NO_DRAFT_DURING_PUBLISH FORM_ARCHIVED FORM_CONVERSION_BLOCKED FORM_PUBLISH_REVISION_CONFLICT PAYLOAD_TOO_LARGE FORM_PUBLISH_VALIDATION_FAILED FORM_SAFETY_REJECTED TOO_MANY_REQUESTS API_COOLDOWN SERVER AI_SERVICE_UNAVAILABLE SERVICE_UNAVAILABLE
message
required

A human-readable explanation. Not part of the contract; never branch on it.

string
request_id
required

The ID of the failed request, also sent as the X-Request-Id response header.

string

Example

{
"code": "INVALID_INPUT"
}

Default Response

Media typeapplication/json
object
code
required

The stable code to branch on.

string
Allowed values: INVALID_INPUT UNAUTHORIZED PERSONAL_ACCESS_TOKEN_EXPIRED PERSONAL_ACCESS_TOKEN_REVOKED PLAN_LIMIT_REACHED PRO_FEATURE_REQUIRED FORBIDDEN FORM_PUBLISH_EMAIL_UNVERIFIED ORGANIZATION_MEMBER_BLOCKED PERSONAL_ACCESS_TOKEN_NOT_PERMITTED NOT_FOUND FORM_NOT_PUBLISHED NO_DRAFT_DURING_PUBLISH FORM_ARCHIVED FORM_CONVERSION_BLOCKED FORM_PUBLISH_REVISION_CONFLICT PAYLOAD_TOO_LARGE FORM_PUBLISH_VALIDATION_FAILED FORM_SAFETY_REJECTED TOO_MANY_REQUESTS API_COOLDOWN SERVER AI_SERVICE_UNAVAILABLE SERVICE_UNAVAILABLE
message
required

A human-readable explanation. Not part of the contract; never branch on it.

string
request_id
required

The ID of the failed request, also sent as the X-Request-Id response header.

string
required_permission
required
Any of:
string

Example

{
"code": "INVALID_INPUT"
}

A rejected call. The organization budget names the policy it rejected the call under; the request floor that bounds hammering sends the envelope alone.

Media typeapplication/json
Any of:
object
code
required

The stable code to branch on.

string
Allowed values: INVALID_INPUT UNAUTHORIZED PERSONAL_ACCESS_TOKEN_EXPIRED PERSONAL_ACCESS_TOKEN_REVOKED PLAN_LIMIT_REACHED PRO_FEATURE_REQUIRED FORBIDDEN FORM_PUBLISH_EMAIL_UNVERIFIED ORGANIZATION_MEMBER_BLOCKED PERSONAL_ACCESS_TOKEN_NOT_PERMITTED NOT_FOUND FORM_NOT_PUBLISHED NO_DRAFT_DURING_PUBLISH FORM_ARCHIVED FORM_CONVERSION_BLOCKED FORM_PUBLISH_REVISION_CONFLICT PAYLOAD_TOO_LARGE FORM_PUBLISH_VALIDATION_FAILED FORM_SAFETY_REJECTED TOO_MANY_REQUESTS API_COOLDOWN SERVER AI_SERVICE_UNAVAILABLE SERVICE_UNAVAILABLE
message
required

A human-readable explanation. Not part of the contract; never branch on it.

string
request_id
required

The ID of the failed request, also sent as the X-Request-Id response header.

string
policy
required

The policy that rejected the call.

string
Allowed values: minute burst
plan
required

The plan whose numbers were applied.

string
Allowed values: free pro
limit
required

The policy limit in credits.

integer
>= -9007199254740991 <= 9007199254740991
used
required

Credits already spent in the open window.

integer
>= -9007199254740991 <= 9007199254740991
remaining
required

Credits still available under the policy.

integer
>= -9007199254740991 <= 9007199254740991
cost
required

What the rejected call would have cost.

integer
>= -9007199254740991 <= 9007199254740991
window_seconds
required

How long the policy window lasts.

integer
>= -9007199254740991 <= 9007199254740991
cooldown_until
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$/
resets_at
required

When the window that rejected the call ends.

string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$/
retry_after_seconds
required

Seconds to wait before retrying. Also sent as the Retry-After response header.

integer
>= -9007199254740991 <= 9007199254740991
upgrade_url
required
Any of:
string

Example

{
"code": "INVALID_INPUT",
"policy": "minute",
"plan": "free"
}

Default Response

Media typeapplication/json
object
code
required

The stable code to branch on.

string
Allowed values: INVALID_INPUT UNAUTHORIZED PERSONAL_ACCESS_TOKEN_EXPIRED PERSONAL_ACCESS_TOKEN_REVOKED PLAN_LIMIT_REACHED PRO_FEATURE_REQUIRED FORBIDDEN FORM_PUBLISH_EMAIL_UNVERIFIED ORGANIZATION_MEMBER_BLOCKED PERSONAL_ACCESS_TOKEN_NOT_PERMITTED NOT_FOUND FORM_NOT_PUBLISHED NO_DRAFT_DURING_PUBLISH FORM_ARCHIVED FORM_CONVERSION_BLOCKED FORM_PUBLISH_REVISION_CONFLICT PAYLOAD_TOO_LARGE FORM_PUBLISH_VALIDATION_FAILED FORM_SAFETY_REJECTED TOO_MANY_REQUESTS API_COOLDOWN SERVER AI_SERVICE_UNAVAILABLE SERVICE_UNAVAILABLE
message
required

A human-readable explanation. Not part of the contract; never branch on it.

string
request_id
required

The ID of the failed request, also sent as the X-Request-Id response header.

string

Example

{
"code": "INVALID_INPUT"
}

Your next form could be the best-looking thing on your site.

Free forever. Unlimited responses. No signup to start.