Skip to main content

API V1 (v0.3)

Download OpenAPI specification:Download

A RestFull API for Decidim, to be able to CRUD resources from Decidim.
current version: 0.3.4

Authentication

Get a token from our /oauth/token routes, following OAuth specs on Credential Flows or Resource Owner Password Credentials Flow.

Permissions

A permission system is attached to the created OAuth application, that is designed in two levels:

  • scope: a broad permission to access a collection of endpoints
  • abilities: a fine grained permission system that allow actions.

The scopes and abilities are manageable in your System Admin Panel.

Multi-tenant Organizations

One deployment hosts many Organizations (tenants by host).

  • The system scope endpoints apply in the context of the resolved organization
  • The request host selects which Organization you target. For example, example.org/oauth/token and foobar.org/oauth/token obtain tokens for those organizations' OAuth applications.

Integrators

Start with the Integrator quickstart (host → API client → token → first API call).

TypeScript client: https://octree-gva.github.io/decidim-rest-full/integrator/typescript-sdk (@octree/decidim-sdk).

Outbound webhook events are listed under the Webhooks tag (subscribe in System admin).

OAuth

Obtain access tokens for this API: client_credentials (machine-to-machine) or password with auth_type login or impersonation (Resource Owner Password Credentials flow).

  • Machine-to-machine: client credentials grant
  • User: ROPC with auth_type login or impersonation

Introspect an OAuth token

Check token validity and get optional user/resource (RFC 7662). Send the token to introspect in the request body; use a valid Bearer token in Authorization.

Authorizations:
credentialFlowBearerresourceOwnerFlowBearer
Request Body schema: application/json
required
token
required
string

Responses

Request samples

Content type
application/json
{
  • "token": "string"
}

Response samples

Content type
application/json
Example
{
  • "active": true,
  • "scope": "public",
  • "client_id": "2-9981EkXj0mERNN9M_bJ205KcIDF3xFFcpBT_eb1Zs",
  • "token_type": "Bearer",
  • "exp": 3571965494,
  • "iat": 1784643547,
  • "sub": 816,
  • "resource": {
    }
}

Request an OAuth token (ROPC)

Create an OAuth token for the given scopes (password or client_credentials grant).

Request Body schema: application/json
required
One of
grant_type
required
string
Value: "client_credentials"

Client Credential Flow, for machine-to-machine

client_id
required
string

OAuth application Client Id

client_secret
required
string

OAuth application Client Secret

scope
required
string
Enum: "public" "spaces" "system" "meetings" "debates" "pages" "oauth" "roles" "attachments"

Requested scopes

Responses

Request samples

Content type
application/json
Example
{
  • "grant_type": "client_credentials",
  • "client_id": "string",
  • "client_secret": "string",
  • "scope": "public"
}

Response samples

Content type
application/json
Example
{
  • "access_token": "in3ZId4MKQ0lAhOWqdnxeFT9Y9x57ulcV5a6s29W3tw",
  • "token_type": "Bearer",
  • "expires_in": 7200,
  • "scope": "public proposals",
  • "created_at": 1784644118
}

Organizations

Organization settings (Decidim tenant boundary: primary host, secondary hosts, locale defaults, and related configuration).

One deployment hosts many Organizations. Each organization has:

  • host: primary domain name
  • secondary_hosts: additional hostnames that redirect (301) to host

The active Organization is resolved from the request Host header, so different host values resolve to that host's organization data.

Organizations

List available organizations

Authorizations:
credentialFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Update organization

This endpoint allows you to update an organization.

Update host

To update the host, send in your payload the host attribute. It will be saved as an unconfirmed_host extended data attribute. Once saved, a job will be enqueued to reverse DNS the unconfirmed host before actually updating the host. The host attribute must be unique across all organizations. More information on this update process is documented in the Safe host update page.

Update name

To update the name, send in your payload the name attribute. The name attribute must be unique across all organizations.

Authorizations:
credentialFlowBearer
path Parameters
id
required
string

The ID of the organization

header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object (Organization Attributes)
required
object (Translated data)

Hash with translated data, key=locale value=translation

object (Translated data)

Hash with translated data, key=locale value=translation

reference_prefix
string

Prefix for the organization. Used to prefix uploaded files and reference resources

host
required
string
send_welcome_notification
boolean

True if welcome email is sent to users

secondary_hosts
Array of strings
available_locales
required
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

default_locale
required
string

Default locale for the organization

users_registration_mode
string
Enum: "enabled" "existing" "disabled"

Define user registration mode:

  • enabled: Enable users registration
  • existing: Existing users will be able to login. Registration will be disabled.
  • disabled: No registration enabled
force_users_to_authenticate_before_access_organization
boolean

Force users to authenticate before accessing the organization (disabled if users_registration_mode is disabled)

badges_enabled
boolean

Enable badges for public views

enable_participatory_space_filters
boolean

Display areas and scopes filter in public views.

enable_machine_translations
boolean

Enable machine translations (must be configured, see Using machine translations)

user_groups_enabled
boolean

Enable user groups in public views

