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).
Extended data (client metadata on organizations, components, spaces, proposals, meetings): https://octree-gva.github.io/decidim-rest-full/integrator/extended-data.
Outbound webhook events are listed under the Webhooks tag.
Manage registrations via /webhook_registrations (or System admin) and fetch example
payloads from GET /webhook_events/{event_type}.
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 impersonationCreate a oauth token for the given scopes
| 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" "pages" "oauth" "roles" "attachments" "webhooks" Requested scopes |
{- "grant_type": "client_credentials",
- "client_id": "string",
- "client_secret": "string",
- "scope": "public"
}{- "access_token": "-z57twZOgIUVqk3lutO3C09f63YD4OCJbIRj9UCyG0k",
- "token_type": "Bearer",
- "expires_in": 7200,
- "scope": "public proposals",
- "created_at": 1785913769
}Check token validity and get optional user/resource (RFC 7662). Send the token to introspect in the request body; use a valid Bearer token in Authorization.
| token required | string |
{- "token": "string"
}{- "active": true,
- "scope": "public",
- "client_id": "NP3luTEPbMnFKzQRHeUJ3W37XwNQi_by_A4MdLon6Ag",
- "token_type": "Bearer",
- "iat": 1785913926,
- "exp": 3574506252,
- "sub": 1661,
- "resource": {
- "id": "5531",
- "type": "user",
- "attributes": {
- "email": "user431@example.org",
- "name": "Contessa Hegmann",
- "created_at": "2026-08-05T07:12:06Z",
- "updated_at": "2026-08-05T07:12:06Z",
- "locale": "en"
}, - "relationships": { },
- "meta": {
- "blocked": false,
- "locked": false
}
}
}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": "1610",
- "type": "organization",
- "attributes": {
- "host": "215.lvh.me",
- "secondary_hosts": [ ],
- "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "LLD",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "Bins-Dibbert",
- "fr": "Morissette-Carter"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Omnis cum similique. 13720</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Omnis quasi in. 13721</p>"
}, - "extended_data": { },
- "created_at": "2026-08-05T07:08:59Z",
- "updated_at": "2026-08-05T07:08:59Z"
}, - "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": "1711",
- "type": "organization",
- "attributes": {
- "host": "362.lvh.me",
- "secondary_hosts": [ ],
- "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "MD",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "Braun-Mayert",
- "fr": "Nom de l'organisation"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Quod perspiciatis tempora. 21357</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Esse nam error. 21358</p>"
}, - "extended_data": { },
- "created_at": "2026-08-05T07:11:35Z",
- "updated_at": "2026-08-05T07:11:35Z"
}, - "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": "1912",
- "type": "organization",
- "attributes": {
- "host": "989.lvh.me",
- "secondary_hosts": [ ],
- "default_locale": "en",
- "available_locales": [
- "en"
], - "enable_machine_translations": false,
- "badges_enabled": true,
- "rich_text_editor_in_public_views": false,
- "comments_max_length": 1000,
- "time_zone": "UTC",
- "users_registration_mode": "enabled",
- "force_users_to_authenticate_before_access_organization": false,
- "reference_prefix": "DVM",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "Pfeffer-Ferry",
- "fr": "Doyle, Bogisich and Schimmel"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Reiciendis adipisci molestiae. 83726</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Consequatur ducimus aut. 83727</p>"
}, - "extended_data": { },
- "created_at": "2026-08-05T07:20:46Z",
- "updated_at": "2026-08-05T07:20:46Z"
}, - "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.
Overview: Extended data.
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"
}
}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"
}
}Search, list, and fetch participatory spaces (e.g. Assemblies, Participatory Processes).
Extended data: GET/PUT /spaces/{manifest}/{id}/extended_data (+ /sync); filter with filter[extended_data_cont] on search and index. See Extended data.
See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "zone": "north"
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "zone": "south"
}
}List participatory spaces of type Assemblies for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type. Extended data filter: filter[extended_data_cont] (requires public.space.extended_data.read).
| 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[extended_data_cont] | string Search on space extended_data. See Extended data. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "1979",
- "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> Modi qui fugiat. 38058",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Rerum animi dolor. 38059"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Dolorem tenetur nulla. 38061</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Molestiae consequatur doloribus. 38062</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Sed quidem sed. 38064</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Culpa nesciunt consequatur. 38065</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:15:08Z",
- "updated_at": "2026-08-05T07:15:08Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "8279",
- "type": "page_component"
}, - {
- "id": "8280",
- "type": "proposal_component"
}, - {
- "id": "8281",
- "type": "meeting_component"
}, - {
- "id": "8282",
- "type": "budget_component"
}, - {
- "id": "8283",
- "type": "survey_component"
}, - {
- "id": "8284",
- "type": "accountability_component"
}, - {
- "id": "8285",
- "type": "debate_component"
}, - {
- "id": "8286",
- "type": "blog_component"
}, - {
- "id": "8287",
- "type": "awesome_map_component"
}, - {
- "id": "8288",
- "type": "awesome_iframe_component"
}, - {
- "id": "8289",
- "type": "proposal_component"
}, - {
- "id": "8290",
- "type": "meeting_component"
}, - {
- "id": "8291",
- "type": "proposal_component"
}, - {
- "id": "8292",
- "type": "meeting_component"
}, - {
- "id": "8293",
- "type": "proposal_component"
}, - {
- "id": "8294",
- "type": "meeting_component"
}
], - "meta": {
- "count": 16
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "1979",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "1979",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Deckow-Bradtke",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "1980",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Labore aperiam reprehenderit. 38217",
- "fr": "<script>alert(\"assembly_title\");</script> Consequatur veritatis cupiditate. 38218"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Quae magnam et. 38220",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Dignissimos cumque nisi. 38221"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Quo perferendis animi. 38223</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Ex necessitatibus est. 38224</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Asperiores aspernatur blanditiis. 38226</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Optio adipisci omnis. 38227</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:15:09Z",
- "updated_at": "2026-08-05T07:15:09Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "1980",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "1980",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Deckow-Bradtke",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "1981",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Perspiciatis tempore ullam. 38292",
- "fr": "<script>alert(\"assembly_title\");</script> Ipsa possimus et. 38293"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Veritatis assumenda accusamus. 38295",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Autem consequatur et. 38296"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Aut quia eius. 38298</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Dolores dolorem ut. 38299</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Quas deleniti fuga. 38301</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Et porro reprehenderit. 38302</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:15:09Z",
- "updated_at": "2026-08-05T07:15:09Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "1981",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "1981",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Deckow-Bradtke",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "1982",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Sed totam tenetur. 38367",
- "fr": "<script>alert(\"assembly_title\");</script> Id porro quia. 38368"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Consequatur dolores omnis. 38370",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Provident ut aperiam. 38371"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Reprehenderit consequatur sapiente. 38373</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Accusantium nisi itaque. 38374</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Sapiente aperiam tenetur. 38376</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Perferendis excepturi aliquid. 38377</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:15:09Z",
- "updated_at": "2026-08-05T07:15:09Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "1982",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "1982",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Deckow-Bradtke",
- "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. Extended data filter: filter[extended_data_cont] (requires public.space.extended_data.read).
| 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[extended_data_cont] | string Search on space extended_data. See Extended data. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [ ]
}List participatory spaces of type Conferences for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type. Extended data filter: filter[extended_data_cont] (requires public.space.extended_data.read).
| 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[extended_data_cont] | string Search on space extended_data. See Extended data. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "67",
- "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> Assumenda molestias optio. 60082</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Soluta corporis a. 60083</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Nobis id sapiente. 60085</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Earum tempore quaerat. 60086</p>"
}, - "visibility": "public",
- "created_at": "2026-08-05T07:16:45Z",
- "updated_at": "2026-08-05T07:16:45Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "67",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "67",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Auer, Wyman and Stamm",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
]
}List participatory spaces of type Initiatives for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type. Extended data filter: filter[extended_data_cont] (requires public.space.extended_data.read).
| 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[extended_data_cont] | string Search on space extended_data. See Extended data. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "60",
- "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> Non sapiente nihil. 70649</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Quia vel nemo. 70650</p>"
}, - "visibility": "public",
- "created_at": "2026-08-05T07:17:48Z",
- "updated_at": "2026-08-05T07:17:48Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "60",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "60",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "Schultz Inc",
- "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 |
| filter[extended_data_cont] | string Search on space extended_data. Requires |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "2267",
- "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> Magni quaerat atque. 109450",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Odit architecto vero. 109451"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Sit quia assumenda. 109453</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Similique voluptate omnis. 109454</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Occaecati sunt aspernatur. 109456</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Incidunt voluptatem voluptas. 109457</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:23:41Z",
- "updated_at": "2026-08-05T07:23:41Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "9501",
- "type": "proposal_component"
}, - {
- "id": "9502",
- "type": "meeting_component"
}, - {
- "id": "9503",
- "type": "proposal_component"
}, - {
- "id": "9504",
- "type": "meeting_component"
}, - {
- "id": "9505",
- "type": "proposal_component"
}, - {
- "id": "9506",
- "type": "meeting_component"
}, - {
- "id": "9507",
- "type": "page_component"
}, - {
- "id": "9508",
- "type": "proposal_component"
}, - {
- "id": "9509",
- "type": "meeting_component"
}, - {
- "id": "9510",
- "type": "budget_component"
}, - {
- "id": "9511",
- "type": "survey_component"
}, - {
- "id": "9512",
- "type": "accountability_component"
}, - {
- "id": "9513",
- "type": "debate_component"
}, - {
- "id": "9514",
- "type": "blog_component"
}, - {
- "id": "9515",
- "type": "awesome_map_component"
}, - {
- "id": "9516",
- "type": "awesome_iframe_component"
}
], - "meta": {
- "count": 16
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "2267",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "2267",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Mraz Group",
- "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": "78",
- "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> Laudantium sunt quibusdam. 136223</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Id vitae nostrum. 136224</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Ad nihil harum. 136226</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Magnam unde non. 136227</p>"
}, - "visibility": "public",
- "created_at": "2026-08-05T07:28:47Z",
- "updated_at": "2026-08-05T07:28:47Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "78",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My conference for testing",
- "rel": "resource",
- "meta": {
- "space_id": "78",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Jaskolski, Kerluke and Goyette",
- "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": "3213",
- "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> Eveniet dolorem eum. 148556",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Eveniet aperiam ut. 148557"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Aperiam et voluptatem. 148559</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> At est quaerat. 148560</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Aliquam ea sequi. 148562</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Itaque perferendis et. 148563</p>"
}, - "visibility": "public",
- "created_at": "2026-08-05T07:30:13Z",
- "updated_at": "2026-08-05T07:30:13Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "3213",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My participatory_process for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "3213",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Bins, Hirthe and Gutkowski",
- "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": "74",
- "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> Est rerum perspiciatis. 162943</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Quia ut cupiditate. 162944</p>"
}, - "visibility": "public",
- "created_at": "2026-08-05T07:32:24Z",
- "updated_at": "2026-08-05T07:32:24Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "74",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My initiative for testing",
- "rel": "resource",
- "meta": {
- "space_id": "74",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "Russel-Macejkovic",
- "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": "2517",
- "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> Consequatur facere ad. 172254",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Inventore odit ad. 172255"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Exercitationem vero accusantium. 172257</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Aut sit est. 172258</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Id harum officia. 172260</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Consequuntur doloremque quis. 172261</p>"
}, - "visibility": "transparent",
- "created_at": "2026-08-05T07:33:49Z",
- "updated_at": "2026-08-05T07:33:49Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "10546",
- "type": "page_component"
}, - {
- "id": "10547",
- "type": "proposal_component"
}, - {
- "id": "10548",
- "type": "meeting_component"
}, - {
- "id": "10549",
- "type": "budget_component"
}, - {
- "id": "10550",
- "type": "survey_component"
}, - {
- "id": "10551",
- "type": "accountability_component"
}, - {
- "id": "10552",
- "type": "debate_component"
}, - {
- "id": "10553",
- "type": "blog_component"
}, - {
- "id": "10554",
- "type": "awesome_map_component"
}, - {
- "id": "10555",
- "type": "awesome_iframe_component"
}, - {
- "id": "10556",
- "type": "proposal_component"
}, - {
- "id": "10557",
- "type": "meeting_component"
}, - {
- "id": "10558",
- "type": "proposal_component"
}, - {
- "id": "10559",
- "type": "meeting_component"
}, - {
- "id": "10560",
- "type": "proposal_component"
}, - {
- "id": "10561",
- "type": "meeting_component"
}
], - "meta": {
- "count": 16
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "2517",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My assembly for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "2517",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Murray, Cremin and Murazik",
- "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.
Extended data: GET/PUT /components/{id}/extended_data (+ /sync); filter with filter[extended_data_cont] on search. See Extended data.
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": "7935",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::Assembly",
- "participatory_space_id": "1920",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Sit quaerat occaecati. 3165",
- "fr": "<script>alert(\"component_name\");</script> Error ut beatae. 3166"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:05:44Z",
- "updated_at": "2026-08-05T07:05:44Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Sit quaerat occaecati. 3165",
- "rel": "resource",
- "meta": {
- "space_id": "1920",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"assembly_title\");</script> Eos veritatis velit. 3033",
- "rel": "resource",
- "meta": {
- "space_id": "1920",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": 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_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "collaborative_drafts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "votes_enabled": false,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "endorsements_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": true
}
}, - {
- "id": "7936",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::Assembly",
- "participatory_space_id": "1920",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Et ut earum. 3174",
- "fr": "<script>alert(\"component_name\");</script> Iusto provident et. 3175"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:05:44Z",
- "updated_at": "2026-08-05T07:05:44Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Et ut earum. 3174",
- "rel": "resource",
- "meta": {
- "space_id": "1920",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"assembly_title\");</script> Eos veritatis velit. 3033",
- "rel": "resource",
- "meta": {
- "space_id": "1920",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": 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_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "collaborative_drafts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "votes_enabled": false,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "endorsements_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": 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": "8084",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "2582",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Accusamus neque molestiae. 20592",
- "fr": "<script>alert(\"component_name\");</script> Sed dolore accusamus. 20593"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:11:00Z",
- "updated_at": "2026-08-05T07:11:00Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Accusamus neque molestiae. 20592",
- "rel": "resource",
- "meta": {
- "space_id": "2582",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Aperiam sit modi. 20556",
- "rel": "resource",
- "meta": {
- "space_id": "2582",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false,
- "amendments_enabled": false,
- "attachments_allowed": 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_time": "limited",
- "proposal_limit": 0,
- "resources_permissions_enabled": true,
- "threshold_per_proposal": 0,
- "vote_limit": 0,
- "collaborative_drafts_enabled": false,
- "proposal_edit_before_minutes": 5,
- "votes_enabled": false,
- "creation_enabled": false,
- "proposal_answering_enabled": true,
- "amendment_creation_enabled": true,
- "amendment_reaction_enabled": true,
- "amendment_promotion_enabled": true,
- "endorsements_enabled": true,
- "can_create_proposals": false,
- "can_vote": false,
- "can_endorse": true,
- "can_comment": true
}
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "a": 1
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "k": "v"
}
}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" "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" "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" "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" "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 |
| filter[extended_data_cont] | string Search on component extended_data. Format: |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "9022",
- "type": "survey_component",
- "attributes": {
- "manifest_name": "surveys",
- "participatory_space_type": "Decidim::Assembly",
- "participatory_space_id": "2150",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Minima enim qui. 80701",
- "fr": "<script>alert(\"component_name\");</script> Dolor aliquid voluptas. 80702"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:18:55Z",
- "updated_at": "2026-08-05T07:18:55Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Minima enim qui. 80701",
- "rel": "resource",
- "meta": {
- "space_id": "2150",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"assembly_title\");</script> Maxime id voluptas. 80429",
- "rel": "resource",
- "meta": {
- "space_id": "2150",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}, - {
- "id": "9023",
- "type": "meeting_component",
- "attributes": {
- "manifest_name": "meetings",
- "participatory_space_type": "Decidim::Assembly",
- "participatory_space_id": "2150",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Qui quis placeat. 80710",
- "fr": "<script>alert(\"component_name\");</script> Voluptatem animi placeat. 80711"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:18:55Z",
- "updated_at": "2026-08-05T07:18:55Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Qui quis placeat. 80710",
- "rel": "resource",
- "meta": {
- "space_id": "2150",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"assembly_title\");</script> Maxime id voluptas. 80429",
- "rel": "resource",
- "meta": {
- "space_id": "2150",
- "space_manifest": "assemblies",
- "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
}
}
]
}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": "10648",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "3350",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Rerum possimus harum. 178007",
- "fr": "<script>alert(\"component_name\");</script> Et et quaerat. 178008"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:35:27Z",
- "updated_at": "2026-08-05T07:35:27Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Rerum possimus harum. 178007",
- "rel": "resource",
- "meta": {
- "space_id": "3350",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Officiis sunt harum. 177930",
- "rel": "resource",
- "meta": {
- "space_id": "3350",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}, - {
- "id": "10649",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "3350",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Similique qui amet. 178016",
- "fr": "<script>alert(\"component_name\");</script> Sunt sunt iure. 178017"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:35:27Z",
- "updated_at": "2026-08-05T07:35:27Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Similique qui amet. 178016",
- "rel": "resource",
- "meta": {
- "space_id": "3350",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Officiis sunt harum. 177930",
- "rel": "resource",
- "meta": {
- "space_id": "3350",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
]
}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": "10679",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "3372",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Est tempora sunt. 180058",
- "fr": "<script>alert(\"component_name\");</script> Voluptas ducimus vel. 180059"
}, - "global_announcement": { },
- "created_at": "2026-08-05T07:36:19Z",
- "updated_at": "2026-08-05T07:36:19Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Est tempora sunt. 180058",
- "rel": "resource",
- "meta": {
- "space_id": "3372",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Rerum consequatur incidunt. 180073",
- "rel": "resource",
- "meta": {
- "space_id": "3372",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
}List users; read and update your extended data; create and consume magic links for sign-in (scopes and permissions per operation).
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) |
{ }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"
}
}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": {
- "personal": {
- "birthday": "1989-01-28"
}, - "birthday": "1989-01-28"
}
}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": "6125",
- "type": "user",
- "attributes": {
- "name": "Trish Koepp",
- "nickname": "9_1021",
- "email": "user1024@example.org",
- "about": "<script>alert(\"user_about\");</script>Saepe suscipit magnam. 83446",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:01Z",
- "updated_at": "2026-08-05T07:20:01Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "6126",
- "type": "user",
- "attributes": {
- "name": "Mrs. Jo Carter",
- "nickname": "750bsxtat_1022",
- "email": "user1025@example.org",
- "about": "<script>alert(\"user_about\");</script>Assumenda consectetur amet. 83447",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:01Z",
- "updated_at": "2026-08-05T07:20:01Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "6127",
- "type": "user",
- "attributes": {
- "name": "Deirdre Hackett",
- "nickname": "wz_1023",
- "email": "user1026@example.org",
- "about": "<script>alert(\"user_about\");</script>Veritatis eum aut. 83448",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:01Z",
- "updated_at": "2026-08-05T07:20:01Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "6128",
- "type": "user",
- "attributes": {
- "name": "Hollis Erdman",
- "nickname": "k6_1024",
- "email": "user1027@example.org",
- "about": "<script>alert(\"user_about\");</script>Cum nihil rerum. 83449",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:02Z",
- "updated_at": "2026-08-05T07:20:02Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "6129",
- "type": "user",
- "attributes": {
- "name": "Mathilda Schimmel",
- "nickname": "qqfhoks3b_1025",
- "email": "user1028@example.org",
- "about": "<script>alert(\"user_about\");</script>Quas aut dolor. 83450",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:02Z",
- "updated_at": "2026-08-05T07:20:02Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "6130",
- "type": "user",
- "attributes": {
- "name": "Aretha Lubowitz",
- "nickname": "fk1izyg333_1026",
- "email": "user1029@example.org",
- "about": "<script>alert(\"user_about\");</script>Occaecati libero reiciendis. 83451",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-08-05T07:20:02Z",
- "updated_at": "2026-08-05T07:20:02Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}
]
}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": "13",
- "type": "magic_link",
- "attributes": {
- "token": "dm1HWnJEZlJ0RGNxa0RwM0tUdjQ=",
- "label": "My label",
}, - "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"
}
}
}
}
}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).
| filename required | string |
| byte_size required | integer |
| checksum required | string |
| content_type | string |
| Authorization | string Bearer access token (see security schemes) |
{- "signed_id": "eyJfcmFpbHMiOnsiZGF0YSI6MTI3MjMsInB1ciI6ImJsb2JfaWQifX0=--103b369431b7490fcdf4cfc19d377b6fb8f877b9",
- "filename": "hello.pdf",
- "content_type": "application/pdf",
- "byte_size": 12345
}| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "10",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Placeat qui quo. 6105",
- "fr": "<script>alert(\"attachment_title\");</script> Incidunt enim nihil. 6106"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Et saepe in. 6108",
- "fr": "<script>alert(\"attachment_description\");</script> Odio quaerat voluptatem. 6109"
}, - "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": 4109
}, - "created_at": "2026-08-05T07:06:54Z",
- "updated_at": "2026-08-05T07:06:54Z"
}
}
}| 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": "16",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Labore accusamus aspernatur. 21231",
- "fr": "<script>alert(\"attachment_title\");</script> Voluptatem quia facere. 21232"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Nostrum nesciunt libero. 21234",
- "fr": "<script>alert(\"attachment_description\");</script> Animi non quis. 21235"
}, - "weight": 9,
- "attachment_collection_id": null,
- "file_type": "document",
- "content_type": "application/pdf",
- "url": null,
- "thumbnail_url": null,
- "attached_to": {
- "type": "Decidim::Proposals::Proposal",
- "id": 4253
}, - "created_at": "2026-08-05T07:11:15Z",
- "updated_at": "2026-08-05T07:11:15Z"
}
}
]
}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).
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": "445",
- "type": "blog",
- "attributes": {
- "created_at": "2026-08-05T07:26:17Z",
- "updated_at": "2026-08-05T07:26:17Z",
- "title": {
- "en": "<script>alert(\"blog_title\");</script> Dolorem ad similique. 125359",
- "fr": "<script>alert(\"blog_title\");</script> Placeat atque impedit. 125360"
}, - "body": {
- "en": "<p><script>alert(\"blog_body\");</script> Consectetur quis et. 125362</p>",
- "fr": "<p><script>alert(\"blog_body\");</script> Repellendus ipsum eveniet. 125363</p>"
}, - "published_at": "2026-08-05T07:25:17.845Z"
}, - "relationships": {
- "space": {
- "data": {
- "id": "3092",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "9768",
- "type": "blog_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Consequuntur officia et. 125342",
- "rel": "resource",
- "meta": {
- "space_id": "3092",
- "space_manifest": "participatory_processes",
- "component_id": "9768",
- "component_manifest": "blogs",
- "action_method": "GET"
}
}, - "self": {
- "title": "Blogs Details",
- "rel": "resource",
- "meta": {
- "component_id": "9768",
- "component_manifest": "blogs",
- "space_id": "3092",
- "space_manifest": "participatory_processes",
- "resource_id": "445",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Blogs List",
- "rel": "resource",
- "meta": {
- "component_id": "9768",
- "component_manifest": "blogs",
- "space_id": "3092",
- "space_manifest": "participatory_processes",
- "resource_id": "445",
- "action_method": "GET"
}
}, - "prev": {
- "title": "Previous post",
- "rel": "resource",
- "meta": {
- "component_id": "9768",
- "component_manifest": "blogs",
- "space_id": "3092",
- "space_manifest": "participatory_processes",
- "resource_id": "446",
- "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": "ed08bd27-3124-41c8-8641-0a154d70bbf9",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": "49cc7d17-d07c-45af-9e22-0f6384762edd",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": [ ]
}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].
Read a submission bundle (aggregate of Decidim::Forms::Answer rows).
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "10",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "155": "Stored answer"
}, - "client_ip": null
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2814",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-08-05T07:07:35Z"
}
}
}| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "2819",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Ea ducimus ut. 12856",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Dolorum iste corrupti. 12859</p>",
- "updated_at": "2026-08-05T07:08:50Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "2819"
}
}, - "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
}
}
]
}| 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": "14",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "185": "Test answer",
- "186": null,
- "187": null
}, - "client_ip": "120488698348784059647353"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2824",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-08-05T07:09:41Z"
}
}
}| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "2846",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Ipsam voluptatem suscipit. 18967",
- "description": "<p><script>alert(\"questionnaire_description\");</script> In culpa quia. 18970</p>",
- "schema": {
- "type": "object",
- "properties": {
- "203": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Consequatur recusandae odit. 18976"
}, - "204": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Qui minus maiores. 19027"
}, - "205": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Nulla qui quo. 19078",
- "enum": [
- "202",
- "203",
- "204"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/203",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Consequatur recusandae odit. 18976"
}, - {
- "type": "Control",
- "scope": "#/properties/204",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Qui minus maiores. 19027"
}, - {
- "type": "Control",
- "scope": "#/properties/205",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Nulla qui quo. 19078",
- "options": {
- "choices": [
- {
- "id": "202",
- "translations": {
- "en": "Quaerat ipsum qui. 19129",
- "fr": "Illo odio sit. 19130",
- "machine_translations": {
- "es": "Qui voluptates aut. 19131"
}
}
}, - {
- "id": "203",
- "translations": {
- "en": "Nulla cupiditate sapiente. 19132",
- "fr": "Error quam voluptatem. 19133",
- "machine_translations": {
- "es": "Quasi laudantium explicabo. 19134"
}
}
}, - {
- "id": "204",
- "translations": {
- "en": "Rem pariatur non. 19135",
- "fr": "Tempore eius itaque. 19136",
- "machine_translations": {
- "es": "Est blanditiis repudiandae. 19137"
}
}
}
]
}
}
]
}, - "updated_at": "2026-08-05T07:10:47Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "2846"
}
}, - "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": "91ab1a31-58af-4835-b7bf-c6705a025240",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": "492618c1-cdcf-4295-9e72-b9c46093cc6e",
- "type": "submission_request",
- "attributes": {
- "status": "pending"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "status": "pending"
}
}
}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": "518cee73-fc3c-47ef-a1f1-cb299b759cb5",
- "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": "245",
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Omnis veniam magni. 24881",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Praesentium quia dolor. 24882",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Qui quia architecto. 24883"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Itaque iusto laborum. 24884</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Sit voluptate sapiente. 24885</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Nihil tempora commodi. 24886</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "short_answer"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2860",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "246",
- "type": "questions",
- "attributes": {
- "position": 1,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Aut omnis facilis. 24932",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Iusto quod similique. 24933",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Fugiat culpa consectetur. 24934"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Ut delectus consequatur. 24935</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Voluptatem ducimus assumenda. 24936</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Dolor a quia. 24937</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "long_answer"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2860",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "247",
- "type": "questions",
- "attributes": {
- "position": 2,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Quia explicabo voluptatem. 24983",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Tenetur at consequatur. 24984",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Repellat voluptatem rerum. 24985"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Temporibus possimus dolor. 24986</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Ab aperiam enim. 24987</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Et velit occaecati. 24988</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "single_option"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2860",
- "type": "questionnaires"
}
}
}
}
], - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}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": "266",
- "type": "questions",
- "attributes": {
- "position": 99,
- "mandatory": false,
- "body": {
- "en": "API-created question"
}, - "description": null,
- "max_choices": null,
- "max_characters": 0,
- "question_type": "short_answer"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "2866",
- "type": "questionnaires"
}
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}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": "2878",
- "type": "questionnaires",
- "attributes": {
- "title": "Updated questionnaire title",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Qui qui incidunt. 29136</p>",
- "schema": {
- "type": "object",
- "properties": {
- "300": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Molestias maxime animi. 29142"
}, - "301": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Id natus eum. 29193"
}, - "302": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Et mollitia id. 29244",
- "enum": [
- "298",
- "299",
- "300"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/300",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Molestias maxime animi. 29142"
}, - {
- "type": "Control",
- "scope": "#/properties/301",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Id natus eum. 29193"
}, - {
- "type": "Control",
- "scope": "#/properties/302",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Et mollitia id. 29244",
- "options": {
- "choices": [
- {
- "id": "298",
- "translations": {
- "en": "Eius voluptas optio. 29295",
- "fr": "Dolor ea quidem. 29296",
- "machine_translations": {
- "es": "Harum ea non. 29297"
}
}
}, - {
- "id": "299",
- "translations": {
- "en": "Voluptatem tempore cupiditate. 29298",
- "fr": "Qui quisquam et. 29299",
- "machine_translations": {
- "es": "Ut et dolorum. 29300"
}
}
}, - {
- "id": "300",
- "translations": {
- "en": "Nam sunt consequatur. 29301",
- "fr": "Molestias debitis ab. 29302",
- "machine_translations": {
- "es": "Et sit rerum. 29303"
}
}
}
]
}
}
]
}, - "updated_at": "2026-08-05T07:13:40Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "2878"
}
}, - "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 meetings (Decidim::Meetings::Meeting) within visible participatory spaces.
Read (meetings.read): list and show meetings; filter by component, space, and extended_data.
Extended data: see Extended data.
List published meetings. Filter with filter[extended_data_cont] when the client has meetings.extended_data.read.
See Extended data.
| 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: "start_time" "rand" Order by |
| order_direction | string Enum: "asc" "desc" Order direction |
| filter[extended_data_cont] | string Search on meeting extended_data. Format: |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "2772",
- "type": "meeting",
- "attributes": {
- "created_at": "2026-08-05T07:09:57Z",
- "updated_at": "2026-08-05T07:09:57Z",
- "extended_data": {
- "integration": "alpha"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2539",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "8041",
- "type": "meeting_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"meetings\");</script> Meetings",
- "rel": "resource",
- "meta": {
- "space_id": "2539",
- "space_manifest": "participatory_processes",
- "component_id": "8041",
- "component_manifest": "meetings",
- "action_method": "GET"
}
}, - "self": {
- "title": "Meetings Details",
- "rel": "resource",
- "meta": {
- "component_id": "8041",
- "component_manifest": "meetings",
- "space_id": "2539",
- "space_manifest": "participatory_processes",
- "resource_id": "2772",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Meetings List",
- "rel": "resource",
- "meta": {
- "component_id": "8041",
- "component_manifest": "meetings",
- "space_id": "2539",
- "space_manifest": "participatory_processes",
- "resource_id": "2772",
- "action_method": "GET"
}
}
}
}
]
}Merge meeting extended data at object_path. See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "hello": "world"
}
}Fetch meeting extended data at object_path. See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "foo": {
- "bar": "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.
Extended data: GET/PUT /proposals/{id}/extended_data (+ /sync); filter with filter[extended_data_cont] on index. See Extended data.
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 |
| filter[extended_data_cont] | string Search on proposal extended_data. Requires |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "4195",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-08-05T07:08:09Z",
- "updated_at": "2026-08-05T07:08:09Z",
- "extended_data": {
- "ext": "1"
}, - "title": {
- "en": "<script>alert(\"proposal_title\");</script> Molestiae voluptatem magni. 10273",
- "fr": "<script>alert(\"proposal_title\");</script> Et quibusdam suscipit. 10274"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Porro reiciendis consequatur. 10276</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Natus velit consectetur. 10277</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2489",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "8011",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "5389",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "5389",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "2489",
- "space_manifest": "participatory_processes",
- "component_id": "8011",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "8011",
- "component_manifest": "proposals",
- "space_id": "2489",
- "space_manifest": "participatory_processes",
- "resource_id": "4195",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "8011",
- "component_manifest": "proposals",
- "space_id": "2489",
- "space_manifest": "participatory_processes",
- "resource_id": "4195",
- "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": "84",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-08-05T07:10:17Z",
- "updated_at": "2026-08-05T07:10:17Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "4228",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "5464",
- "type": "users"
}
}
}
}
}Fetch a single vote by id. Conditional GET supported.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "87",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-08-05T07:10:20Z",
- "updated_at": "2026-08-05T07:10:20Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "4232",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "5472",
- "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": "93",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-08-05T07:10:25Z",
- "updated_at": "2026-08-05T07:10:25Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "4238",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "5484",
- "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": "05b26abc-b44a-47a7-ad0a-beeb635eff31",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": "97",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-08-05T07:10:31Z",
- "updated_at": "2026-08-05T07:10:31Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "4246",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "5500",
- "type": "users"
}
}
}
}
]
}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": "5002",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-08-05T07:26:42Z",
- "updated_at": "2026-08-05T07:26:42Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Perspiciatis ad numquam. 126290",
- "fr": "<script>alert(\"proposal_title\");</script> Molestiae provident non. 126291"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Laboriosam aut rerum. 126293</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Qui incidunt sed. 126294</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "3105",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "9783",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "6621",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "6621",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Magni cum autem. 126268",
- "rel": "resource",
- "meta": {
- "space_id": "3105",
- "space_manifest": "participatory_processes",
- "component_id": "9783",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "9783",
- "component_manifest": "proposals",
- "space_id": "3105",
- "space_manifest": "participatory_processes",
- "resource_id": "5002",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "9783",
- "component_manifest": "proposals",
- "space_id": "3105",
- "space_manifest": "participatory_processes",
- "resource_id": "5002",
- "action_method": "GET"
}
}, - "prev": {
- "title": "Previous Proposal",
- "rel": "resource",
- "meta": {
- "component_id": "9783",
- "component_manifest": "proposals",
- "space_id": "3105",
- "space_manifest": "participatory_processes",
- "resource_id": "5001",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": false
}
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "source": "sync"
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "source": "api"
}
}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.
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": "4100",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-08-05T07:06:04Z",
- "updated_at": "2026-08-05T07:06:04Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Et et ex. 4359",
- "fr": "<script>alert(\"proposal_title\");</script> Veritatis et quaerat. 4360"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Voluptatem id non. 4362</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Aspernatur perspiciatis fugit. 4363</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2430",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "7957",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "5195",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "5195",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Id neque error. 4350",
- "rel": "resource",
- "meta": {
- "space_id": "2430",
- "space_manifest": "participatory_processes",
- "component_id": "7957",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "7957",
- "component_manifest": "proposals",
- "space_id": "2430",
- "space_manifest": "participatory_processes",
- "resource_id": "4100",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "7957",
- "component_manifest": "proposals",
- "space_id": "2430",
- "space_manifest": "participatory_processes",
- "resource_id": "4100",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "client_id": 1406
}
}
}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": "ced5fb18-982a-49bc-98e4-a23000faf772",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": "4115",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-08-05T07:07:10Z",
- "updated_at": "2026-08-05T07:07:10Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Et nulla beatae. 6602"
}, - "body": { },
- "errors": {
- "title": [ ],
- "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2457",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "7984",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "5280",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "5280",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Consequuntur sit velit. 6592",
- "rel": "resource",
- "meta": {
- "space_id": "2457",
- "space_manifest": "participatory_processes",
- "component_id": "7984",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "7984",
- "component_manifest": "proposals",
- "space_id": "2457",
- "space_manifest": "participatory_processes",
- "resource_id": "4115",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "7984",
- "component_manifest": "proposals",
- "space_id": "2457",
- "space_manifest": "participatory_processes",
- "resource_id": "4115",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "fG9mPEdoX01KoqT7ctQF6fh6_5xDBoYI8K6Dx68Zd9M",
- "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": "4732",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-08-05T07:19:48Z",
- "updated_at": "2026-08-05T07:19:49Z",
- "title": {
- "fr": "This is a valid proposal title sample"
}, - "body": {
- "fr": ""
}, - "errors": {
- "title": [ ],
- "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2868",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "9068",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "6115",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "6115",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Quia rerum qui. 83179",
- "rel": "resource",
- "meta": {
- "space_id": "2868",
- "space_manifest": "participatory_processes",
- "component_id": "9068",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "9068",
- "component_manifest": "proposals",
- "space_id": "2868",
- "space_manifest": "participatory_processes",
- "resource_id": "4732",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "9068",
- "component_manifest": "proposals",
- "space_id": "2868",
- "space_manifest": "participatory_processes",
- "resource_id": "4732",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "IezBCZgy8kEPI-tXGlt-Hul6JoqnSRbuXZxAwDqLiLY",
- "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": "4990",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-08-05T07:25:52Z",
- "updated_at": "2026-08-05T07:25:52Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Minus repudiandae officiis. 123846"
}, - "body": {
- "fr": "<p><script>alert(\"proposal_body\");</script> Quae et et. 123849</p>"
}, - "errors": {
- "title": [ ],
- "body": [ ]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "3069",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "9743",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "6536",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "6536",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Voluptatum voluptatibus vel. 123836",
- "rel": "resource",
- "meta": {
- "space_id": "3069",
- "space_manifest": "participatory_processes",
- "component_id": "9743",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "9743",
- "component_manifest": "proposals",
- "space_id": "3069",
- "space_manifest": "participatory_processes",
- "resource_id": "4990",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "9743",
- "component_manifest": "proposals",
- "space_id": "3069",
- "space_manifest": "participatory_processes",
- "resource_id": "4990",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "u5L_t_PEEXLZXL548H8qR80OF4sLtwxWdp2iHHENn0Y",
- "fields": [
- "title",
- "body"
]
}
}
}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": "4737",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-08-05T07:21:33Z",
- "updated_at": "2026-08-05T07:21:33Z",
- "title": { },
- "body": { },
- "errors": {
- "title": [
- "Title cannot be blank"
], - "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "2895",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "9095",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "6265",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "6265",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> A unde corrupti. 85805",
- "rel": "resource",
- "meta": {
- "space_id": "2895",
- "space_manifest": "participatory_processes",
- "component_id": "9095",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "9095",
- "component_manifest": "proposals",
- "space_id": "2895",
- "space_manifest": "participatory_processes",
- "resource_id": "4737",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "9095",
- "component_manifest": "proposals",
- "space_id": "2895",
- "space_manifest": "participatory_processes",
- "resource_id": "4737",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "r7IaGpuyEpqt-XaTC4_6w7UI2ufHQGoC63jED27dv8A",
- "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).
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": "9a20bd93-2416-44d9-942c-6374d5c3a17a",
- "status": "completed",
- "command_key": "draft_proposals#create",
- "created_at": "2026-08-05T07:13:54.618Z",
- "updated_at": "2026-08-05T07:13:54.618Z",
- "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"
}
}
}
}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": "161fa07a-172c-4d04-a80a-62b8d3855a76",
- "status": "completed",
- "command_key": "draft_proposals#create",
- "created_at": "2026-08-05T07:20:30.045Z",
- "updated_at": "2026-08-05T07:20:30.045Z",
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 25
}
}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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6T3JnYW5pemF0aW9uIiwicmVzb3VyY2VfaWQiOjE1MjUsInVzZXJfaWQiOjUyODMsImludml0ZWRfYXQiOm51bGwsInR5cGUiOiJnZW5lcmFsX2FkbWluIn0",
- "type": "role",
- "attributes": {
- "type": "general_admin",
- "user_id": 5283,
- "resource_id": 1525,
- "resource_type": "Decidim::Organization",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-08-05T07:07:19Z",
- "updated_at": "2026-08-05T07:07:19Z"
}
}, - {
- "id": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6MjQ1OSwidXNlcl9pZCI6NTI4MywiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX2FkbWluaXN0cmF0b3IifQ",
- "type": "role",
- "attributes": {
- "type": "space_administrator",
- "user_id": 5283,
- "resource_id": 2459,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-08-05T07:07:19Z",
- "updated_at": "2026-08-05T07:07:19Z"
}
}
]
}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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6QXNzZW1ibHkiLCJyZXNvdXJjZV9pZCI6MTkyNywidXNlcl9pZCI6NTQyMywiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX21vZGVyYXRvciJ9",
- "type": "role",
- "attributes": {
- "type": "space_moderator",
- "user_id": 5423,
- "resource_id": 1927,
- "resource_type": "Decidim::Assembly",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-08-05T07:08:26Z",
- "updated_at": "2026-08-05T07:08: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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6MjU5MSwidXNlcl9pZCI6NTUxOCwiaW52aXRlZF9hdCI6bnVsbCwidHlwZSI6InNwYWNlX3ZhbHVhdG9yIn0",
- "type": "role",
- "attributes": {
- "type": "space_valuator",
- "user_id": 5518,
- "resource_id": 2591,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-08-05T07:11:44Z",
- "updated_at": "2026-08-05T07:11:44Z"
}
}
}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) |
{ }Outbound HTTP callbacks plus REST management of registrations.
GET|POST /webhook_registrations — list / create (signing secret returned only on create)GET|PUT|DELETE /webhook_registrations/{id} — show / update / destroy (scoped to the API client)GET /webhook_events/{event_type} — canned example payload for typed clientsSubscribe via this API or in System admin → API clients → Webhooks.
Verify deliveries with X-Webhook-Signature (v1= + HMAC-SHA256 hex of timestamp + "." + raw body) and X-Webhook-Timestamp.
Payload envelope: schema WebhookDeliveryEnvelope (discriminated on type).
| Event | Scope | Permission | Payload | Trigger |
|---|---|---|---|---|
draft_proposal_creation.succeeded |
proposals |
draft_proposal_creation.succeeded |
draft_proposal |
Proposal lifecycle notification |
draft_proposal_update.succeeded |
proposals |
draft_proposal_update.succeeded |
draft_proposal |
Proposal lifecycle notification |
meetings.upcoming_reminder.succeeded |
meetings |
meetings.upcoming_reminder.succeeded |
— | Upcoming meeting reminder |
participatory_process.step_activated.succeeded |
public |
participatory_process.step_activated.succeeded |
space |
Participatory process step (phase) activated |
proposal_creation.succeeded |
proposals |
proposal_creation.succeeded |
proposal |
Proposal lifecycle notification |
proposal_state_change.succeeded |
proposals |
proposal_state_change.succeeded |
proposal |
Proposal lifecycle notification |
proposal_update.succeeded |
proposals |
proposal_update.succeeded |
proposal |
Proposal lifecycle notification |
system.organizations.created |
system |
system.organizations.created |
organization |
Organization admin change |
system.organizations.deleted |
system |
system.organizations.deleted |
organization |
Organization admin change |
system.organizations.updated |
system |
system.organizations.updated |
organization |
Organization admin change |
user.created |
oauth |
user.created |
user |
User account change |
user.updated |
oauth |
user.updated |
user |
User account change |
Returns an example delivery envelope for the given event type, built by serializing a real resource in the current organization (same serializers used for outbound delivery).
| event_type required | string Event key (e.g. proposal_creation.succeeded) |
| Authorization | string Bearer access token (see security schemes) |
{- "type": "proposal_creation.succeeded",
- "data": {
- "id": "4025",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-08-05T07:05:24Z",
- "updated_at": "2026-08-05T07:05:24Z",
- "title": { },
- "body": { }
}, - "relationships": {
- "space": {
- "data": {
- "id": "2401",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "7886",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "5108",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "5108",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "2401",
- "space_manifest": "participatory_processes",
- "component_id": "7886",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "7886",
- "component_manifest": "proposals",
- "space_id": "2401",
- "space_manifest": "participatory_processes",
- "resource_id": "4025",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "7886",
- "component_manifest": "proposals",
- "space_id": "2401",
- "space_manifest": "participatory_processes",
- "resource_id": "4025",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
}Update URL and subscriptions. Does not rotate the signing secret.
| id required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||||
| |||||||||
{
}{- "data": {
- "id": "31",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-08-05T07:11:26Z",
- "updated_at": "2026-08-05T07:11:26Z"
}
}
}| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "47",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-08-05T07:28:06Z",
- "updated_at": "2026-08-05T07:28:06Z"
}
}
}Create a webhook registration for the current API client. The signing secret is returned only in this response — store it to verify HMAC signatures. Subscriptions must be event permissions already granted on the API client.
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||||
| |||||||||
{
}{- "data": {
- "id": "30",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "signing_secret": "dbd3bee4818c8b01714a31faaf195471a4039ddd7323c7481b0e48b20fc30b6d",
- "created_at": "2026-08-05T07:09:08Z",
- "updated_at": "2026-08-05T07:09:08Z"
}
}
}List webhook registrations owned by the current API client.
| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "43",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-08-05T07:27:29Z",
- "updated_at": "2026-08-05T07:27:29Z"
}
}
]
}