Download OpenAPI specification:Download
A RestFull API for Decidim, to be able to CRUD resources from Decidim.
current version: 0.3.4
Get a token from our /oauth/token routes,
following OAuth specs on Credential Flows or Resource Owner Password Credentials Flow.
A permission system is attached to the created OAuth application, that is designed in two levels:
The scopes and abilities are manageable in your System Admin Panel.
One deployment hosts many Organizations (tenants by host).
system scope endpoints apply in the context of the resolved organizationhost selects which Organization you target.
For example, example.org/oauth/token and foobar.org/oauth/token obtain tokens for those organizations' OAuth applications.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).
Obtain access tokens for this API: client_credentials (machine-to-machine) or password with auth_type login or impersonation (Resource Owner Password Credentials flow).
auth_type login or impersonationCheck 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.
| token required | string |
{- "token": "string"
}{- "active": true,
- "scope": "public",
- "client_id": "2-9981EkXj0mERNN9M_bJ205KcIDF3xFFcpBT_eb1Zs",
- "token_type": "Bearer",
- "exp": 3571965494,
- "iat": 1784643547,
- "sub": 816,
- "resource": {
- "id": "3400",
- "type": "user",
- "attributes": {
- "email": "user1633@example.org",
- "name": "Warner Funk",
- "created_at": "2026-07-21T14:19:07Z",
- "updated_at": "2026-07-21T14:19:07Z",
- "locale": "en"
}, - "relationships": { },
- "meta": {
- "blocked": false,
- "locked": false
}
}
}Create an OAuth token for the given scopes (password or client_credentials grant).
| 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 |
{- "grant_type": "client_credentials",
- "client_id": "string",
- "client_secret": "string",
- "scope": "public"
}{- "access_token": "in3ZId4MKQ0lAhOWqdnxeFT9Y9x57ulcV5a6s29W3tw",
- "token_type": "Bearer",
- "expires_in": 7200,
- "scope": "public proposals",
- "created_at": 1784644118
}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 namesecondary_hosts: additional hostnames that redirect (301) to hostThe active Organization is resolved from the request Host header, so different host values resolve to that host's organization data.
List available organizations
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "18",
- "type": "organization",
- "attributes": {
- "host": "9.lvh.me",
- "secondary_hosts": [ ],
- "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "enable_participatory_space_filters": true,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "user_groups_enabled": true,
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "V",
- "send_welcome_notification": true,
- "name": {
- "en": "Schuster-Gusikowski",
- "fr": "Beahan-Reichel"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> A corporis et. 373</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Distinctio qui consequuntur. 374</p>"
}, - "extended_data": { },
- "created_at": "2026-07-21T14:00:21Z",
- "updated_at": "2026-07-21T14:00:21Z"
}, - "meta": {
- "locales": [
- "en",
- "fr"
]
}
}
]
}This endpoint allows you to update an organization.
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.
To update the name, send in your payload the name attribute.
The name attribute must be unique across all organizations.
| id required | string The ID of the organization |
| Authorization | string Bearer access token (see security schemes) |
required | object (Organization Attributes) | ||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
{- "data": {
- "name": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "description": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "reference_prefix": "string",
- "host": "string",
- "send_welcome_notification": true,
- "secondary_hosts": [
- "string"
], - "available_locales": [
- "en"
], - "default_locale": "string",
- "users_registration_mode": "enabled",
- "force_users_to_authenticate_before_access_organization": true,
- "badges_enabled": true,
- "enable_participatory_space_filters": true,
- "enable_machine_translations": true,
- "user_groups_enabled": true,
- "time_zone": "Africa/Algiers",
- "comments_max_length": 0,
- "rich_text_editor_in_public_views": true,
- "created_at": "2024-11-12T12:34:56Z",
- "updated_at": "2024-12-12T20:34:56Z",
- "extended_data": { }
}
}{- "data": {
- "id": "714",
- "type": "organization",
- "attributes": {
- "host": "1187.lvh.me",
- "secondary_hosts": [
- "[]"
], - "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "enable_participatory_space_filters": true,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "user_groups_enabled": true,
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "JD",
- "send_welcome_notification": true,
- "name": {
- "en": "Paucek LLC",
- "fr": "Corkery-Davis",
- "es": "Rogahn Group"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Optio commodi id. 140362</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Veniam a porro. 140363</p>"
}, - "extended_data": { },
- "created_at": "2026-07-21T14:13:02Z",
- "updated_at": "2026-07-21T14:13:03Z"
}, - "meta": {
- "locales": [
- "en",
- "fr",
- "es"
], - "unconfirmed_host": "new-host.com"
}
}
}Show organization
| id required | string The ID of the organization |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "1176",
- "type": "organization",
- "attributes": {
- "host": "1422.lvh.me",
- "secondary_hosts": [ ],
- "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "enable_participatory_space_filters": true,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "user_groups_enabled": true,
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "I",
- "send_welcome_notification": true,
- "name": {
- "en": "Senger, Ferry and Dicki",
- "fr": "Larkin, Nikolaus and Hodkiewicz"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Explicabo maiores dolores. 152413</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Illo dolore id. 152414</p>"
}, - "extended_data": { },
- "created_at": "2026-07-21T14:22:57Z",
- "updated_at": "2026-07-21T14:22:57Z"
}, - "meta": {
- "locales": [
- "en",
- "fr"
]
}
}
}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.
The extended_data feature allows you to update a hash with recursive merging. Use the body payload with these keys:
data: The value or hash you want to update.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.
| id required | integer Id of the organization |
| Authorization | string Bearer access token (see security schemes) |
| 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 |
{- "data": { },
- "object_path": "string"
}{- "data": {
- "foo": "bar"
}
}Fetch organization extended data
| id required | integer Id of the organization |
| object_path required | string object path, in dot style, like foo.bar |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "personal": {
- "birthday": "1989-01-28"
}, - "birthday": "1989-01-28"
}
}List participatory spaces of type Initiatives for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "19",
- "type": "space",
- "attributes": {
- "manifest_name": "initiatives",
- "participatory_space_type": "Decidim::Initiative",
- "title": {
- "en": "My initiative for testing"
}, - "subtitle": { },
- "short_description": { },
- "description": {
- "en": "<p><script>alert(\"initiative_description\");</script> Aut alias repellendus. 11755</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Optio natus deleniti. 11756</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:12Z",
- "updated_at": "2026-07-21T14:02:12Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "19",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "19",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "Beahan-Kovacek",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}List participatory spaces of type Conferences for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "20",
- "type": "space",
- "attributes": {
- "manifest_name": "conferences",
- "participatory_space_type": "Decidim::Conference",
- "title": {
- "en": "My conference for testing"
}, - "subtitle": { },
- "short_description": {
- "en": "<p><script>alert(\"conference_short_description\");</script> Placeat nesciunt delectus. 22459</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Nostrum adipisci quas. 22460</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Qui consectetur numquam. 22462</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Aspernatur ea eos. 22463</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:37Z",
- "updated_at": "2026-07-21T14:02:37Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "20",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "20",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Boyle Inc",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}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.
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "309",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Unde ex distinctio. 31201",
- "fr": "<script>alert(\"participatory_process_title\");</script> Voluptatem officia rem. 31202"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Reprehenderit et voluptate. 31204",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Eos id quas. 31205"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Minus neque quia. 31207</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Animi neque earum. 31208</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Possimus laudantium sit. 31210</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Omnis officiis quia. 31211</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:59Z",
- "updated_at": "2026-07-21T14:02:59Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "309",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "309",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Anderson, Mohr and Veum",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "307",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "My participatory_process for testing purpose",
- "fr": "c'est une concertation"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Natus ut rerum. 31054",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Dolore totam praesentium. 31055"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Maxime id est. 31057</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Aut et voluptatum. 31058</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Inventore id quis. 31060</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Velit et quasi. 31061</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:59Z",
- "updated_at": "2026-07-21T14:02:59Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "307",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "307",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Anderson, Mohr and Veum",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "308",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Repellat laudantium dolorem. 31126",
- "fr": "<script>alert(\"participatory_process_title\");</script> Assumenda corporis est. 31127"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Sapiente rerum rerum. 31129",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Rerum voluptatum veniam. 31130"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Voluptatibus temporibus assumenda. 31132</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Facilis aut iure. 31133</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Tenetur dolorem et. 31135</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Repellendus est enim. 31136</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:59Z",
- "updated_at": "2026-07-21T14:02:59Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "308",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "308",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Anderson, Mohr and Veum",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "310",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Soluta illum voluptas. 31276",
- "fr": "<script>alert(\"participatory_process_title\");</script> Temporibus in doloremque. 31277"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Quasi neque et. 31279",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Numquam ad et. 31280"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Sit consequatur beatae. 31282</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Ut mollitia dolorem. 31283</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Optio in doloremque. 31285</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Et iusto aut. 31286</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:02:59Z",
- "updated_at": "2026-07-21T14:02:59Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "310",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "310",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Anderson, Mohr and Veum",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}List participatory spaces of type Assemblies for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type.
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "345",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "My assembly for testing purpose",
- "fr": "c'est une assemblée"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Excepturi et consequatur. 40480",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Rem deserunt est. 40481"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Aliquam est exercitationem. 40483</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Modi sequi quidem. 40484</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Voluptatem possimus aut. 40486</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Et qui autem. 40487</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:03:23Z",
- "updated_at": "2026-07-21T14:03:23Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "1418",
- "type": "accountability_component"
}, - {
- "id": "1423",
- "type": "awesome_iframe_component"
}, - {
- "id": "1422",
- "type": "awesome_map_component"
}, - {
- "id": "1421",
- "type": "blog_component"
}, - {
- "id": "1416",
- "type": "budget_component"
}, - {
- "id": "1419",
- "type": "debate_component"
}, - {
- "id": "1429",
- "type": "meeting_component"
}, - {
- "id": "1415",
- "type": "meeting_component"
}, - {
- "id": "1425",
- "type": "meeting_component"
}, - {
- "id": "1427",
- "type": "meeting_component"
}, - {
- "id": "1413",
- "type": "page_component"
}, - {
- "id": "1424",
- "type": "proposal_component"
}, - {
- "id": "1428",
- "type": "proposal_component"
}, - {
- "id": "1414",
- "type": "proposal_component"
}, - {
- "id": "1426",
- "type": "proposal_component"
}, - {
- "id": "1420",
- "type": "sortition_component"
}, - {
- "id": "1417",
- "type": "survey_component"
}
], - "meta": {
- "count": 17
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "345",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "345",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Conroy, Baumbach and Mohr",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "346",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Non expedita omnis. 40648",
- "fr": "<script>alert(\"assembly_title\");</script> Dolores asperiores quaerat. 40649"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Maiores quam quo. 40651",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Cum quae molestiae. 40652"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> In aut sequi. 40654</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Inventore alias commodi. 40655</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Illum error est. 40657</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Officia est sed. 40658</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:03:23Z",
- "updated_at": "2026-07-21T14:03:23Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "346",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "346",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Conroy, Baumbach and Mohr",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "347",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Quasi aut consequatur. 40723",
- "fr": "<script>alert(\"assembly_title\");</script> Sequi quisquam quia. 40724"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Aut architecto rerum. 40726",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Quaerat itaque dignissimos. 40727"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Fugiat ad modi. 40729</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Et ut qui. 40730</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Natus aut minima. 40732</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Dignissimos ex maiores. 40733</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:03:23Z",
- "updated_at": "2026-07-21T14:03:23Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "347",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "347",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Conroy, Baumbach and Mohr",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "348",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Vero dolorem inventore. 40798",
- "fr": "<script>alert(\"assembly_title\");</script> Assumenda sapiente illo. 40799"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Cupiditate quia sed. 40801",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Tempora voluptas occaecati. 40802"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Aliquam rerum dolores. 40804</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Aut vitae qui. 40805</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Velit debitis beatae. 40807</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Molestiae possimus soluta. 40808</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:03:23Z",
- "updated_at": "2026-07-21T14:03:23Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "348",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "348",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Conroy, Baumbach and Mohr",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}List or search spaces of the organization. Can be processes, assemblies, or any other registred participatory space.
| 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 |
| 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 |
| 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 |
| filter[title_blank] | boolean (title blank filter) title is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "501",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "My assembly for testing purpose",
- "fr": "c'est une assemblée"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Fuga minima quibusdam. 80122",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Quos voluptates laborum. 80123"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Aut facere quibusdam. 80125</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Alias enim non. 80126</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Aut voluptatem quis. 80128</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Quod saepe et. 80129</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:07:09Z",
- "updated_at": "2026-07-21T14:07:09Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "2185",
- "type": "accountability_component"
}, - {
- "id": "2190",
- "type": "awesome_iframe_component"
}, - {
- "id": "2189",
- "type": "awesome_map_component"
}, - {
- "id": "2188",
- "type": "blog_component"
}, - {
- "id": "2183",
- "type": "budget_component"
}, - {
- "id": "2186",
- "type": "debate_component"
}, - {
- "id": "2182",
- "type": "meeting_component"
}, - {
- "id": "2175",
- "type": "meeting_component"
}, - {
- "id": "2177",
- "type": "meeting_component"
}, - {
- "id": "2179",
- "type": "meeting_component"
}, - {
- "id": "2180",
- "type": "page_component"
}, - {
- "id": "2178",
- "type": "proposal_component"
}, - {
- "id": "2174",
- "type": "proposal_component"
}, - {
- "id": "2181",
- "type": "proposal_component"
}, - {
- "id": "2176",
- "type": "proposal_component"
}, - {
- "id": "2187",
- "type": "sortition_component"
}, - {
- "id": "2184",
- "type": "survey_component"
}
], - "meta": {
- "count": 17
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "501",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "501",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "MacGyver-Aufderhar",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}Get detail of a Initiatives given its id
| id required | integer Id of the space |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "32",
- "type": "space",
- "attributes": {
- "manifest_name": "initiatives",
- "participatory_space_type": "Decidim::Initiative",
- "title": {
- "en": "My initiative for testing"
}, - "subtitle": { },
- "short_description": { },
- "description": {
- "en": "<p><script>alert(\"initiative_description\");</script> Sit ut non. 101755</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Porro veritatis fugiat. 101756</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:09:28Z",
- "updated_at": "2026-07-21T14:09:28Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "32",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My initiative for testing",
- "rel": "resource",
- "meta": {
- "space_id": "32",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kovacek-Crona",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}Get detail of a Participatory Processes given its id
| id required | integer Id of the space |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "914",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "My participatory_process for testing purpose",
- "fr": "c'est une concertation"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Minus sint labore. 112261",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Et et aut. 112262"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Eveniet voluptatem numquam. 112264</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Est assumenda totam. 112265</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Aliquid ea nobis. 112267</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Et dolorum perspiciatis. 112268</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:09:55Z",
- "updated_at": "2026-07-21T14:09:55Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "914",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My participatory_process for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "914",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Rippin, Maggio and Lakin",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}Get detail of a Assemblies given its id
| id required | integer Id of the space |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "711",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "My assembly for testing purpose",
- "fr": "c'est une assemblée"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Est rem maxime. 120712",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Est voluptatem nam. 120713"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Mollitia voluptatem sit. 120715</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Sequi at perspiciatis. 120716</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Suscipit qui quam. 120718</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Facere voluptas nobis. 120719</p>"
}, - "visibility": "transparent",
- "created_at": "2026-07-21T14:10:15Z",
- "updated_at": "2026-07-21T14:10:15Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "3053",
- "type": "accountability_component"
}, - {
- "id": "3058",
- "type": "awesome_iframe_component"
}, - {
- "id": "3057",
- "type": "awesome_map_component"
}, - {
- "id": "3056",
- "type": "blog_component"
}, - {
- "id": "3050",
- "type": "budget_component"
}, - {
- "id": "3054",
- "type": "debate_component"
}, - {
- "id": "3068",
- "type": "meeting_component"
}, - {
- "id": "3049",
- "type": "meeting_component"
}, - {
- "id": "3060",
- "type": "meeting_component"
}, - {
- "id": "3064",
- "type": "meeting_component"
}, - {
- "id": "3046",
- "type": "page_component"
}, - {
- "id": "3059",
- "type": "proposal_component"
}, - {
- "id": "3067",
- "type": "proposal_component"
}, - {
- "id": "3047",
- "type": "proposal_component"
}, - {
- "id": "3061",
- "type": "proposal_component"
}, - {
- "id": "3055",
- "type": "sortition_component"
}, - {
- "id": "3051",
- "type": "survey_component"
}
], - "meta": {
- "count": 17
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "711",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My assembly for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "711",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Price-Hessel",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}Get detail of a Conferences given its id
| id required | integer Id of the space |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "27",
- "type": "space",
- "attributes": {
- "manifest_name": "conferences",
- "participatory_space_type": "Decidim::Conference",
- "title": {
- "en": "My conference for testing"
}, - "subtitle": { },
- "short_description": {
- "en": "<p><script>alert(\"conference_short_description\");</script> Totam voluptas voluptate. 131497</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Aliquam ullam odit. 131498</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Voluptas ducimus nihil. 131500</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Voluptas similique sequi. 131501</p>"
}, - "visibility": "public",
- "created_at": "2026-07-21T14:10:42Z",
- "updated_at": "2026-07-21T14:10:42Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "27",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My conference for testing",
- "rel": "resource",
- "meta": {
- "space_id": "27",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kunze LLC",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}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.
List or search blog components of the organization
| 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 |
| 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 |
| filter[name_blank] | boolean (name blank filter) name is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "146",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "49",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Tempore porro repellendus. 3040",
- "fr": "<script>alert(\"component_name\");</script> Vel neque provident. 3041"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:01:22Z",
- "updated_at": "2026-07-21T14:01:22Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Tempore porro repellendus. 3040",
- "rel": "resource",
- "meta": {
- "space_id": "49",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Libero repudiandae dolorem. 2962",
- "rel": "resource",
- "meta": {
- "space_id": "49",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
]
}Search components (Decidim::Component) in the organization resolved from the request host.
filter[manifest_name]: e.g. proposals, blogs, meetingsfilter[id], filter[participatory_space_id], filter[participatory_space_type], filter[name]Supports page, per_page, and locales[] like other collection endpoints.
public scope with public.component.read (credential or impersonation token).
| 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 |
| 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 |
| 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 |
| filter[name_blank] | boolean (name blank filter) name is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "1591",
- "type": "meeting_component",
- "attributes": {
- "manifest_name": "meetings",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "526",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Occaecati at maiores. 53629",
- "fr": "<script>alert(\"component_name\");</script> Ducimus maiores quia. 53630"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:04:50Z",
- "updated_at": "2026-07-21T14:04:50Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Occaecati at maiores. 53629",
- "rel": "resource",
- "meta": {
- "space_id": "526",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Ut perspiciatis mollitia. 53590",
- "rel": "resource",
- "meta": {
- "space_id": "526",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "default_registration_terms": { },
- "comments_enabled": true,
- "comments_max_length": 1000,
- "registration_code_enabled": true,
- "creation_enabled_for_participants": false
}
}, - {
- "id": "1594",
- "type": "accountability_component",
- "attributes": {
- "manifest_name": "accountability",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "526",
- "name": {
- "en": "<script>alert(\"accountability\");</script> Accountability"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:04:50Z",
- "updated_at": "2026-07-21T14:04:50Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "33",
- "type": "result"
}, - {
- "id": "34",
- "type": "result"
}
], - "meta": {
- "count": 2
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"accountability\");</script> Accountability",
- "rel": "resource",
- "meta": {
- "space_id": "526",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Ut perspiciatis mollitia. 53590",
- "rel": "resource",
- "meta": {
- "space_id": "526",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": true
}
}
]
}Find on proposal
| id required | integer |
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "4937",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "1524",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Qui dolorem nulla. 145990",
- "fr": "<script>alert(\"component_name\");</script> Itaque molestiae ipsa. 145991"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:16:23Z",
- "updated_at": "2026-07-21T14:16:23Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Qui dolorem nulla. 145990",
- "rel": "resource",
- "meta": {
- "space_id": "1524",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> At et et. 145951",
- "rel": "resource",
- "meta": {
- "space_id": "1524",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": false,
- "collaborative_drafts_enabled": false,
- "comments_enabled": true,
- "comments_max_length": 1000,
- "default_sort_order": "default",
- "geocoding_enabled": false,
- "minimum_votes_per_user": 0,
- "official_proposals_enabled": true,
- "participatory_texts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "proposal_edit_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "endorsements_enabled": true,
- "votes_enabled": false,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": true
}
}
}Blog component details
| id required | integer |
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "4974",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "1561",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Omnis fugit sapiente. 148549",
- "fr": "<script>alert(\"component_name\");</script> Quo eum enim. 148550"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:17:45Z",
- "updated_at": "2026-07-21T14:17:45Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Omnis fugit sapiente. 148549",
- "rel": "resource",
- "meta": {
- "space_id": "1561",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Dolorem voluptatum non. 148564",
- "rel": "resource",
- "meta": {
- "space_id": "1561",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
}List or search proposal components of the organization
| 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 |
| 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 |
| 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. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "5206",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "1881",
- "name": {
- "en": "<script>alert(\"component_name\");</script> A repellat velit. 164113",
- "fr": "<script>alert(\"component_name\");</script> Est sit voluptatem. 164114"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:26:01Z",
- "updated_at": "2026-07-21T14:26:01Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "2591",
- "type": "proposal"
}, - {
- "id": "2592",
- "type": "proposal"
}, - {
- "id": "2593",
- "type": "proposal"
}
], - "meta": {
- "count": 3
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> A repellat velit. 164113",
- "rel": "resource",
- "meta": {
- "space_id": "1881",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Porro eos esse. 164074",
- "rel": "resource",
- "meta": {
- "space_id": "1881",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": false,
- "collaborative_drafts_enabled": false,
- "comments_enabled": true,
- "comments_max_length": 1000,
- "default_sort_order": "default",
- "geocoding_enabled": false,
- "minimum_votes_per_user": 0,
- "official_proposals_enabled": true,
- "participatory_texts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "proposal_edit_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "endorsements_enabled": true,
- "votes_enabled": false,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": true
}
}, - {
- "id": "5207",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "1881",
- "name": {
- "en": "<script>alert(\"proposals\");</script> Proposals"
}, - "global_announcement": { },
- "created_at": "2026-07-21T14:26:01Z",
- "updated_at": "2026-07-21T14:26:01Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "1881",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Porro eos esse. 164074",
- "rel": "resource",
- "meta": {
- "space_id": "1881",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": false,
- "collaborative_drafts_enabled": false,
- "comments_enabled": true,
- "comments_max_length": 0,
- "default_sort_order": "default",
- "geocoding_enabled": false,
- "minimum_votes_per_user": 0,
- "official_proposals_enabled": true,
- "participatory_texts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "proposal_edit_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "endorsements_enabled": true,
- "votes_enabled": true,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": true
}
}
]
}List users; read and update your extended data; create and consume magic links for sign-in (scopes and permissions per operation).
The extended_data feature allows you to update a hash with recursive merging. Use the body payload with these keys:
data: The value or hash you want to update.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.
| Authorization | string Bearer access token (see security schemes) |
| 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 |
{- "data": { },
- "object_path": "string"
}{- "data": {
- "foo": "bar"
}
}Challenge given token, open a session and redirect. Browser-only — not intended for server-side SDK clients; use generateMagicLink and send users the URL instead.
Marked for documentation only; TypeScript clients should not call this operation.
| magic_token required | string A token received for magic link |
| Authorization | string Bearer access token (see security schemes) |
{ }Generates a uniq magic link, valid for 5minutes. If the user follow this link, it will be signed in automatically
| Authorization | string Bearer access token (see security schemes) |
object (Generate Magic Link Data) Optional payload to configure the magic link | |||
| |||
{- "data": {
- "redirect_url": "string"
}
}{- "data": {
- "id": "6",
- "type": "magic_link",
- "attributes": {
- "token": "Q1FmeEFzX3d5WjJMLVhXZUxpdTc=",
- "label": "My label",
- "redirect_url": null
}, - "links": {
- "self": {
- "title": "Generates a magic link",
- "rel": "resource",
- "meta": {
- "action_method": "POST",
- "action_enctype": "application/x-www-form-urlencoded"
}
}, - "sign_in": {
- "title": "Sign in with magic link",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}List or search users of the organization
| 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 |
| 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: |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "3313",
- "type": "user",
- "attributes": {
- "name": "Carina Johnston",
- "nickname": "xg_1570",
- "email": "user1571@example.org",
- "about": "{\"en\"=>\"<script>alert(\\\"user_about\\\");</script> Voluptas illo animi. 149254\", \"fr\"=>\"<script>alert(\\\"user_about\\\");</script> Optio laudantium enim. 149255\", \"machine_translations\"=>{\"es\"=>\"<script>alert(\\\"user_about\\\");</script> Qui necessitatibus nam. 149256\"}}",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-07-21T14:18:05Z",
- "updated_at": "2026-07-21T14:18:05Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "3314",
- "type": "user",
- "attributes": {
- "name": "Wilfred Champlin",
- "nickname": "fig58l2_1571",
- "email": "user1572@example.org",
- "about": "{\"en\"=>\"<script>alert(\\\"user_about\\\");</script> Rerum voluptates voluptas. 149257\", \"fr\"=>\"<script>alert(\\\"user_about\\\");</script> Quasi doloribus sequi. 149258\", \"machine_translations\"=>{\"es\"=>\"<script>alert(\\\"user_about\\\");</script> Facere error vel. 149259\"}}",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-07-21T14:18:05Z",
- "updated_at": "2026-07-21T14:18:05Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}
]
}Fetch user extended data
| object_path required | string object path, in dot style, like foo.bar |
| Authorization | string Bearer access token (see security schemes) |
{- "data": { }
}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).
| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "2",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Illo voluptatem deleniti. 157",
- "fr": "<script>alert(\"attachment_title\");</script> Accusantium perspiciatis cumque. 158"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Aut laudantium unde. 160",
- "fr": "<script>alert(\"attachment_description\");</script> Repellat qui labore. 161"
}, - "weight": 0,
- "attachment_collection_id": null,
- "file_type": "document",
- "content_type": "application/pdf",
- "url": null,
- "thumbnail_url": null,
- "attached_to": {
- "type": "Decidim::Proposals::Proposal",
- "id": 2
}, - "created_at": "2026-07-21T13:59:55Z",
- "updated_at": "2026-07-21T13:59:55Z"
}
}
}| filename required | string |
| byte_size required | integer |
| checksum required | string |
| content_type | string |
| Authorization | string Bearer access token (see security schemes) |
{- "signed_id": "eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBdHNoIiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0d88ff0f62644cc0934ac7a51c0c079cf3693fee",
- "filename": "hello.pdf",
- "content_type": "application/pdf",
- "byte_size": 12345
}| 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 |
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "11",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Voluptas incidunt et. 145099",
- "fr": "<script>alert(\"attachment_title\");</script> Aut provident totam. 145100"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Qui nisi eum. 145102",
- "fr": "<script>alert(\"attachment_description\");</script> Dolores sint ipsa. 145103"
}, - "weight": 1,
- "attachment_collection_id": null,
- "file_type": "document",
- "content_type": "application/pdf",
- "url": null,
- "thumbnail_url": null,
- "attached_to": {
- "type": "Decidim::Proposals::Proposal",
- "id": 2277
}, - "created_at": "2026-07-21T14:15:53Z",
- "updated_at": "2026-07-21T14:15:53Z"
}
}
]
}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 (Decidim::Blogs::Post)
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [ ]
}Enqueue creation of a blog post. Poll GET /jobs/:uuid.
Set published_at to control visibility (see Blogs tag). Requires blogs.write and impersonation.
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||
| |||||
{- "data": {
- "component_id": 0,
- "attributes": {
- "title": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "body": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "published_at": "2019-08-24T14:15:22Z"
}
}
}{- "job_id": "bed33abf-3557-4252-a3a5-856de8aa7a81",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}Get post details (Decidim::Blogs::Post)
| id required | integer Post id |
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "425",
- "type": "blog",
- "attributes": {
- "created_at": "2026-07-21T14:15:08Z",
- "updated_at": "2026-07-21T14:15:08Z",
- "title": {
- "en": "<script>alert(\"blog_title\");</script> Facere voluptatum repellat. 144439",
- "fr": "<script>alert(\"blog_title\");</script> Dolorem perspiciatis quisquam. 144440"
}, - "body": {
- "en": "<p><script>alert(\"blog_body\");</script> Vel illo velit. 144442</p>",
- "fr": "<p><script>alert(\"blog_body\");</script> Et quia dolorem. 144443</p>"
}, - "published_at": "2026-07-21T14:13:08.760Z"
}, - "relationships": {
- "space": {
- "data": {
- "id": "1474",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "4893",
- "type": "blog_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Molestias nemo voluptatem. 144409",
- "rel": "resource",
- "meta": {
- "space_id": "1474",
- "space_manifest": "participatory_processes",
- "component_id": "4893",
- "component_manifest": "blogs",
- "action_method": "GET"
}
}, - "self": {
- "title": "Blogs Details",
- "rel": "resource",
- "meta": {
- "component_id": "4893",
- "component_manifest": "blogs",
- "space_id": "1474",
- "space_manifest": "participatory_processes",
- "resource_id": "425",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Blogs List",
- "rel": "resource",
- "meta": {
- "component_id": "4893",
- "component_manifest": "blogs",
- "space_id": "1474",
- "space_manifest": "participatory_processes",
- "resource_id": "425",
- "action_method": "GET"
}
}, - "next": {
- "title": "Next post",
- "rel": "resource",
- "meta": {
- "component_id": "4893",
- "component_manifest": "blogs",
- "space_id": "1474",
- "space_manifest": "participatory_processes",
- "resource_id": "424",
- "action_method": "GET"
}
}, - "prev": {
- "title": "Previous post",
- "rel": "resource",
- "meta": {
- "component_id": "4893",
- "component_manifest": "blogs",
- "space_id": "1474",
- "space_manifest": "participatory_processes",
- "resource_id": "426",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
}Enqueue deletion of a blog post. Requires blogs.destroy.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "job_id": "8b6fd7da-894e-49fd-85c1-3cd3281ce302",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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 /answers → submission_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 a question inline (201).
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||
| |||||||
{- "data": {
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": true,
- "body": {
- "property1": "string",
- "property2": "string"
}, - "description": {
- "property1": "string",
- "property2": "string"
}, - "question_type": "single_option",
- "max_choices": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "type": "questionnaires",
- "id": "string"
}
}
}
}
}{- "data": {
- "id": "148",
- "type": "questions",
- "attributes": {
- "position": 99,
- "mandatory": false,
- "question_type": "short_answer",
- "body": {
- "en": "API-created question"
}, - "description": null,
- "max_choices": null,
- "max_characters": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "577",
- "type": "questionnaires"
}
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}Enqueue question creation; poll GET /jobs/:uuid.
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||
| |||||||
{- "data": {
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": true,
- "body": {
- "property1": "string",
- "property2": "string"
}, - "description": {
- "property1": "string",
- "property2": "string"
}, - "question_type": "single_option",
- "max_choices": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "type": "questionnaires",
- "id": "string"
}
}
}
}
}{- "job_id": "038004b6-f234-4449-81ab-44dd1bdf957c",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}List questions for a questionnaire (filter[questionnaire_id] required).
| filter[questionnaire_id] required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "210",
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": false,
- "question_type": "short_answer",
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Ad sit omnis. 48346",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Vel placeat et. 48347",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Quidem ut rerum. 48348"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Veritatis fuga ea. 48349</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Sit perspiciatis maiores. 48350</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Molestiae alias dolorem. 48351</p>"
}
}, - "max_choices": null,
- "max_characters": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "620",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "211",
- "type": "questions",
- "attributes": {
- "position": 1,
- "mandatory": false,
- "question_type": "long_answer",
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Accusantium vel aperiam. 48397",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Veritatis temporibus consequatur. 48398",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Molestiae corrupti laudantium. 48399"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Praesentium quas natus. 48400</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Repellat et et. 48401</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Nisi commodi vero. 48402</p>"
}
}, - "max_choices": null,
- "max_characters": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "620",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "212",
- "type": "questions",
- "attributes": {
- "position": 2,
- "mandatory": false,
- "question_type": "single_option",
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Dolores excepturi suscipit. 48448",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Tempore voluptatum perspiciatis. 48449",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Architecto et inventore. 48450"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Quibusdam magni dicta. 48451</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Recusandae optio deserunt. 48452</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Assumenda eius ut. 48453</p>"
}
}, - "max_choices": null,
- "max_characters": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "620",
- "type": "questionnaires"
}
}
}
}
], - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}Enqueue answer submission; poll GET /submission_requests/:id (202 Accepted).
| Authorization | string Bearer access token (see security schemes) |
object | |
required | object |
{- "meta": {
- "locale": "string",
- "anonymous": true,
- "client_ip": "string"
}, - "data": {
- "type": "questionnaire_response",
- "attributes": {
- "answers": { }
}, - "relationships": {
- "questionnaire": {
- "data": {
- "type": "questionnaires",
- "id": "string"
}
}
}
}
}{- "data": {
- "id": "db1182ab-23fa-426f-a4c3-986587a60a45",
- "type": "submission_request",
- "attributes": {
- "status": "pending"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "status": "pending"
}
}
}| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "1604",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Dolores aliquid dolore. 140584",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Vitae sit enim. 140587</p>",
- "schema": {
- "type": "object",
- "properties": {
- "276": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Cumque minima sunt. 140629"
}, - "277": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Autem suscipit ut. 140680"
}, - "278": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Dignissimos saepe qui. 140731",
- "enum": [
- "136",
- "137",
- "138"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/276",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Cumque minima sunt. 140629"
}, - {
- "type": "Control",
- "scope": "#/properties/277",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Autem suscipit ut. 140680"
}, - {
- "type": "Control",
- "scope": "#/properties/278",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Dignissimos saepe qui. 140731",
- "options": {
- "choices": [
- {
- "id": "136",
- "translations": {
- "en": "Reiciendis animi qui. 140833",
- "fr": "Consequatur ut ea. 140834",
- "machine_translations": {
- "es": "Eaque minima laudantium. 140835"
}
}
}, - {
- "id": "137",
- "translations": {
- "en": "Nam deleniti et. 140887",
- "fr": "Officiis rerum eum. 140888",
- "machine_translations": {
- "es": "Aut officiis a. 140889"
}
}
}, - {
- "id": "138",
- "translations": {
- "en": "Cumque quos voluptatibus. 140941",
- "fr": "Vero consequatur molestias. 140942",
- "machine_translations": {
- "es": "Necessitatibus fugiat sed. 140943"
}
}
}
]
}
}
]
}, - "updated_at": "2026-07-21T14:13:55Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "1604"
}
}, - "submit_sync": {
- "rel": "submit_sync",
- "meta": {
- "action_method": "POST"
}
}, - "questions": {
- "rel": "questions",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "submission": {
- "allows_anonymous": true,
- "requires_participant_ip": true
}
}
}
}Enqueue questionnaire metadata update (title, description, terms of service). Poll GET /jobs/:uuid.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||
| |||||||
{- "data": {
- "type": "questionnaires",
- "id": "string",
- "attributes": {
- "title": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "description": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "tos": {
- "en": "string",
- "fr": "string",
- "es": "string"
}
}
}
}{- "job_id": "deb2b86d-11a6-479a-85c2-4119fab01559",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "1824",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Aspernatur non odit. 154474",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Qui corporis repellendus. 154477</p>",
- "updated_at": "2026-07-21T14:23:52Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "1824"
}
}, - "submit_sync": {
- "rel": "submit_sync",
- "meta": {
- "action_method": "POST"
}
}, - "questions": {
- "rel": "questions",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}
]
}Read a submission bundle (aggregate of Decidim::Forms::Answer rows).
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "8",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "438": "Stored answer"
}, - "client_ip": null
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "1852",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-07-21T14:24:19Z"
}
}
}| Authorization | string Bearer access token (see security schemes) |
object | |
required | object |
{- "meta": {
- "locale": "string",
- "anonymous": true,
- "client_ip": "string"
}, - "data": {
- "type": "questionnaire_response",
- "attributes": {
- "answers": { }
}, - "relationships": {
- "questionnaire": {
- "data": {
- "type": "questionnaires",
- "id": "string"
}
}
}
}
}{- "data": {
- "id": "11",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "474": "Test answer",
- "475": null,
- "476": null
}, - "client_ip": "504062477794058632118587"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "1876",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-07-21T14:24:45Z"
}
}
}Update questionnaire title, description, or terms of service inline.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||
| |||||||
{- "data": {
- "type": "questionnaires",
- "id": "string",
- "attributes": {
- "title": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "description": {
- "en": "string",
- "fr": "string",
- "es": "string"
}, - "tos": {
- "en": "string",
- "fr": "string",
- "es": "string"
}
}
}
}{- "data": {
- "id": "1904",
- "type": "questionnaires",
- "attributes": {
- "title": "Updated questionnaire title",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Et ad ducimus. 164554</p>",
- "schema": {
- "type": "object",
- "properties": {
- "516": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Porro itaque excepturi. 164596"
}, - "517": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Suscipit quas animi. 164647"
}, - "518": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Sed ab nihil. 164698",
- "enum": [
- "256",
- "257",
- "258"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/516",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Porro itaque excepturi. 164596"
}, - {
- "type": "Control",
- "scope": "#/properties/517",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Suscipit quas animi. 164647"
}, - {
- "type": "Control",
- "scope": "#/properties/518",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Sed ab nihil. 164698",
- "options": {
- "choices": [
- {
- "id": "256",
- "translations": {
- "en": "Sit et quidem. 164800",
- "fr": "Qui itaque accusantium. 164801",
- "machine_translations": {
- "es": "Aspernatur qui assumenda. 164802"
}
}
}, - {
- "id": "257",
- "translations": {
- "en": "Qui sint architecto. 164854",
- "fr": "Quos ducimus eos. 164855",
- "machine_translations": {
- "es": "Saepe repudiandae qui. 164856"
}
}
}, - {
- "id": "258",
- "translations": {
- "en": "Voluptates minima officia. 164908",
- "fr": "Consequuntur eaque assumenda. 164909",
- "machine_translations": {
- "es": "Ratione ut numquam. 164910"
}
}
}
]
}
}
]
}, - "updated_at": "2026-07-21T14:26:08Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "1904"
}
}, - "submit_sync": {
- "rel": "submit_sync",
- "meta": {
- "action_method": "POST"
}
}, - "questions": {
- "rel": "questions",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "submission": {
- "allows_anonymous": true,
- "requires_participant_ip": true
}
}
}
}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 detail
| id required | integer Proposal Id |
| 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 |
| 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 |
| filter[state_blank] | boolean (state blank filter) state is null or empty |
| order | string Order by |
| order_direction | string Enum: "asc" "desc" Order direction |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "2529",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-07-21T14:23:41Z",
- "updated_at": "2026-07-21T14:23:41Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Doloribus aut repellat. 154264",
- "fr": "<script>alert(\"proposal_title\");</script> Repellendus accusamus possimus. 154265"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Est velit velit. 154267</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Tempora temporibus iusto. 154268</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1765",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "5126",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "3638",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3638",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Quibusdam consequatur unde. 154255",
- "rel": "resource",
- "meta": {
- "space_id": "1765",
- "space_manifest": "participatory_processes",
- "component_id": "5126",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "5126",
- "component_manifest": "proposals",
- "space_id": "1765",
- "space_manifest": "participatory_processes",
- "resource_id": "2529",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "5126",
- "component_manifest": "proposals",
- "space_id": "1765",
- "space_manifest": "participatory_processes",
- "resource_id": "2529",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
}Search proposals
| 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 |
| filter[state_blank] | boolean (state blank filter) state is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "2656",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-07-21T14:27:18Z",
- "updated_at": "2026-07-21T14:27:18Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Quia est molestias. 170704",
- "fr": "<script>alert(\"proposal_title\");</script> Qui illo et. 170705"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Ducimus vero non. 170707</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Repudiandae blanditiis magni. 170708</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1955",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "5254",
- "type": "proposal_component"
}
}, - "state": {
- "data": {
- "id": "3473",
- "type": "proposal_state"
}, - "meta": {
- "token": "accepted"
}
}, - "author": {
- "data": {
- "id": "3890",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3890",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "component_id": "5254",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "5254",
- "component_manifest": "proposals",
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "resource_id": "2656",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "5254",
- "component_manifest": "proposals",
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "resource_id": "2656",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}, - {
- "id": "2657",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-07-21T14:27:18Z",
- "updated_at": "2026-07-21T14:27:18Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Nulla et natus. 170719",
- "fr": "<script>alert(\"proposal_title\");</script> Officia et consequatur. 170720"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Sit corporis eum. 170722</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Et voluptatem aliquid. 170723</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1955",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "5254",
- "type": "proposal_component"
}
}, - "state": {
- "data": {
- "id": "3473",
- "type": "proposal_state"
}, - "meta": {
- "token": "accepted"
}
}, - "author": {
- "data": {
- "id": "3891",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3891",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "component_id": "5254",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "5254",
- "component_manifest": "proposals",
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "resource_id": "2657",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "5254",
- "component_manifest": "proposals",
- "space_id": "1955",
- "space_manifest": "participatory_processes",
- "resource_id": "2657",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
]
}Cast a vote synchronously. Returns a vote_proposal resource by default.
Set query include_proposal=true to return the full proposal payload (heavier).
| include_proposal | boolean When true, return the full proposal instead of the vote resource |
| Authorization | string Bearer access token (see security schemes) |
| proposal_id required | integer Published proposal id |
required | object |
{- "proposal_id": 0,
- "data": {
- "weight": 0
}
}{- "data": {
- "id": "42",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-07-21T14:28:06Z",
- "updated_at": "2026-07-21T14:28:06Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "2728",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "3976",
- "type": "users"
}
}
}
}
}Fetch a single vote by id. Conditional GET supported.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "48",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-07-21T14:28:11Z",
- "updated_at": "2026-07-21T14:28:11Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "2734",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "3988",
- "type": "users"
}
}
}
}
}Remove the impersonated user's vote (Decidim::Proposals::UnvoteProposal). Returns the vote resource.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "49",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-07-21T14:28:11Z",
- "updated_at": "2026-07-21T14:28:11Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "2735",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "3990",
- "type": "users"
}
}
}
}
}List Decidim::Proposals::ProposalVote rows for published proposals in visible spaces.
filter[creator_id] (or filter[author_id]): voter user idfilter[proposal_id]: proposal idfilter[component_id]: proposals component idfilter[participatory_space_id]: participatory space idResponses support conditional GET (ETag / If-None-Match).
Requires impersonation (proposals.vote or proposals.read for listing).
| 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 |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "55",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-07-21T14:28:17Z",
- "updated_at": "2026-07-21T14:28:17Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "2741",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "4002",
- "type": "users"
}
}
}
}
]
}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.
| Authorization | string Bearer access token (see security schemes) |
| proposal_id required | integer Published proposal id |
required | object |
{- "proposal_id": 0,
- "data": {
- "weight": 0
}
}{- "job_id": "07539d3a-bb10-4786-ba0e-659652b913f7",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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.
Detail a draft proposal. Raise HTTP 404 error if no draft is created for now.
| id required | integer Draft Id |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "12",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-07-21T14:00:46Z",
- "updated_at": "2026-07-21T14:00:46Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Cum eum molestiae. 590"
}, - "body": { },
- "errors": {
- "title": [ ],
- "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "12",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "12",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "23",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "23",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Explicabo aspernatur eveniet. 580",
- "rel": "resource",
- "meta": {
- "space_id": "12",
- "space_manifest": "participatory_processes",
- "component_id": "12",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "12",
- "component_manifest": "proposals",
- "space_id": "12",
- "space_manifest": "participatory_processes",
- "resource_id": "12",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "12",
- "component_manifest": "proposals",
- "space_id": "12",
- "space_manifest": "participatory_processes",
- "resource_id": "12",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "et6YzrM-LLRvRBylKhELf7ebS-AL2iqx8JliyWMe-Ac",
- "fields": [
- "title",
- "body"
]
}
}
}Withdraw (delete) a draft proposal. This action cannot be undone.
| id required | integer Draft Id |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "830",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-07-21T14:05:25Z",
- "updated_at": "2026-07-21T14:05:25Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Rerum minima sed. 56450"
}, - "body": {
- "fr": "<p><script>alert(\"proposal_body\");</script> Eos nisi saepe. 56453</p>"
}, - "errors": {
- "title": [ ],
- "body": [ ]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "565",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "1687",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "1089",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "1089",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Odit explicabo ut. 56440",
- "rel": "resource",
- "meta": {
- "space_id": "565",
- "space_manifest": "participatory_processes",
- "component_id": "1687",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "1687",
- "component_manifest": "proposals",
- "space_id": "565",
- "space_manifest": "participatory_processes",
- "resource_id": "830",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "1687",
- "component_manifest": "proposals",
- "space_id": "565",
- "space_manifest": "participatory_processes",
- "resource_id": "830",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "JZ8nADbqMvITnrBESNDHk7jcjiSjJTNjTwWnr77JvN4",
- "fields": [
- "title",
- "body"
]
}
}
}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.
PUT /public/assemblies/12/2319/proposals/draft
Content-Type: application/json
Authorization: Bearer YOUR_bearer_token
{
"title": "My valid title"
}
{
"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.
| id required | integer Draft Id |
| Authorization | string Bearer access token (see security schemes) |
required | object (Update Draft Proposal Payload Data) Payload to update in the proposal | ||||||
| |||||||
{- "data": {
- "title": "string",
- "body": "string",
- "locale": "en"
}
}{- "data": {
- "id": "2613",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-07-21T14:26:39Z",
- "updated_at": "2026-07-21T14:26:40Z",
- "title": {
- "fr": "This is a valid proposal title sample"
}, - "body": {
- "fr": ""
}, - "errors": {
- "title": [ ],
- "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1936",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "5235",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "3783",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3783",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Incidunt et repellendus. 168958",
- "rel": "resource",
- "meta": {
- "space_id": "1936",
- "space_manifest": "participatory_processes",
- "component_id": "5235",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "5235",
- "component_manifest": "proposals",
- "space_id": "1936",
- "space_manifest": "participatory_processes",
- "resource_id": "2613",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "5235",
- "component_manifest": "proposals",
- "space_id": "1936",
- "space_manifest": "participatory_processes",
- "resource_id": "2613",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "u94VQQxFaHHTnx08SXnjdO0GMswbijdO6bPPJDU6cCk",
- "fields": [
- "title",
- "body"
]
}
}
}Publish a draft proposal inline and return the published proposal resource.
Same validation rules as the async publish endpoint. Requires impersonation (proposals.draft).
| id required | integer Draft Id |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "2382",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-07-21T14:17:15Z",
- "updated_at": "2026-07-21T14:17:15Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Error reiciendis molestiae. 147115",
- "fr": "<script>alert(\"proposal_title\");</script> Et repellat ut. 147116"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Dolore possimus adipisci. 147118</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Enim voluptatibus dignissimos. 147119</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1543",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "4956",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "3268",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3268",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Sit non pariatur. 147106",
- "rel": "resource",
- "meta": {
- "space_id": "1543",
- "space_manifest": "participatory_processes",
- "component_id": "4956",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "4956",
- "component_manifest": "proposals",
- "space_id": "1543",
- "space_manifest": "participatory_processes",
- "resource_id": "2382",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "4956",
- "component_manifest": "proposals",
- "space_id": "1543",
- "space_manifest": "participatory_processes",
- "resource_id": "2382",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "client_id": 743
}
}
}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.
| id required | integer Draft Id |
| Authorization | string Bearer access token (see security schemes) |
{- "job_id": "a863f234-9f1f-4e25-979f-e683f19170a9",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}Create a draft
| Authorization | string Bearer access token (see security schemes) |
required | object (Draft Proposal Data) Payload to update in the proposal | ||
| |||
{- "data": {
- "component_id": 0
}
}{- "data": {
- "id": "2451",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-07-21T14:21:46Z",
- "updated_at": "2026-07-21T14:21:46Z",
- "title": { },
- "body": { },
- "errors": {
- "title": [
- "Title cannot be blank"
], - "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "1697",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "5069",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "3520",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "3520",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> At rerum ipsam. 152320",
- "rel": "resource",
- "meta": {
- "space_id": "1697",
- "space_manifest": "participatory_processes",
- "component_id": "5069",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "5069",
- "component_manifest": "proposals",
- "space_id": "1697",
- "space_manifest": "participatory_processes",
- "resource_id": "2451",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "5069",
- "component_manifest": "proposals",
- "space_id": "1697",
- "space_manifest": "participatory_processes",
- "resource_id": "2451",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "sZ8346vjfok4g9VqdMsbKA9F-CHThOWHMMe7scsVsno",
- "fields": [
- "title",
- "body"
]
}
}
}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).
Returns async jobs for the same OAuth application, resource owner (when applicable), and organization as the Bearer token used to originate those jobs.
page defaults to 1; per_page defaults to 25 and is clamped to 100.
filter[command_key]: job name (e.g. draft_proposals#create, forms/questions#create)filter[status]: pending, processing, completed, or failedSupports ETag / If-None-Match on the collection.
Bearer token required (same OAuth context as the jobs being listed).
| 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 |
| 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 |
| 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 |
| Authorization required | string Bearer access token: |
{- "data": [
- {
- "id": "6647684f-9877-4a12-bc54-d9d41dc349af",
- "status": "completed",
- "command_key": "draft_proposals#create",
- "created_at": "2026-07-21T14:07:48.497Z",
- "updated_at": "2026-07-21T14:07:48.497Z",
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 25
}
}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.
| id required | string <uuid> |
| Authorization required | string |
{ }Poll job status with the UUID from HTTP 202 responses. No Bearer header: capability is solely the opaque UUID scoped by request host / organization.
| id required | string <uuid> Job UUID ( |
{- "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": {
- "ok": true
}, - "return_value": {
- "ok": true
}, - "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}Remove a role (revoke admin, or delete ParticipatoryProcessUserRole/AssemblyUserRole/AssemblyMember). Id is the composite encoded id.
| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{ }Create a role (general_admin or space_*). Mutates Decidim state (User admin, ParticipatoryProcessUserRole, AssemblyUserRole, AssemblyMember).
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||||||||
| |||||||||||||
{- "data": {
- "attributes": {
- "resource_type": "Decidim::ParticipatoryProcess",
- "resource_id": 0,
- "user_id": 0,
- "type": "general_admin"
}
}
}{- "data": {
- "id": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6Q29uZmVyZW5jZSIsInJlc291cmNlX2lkIjo0NSwidXNlcl9pZCI6MzM2MCwiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX3ByaXZhdGVfbWVtYmVyIn0",
- "type": "role",
- "attributes": {
- "type": "space_private_member",
- "user_id": 3360,
- "resource_id": 45,
- "resource_type": "Decidim::Conference",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-07-21T14:18:34Z",
- "updated_at": "2026-07-21T14:18:34Z"
}
}
}List roles scoped to the current organization (from Decidim state: admin users, participatory space roles, assembly members)
| 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 |
| 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 |
| filter[type_blank] | boolean (type blank filter) type is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6T3JnYW5pemF0aW9uIiwicmVzb3VyY2VfaWQiOjEwOTAsInVzZXJfaWQiOjM0ODgsImludml0ZWRfYXQiOm51bGwsInR5cGUiOiJnZW5lcmFsX2FkbWluIn0",
- "type": "role",
- "attributes": {
- "type": "general_admin",
- "user_id": 3488,
- "resource_id": 1090,
- "resource_type": "Decidim::Organization",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-07-21T14:20:26Z",
- "updated_at": "2026-07-21T14:20:26Z"
}
}, - {
- "id": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6MTY3NywidXNlcl9pZCI6MzQ4OCwiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX2FkbWluaXN0cmF0b3IifQ",
- "type": "role",
- "attributes": {
- "type": "space_administrator",
- "user_id": 3488,
- "resource_id": 1677,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-07-21T14:20:26Z",
- "updated_at": "2026-07-21T14:20:26Z"
}
}
]
}Show a single role by id (composite id from Decidim state)
| id required | string The composite role ID (base64url-encoded JSON of resource_type, resource_id, user_id, invited_at, type) |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6MTg0OSwidXNlcl9pZCI6MzY1MywiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX3ZhbHVhdG9yIn0",
- "type": "role",
- "attributes": {
- "type": "space_valuator",
- "user_id": 3653,
- "resource_id": 1849,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-07-21T14:25:10Z",
- "updated_at": "2026-07-21T14:25:10Z"
}
}
}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 | 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 |