time_zone
string (Time Zone)
Enum: "Africa/Algiers" "Africa/Cairo" "Africa/Casablanca" "Africa/Harare" "Africa/Johannesburg" "Africa/Monrovia" "Africa/Nairobi" "America/Argentina/Buenos_Aires" "America/Bogota" "America/Caracas" "America/Chicago" "America/Chihuahua" "America/Denver" "America/Godthab" "America/Guatemala" "America/Guyana" "America/Halifax" "America/Indiana/Indianapolis" "America/Juneau" "America/La_Paz" "America/Lima" "America/Lima" "America/Los_Angeles" "America/Mazatlan" "America/Mexico_City" "America/Mexico_City" "America/Monterrey" "America/Montevideo" "America/New_York" "America/Phoenix" "America/Puerto_Rico" "America/Regina" "America/Santiago" "America/Sao_Paulo" "America/St_Johns" "America/Tijuana" "Asia/Almaty" "Asia/Baghdad" "Asia/Baku" "Asia/Bangkok" "Asia/Bangkok" "Asia/Chongqing" "Asia/Colombo" "Asia/Dhaka" "Asia/Dhaka" "Asia/Hong_Kong" "Asia/Irkutsk" "Asia/Jakarta" "Asia/Jerusalem" "Asia/Kabul" "Asia/Kamchatka" "Asia/Karachi" "Asia/Karachi" "Asia/Kathmandu" "Asia/Kolkata" "Asia/Kolkata" "Asia/Kolkata" "Asia/Kolkata" "Asia/Krasnoyarsk" "Asia/Kuala_Lumpur" "Asia/Kuwait" "Asia/Magadan" "Asia/Muscat" "Asia/Muscat" "Asia/Novosibirsk" "Asia/Rangoon" "Asia/Riyadh" "Asia/Seoul" "Asia/Shanghai" "Asia/Singapore" "Asia/Srednekolymsk" "Asia/Taipei" "Asia/Tashkent" "Asia/Tbilisi" "Asia/Tehran" "Asia/Tokyo" "Asia/Tokyo" "Asia/Tokyo" "Asia/Ulaanbaatar" "Asia/Urumqi" "Asia/Vladivostok" "Asia/Yakutsk" "Asia/Yekaterinburg" "Asia/Yerevan" "Atlantic/Azores" "Atlantic/Cape_Verde" "Atlantic/South_Georgia" "Australia/Adelaide" "Australia/Brisbane" "Australia/Darwin" "Australia/Hobart" "Australia/Melbourne" "Australia/Melbourne" "Australia/Perth" "Australia/Sydney" "Etc/GMT+12" "Etc/UTC" "Europe/Amsterdam" "Europe/Athens" "Europe/Belgrade" "Europe/Berlin" "Europe/Bratislava" "Europe/Brussels" "Europe/Bucharest" "Europe/Budapest" "Europe/Copenhagen" "Europe/Dublin" "Europe/Helsinki" "Europe/Istanbul" "Europe/Kaliningrad" "Europe/Kiev" "Europe/Lisbon" "Europe/Ljubljana" "Europe/London" "Europe/London" "Europe/Madrid" "Europe/Minsk" "Europe/Moscow" "Europe/Moscow" "Europe/Paris" "Europe/Prague" "Europe/Riga" "Europe/Rome" "Europe/Samara" "Europe/Sarajevo" "Europe/Skopje" "Europe/Sofia" "Europe/Stockholm" "Europe/Tallinn" "Europe/Vienna" "Europe/Vilnius" "Europe/Volgograd" "Europe/Warsaw" "Europe/Zagreb" "Europe/Zurich" "Europe/Zurich" "Pacific/Apia" "Pacific/Auckland" "Pacific/Auckland" "Pacific/Chatham" "Pacific/Fakaofo" "Pacific/Fiji" "Pacific/Guadalcanal" "Pacific/Guam" "Pacific/Honolulu" "Pacific/Majuro" "Pacific/Midway" "Pacific/Noumea" "Pacific/Pago_Pago" "Pacific/Port_Moresby" "Pacific/Tongatapu" "UTC"

Time Zone identifier

comments_max_length
integer

Default maximum length of comments

rich_text_editor_in_public_views
boolean

Enable rich text editor in public views

created_at
string <date_time> (Creation date)

Creation date, in ISO8601 format.

updated_at
string <date_time> (Last Update Date)

Last update date, in ISO8601 format.

extended_data
object (Extended data for the organization)

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Organization

Show organization

Authorizations:
credentialFlowBearer
path Parameters
id
required
string

The ID of the organization

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Organizations Extended Data

Read organization extended_data and merge updates under a dot-path via sync (PUT /organizations/{id}/extended_data/sync). Supports recursive merge, dot paths (use . for the root), path creation, and clearing keys by setting them to null or empty—see the operation description for full examples. Requires system scopes as documented on each operation.

Update organization extended data

The extended_data feature allows you to update a hash with recursive merging. Use the body payload with these keys:

  1. data: The value or hash you want to update.
  2. object_path: The dot-style path to the key (e.g., access.this.key).

Root path
To update data from root of the hash, use object_path=".".

Example:

  body={"data": {"name": "Jane"}, "object_path": "personnal"}

This recursively merges data into the hash without removing existing keys.

Merge some data
Initial hash:

  {
    "personnal": {"birthday": "1989-05-18"}
  }

Patch payload:

  {
    "data": {
      "name": "Jane"
    },
    "object_path": "personnal"
  }

Result:

  {
    "personnal": {"birthday": "1989-05-18", "name": "Jane"}
  }

Create new Paths
Paths are created as needed. Exemple:

  body = {"data": {"external_user_id": 12}, "object_path": "data-store.my-app.foo"}

Result:

  {
    "personnal": {"birthday": "1989-05-18"},
    "data-store": {"my-app": {"foo": {"external_user_id": 12}}}
  }

Alternatively:

  body = {"data": 12, "object_path": "data-store.my-app.foo.external_user_id"}

Remove a key
Set a key to null or an empty value to remove it.

Example: Initial hash:

  {
    "personnal": {"birthday": "1989-05-18", "name": "Jane"}
  }

Patch:

  body = {"data": {"birthday": ""}, "object_path": "personnal"}

Result:

{
  "personnal": {"name": "Jane"}
}

Return Value
The update request returns the updated value at the specified path.

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer

Id of the organization

header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
data
required
object (User Extended Data Data)

New value for the extended data at the given path

object_path
string

object path, in dot style, like foo.bar. use '.' to update the whole user data

Responses

Request samples

Content type
application/json
{
  • "data": { },
  • "object_path": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Organization extended data

Fetch organization extended data

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer

Id of the organization

query Parameters
object_path
required
string

object path, in dot style, like foo.bar

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Spaces

Search, list, and fetch participatory spaces (e.g. Assemblies, Participatory Processes).

List Initiatives

List participatory spaces of type Initiatives for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

List Conferences

List participatory spaces of type Conferences for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

List Participatory Processes

List participatory spaces of type Participatory Processes for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

List Assemblies

List participatory spaces of type Assemblies for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Search Participatory Spaces

List or search spaces of the organization. Can be processes, assemblies, or any other registred participatory space.

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[manifest_name_not_in][]
Array of strings (manifest_name not IN filter)
Items Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

match none of manifest_name's values in array

filter[manifest_name_in][]
Array of strings (manifest_name IN filter)
Items Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

match one of manifest_name's values in array

filter[manifest_name_start]
string (manifest_name starts With filter)
Example: filter[manifest_name_start]=some_string

manifest_name starts with

filter[manifest_name_eq]
string (manifest_name equal filter)
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

manifest_name is equal to

filter[manifest_name_not_eq]
string (manifest_name not equal filter)
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

manifest_name is NOT equal to

filter[manifest_name_matches]
string (manifest_name like filter)
Example: filter[manifest_name_matches]=%some_string

matches manifest_name with LIKE

filter[manifest_name_blank]
boolean (manifest_name blank filter)

manifest_name is null or empty

filter[id_in][]
Array of integers (id IN filter)

match one of id's values in array

filter[id_eq]
integer (id equal filter)

id is equal to

filter[id_lt]
integer (id less than filter)

id is less than

filter[id_gt]
integer (id greater than filter)

id is greater than

filter[id_present]
boolean (id present filter)

id is not null and not empty

filter[id_blank]
boolean (id blank filter)

id is null or empty

filter[slug_not_in][]
Array of strings (slug not IN filter)

match none of slug's values in array

filter[slug_in][]
Array of strings (slug IN filter)

match one of slug's values in array

filter[slug_start]
string (slug starts With filter)
Example: filter[slug_start]=some_string

slug starts with

filter[slug_eq]
string (slug equal filter)

slug is equal to

filter[slug_not_eq]
string (slug not equal filter)

slug is NOT equal to

filter[slug_matches]
string (slug like filter)
Example: filter[slug_matches]=%some_string

matches slug with LIKE

filter[slug_blank]
boolean (slug blank filter)

slug is null or empty

filter[title_not_in][]
Array of strings (title not IN filter)

match none of title's values in array

filter[title_in][]
Array of strings (title IN filter)

match one of title's values in array

filter[title_start]
string (title starts With filter)
Example: filter[title_start]=some_string

title starts with

filter[title_eq]
string (title equal filter)

title is equal to

filter[title_not_eq]
string (title not equal filter)

title is NOT equal to

filter[title_matches]
string (title like filter)
Example: filter[title_matches]=%some_string

matches title with LIKE

filter[title_blank]
boolean (title blank filter)

title is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Initiatives Details

Get detail of a Initiatives given its id

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Id of the space

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Participatory Processes Details

Get detail of a Participatory Processes given its id

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Id of the space

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Assemblies Details

Get detail of a Assemblies given its id

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Id of the space

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Conferences Details

Get detail of a Conferences given its id

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Id of the space

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Components

Participatory-space components (Decidim::Component): modular features (proposals, blogs, meetings, surveys, …) attached to a space.

Use GET /components/search to discover components by manifest, id, participatory space, or name—within the organization resolved from the request host.

Manifest-specific sub-resources (e.g. proposal_components, blog_components) expose typed settings for that feature.

Blog Components

List or search blog components of the organization

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

filter[participatory_space_id_in][]
Array of strings (participatory_space_id IN filter)

match one of participatory_space_id's values in array

filter[participatory_space_id_eq]
string (participatory_space_id equal filter)

participatory_space_id is equal to

filter[participatory_space_id_lt]
string (participatory_space_id less than filter)

participatory_space_id is less than

filter[participatory_space_id_gt]
string (participatory_space_id greater than filter)

participatory_space_id is greater than

filter[participatory_space_id_present]
boolean (participatory_space_id present filter)

participatory_space_id is not null and not empty

filter[participatory_space_id_blank]
boolean (participatory_space_id blank filter)

participatory_space_id is null or empty

filter[participatory_space_type_not_in][]
Array of strings (participatory_space_type not IN filter)
Example: filter[participatory_space_type_not_in][]=Decidim::Assembly

match none of participatory_space_type's values in array

filter[participatory_space_type_in][]
Array of strings (participatory_space_type IN filter)
Example: filter[participatory_space_type_in][]=Decidim::Assembly

match one of participatory_space_type's values in array

filter[participatory_space_type_start]
string (participatory_space_type starts With filter)
Example: filter[participatory_space_type_start]=some_string

participatory_space_type starts with

filter[participatory_space_type_eq]
string (participatory_space_type equal filter)
Example: filter[participatory_space_type_eq]=Decidim::Assembly

participatory_space_type is equal to

filter[participatory_space_type_not_eq]
string (participatory_space_type not equal filter)
Example: filter[participatory_space_type_not_eq]=Decidim::Assembly

participatory_space_type is NOT equal to

filter[participatory_space_type_matches]
string (participatory_space_type like filter)
Example: filter[participatory_space_type_matches]=%some_string

matches participatory_space_type with LIKE

filter[participatory_space_type_blank]
boolean (participatory_space_type blank filter)

participatory_space_type is null or empty

filter[name_not_in][]
Array of strings (name not IN filter)

match none of name's values in array

filter[name_in][]
Array of strings (name IN filter)

match one of name's values in array

filter[name_start]
string (name starts With filter)
Example: filter[name_start]=some_string

name starts with

filter[name_eq]
string (name equal filter)

name is equal to

filter[name_not_eq]
string (name not equal filter)

name is NOT equal to

filter[name_matches]
string (name like filter)
Example: filter[name_matches]=%some_string

matches name with LIKE

filter[name_blank]
boolean (name blank filter)

name is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Search components

Search components (Decidim::Component) in the organization resolved from the request host.

Filters

  • filter[manifest_name]: e.g. proposals, blogs, meetings
  • filter[id], filter[participatory_space_id], filter[participatory_space_type], filter[name]

Pagination & locale

Supports page, per_page, and locales[] like other collection endpoints.

Access

public scope with public.component.read (credential or impersonation token).

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

filter[manifest_name_not_in][]
Array of strings (manifest_name not IN filter)
Items Enum: "pages" "proposals" "meetings" "budgets" "surveys" "accountability" "debates" "sortitions" "blogs" "awesome_map" "awesome_iframe"

match none of manifest_name's values in array

filter[manifest_name_in][]
Array of strings (manifest_name IN filter)
Items Enum: "pages" "proposals" "meetings" "budgets" "surveys" "accountability" "debates" "sortitions" "blogs" "awesome_map" "awesome_iframe"

match one of manifest_name's values in array

filter[manifest_name_start]
string (manifest_name starts With filter)
Example: filter[manifest_name_start]=some_string

manifest_name starts with

filter[manifest_name_eq]
string (Component Manifest)
Enum: "pages" "proposals" "meetings" "budgets" "surveys" "accountability" "debates" "sortitions" "blogs" "awesome_map" "awesome_iframe"

Component type key (Decidim manifest name).

filter[manifest_name_not_eq]
string (Component Manifest)
Enum: "pages" "proposals" "meetings" "budgets" "surveys" "accountability" "debates" "sortitions" "blogs" "awesome_map" "awesome_iframe"

Component type key (Decidim manifest name).

filter[manifest_name_matches]
string (manifest_name like filter)
Example: filter[manifest_name_matches]=%some_string

matches manifest_name with LIKE

filter[manifest_name_blank]
boolean (manifest_name blank filter)

manifest_name is null or empty

filter[id_in][]
Array of integers (id IN filter)

match one of id's values in array

filter[id_eq]
integer (id equal filter)

id is equal to

filter[id_lt]
integer (id less than filter)

id is less than

filter[id_gt]
integer (id greater than filter)

id is greater than

filter[id_present]
boolean (id present filter)

id is not null and not empty

filter[id_blank]
boolean (id blank filter)

id is null or empty

filter[participatory_space_id_in][]
Array of strings (participatory_space_id IN filter)

match one of participatory_space_id's values in array

filter[participatory_space_id_eq]
string (participatory_space_id equal filter)

participatory_space_id is equal to

filter[participatory_space_id_lt]
string (participatory_space_id less than filter)

participatory_space_id is less than

filter[participatory_space_id_gt]
string (participatory_space_id greater than filter)

participatory_space_id is greater than

filter[participatory_space_id_present]
boolean (participatory_space_id present filter)

participatory_space_id is not null and not empty

filter[participatory_space_id_blank]
boolean (participatory_space_id blank filter)

participatory_space_id is null or empty

filter[participatory_space_type_not_in][]
Array of strings (participatory_space_type not IN filter)
Items Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

match none of participatory_space_type's values in array

filter[participatory_space_type_in][]
Array of strings (participatory_space_type IN filter)
Items Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

match one of participatory_space_type's values in array

filter[participatory_space_type_start]
string (participatory_space_type starts With filter)
Example: filter[participatory_space_type_start]=some_string

participatory_space_type starts with

filter[participatory_space_type_eq]
string (space_type)
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"
filter[participatory_space_type_not_eq]
string (space_type)
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"
filter[participatory_space_type_matches]
string (participatory_space_type like filter)
Example: filter[participatory_space_type_matches]=%some_string

matches participatory_space_type with LIKE

filter[participatory_space_type_blank]
boolean (participatory_space_type blank filter)

participatory_space_type is null or empty

filter[name_not_in][]
Array of strings (name not IN filter)

match none of name's values in array

filter[name_in][]
Array of strings (name IN filter)

match one of name's values in array

filter[name_start]
string (name starts With filter)
Example: filter[name_start]=some_string

name starts with

filter[name_eq]
string (name equal filter)

name is equal to

filter[name_not_eq]
string (name not equal filter)

name is NOT equal to

filter[name_matches]
string (name like filter)
Example: filter[name_matches]=%some_string

matches name with LIKE

filter[name_blank]
boolean (name blank filter)

name is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Proposal Component Details

Find on proposal

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[id_in][]
Array of integers (id IN filter)

match one of id's values in array

filter[id_eq]
integer (id equal filter)

id is equal to

filter[id_lt]
integer (id less than filter)

id is less than

filter[id_gt]
integer (id greater than filter)

id is greater than

filter[id_present]
boolean (id present filter)

id is not null and not empty

filter[id_blank]
boolean (id blank filter)

id is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Blog Component Details

Blog component details

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

component_id
integer

Component Id

space_manifest
string
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

Space type

space_id
integer

Space Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Proposal Components

List or search proposal components of the organization

Authorizations:
credentialFlowBearer
query Parameters
filter[name_not_in][]
Array of strings (name not IN filter)

match none of name's values in array

filter[name_in][]
Array of strings (name IN filter)

match one of name's values in array

filter[name_start]
string (name starts With filter)
Example: filter[name_start]=some_string

name starts with

filter[name_eq]
string (name equal filter)

name is equal to

filter[name_not_eq]
string (name not equal filter)

name is NOT equal to

filter[name_matches]
string (name like filter)
Example: filter[name_matches]=%some_string

matches name with LIKE

filter[name_blank]
boolean (name blank filter)

name is null or empty

filter[participatory_space_type_not_in][]
Array of strings (participatory_space_type not IN filter)
Example: filter[participatory_space_type_not_in][]=Decidim::Assembly

match none of participatory_space_type's values in array

filter[participatory_space_type_in][]
Array of strings (participatory_space_type IN filter)
Example: filter[participatory_space_type_in][]=Decidim::Assembly

match one of participatory_space_type's values in array

filter[participatory_space_type_start]
string (participatory_space_type starts With filter)
Example: filter[participatory_space_type_start]=some_string

participatory_space_type starts with

filter[participatory_space_type_eq]
string (participatory_space_type equal filter)
Example: filter[participatory_space_type_eq]=Decidim::Assembly

participatory_space_type is equal to

filter[participatory_space_type_not_eq]
string (participatory_space_type not equal filter)
Example: filter[participatory_space_type_not_eq]=Decidim::Assembly

participatory_space_type is NOT equal to

filter[participatory_space_type_matches]
string (participatory_space_type like filter)
Example: filter[participatory_space_type_matches]=%some_string

matches participatory_space_type with LIKE

filter[participatory_space_type_blank]
boolean (participatory_space_type blank filter)

participatory_space_type is null or empty

filter[participatory_space_id_in][]
Array of strings (participatory_space_id IN filter)

match one of participatory_space_id's values in array

filter[participatory_space_id_eq]
string (participatory_space_id equal filter)

participatory_space_id is equal to

filter[participatory_space_id_lt]
string (participatory_space_id less than filter)

participatory_space_id is less than

filter[participatory_space_id_gt]
string (participatory_space_id greater than filter)

participatory_space_id is greater than

filter[participatory_space_id_present]
boolean (participatory_space_id present filter)

participatory_space_id is not null and not empty

filter[participatory_space_id_blank]
boolean (participatory_space_id blank filter)

participatory_space_id is null or empty

page
integer

Page number for pagination

per_page
integer

Number of items per page

locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Users

List users; read and update your extended data; create and consume magic links for sign-in (scopes and permissions per operation).

Update user extended data

The extended_data feature allows you to update a hash with recursive merging. Use the body payload with these keys:

  1. data: The value or hash you want to update.
  2. object_path: The dot-style path to the key (e.g., access.this.key).

Root path
To update data from root of the hash, use object_path=".".

Example:

  body={"data": {"name": "Jane"}, "object_path": "personnal"}

This recursively merges data into the hash without removing existing keys.

Merge some data
Initial hash:

  {
    "personnal": {"birthday": "1989-05-18"}
  }

Patch payload:

  {
    "data": {
      "name": "Jane"
    },
    "object_path": "personnal"
  }

Result:

  {
    "personnal": {"birthday": "1989-05-18", "name": "Jane"}
  }

Create new Paths
Paths are created as needed. Exemple:

  body = {"data": {"external_user_id": 12}, "object_path": "data-store.my-app.foo"}

Result:

  {
    "personnal": {"birthday": "1989-05-18"},
    "data-store": {"my-app": {"foo": {"external_user_id": 12}}}
  }

Alternatively:

  body = {"data": 12, "object_path": "data-store.my-app.foo.external_user_id"}

Remove a key
Set a key to null or an empty value to remove it.

Example: Initial hash:

  {
    "personnal": {"birthday": "1989-05-18", "name": "Jane"}
  }

Patch:

  body = {"data": {"birthday": ""}, "object_path": "personnal"}

Result:

{
  "personnal": {"name": "Jane"}
}

Return Value
The update request returns the updated value at the specified path.

Authorizations:
resourceOwnerFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
data
required
object (User Extended Data Data)

New value for the extended data at the given path

object_path
string

object path, in dot style, like foo.bar. use '.' to update the whole user data

Responses

Request samples

Content type
application/json
{
  • "data": { },
  • "object_path": "string"
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

List available Users

List or search users of the organization

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[nickname_not_in][]
Array of strings (nickname not IN filter)

match none of nickname's values in array

filter[nickname_in][]
Array of strings (nickname IN filter)

match one of nickname's values in array

filter[nickname_start]
string (nickname starts With filter)
Example: filter[nickname_start]=some_string

nickname starts with

filter[nickname_eq]
string (nickname equal filter)

nickname is equal to

filter[nickname_not_eq]
string (nickname not equal filter)

nickname is NOT equal to

filter[nickname_matches]
string (nickname like filter)
Example: filter[nickname_matches]=%some_string

matches nickname with LIKE

filter[nickname_blank]
boolean (nickname blank filter)

nickname is null or empty

filter[id_in][]
Array of integers (id IN filter)

match one of id's values in array

filter[id_eq]
integer (id equal filter)

id is equal to

filter[id_lt]
integer (id less than filter)

id is less than

filter[id_gt]
integer (id greater than filter)

id is greater than

filter[id_present]
boolean (id present filter)

id is not null and not empty

filter[id_blank]
boolean (id blank filter)

id is null or empty

filter[extended_data_cont]
string
Example: filter[extended_data_cont]="foo": "bar"

Search on user extended_data. use the format: "<key>":<space>"<value>"

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Get user extended data

Fetch user extended data

Authorizations:
resourceOwnerFlowBearer
query Parameters
object_path
required
string

object path, in dot style, like foo.bar

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": { }
}

Attachments

Manage Decidim::Attachment rows (files linked to proposals, spaces, etc.).

Create (mode A): POST /attachments with multipart/form-data (file, attached_to_type, attached_to_id, translated title / description).

Create (mode B): POST /attachments/direct_upload → use signed_id in POST /attachments (application/json).

Update: metadata only (PUT /attachments/{id}) — no file replacement in v1.

List filters: filter[attached_to_type], filter[attached_to_id], filter[attachment_collection_id], filter[file_type] (image, document, link).

Show attachment

Authorizations:
credentialFlowBearer
path Parameters
id
required
string
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Stage file for direct upload

Authorizations:
credentialFlowBearer
query Parameters
filename
required
string
byte_size
required
integer
checksum
required
string
content_type
string
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "signed_id": "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdHNoIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0d88ff0f62644cc0934ac7a51c0c079cf3693fee",
  • "filename": "hello.pdf",
  • "content_type": "application/pdf",
  • "byte_size": 12345
}

List attachments

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[attached_to_type_not_in][]
Array of strings (attached_to_type not IN filter)

match none of attached_to_type's values in array

filter[attached_to_type_in][]
Array of strings (attached_to_type IN filter)

match one of attached_to_type's values in array

filter[attached_to_type_start]
string (attached_to_type starts With filter)
Example: filter[attached_to_type_start]=some_string

attached_to_type starts with

filter[attached_to_type_eq]
string (attached_to_type equal filter)

attached_to_type is equal to

filter[attached_to_type_not_eq]
string (attached_to_type not equal filter)

attached_to_type is NOT equal to

filter[attached_to_type_matches]
string (attached_to_type like filter)
Example: filter[attached_to_type_matches]=%some_string

matches attached_to_type with LIKE

filter[attached_to_type_blank]
boolean (attached_to_type blank filter)

attached_to_type is null or empty

filter[attached_to_id_in][]
Array of integers (attached_to_id IN filter)

match one of attached_to_id's values in array

filter[attached_to_id_eq]
integer (attached_to_id equal filter)

attached_to_id is equal to

filter[attached_to_id_lt]
integer (attached_to_id less than filter)

attached_to_id is less than

filter[attached_to_id_gt]
integer (attached_to_id greater than filter)

attached_to_id is greater than

filter[attached_to_id_present]
boolean (attached_to_id present filter)

attached_to_id is not null and not empty

filter[attached_to_id_blank]
boolean (attached_to_id blank filter)

attached_to_id is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Blogs

Blog posts (Decidim::Blogs::Post) on components with the :blogs manifest.

Visibility is driven by published_at, not a separate published flag:

  • published_at is null or in the future → the post is not shown in public index/show (unless you impersonate the author).
  • published_at in the past → the post is visible to readers with blogs.read.

Read: GET /blogs and GET /blogs/:id (conditional caching on GET).

Write (blogs.write): create and update posts (async by default; POST /blogs/sync, PUT /blogs/:id/sync). Delete (blogs.destroy): remove a post (DELETE /blogs/:id, async; DELETE /blogs/:id/sync inline).

List posts

List posts (Decidim::Blogs::Post)

Authorizations:
credentialFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

space_manifest
string
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

Space type

space_id
integer

Space Id

component_id
integer

Component Id

order
string

Order by

order_direction
string
Enum: "asc" "desc"

Order direction

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [ ]
}

Create blog post (async)

Enqueue creation of a blog post. Poll GET /jobs/:uuid.

Set published_at to control visibility (see Blogs tag). Requires blogs.write and impersonation.

Authorizations:
resourceOwnerFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
component_id
required
integer

Blogs component id

required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{}

Show post

Get post details (Decidim::Blogs::Post)

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer

Post id

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

space_manifest
string
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

Space type

space_id
integer

Space Id

component_id
integer

Component Id

order
string

Order by

order_direction
string
Enum: "asc" "desc"

Order direction

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Delete blog post (async)

Enqueue deletion of a blog post. Requires blogs.destroy.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{}

Forms

Survey and questionnaire authoring backed by Decidim::Forms.

Questionnaire (Decidim::Forms::Questionnaire) is the container: title, description, and terms of service. It belongs to a survey resource (e.g. Decidim::Surveys::Survey) via questionnaire_for.

Questions (Decidim::Forms::Question) define rows in the questionnaire (question_type, body, mandatory, …). Answer options (Decidim::Forms::AnswerOption) belong to choice-style questions.

Participant flow: answers are submitted as a bundle (POST /answerssubmission_requests/:id for validation state). Questionnaire responses (GET /questionnaire_responses/:id) expose a read model of stored answers; admins can delete a response bundle.

Authoring (credential token, surveys.questions.manage): mutate questionnaires, questions, and answer options. Default writes are async (HTTP 202 + GET /jobs/:uuid); use …/sync routes for inline 200/201.

Listing: GET /questionnaires returns a JSON Forms projection for rendering; GET /questions and GET /answers require filter[questionnaire_id].

Create question (sync)

Create a question inline (201).

Authorizations:
credentialFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
type
required
string
Value: "questions"
required
object or object or object
required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    },
  • "meta": {
    }
}

Create question (async)

Enqueue question creation; poll GET /jobs/:uuid.

Authorizations:
credentialFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
type
required
string
Value: "questions"
required
object or object or object
required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{}

List questions

List questions for a questionnaire (filter[questionnaire_id] required).

Authorizations:
credentialFlowBearer
query Parameters
filter[questionnaire_id]
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Submit answers (async)

Enqueue answer submission; poll GET /submission_requests/:id (202 Accepted).

Authorizations:
credentialFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
object
required
object

Responses

Request samples

Content type
application/json
{
  • "meta": {
    },
  • "data": {
    }
}

Response samples

Content type
application/json
{}

Questionnaire

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update questionnaire metadata (async)

Enqueue questionnaire metadata update (title, description, terms of service). Poll GET /jobs/:uuid.

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
type
required
string
Value: "questionnaires"
id
required
string
required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{}

Questionnaires index

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Show questionnaire response

Read a submission bundle (aggregate of Decidim::Forms::Answer rows).

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Submit answers synchronously

Authorizations:
credentialFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
object
required
object

Responses

Request samples

Content type
application/json
{
  • "meta": {
    },
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update questionnaire metadata (sync)

Update questionnaire title, description, or terms of service inline.

Authorizations:
credentialFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
type
required
string
Value: "questionnaires"
id
required
string
required
object

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Proposals

Published proposals (Decidim::Proposals::Proposal with published_at set) within visible participatory spaces.

Read (proposals.read): list and show proposals; filter by component, space, scope, and vote-related facets.

Vote proposals (proposals.vote, impersonation): async POST /vote_proposals (202 + job poll) or sync POST /vote_proposals/sync (slim vote payload; ?include_proposal=true for full proposal). One vote per author per proposal.

Components: GET /components/proposal_components exposes proposals-component settings (votes enabled, limits, phases).

Draft authoring lives under the Draft Proposals tag.

Proposal Details

Proposal detail

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Proposal Id

query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

space_manifest
string
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

Space type

space_id
integer

Space Id

component_id
integer

Component Id

filter[voted_weight_not_in][]
Array of strings (voted_weight not IN filter)

match none of voted_weight's values in array

filter[voted_weight_in][]
Array of strings (voted_weight IN filter)

match one of voted_weight's values in array

filter[voted_weight_start]
string (voted_weight starts With filter)
Example: filter[voted_weight_start]=some_string

voted_weight starts with

filter[voted_weight_eq]
string (voted_weight equal filter)

voted_weight is equal to

filter[voted_weight_not_eq]
string (voted_weight not equal filter)

voted_weight is NOT equal to

filter[voted_weight_matches]
string (voted_weight like filter)
Example: filter[voted_weight_matches]=%some_string

matches voted_weight with LIKE

filter[voted_weight_blank]
boolean (voted_weight blank filter)

voted_weight is null or empty

filter[state_not_in][]
Array of strings (state not IN filter)

match none of state's values in array

filter[state_in][]
Array of strings (state IN filter)

match one of state's values in array

filter[state_start]
string (state starts With filter)
Example: filter[state_start]=some_string

state starts with

filter[state_eq]
string (state equal filter)

state is equal to

filter[state_not_eq]
string (state not equal filter)

state is NOT equal to

filter[state_matches]
string (state like filter)
Example: filter[state_matches]=%some_string

matches state with LIKE

filter[state_blank]
boolean (state blank filter)

state is null or empty

order
string

Order by

order_direction
string
Enum: "asc" "desc"

Order direction

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Proposals

Search proposals

Authorizations:
resourceOwnerFlowBearer
query Parameters
locales[]
Array of strings (Available locales)
Items Enum: "en" "fr" "es"

List of locale codes the organization exposes.

page
integer

Page number for pagination

per_page
integer

Number of items per page

space_manifest
string
Enum: "participatory_processes" "assemblies" "conferences" "initiatives"

Space type

space_id
integer

Space Id

component_id
integer

Component Id

order
string
Enum: "published_at" "rand"

Order by

order_direction
string
Enum: "asc" "desc"

Order direction

filter[voted_weight_in][]
Array of strings (voted_weight IN filter)

match one of voted_weight's values in array. Only available with [:impersonationFlow] flow

filter[voted_weight_eq]
string (voted_weight equal filter)

voted_weight is equal to. Only available with [:impersonationFlow] flow

filter[voted_weight_lt]
string (voted_weight less than filter)

voted_weight is less than. Only available with [:impersonationFlow] flow

filter[voted_weight_gt]
string (voted_weight greater than filter)

voted_weight is greater than. Only available with [:impersonationFlow] flow

filter[voted_weight_present]
boolean (voted_weight present filter)

voted_weight is not null and not empty. Only available with [:impersonationFlow] flow

filter[voted_weight_blank]
boolean (voted_weight blank filter)

voted_weight is null or empty. Only available with [:impersonationFlow] flow

filter[state_not_in][]
Array of strings (state not IN filter)

match none of state's values in array

filter[state_in][]
Array of strings (state IN filter)

match one of state's values in array

filter[state_start]
string (state starts With filter)
Example: filter[state_start]=some_string

state starts with

filter[state_eq]
string (state equal filter)

state is equal to

filter[state_not_eq]
string (state not equal filter)

state is NOT equal to

filter[state_matches]
string (state like filter)
Example: filter[state_matches]=%some_string

matches state with LIKE

filter[state_blank]
boolean (state blank filter)

state is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Vote on a proposal (sync)

Cast a vote synchronously. Returns a vote_proposal resource by default.

Set query include_proposal=true to return the full proposal payload (heavier).

Authorizations:
resourceOwnerFlowBearer
query Parameters
include_proposal
boolean

When true, return the full proposal instead of the vote resource

header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
proposal_id
required
integer

Published proposal id

required
object

Responses

Request samples

Content type
application/json
{
  • "proposal_id": 0,
  • "data": {
    }
}

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Show vote proposal

Fetch a single vote by id. Conditional GET supported.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Remove vote on a proposal

Remove the impersonated user's vote (Decidim::Proposals::UnvoteProposal). Returns the vote resource.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

List vote proposals

List Decidim::Proposals::ProposalVote rows for published proposals in visible spaces.

Filters

  • filter[creator_id] (or filter[author_id]): voter user id
  • filter[proposal_id]: proposal id
  • filter[component_id]: proposals component id
  • filter[participatory_space_id]: participatory space id

Responses support conditional GET (ETag / If-None-Match).

Access

Requires impersonation (proposals.vote or proposals.read for listing).

Authorizations:
resourceOwnerFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[creator_id_in][]
Array of integers (creator_id IN filter)

match one of creator_id's values in array

filter[creator_id_eq]
integer (creator_id equal filter)

creator_id is equal to

filter[creator_id_lt]
integer (creator_id less than filter)

creator_id is less than

filter[creator_id_gt]
integer (creator_id greater than filter)

creator_id is greater than

filter[creator_id_present]
boolean (creator_id present filter)

creator_id is not null and not empty

filter[creator_id_blank]
boolean (creator_id blank filter)

creator_id is null or empty

filter[proposal_id_in][]
Array of integers (proposal_id IN filter)

match one of proposal_id's values in array

filter[proposal_id_eq]
integer (proposal_id equal filter)

proposal_id is equal to

filter[proposal_id_lt]
integer (proposal_id less than filter)

proposal_id is less than

filter[proposal_id_gt]
integer (proposal_id greater than filter)

proposal_id is greater than

filter[proposal_id_present]
boolean (proposal_id present filter)

proposal_id is not null and not empty

filter[proposal_id_blank]
boolean (proposal_id blank filter)

proposal_id is null or empty

filter[component_id_in][]
Array of integers (component_id IN filter)

match one of component_id's values in array

filter[component_id_eq]
integer (component_id equal filter)

component_id is equal to

filter[component_id_lt]
integer (component_id less than filter)

component_id is less than

filter[component_id_gt]
integer (component_id greater than filter)

component_id is greater than

filter[component_id_present]
boolean (component_id present filter)

component_id is not null and not empty

filter[component_id_blank]
boolean (component_id blank filter)

component_id is null or empty

filter[participatory_space_id_in][]
Array of integers (participatory_space_id IN filter)

match one of participatory_space_id's values in array

filter[participatory_space_id_eq]
integer (participatory_space_id equal filter)

participatory_space_id is equal to

filter[participatory_space_id_lt]
integer (participatory_space_id less than filter)

participatory_space_id is less than

filter[participatory_space_id_gt]
integer (participatory_space_id greater than filter)

participatory_space_id is greater than

filter[participatory_space_id_present]
boolean (participatory_space_id present filter)

participatory_space_id is not null and not empty

filter[participatory_space_id_blank]
boolean (participatory_space_id blank filter)

participatory_space_id is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Vote on a proposal (async)

Enqueue a vote on a published proposal. Poll GET /jobs/:uuid for the result (slim vote payload by default).

Prefer this endpoint under load. Use POST /vote_proposals/sync when you need an immediate response.

Authorizations:
resourceOwnerFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
proposal_id
required
integer

Published proposal id

required
object

Responses

Request samples

Content type
application/json
{
  • "proposal_id": 0,
  • "data": {
    }
}

Response samples

Content type
application/json
{}

Draft Proposals

Unpublished proposals (published_at is null) tied to your OAuth application and impersonated participant.

One draft per component: for a given proposals component and user, only a single draft may exist. Creating again returns 400 if a draft is already present.

Isolation from the Decidim UI: drafts created or updated through this API are not editable in the web app, and drafts created in the UI are not visible here.

Lifecycle: create → update (meta.publishable) → publish (POST /draft_proposals/:id/publish, async by default; …/publish/sync for inline publication) → the resource becomes a published proposal.

Requires impersonation token (proposals.draft); service (client credentials) tokens cannot hold drafts.

Display a draft proposal

Detail a draft proposal. Raise HTTP 404 error if no draft is created for now.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Draft Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Withdraw a draft proposal

Withdraw (delete) a draft proposal. This action cannot be undone.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Draft Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Update draft proposal

This endpoint allows you to update a draft proposal associated with your application ID. Drafts updated via this API are not visible in the Decidim front-end, and drafts created from the Decidim application are not editable through the API. Therefore, any draft you create here is new and tied to your application's credentials.

Example Request

PUT /public/assemblies/12/2319/proposals/draft
Content-Type: application/json
Authorization: Bearer YOUR_bearer_token

{
  "title": "My valid title"
}

Access Requirements

  • Authentication: This endpoint requires an impersonation token. You must create drafts on behalf of a participant; drafts cannot be created using a service token (credential_token).

Error Handling

  • Field Errors: Only errors related to the fields you're updating will be returned.
  • Publishable Status: To determine if the draft is publishable, check the data.meta.publishable field in the response.

Example response

{
  "data": {
    "id": "12345",
    "type": "proposal",
    "attributes": {
      "title": "My valid title",
      "body": null
    },
    "meta": {
      "publishable": false
    }
  }
}

In this example, the title is valid, so the server returns a 200 OK status. However, since the body is blank, meta.publishable is false, indicating that the draft is not yet ready for publication.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Draft Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object (Update Draft Proposal Payload Data)

Payload to update in the proposal

title
string

Title of the draft

body
string

Content of the draft

locale
string
Enum: "en" "fr" "es"

Locale of the draft. default to user locale

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Publish a draft proposal (sync)

Publish a draft proposal inline and return the published proposal resource.

Same validation rules as the async publish endpoint. Requires impersonation (proposals.draft).

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Draft Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{
  • "data": {
    }
}

Publish a draft proposal (async)

Enqueue publication of a draft proposal. Poll GET /jobs/:uuid for the published proposal payload.

The draft must be publishable (meta.publishable on the last update). Requires impersonation (proposals.draft).

For synchronous publication, use POST /draft_proposals/{id}/publish/sync.

Authorizations:
resourceOwnerFlowBearer
path Parameters
id
required
integer

Draft Id

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{}

Create draft proposal

Create a draft

Authorizations:
resourceOwnerFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object (Draft Proposal Data)

Payload to update in the proposal

component_id
required
integer

Component ID

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
{
  • "data": {
    }
}

Jobs

Durable records for asynchronous API writes (decidim_rest_full_api_jobs).

When a mutating route returns HTTP 202, the body includes job_id (UUID). Poll GET /jobs/{id} without a Bearer token—the UUID is the capability—or list jobs with the same OAuth application and resource owner via GET /jobs (Bearer required).

Filter the index with filter[command_key] (job name, e.g. draft_proposals#create) and filter[status] (pending, processing, completed, failed). Delete a job with DELETE /jobs/{id} (same OAuth context as the list).

List API jobs

Returns async jobs for the same OAuth application, resource owner (when applicable), and organization as the Bearer token used to originate those jobs.

Pagination

page defaults to 1; per_page defaults to 25 and is clamped to 100.

Filters

  • filter[command_key]: job name (e.g. draft_proposals#create, forms/questions#create)
  • filter[status]: pending, processing, completed, or failed

Conditional GET

Supports ETag / If-None-Match on the collection.

Access

Bearer token required (same OAuth context as the jobs being listed).

query Parameters
filter[command_key_not_in][]
Array of strings (command_key not IN filter)

match none of command_key's values in array

filter[command_key_in][]
Array of strings (command_key IN filter)

match one of command_key's values in array

filter[command_key_start]
string (command_key starts With filter)
Example: filter[command_key_start]=some_string

command_key starts with

filter[command_key_eq]
string (command_key equal filter)

command_key is equal to

filter[command_key_not_eq]
string (command_key not equal filter)

command_key is NOT equal to

filter[command_key_matches]
string (command_key like filter)
Example: filter[command_key_matches]=%some_string

matches command_key with LIKE

filter[command_key_blank]
boolean (command_key blank filter)

command_key is null or empty

filter[status_not_in][]
Array of strings (status not IN filter)
Items Enum: "pending" "processing" "completed" "failed"

match none of status's values in array

filter[status_in][]
Array of strings (status IN filter)
Items Enum: "pending" "processing" "completed" "failed"

match one of status's values in array

filter[status_start]
string (status starts With filter)
Example: filter[status_start]=some_string

status starts with

filter[status_eq]
string (status equal filter)
Enum: "pending" "processing" "completed" "failed"

status is equal to

filter[status_not_eq]
string (status not equal filter)
Enum: "pending" "processing" "completed" "failed"

status is NOT equal to

filter[status_matches]
string (status like filter)
Example: filter[status_matches]=%some_string

matches status with LIKE

filter[status_blank]
boolean (status blank filter)

status is null or empty

page
integer

Page number for pagination

per_page
integer

Number of items per page

header Parameters
Authorization
required
string

Bearer access token: Bearer <token>

Responses

Response samples

Content type
application/json
{
  • "data": [],
  • "meta": {
    }
}

Delete API job

Remove a job record from the index. Only jobs created under the same OAuth application and resource owner as the Bearer token may be deleted. Does not cancel Sidekiq work already in flight for processing jobs.

Authorizations:
credentialFlowBearerresourceOwnerFlowBearer
path Parameters
id
required
string <uuid>
header Parameters
Authorization
required
string

Responses

Response samples

Content type
application/json
{ }

Poll API job

Poll job status with the UUID from HTTP 202 responses. No Bearer header: capability is solely the opaque UUID scoped by request host / organization.

path Parameters
id
required
string <uuid>

Job UUID (job_id from the asynchronous response body)

Responses

Response samples

Content type
application/json
{
  • "id": "19651688-ccd9-4f3a-a391-67d08f4e8242",
  • "status": "completed",
  • "command_key": "draft_proposals#create",
  • "created_at": "2026-07-21T14:22:09.511Z",
  • "updated_at": "2026-07-21T14:22:09.511Z",
  • "error_class": null,
  • "error_message": null,
  • "data": {
    },
  • "return_value": {
    },
  • "links": {}
}

Roles

Manage user roles within an organization and its participatory spaces.

Destroy role

Remove a role (revoke admin, or delete ParticipatoryProcessUserRole/AssemblyUserRole/AssemblyMember). Id is the composite encoded id.

Authorizations:
credentialFlowBearer
path Parameters
id
required
string
header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
{ }

Create role

Create a role (general_admin or space_*). Mutates Decidim state (User admin, ParticipatoryProcessUserRole, AssemblyUserRole, AssemblyMember).

Authorizations:
credentialFlowBearer
header Parameters
Authorization
string

Bearer access token (see security schemes)

Request Body schema: application/json
required
required
object
required
object
resource_type
required
string
Enum: "Decidim::ParticipatoryProcess" "Decidim::Assembly" "Decidim::Conference" "Decidim::Initiative" "Decidim::Organization"
resource_id
required
integer
user_id
required
integer
type
required
string
Enum: "general_admin" "space_private_member" "space_administrator" "space_moderator" "space_valuator"

Responses

Request samples

Content type
application/json
{
  • "data": {
    }
}

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

List roles

List roles scoped to the current organization (from Decidim state: admin users, participatory space roles, assembly members)

Authorizations:
credentialFlowBearer
query Parameters
page
integer

Page number for pagination

per_page
integer

Number of items per page

filter[user_id_in][]
Array of integers (user_id IN filter)

match one of user_id's values in array

filter[user_id_eq]
integer (user_id equal filter)

user_id is equal to

filter[user_id_lt]
integer (user_id less than filter)

user_id is less than

filter[user_id_gt]
integer (user_id greater than filter)

user_id is greater than

filter[user_id_present]
boolean (user_id present filter)

user_id is not null and not empty

filter[user_id_blank]
boolean (user_id blank filter)

user_id is null or empty

filter[resource_id_in][]
Array of integers (resource_id IN filter)

match one of resource_id's values in array

filter[resource_id_eq]
integer (resource_id equal filter)

resource_id is equal to

filter[resource_id_lt]
integer (resource_id less than filter)

resource_id is less than

filter[resource_id_gt]
integer (resource_id greater than filter)

resource_id is greater than

filter[resource_id_present]
boolean (resource_id present filter)

resource_id is not null and not empty

filter[resource_id_blank]
boolean (resource_id blank filter)

resource_id is null or empty

filter[resource_type_not_in][]
Array of strings (resource_type not IN filter)

match none of resource_type's values in array

filter[resource_type_in][]
Array of strings (resource_type IN filter)

match one of resource_type's values in array

filter[resource_type_start]
string (resource_type starts With filter)
Example: filter[resource_type_start]=some_string

resource_type starts with

filter[resource_type_eq]
string (resource_type equal filter)

resource_type is equal to

filter[resource_type_not_eq]
string (resource_type not equal filter)

resource_type is NOT equal to

filter[resource_type_matches]
string (resource_type like filter)
Example: filter[resource_type_matches]=%some_string

matches resource_type with LIKE

filter[resource_type_blank]
boolean (resource_type blank filter)

resource_type is null or empty

filter[type_not_in][]
Array of strings (type not IN filter)

match none of type's values in array

filter[type_in][]
Array of strings (type IN filter)

match one of type's values in array

filter[type_start]
string (type starts With filter)
Example: filter[type_start]=some_string

type starts with

filter[type_eq]
string (type equal filter)

type is equal to

filter[type_not_eq]
string (type not equal filter)

type is NOT equal to

filter[type_matches]
string (type like filter)
Example: filter[type_matches]=%some_string

matches type with LIKE

filter[type_blank]
boolean (type blank filter)

type is null or empty

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": [
    ]
}

Show role

Show a single role by id (composite id from Decidim state)

Authorizations:
credentialFlowBearer
path Parameters
id
required
string

The composite role ID (base64url-encoded JSON of resource_type, resource_id, user_id, invited_at, type)

header Parameters
Authorization
string

Bearer access token (see security schemes)

Responses

Response samples

Content type
application/json
Example
{
  • "data": {
    }
}

Webhooks

Outbound HTTP callbacks (not REST paths). Subscribe in System admin → API clients → Webhooks.

Verify deliveries with X-Webhook-Signature (HMAC-SHA256 over timestamp + "." + raw body) and X-Webhook-Timestamp.

Payload envelope: see schema WebhookDeliveryEnvelope.

Event catalog

Event Scope Permission Payload Trigger
draft_proposal_creation.succeeded proposals draft_proposal_creation.succeeded proposal_item_response Proposal lifecycle notification
draft_proposal_update.succeeded proposals draft_proposal_update.succeeded proposal_item_response Proposal lifecycle notification
meetings.upcoming_reminder.succeeded meetings meetings.upcoming_reminder.succeeded meeting_item_response Upcoming meeting reminder
proposal_creation.succeeded proposals proposal_creation.succeeded proposal_item_response Proposal lifecycle notification
proposal_state_change.succeeded proposals proposal_state_change.succeeded proposal_item_response Proposal lifecycle notification
proposal_update.succeeded proposals proposal_update.succeeded proposal_item_response Proposal lifecycle notification
system.organizations.created system system.organizations.created Organization admin change
system.organizations.deleted system system.organizations.deleted Organization admin change
system.organizations.updated system system.organizations.updated Organization admin change
user.created oauth user.created User account change
user.updated oauth user.updated User account change