Download OpenAPI specification:Download
A RestFull API for Decidim, to be able to CRUD resources from Decidim.
current version: 0.3.8
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": "pKghNYHlopABQ0wL705YTSKRskOuo6-6Q-VJXMWU6EA",
- "token_type": "Bearer",
- "expires_in": 7200,
- "scope": "public proposals",
- "created_at": 1790822642
}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": "Gq_ix2PKctC9BSmK9fN_oLZ7hdsrlQAC4isXtyTO6uA",
- "token_type": "Bearer",
- "iat": 1790823196,
- "exp": 3584324792,
- "sub": 4486,
}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.
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": "5014",
- "type": "organization",
- "attributes": {
- "host": "1152.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": "V",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "VonRueden, O'Hara and Powlowski",
- "fr": "Nom de l'organisation"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Quia perspiciatis iusto. 114772</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Accusamus est perferendis. 114761</p>"
}, - "extended_data": { },
- "created_at": "2026-10-01T02:55:39Z",
- "updated_at": "2026-10-01T02:55:39Z"
}, - "meta": {
- "locales": [
- "en"
], - "unconfirmed_host": "new-host.com"
}
}
}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": "5027",
- "type": "organization",
- "attributes": {
- "host": "1165.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": "PhD",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "Russel-Brekke",
- "fr": "Schulist-Buckridge"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Qui sed praesentium. 115184</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Neque quo cupiditate. 115185</p>"
}, - "extended_data": { },
- "created_at": "2026-10-01T02:56:00Z",
- "updated_at": "2026-10-01T02:56:00Z"
}, - "meta": {
- "locales": [
- "en",
- "fr"
]
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "5181",
- "type": "organization",
- "attributes": {
- "host": "1474.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": "IV",
- "send_welcome_notification": true,
- "enable_participatory_space_filters": false,
- "user_groups_enabled": false,
- "name": {
- "en": "Glover, Gusikowski and Von",
- "fr": "Friesen, Labadie and Koelpin"
}, - "description": {
- "en": "<p><script>alert(\"organization_description\");</script> Fuga nisi in. 138994</p>",
- "fr": "<p><script>alert(\"organization_description\");</script> Voluptatum et animi. 138995</p>"
}, - "extended_data": { },
- "created_at": "2026-10-01T03:00:29Z",
- "updated_at": "2026-10-01T03:00:29Z"
}, - "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) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "zone": "south"
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "zone": "north"
}
}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": "3450",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Eum tempore voluptatem. 25784"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Pariatur vel distinctio. 25787"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Quis dignissimos voluptatem. 25790</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Doloribus enim quibusdam. 25793</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3450",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3450",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "5589",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Delectus praesentium aspernatur. 25829"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Quia ut recusandae. 25832"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Doloremque ea iste. 25835</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Et facere tempore. 25838</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "5589",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "5589",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "3451",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Aspernatur necessitatibus quia. 25859"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Blanditiis facilis et. 25862"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Molestias eligendi similique. 25865</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Ut est sint. 25868</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3451",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3451",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "5590",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Aut non possimus. 25904"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Accusantium id temporibus. 25907"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Nemo sit quod. 25910</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Tempore saepe hic. 25913</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "5590",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "5590",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "3452",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Quaerat ea nesciunt. 25934"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Quos repudiandae mollitia. 25937"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Sit non esse. 25940</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Velit veritatis blanditiis. 25943</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3452",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3452",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "5591",
- "type": "space",
- "attributes": {
- "manifest_name": "participatory_processes",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "title": {
- "en": "<script>alert(\"participatory_process_title\");</script> Minima atque sunt. 25979"
}, - "subtitle": {
- "en": "<script>alert(\"participatory_process_subtitle\");</script> Ipsum voluptatem maiores. 25982"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Aut atque perspiciatis. 25985</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Nam et nemo. 25988</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:42:27Z",
- "updated_at": "2026-10-01T02:42:27Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "5591",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "5591",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Kreiger and Sons",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "3575",
- "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> Consequuntur eum fugiat. 57217",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Dolores cupiditate culpa. 57218"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Perspiciatis accusamus et. 57220</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Magni non molestiae. 57221</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Voluptates et sapiente. 57223</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Est laborum velit. 57224</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T02:46:37Z",
- "updated_at": "2026-10-01T02:46:37Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "15646",
- "type": "page_component"
}, - {
- "id": "15647",
- "type": "proposal_component"
}, - {
- "id": "15648",
- "type": "meeting_component"
}, - {
- "id": "15649",
- "type": "budget_component"
}, - {
- "id": "15650",
- "type": "survey_component"
}, - {
- "id": "15651",
- "type": "accountability_component"
}, - {
- "id": "15652",
- "type": "debate_component"
}, - {
- "id": "15653",
- "type": "blog_component"
}, - {
- "id": "15654",
- "type": "awesome_map_component"
}, - {
- "id": "15655",
- "type": "awesome_iframe_component"
}, - {
- "id": "15656",
- "type": "proposal_component"
}, - {
- "id": "15657",
- "type": "meeting_component"
}, - {
- "id": "15658",
- "type": "proposal_component"
}, - {
- "id": "15659",
- "type": "meeting_component"
}, - {
- "id": "15660",
- "type": "proposal_component"
}, - {
- "id": "15661",
- "type": "meeting_component"
}
], - "meta": {
- "count": 16
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3575",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My assembly for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "3575",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "Renner, Wilderman and Jones",
- "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": "140",
- "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> Ratione excepturi sint. 70754</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Non autem sunt. 70755</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Similique consequatur ea. 70757</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Ad voluptatem iste. 70758</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:47:29Z",
- "updated_at": "2026-10-01T02:47:29Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "140",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My conference for testing",
- "rel": "resource",
- "meta": {
- "space_id": "140",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Zieme, McGlynn and Watsica",
- "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": "5872",
- "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> Non eos eum. 80225",
- "fr": "<script>alert(\"participatory_process_subtitle\");</script> Repellat vel iusto. 80226"
}, - "short_description": {
- "en": "<p><script>alert(\"participatory_process_short_description\");</script> Ut quibusdam voluptatum. 80228</p>",
- "fr": "<p><script>alert(\"participatory_process_short_description\");</script> Exercitationem illum fuga. 80229</p>"
}, - "description": {
- "en": "<p><script>alert(\"participatory_process_description\");</script> Eum dolorem sit. 80231</p>",
- "fr": "<p><script>alert(\"participatory_process_description\");</script> Iste laboriosam qui. 80232</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:48:06Z",
- "updated_at": "2026-10-01T02:48:06Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "participatory_processes",
- "space_id": "5872",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My participatory_process for testing purpose",
- "rel": "resource",
- "meta": {
- "space_id": "5872",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "Dooley-Nicolas",
- "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": "120",
- "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> Iure et assumenda. 93632</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Voluptatem laboriosam molestiae. 93633</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T02:48:58Z",
- "updated_at": "2026-10-01T02:48:58Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "120",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "My initiative for testing",
- "rel": "resource",
- "meta": {
- "space_id": "120",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "VonRueden LLC",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}List participatory spaces of type Conferences for the current organization. Supports the same filter query parameters as /spaces/search, scoped to this space type. 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": "155",
- "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> Unde omnis deserunt. 150324</p>",
- "fr": "<p><script>alert(\"conference_short_description\");</script> Ea unde sed. 150325</p>"
}, - "description": {
- "en": "<p><script>alert(\"conference_description\");</script> Sapiente eius odit. 150327</p>",
- "fr": "<p><script>alert(\"conference_description\");</script> Ipsa occaecati dolores. 150328</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T03:01:44Z",
- "updated_at": "2026-10-01T03:01:44Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "conferences",
- "space_id": "155",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "155",
- "space_manifest": "conferences",
- "action_method": "GET"
}
}, - "related": {
- "title": "Carroll, Brown and Simonis",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "132",
- "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> Reiciendis non voluptas. 160896</p>",
- "fr": "<p><script>alert(\"initiative_description\");</script> Et veniam dolor. 160897</p>"
}, - "visibility": "public",
- "created_at": "2026-10-01T03:02:22Z",
- "updated_at": "2026-10-01T03:02:22Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "initiatives",
- "space_id": "132",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "132",
- "space_manifest": "initiatives",
- "action_method": "GET"
}
}, - "related": {
- "title": "Marvin, Botsford and Okuneva",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "3925",
- "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> Debitis soluta enim. 168342",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Repudiandae neque non. 168343"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Nulla possimus necessitatibus. 168345</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Nihil officia sed. 168346</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Suscipit repudiandae eveniet. 168348</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Sunt occaecati ducimus. 168349</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T03:02:50Z",
- "updated_at": "2026-10-01T03:02:50Z"
}, - "relationships": {
- "components": {
- "data": [
- {
- "id": "17301",
- "type": "page_component"
}, - {
- "id": "17302",
- "type": "proposal_component"
}, - {
- "id": "17303",
- "type": "meeting_component"
}, - {
- "id": "17304",
- "type": "budget_component"
}, - {
- "id": "17305",
- "type": "survey_component"
}, - {
- "id": "17306",
- "type": "accountability_component"
}, - {
- "id": "17307",
- "type": "debate_component"
}, - {
- "id": "17308",
- "type": "blog_component"
}, - {
- "id": "17309",
- "type": "awesome_map_component"
}, - {
- "id": "17310",
- "type": "awesome_iframe_component"
}, - {
- "id": "17311",
- "type": "proposal_component"
}, - {
- "id": "17312",
- "type": "meeting_component"
}, - {
- "id": "17313",
- "type": "proposal_component"
}, - {
- "id": "17314",
- "type": "meeting_component"
}, - {
- "id": "17315",
- "type": "proposal_component"
}, - {
- "id": "17316",
- "type": "meeting_component"
}
], - "meta": {
- "count": 16
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3925",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3925",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "O'Keefe, Maggio and Lubowitz",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "3926",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Harum sint error. 168501",
- "fr": "<script>alert(\"assembly_title\");</script> Ex quas qui. 168502"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Enim in ipsam. 168504",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Vitae dolore quis. 168505"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Provident quae tempore. 168507</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Maiores consequatur vel. 168508</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Error delectus labore. 168510</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Sed quia ea. 168511</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T03:02:51Z",
- "updated_at": "2026-10-01T03:02:51Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3926",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3926",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "O'Keefe, Maggio and Lubowitz",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "3927",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Sed quia odit. 168576",
- "fr": "<script>alert(\"assembly_title\");</script> Dolor reiciendis reprehenderit. 168577"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Labore laboriosam perspiciatis. 168579",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Rerum tempora quibusdam. 168580"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Blanditiis magni porro. 168582</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Beatae magni voluptas. 168583</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Facere expedita excepturi. 168585</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Omnis reprehenderit maxime. 168586</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T03:02:51Z",
- "updated_at": "2026-10-01T03:02:51Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3927",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3927",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "O'Keefe, Maggio and Lubowitz",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}, - {
- "id": "3928",
- "type": "space",
- "attributes": {
- "manifest_name": "assemblies",
- "participatory_space_type": "Decidim::Assembly",
- "title": {
- "en": "<script>alert(\"assembly_title\");</script> Sit inventore et. 168651",
- "fr": "<script>alert(\"assembly_title\");</script> Corporis expedita vel. 168652"
}, - "subtitle": {
- "en": "<script>alert(\"assembly_subtitle\");</script> Eum ducimus sed. 168654",
- "fr": "<script>alert(\"assembly_subtitle\");</script> Ipsam saepe consequatur. 168655"
}, - "short_description": {
- "en": "<p><script>alert(\"assembly_short_description\");</script> Sint asperiores blanditiis. 168657</p>",
- "fr": "<p><script>alert(\"assembly_short_description\");</script> Dolores deserunt deleniti. 168658</p>"
}, - "description": {
- "en": "<p><script>alert(\"assembly_description\");</script> Soluta saepe consequatur. 168660</p>",
- "fr": "<p><script>alert(\"assembly_description\");</script> Omnis voluptatibus voluptates. 168661</p>"
}, - "visibility": "transparent",
- "created_at": "2026-10-01T03:02:51Z",
- "updated_at": "2026-10-01T03:02:51Z"
}, - "relationships": {
- "components": {
- "data": [ ],
- "meta": {
- "count": 0
}, - "links": {
- "self": {
- "title": "Component list for this space",
- "rel": "resource",
- "meta": {
- "space_manifest": "assemblies",
- "space_id": "3928",
- "action_method": "GET"
}
}
}
}
}, - "links": {
- "self": {
- "title": "en",
- "rel": "resource",
- "meta": {
- "space_id": "3928",
- "space_manifest": "assemblies",
- "action_method": "GET"
}
}, - "related": {
- "title": "O'Keefe, Maggio and Lubowitz",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": [ ],
- "meta": {
- "page": 1,
- "per_page": 50,
- "has_more": false,
- "next": null,
- "prev": null
}
}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 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": "15514",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "5737",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Sit in unde. 48882",
- "fr": "<script>alert(\"component_name\");</script> Sapiente facere pariatur. 48883"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:45:38Z",
- "updated_at": "2026-10-01T02:45:38Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Sit in unde. 48882",
- "rel": "resource",
- "meta": {
- "space_id": "5737",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Ex incidunt iure. 48787",
- "rel": "resource",
- "meta": {
- "space_id": "5737",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
], - "meta": {
- "page": 2,
- "per_page": 2,
- "has_more": false,
- "next": null,
}
}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": "16448",
- "type": "blog_component",
- "attributes": {
- "manifest_name": "blogs",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6098",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Nam nihil aut. 112072",
- "fr": "<script>alert(\"component_name\");</script> Explicabo laboriosam doloribus. 112073"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:54:10Z",
- "updated_at": "2026-10-01T02:54:10Z"
}, - "relationships": {
- "resources": {
- "data": [ ],
- "meta": {
- "count": 0
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Nam nihil aut. 112072",
- "rel": "resource",
- "meta": {
- "space_id": "6098",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Laudantium et commodi. 112087",
- "rel": "resource",
- "meta": {
- "space_id": "6098",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "scopes_enabled": false
}
}
}List or search proposal components of the organization
| filter[name_not_in][] | Array of strings (name not IN filter) match none of name's values in array |
| filter[name_in][] | Array of strings (name IN filter) match one of name's values in array |
| filter[name_start] | string (name starts With filter) Example: filter[name_start]=some_string name starts with |
| filter[name_eq] | string (name equal filter) name is equal to |
| filter[name_not_eq] | string (name not equal filter) name is NOT equal to |
| filter[name_matches] | string (name like filter) Example: filter[name_matches]=%some_string matches name with |
| filter[name_blank] | boolean (name blank filter) name is null or empty |
| filter[participatory_space_type_not_in][] | Array of strings (participatory_space_type not IN filter) Example: filter[participatory_space_type_not_in][]=Decidim::Assembly match none of participatory_space_type's values in array |
| filter[participatory_space_type_in][] | Array of strings (participatory_space_type IN filter) Example: filter[participatory_space_type_in][]=Decidim::Assembly match one of participatory_space_type's values in array |
| filter[participatory_space_type_start] | string (participatory_space_type starts With filter) Example: filter[participatory_space_type_start]=some_string participatory_space_type starts with |
| filter[participatory_space_type_eq] | string (participatory_space_type equal filter) Example: filter[participatory_space_type_eq]=Decidim::Assembly participatory_space_type is equal to |
| filter[participatory_space_type_not_eq] | string (participatory_space_type not equal filter) Example: filter[participatory_space_type_not_eq]=Decidim::Assembly participatory_space_type is NOT equal to |
| filter[participatory_space_type_matches] | string (participatory_space_type like filter) Example: filter[participatory_space_type_matches]=%some_string matches participatory_space_type with |
| filter[participatory_space_type_blank] | boolean (participatory_space_type blank filter) participatory_space_type is null or empty |
| filter[participatory_space_id_in][] | Array of strings (participatory_space_id IN filter) match one of participatory_space_id's values in array |
| filter[participatory_space_id_eq] | string (participatory_space_id equal filter) participatory_space_id is equal to |
| filter[participatory_space_id_lt] | string (participatory_space_id less than filter) participatory_space_id is less than |
| filter[participatory_space_id_gt] | string (participatory_space_id greater than filter) participatory_space_id is greater than |
| filter[participatory_space_id_present] | boolean (participatory_space_id present filter) participatory_space_id is not null and not empty |
| filter[participatory_space_id_blank] | boolean (participatory_space_id blank filter) participatory_space_id is null or empty |
| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "16574",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6156",
- "name": {
- "en": "Simple vote no abstain"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:56:38Z",
- "updated_at": "2026-10-01T02:56:38Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "9285",
- "type": "proposal"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "self": {
- "title": "Simple vote no abstain",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Dolor laborum non. 118391",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "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": 0,
- "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": true,
- "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": true,
- "can_endorse": true,
- "can_comment": true,
- "awesome_voting_manifest": "",
- "voting_cards_show_abstain": false,
- "voting_cards_show_modal_help": true,
- "voting_cards_box_title": { },
- "voting_cards_instructions": { },
- "votes": [
- {
- "weight": 1,
- "label": {
- "en": "Vote",
- "fr": "Voter"
}
}
]
}
}, - {
- "id": "16575",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6156",
- "name": {
- "en": "Simple vote with abstain"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:56:38Z",
- "updated_at": "2026-10-01T02:56:39Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "9286",
- "type": "proposal"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "self": {
- "title": "Simple vote with abstain",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Dolor laborum non. 118391",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "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": 0,
- "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": true,
- "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": true,
- "can_endorse": true,
- "can_comment": true,
- "awesome_voting_manifest": "",
- "voting_cards_show_abstain": true,
- "voting_cards_show_modal_help": true,
- "voting_cards_box_title": { },
- "voting_cards_instructions": { },
- "votes": [
- {
- "weight": 0,
- "label": {
- "en": "Abstain",
- "fr": "Abstention"
}
}, - {
- "weight": 1,
- "label": {
- "en": "Vote",
- "fr": "Voter"
}
}
]
}
}, - {
- "id": "16576",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6156",
- "name": {
- "en": "Cards vote no abstain"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:56:38Z",
- "updated_at": "2026-10-01T02:56:39Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "9287",
- "type": "proposal"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "self": {
- "title": "Cards vote no abstain",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Dolor laborum non. 118391",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "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": 0,
- "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": true,
- "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": true,
- "can_endorse": true,
- "can_comment": true,
- "awesome_voting_manifest": "voting_cards",
- "voting_cards_show_abstain": false,
- "voting_cards_show_modal_help": true,
- "voting_cards_box_title": { },
- "voting_cards_instructions": { },
- "votes": [
- {
- "weight": 1,
- "label": {
- "en": "Red",
- "fr": "Rouge"
}
}, - {
- "weight": 2,
- "label": {
- "en": "Yellow",
- "fr": "Jaune"
}
}, - {
- "weight": 3,
- "label": {
- "en": "Green",
- "fr": "Verte"
}
}
]
}
}, - {
- "id": "16577",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6156",
- "name": {
- "en": "Cards vote with abstain"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:56:38Z",
- "updated_at": "2026-10-01T02:56:39Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "9288",
- "type": "proposal"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "self": {
- "title": "Cards vote with abstain",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Dolor laborum non. 118391",
- "rel": "resource",
- "meta": {
- "space_id": "6156",
- "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": 0,
- "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": true,
- "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": true,
- "can_endorse": true,
- "can_comment": true,
- "awesome_voting_manifest": "voting_cards",
- "voting_cards_show_abstain": true,
- "voting_cards_show_modal_help": true,
- "voting_cards_box_title": { },
- "voting_cards_instructions": { },
- "votes": [
- {
- "weight": 0,
- "label": {
- "en": "Abstain",
- "fr": "Abstention"
}
}, - {
- "weight": 1,
- "label": {
- "en": "Red",
- "fr": "Rouge"
}
}, - {
- "weight": 2,
- "label": {
- "en": "Yellow",
- "fr": "Jaune"
}
}, - {
- "weight": 3,
- "label": {
- "en": "Green",
- "fr": "Verte"
}
}
]
}
}
], - "meta": {
- "page": 1,
- "per_page": 10,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "16604",
- "type": "proposal_component",
- "attributes": {
- "manifest_name": "proposals",
- "participatory_space_type": "Decidim::ParticipatoryProcess",
- "participatory_space_id": "6173",
- "name": {
- "en": "<script>alert(\"component_name\");</script> Harum libero excepturi. 120051",
- "fr": "<script>alert(\"component_name\");</script> Doloribus repudiandae quia. 120052"
}, - "global_announcement": { },
- "created_at": "2026-10-01T02:57:14Z",
- "updated_at": "2026-10-01T02:57:14Z"
}, - "relationships": {
- "resources": {
- "data": [
- {
- "id": "9306",
- "type": "proposal"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "self": {
- "title": "<script>alert(\"component_name\");</script> Harum libero excepturi. 120051",
- "rel": "resource",
- "meta": {
- "space_id": "6173",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "related": {
- "title": "<script>alert(\"participatory_process_title\");</script> Sequi consequuntur ut. 119958",
- "rel": "resource",
- "meta": {
- "space_id": "6173",
- "space_manifest": "participatory_processes",
- "action_method": "GET"
}
}, - "draft": {
- "title": "Draft Details",
- "rel": "resource",
- "meta": {
- "component_id": "16604",
- "component_manifest": "proposals",
- "space_id": "6173",
- "space_manifest": "participatory_processes",
- "resource_id": "9306",
- "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,
- "awesome_voting_manifest": "",
- "voting_cards_show_abstain": false,
- "voting_cards_show_modal_help": true,
- "voting_cards_box_title": { },
- "voting_cards_instructions": { },
- "votes": [ ]
}
}
}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": [ ],
- "meta": {
- "page": 1,
- "per_page": 2,
- "has_more": false,
- "next": null,
- "prev": null
}
}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"
}
}List users; read and update your extended data; create and consume magic links for sign-in (scopes and permissions per operation).
The extended_data feature allows you to update a hash with recursive merging. Use the body payload with these keys:
data: The value or hash you want to update.object_path: The dot-style path to the key (e.g., access.this.key).Root path
To update data from root of the hash, use object_path=".".
Example:
body={"data": {"name": "Jane"}, "object_path": "personnal"}
This recursively merges data into the hash without removing existing keys.
Merge some data
Initial hash:
{
"personnal": {"birthday": "1989-05-18"}
}
Patch payload:
{
"data": {
"name": "Jane"
},
"object_path": "personnal"
}
Result:
{
"personnal": {"birthday": "1989-05-18", "name": "Jane"}
}
Create new Paths
Paths are created as needed.
Exemple:
body = {"data": {"external_user_id": 12}, "object_path": "data-store.my-app.foo"}
Result:
{
"personnal": {"birthday": "1989-05-18"},
"data-store": {"my-app": {"foo": {"external_user_id": 12}}}
}
Alternatively:
body = {"data": 12, "object_path": "data-store.my-app.foo.external_user_id"}
Remove a key
Set a key to null or an empty value to remove it.
Example: Initial hash:
{
"personnal": {"birthday": "1989-05-18", "name": "Jane"}
}
Patch:
body = {"data": {"birthday": ""}, "object_path": "personnal"}
Result:
{
"personnal": {"name": "Jane"}
}
Return Value
The update request returns the updated value at the specified path.
| Authorization | string Bearer access token (see security schemes) |
| data required | object (User Extended Data Data) New value for the extended data at the given path |
| object_path | string object path, in dot style, like foo.bar. use '.' to update the whole user data |
{- "data": { },
- "object_path": "string"
}{- "data": {
- "foo": "bar"
}
}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": "62",
- "type": "magic_link",
- "attributes": {
- "token": "emRZbS14dDdpZ0FKWGl6azRqMW4=",
- "label": "My label",
- "redirect_url": null
}, - "links": {
- "self": {
- "title": "Generates a magic link",
- "rel": "resource",
- "meta": {
- "action_method": "POST",
- "action_enctype": "application/x-www-form-urlencoded"
}
}, - "sign_in": {
- "title": "Sign in with magic link",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
}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) |
{ }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": { }
}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": "13527",
- "type": "user",
- "attributes": {
- "name": "Trevor Langworth",
- "nickname": "ljhaevno9o_1515",
- "email": "user1517@example.org",
- "about": "<script>alert(\"user_about\");</script>Deleniti fuga aut. 114542",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-10-01T02:55:23Z",
- "updated_at": "2026-10-01T02:55:23Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "13528",
- "type": "user",
- "attributes": {
- "name": "Rep. Trenton Grant",
- "nickname": "uan3p_1516",
- "email": "user1518@example.org",
- "about": "<script>alert(\"user_about\");</script>Et dolor corrupti. 114543",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-10-01T02:55:23Z",
- "updated_at": "2026-10-01T02:55:23Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "13529",
- "type": "user",
- "attributes": {
- "name": "Trevor Heller",
- "nickname": "505_1517",
- "email": "user1519@example.org",
- "about": "<script>alert(\"user_about\");</script>Est minus quo. 114544",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-10-01T02:55:24Z",
- "updated_at": "2026-10-01T02:55:24Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "13530",
- "type": "user",
- "attributes": {
- "name": "Vince Collins V",
- "nickname": "3j7ik2l9j_1518",
- "email": "user1520@example.org",
- "about": "<script>alert(\"user_about\");</script>Fugit ad fugiat. 114545",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-10-01T02:55:24Z",
- "updated_at": "2026-10-01T02:55:24Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}, - {
- "id": "13531",
- "type": "user",
- "attributes": {
- "name": "Ben Smith",
- "nickname": "5t52mt_1519",
- "email": "user1521@example.org",
- "about": "<script>alert(\"user_about\");</script>Sit omnis beatae. 114546",
- "extended_data": { },
- "locale": "en",
- "created_at": "2026-10-01T02:55:24Z",
- "updated_at": "2026-10-01T02:55:24Z"
}, - "relationships": {
- "roles": {
- "data": [ ]
}
}, - "meta": {
- "blocked": false,
- "locked": false
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null
}
}Manage Decidim::Attachment rows (files linked to proposals, spaces, etc.).
Create (mode A): POST /attachments with multipart/form-data (file, attached_to_type, attached_to_id, translated title / description).
Create (mode B): POST /attachments/direct_upload → use signed_id in POST /attachments (application/json).
Update: metadata only (PUT /attachments/{id}) — no file replacement in v1.
List filters: filter[attached_to_type], filter[attached_to_id], filter[attachment_collection_id], filter[file_type] (image, document, link).
| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "43",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Dicta illo ut. 44451",
- "fr": "<script>alert(\"attachment_title\");</script> Quo voluptate accusamus. 44452"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Et distinctio aliquam. 44454",
- "fr": "<script>alert(\"attachment_description\");</script> Aut ipsam ut. 44455"
}, - "weight": 2,
- "attachment_collection_id": null,
- "file_type": "document",
- "content_type": "application/pdf",
- "url": null,
- "thumbnail_url": null,
- "attached_to": {
- "type": "Decidim::Proposals::Proposal",
- "id": 8527
}, - "created_at": "2026-10-01T02:44:49Z",
- "updated_at": "2026-10-01T02:44:49Z"
}
}
}| filename required | string |
| byte_size required | integer |
| checksum required | string |
| content_type | string |
| Authorization | string Bearer access token (see security schemes) |
{- "signed_id": "eyJfcmFpbHMiOnsiZGF0YSI6MzI1ODMsInB1ciI6ImJsb2JfaWQifX0=--d60ce569d14df8faf58eccb55b14cecf83c00d8c",
- "filename": "hello.pdf",
- "content_type": "application/pdf",
- "byte_size": 12345
}| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| filter[attached_to_type_not_in][] | Array of strings (attached_to_type not IN filter) match none of attached_to_type's values in array |
| filter[attached_to_type_in][] | Array of strings (attached_to_type IN filter) match one of attached_to_type's values in array |
| filter[attached_to_type_start] | string (attached_to_type starts With filter) Example: filter[attached_to_type_start]=some_string attached_to_type starts with |
| filter[attached_to_type_eq] | string (attached_to_type equal filter) attached_to_type is equal to |
| filter[attached_to_type_not_eq] | string (attached_to_type not equal filter) attached_to_type is NOT equal to |
| filter[attached_to_type_matches] | string (attached_to_type like filter) Example: filter[attached_to_type_matches]=%some_string matches attached_to_type with |
| filter[attached_to_type_blank] | boolean (attached_to_type blank filter) attached_to_type is null or empty |
| filter[attached_to_id_in][] | Array of integers (attached_to_id IN filter) match one of attached_to_id's values in array |
| filter[attached_to_id_eq] | integer (attached_to_id equal filter) attached_to_id is equal to |
| filter[attached_to_id_lt] | integer (attached_to_id less than filter) attached_to_id is less than |
| filter[attached_to_id_gt] | integer (attached_to_id greater than filter) attached_to_id is greater than |
| filter[attached_to_id_present] | boolean (attached_to_id present filter) attached_to_id is not null and not empty |
| filter[attached_to_id_blank] | boolean (attached_to_id blank filter) attached_to_id is null or empty |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "45",
- "type": "attachment",
- "attributes": {
- "title": {
- "en": "<script>alert(\"attachment_title\");</script> Vitae sed ipsum. 114950",
- "fr": "<script>alert(\"attachment_title\");</script> Atque maiores sapiente. 114951"
}, - "description": {
- "en": "<script>alert(\"attachment_description\");</script> Voluptatem voluptas ut. 114953",
- "fr": "<script>alert(\"attachment_description\");</script> Aut officia totam. 114954"
}, - "weight": 3,
- "attachment_collection_id": null,
- "file_type": "document",
- "content_type": "application/pdf",
- "url": null,
- "thumbnail_url": null,
- "attached_to": {
- "type": "Decidim::Proposals::Proposal",
- "id": 9207
}, - "created_at": "2026-10-01T02:55:51Z",
- "updated_at": "2026-10-01T02:55:51Z"
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null
}
}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).
Blog show links.next / links.prev when two posts share published_at (DESC + id tie-break)
| id required | integer Blog 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": "1511",
- "type": "blog",
- "attributes": {
- "created_at": "2026-10-01T02:43:47Z",
- "updated_at": "2026-10-01T02:43:47Z",
- "title": {
- "en": "<script>alert(\"blog_title\");</script> Expedita magni laboriosam. 42614",
- "fr": "<script>alert(\"blog_title\");</script> Repellat autem aliquam. 42615"
}, - "body": {
- "en": "<p><script>alert(\"blog_body\");</script> Maxime facere hic. 42617</p>",
- "fr": "<p><script>alert(\"blog_body\");</script> Dolores aut voluptas. 42618</p>"
}, - "published_at": "2026-10-01T02:40:47.451Z"
}, - "relationships": {
- "space": {
- "data": {
- "id": "5679",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "15425",
- "type": "blog_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Quae et sapiente. 42583",
- "rel": "resource",
- "meta": {
- "space_id": "5679",
- "space_manifest": "participatory_processes",
- "component_id": "15425",
- "component_manifest": "blogs",
- "action_method": "GET"
}
}, - "self": {
- "title": "Blogs Details",
- "rel": "resource",
- "meta": {
- "component_id": "15425",
- "component_manifest": "blogs",
- "space_id": "5679",
- "space_manifest": "participatory_processes",
- "resource_id": "1511",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Blogs List",
- "rel": "resource",
- "meta": {
- "component_id": "15425",
- "component_manifest": "blogs",
- "space_id": "5679",
- "space_manifest": "participatory_processes",
- "resource_id": "1511",
- "action_method": "GET"
}
}, - "next": {
- "title": "Next post",
- "rel": "resource",
- "meta": {
- "component_id": "15425",
- "component_manifest": "blogs",
- "space_id": "5679",
- "space_manifest": "participatory_processes",
- "resource_id": "1510",
- "action_method": "GET"
}
}, - "prev": {
- "title": "Previous post",
- "rel": "resource",
- "meta": {
- "component_id": "15425",
- "component_manifest": "blogs",
- "space_id": "5679",
- "space_manifest": "participatory_processes",
- "resource_id": "1508",
- "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": "25235225-4648-4178-a492-5187e77373c2",
- "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": "1fdf99b9-1838-4f0c-8dff-913ddd9c6b62",
- "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 Enum: "rand" "published_at" Order by |
| order_direction | string Enum: "asc" "desc" Order direction |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "1742",
- "type": "blog",
- "attributes": {
- "created_at": "2026-10-01T02:53:54Z",
- "updated_at": "2026-10-01T02:53:54Z",
- "title": {
- "en": "<script>alert(\"blog_title\");</script> Ea et vero. 111011",
- "fr": "<script>alert(\"blog_title\");</script> Nihil nulla debitis. 111012"
}, - "body": {
- "en": "<p><script>alert(\"blog_body\");</script> Alias consequatur et. 111014</p>",
- "fr": "<p><script>alert(\"blog_body\");</script> Ducimus fuga harum. 111015</p>"
}, - "published_at": "2026-09-30T02:53:54.937Z"
}, - "relationships": {
- "space": {
- "data": {
- "id": "6085",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16435",
- "type": "blog_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Voluptatibus enim accusamus. 110969",
- "rel": "resource",
- "meta": {
- "space_id": "6085",
- "space_manifest": "participatory_processes",
- "component_id": "16435",
- "component_manifest": "blogs",
- "action_method": "GET"
}
}, - "self": {
- "title": "Blogs Details",
- "rel": "resource",
- "meta": {
- "component_id": "16435",
- "component_manifest": "blogs",
- "space_id": "6085",
- "space_manifest": "participatory_processes",
- "resource_id": "1742",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Blogs List",
- "rel": "resource",
- "meta": {
- "component_id": "16435",
- "component_manifest": "blogs",
- "space_id": "6085",
- "space_manifest": "participatory_processes",
- "resource_id": "1742",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
], - "meta": {
- "page": 1,
- "per_page": 1,
- "has_more": true,
- "prev": null
}
}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": "42",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "759": "Stored answer"
}, - "client_ip": null
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "5208",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-10-01T02:45:14Z"
}
}
}| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "5216",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Ab recusandae illum. 50417",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Nostrum pariatur minima. 50420</p>",
- "schema": {
- "type": "object",
- "properties": {
- "783": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Omnis libero rerum. 50426"
}, - "784": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Quia et quae. 50477"
}, - "785": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Rerum impedit ducimus. 50528",
- "enum": [
- "778",
- "779",
- "780"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/783",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Omnis libero rerum. 50426"
}, - {
- "type": "Control",
- "scope": "#/properties/784",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Quia et quae. 50477"
}, - {
- "type": "Control",
- "scope": "#/properties/785",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Rerum impedit ducimus. 50528",
- "options": {
- "choices": [
- {
- "id": "778",
- "translations": {
- "en": "Reiciendis reprehenderit debitis. 50579",
- "fr": "Ut assumenda est. 50580",
- "machine_translations": {
- "es": "Omnis illum consectetur. 50581"
}
}
}, - {
- "id": "779",
- "translations": {
- "en": "Eos corrupti non. 50582",
- "fr": "Cumque dolores suscipit. 50583",
- "machine_translations": {
- "es": "Sunt voluptatem et. 50584"
}
}
}, - {
- "id": "780",
- "translations": {
- "en": "Cum magni sed. 50585",
- "fr": "Libero corporis rerum. 50586",
- "machine_translations": {
- "es": "Non nostrum quas. 50587"
}
}
}
]
}
}
]
}, - "updated_at": "2026-10-01T02:46:06Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "5216"
}
}, - "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": "d1844950-355a-4de9-95af-0149a6932fed",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [
- {
- "id": "5508",
- "type": "questionnaires",
- "attributes": {
- "title": "<script>alert(\"questionnaire_title\");</script> Harum provident illum. 103322",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Aut unde veritatis. 103325</p>",
- "updated_at": "2026-10-01T02:51:29Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "5508"
}
}, - "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
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": 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": "46",
- "type": "questionnaire_response",
- "attributes": {
- "answers": {
- "801": "Test answer",
- "802": null,
- "803": null
}, - "client_ip": "1159300851971808711437866"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "5510",
- "type": "questionnaires"
}
}
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null,
- "user": null,
- "created_at": "2026-10-01T02:52:47Z"
}
}
}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": "9b9fa57e-c9c6-413e-80c2-fbfb07ded47a",
- "type": "submission_request",
- "attributes": {
- "status": "pending"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}
}, - "meta": {
- "status": "pending"
}
}
}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": "5588",
- "type": "questionnaires",
- "attributes": {
- "title": "Updated questionnaire title",
- "description": "<p><script>alert(\"questionnaire_description\");</script> Unde in sunt. 131961</p>",
- "schema": {
- "type": "object",
- "properties": {
- "855": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Sed fugiat modi. 131967"
}, - "856": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Nihil tenetur officia. 132018"
}, - "857": {
- "type": "string",
- "title": "<script>alert(\"questionnaire_question_body\");</script> Modi delectus et. 132069",
- "enum": [
- "850",
- "851",
- "852"
]
}
}, - "required": [ ]
}, - "ui": {
- "type": "VerticalLayout",
- "elements": [
- {
- "type": "Control",
- "scope": "#/properties/855",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Sed fugiat modi. 131967"
}, - {
- "type": "Control",
- "scope": "#/properties/856",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Nihil tenetur officia. 132018"
}, - {
- "type": "Control",
- "scope": "#/properties/857",
- "label": "<script>alert(\"questionnaire_question_body\");</script> Modi delectus et. 132069",
- "options": {
- "choices": [
- {
- "id": "850",
- "translations": {
- "en": "Omnis atque nobis. 132120",
- "fr": "Qui et et. 132121",
- "machine_translations": {
- "es": "Maxime sunt quisquam. 132122"
}
}
}, - {
- "id": "851",
- "translations": {
- "en": "Ratione qui blanditiis. 132123",
- "fr": "Sint dicta reprehenderit. 132124",
- "machine_translations": {
- "es": "Eius nihil et. 132125"
}
}
}, - {
- "id": "852",
- "translations": {
- "en": "Eius aut ut. 132126",
- "fr": "Sequi est enim. 132127",
- "machine_translations": {
- "es": "Voluptatum veniam consequatur. 132128"
}
}
}
]
}
}
]
}, - "updated_at": "2026-10-01T02:59:11Z"
}, - "links": {
- "self": {
- "rel": "self",
- "meta": {
- "action_method": "GET"
}
}, - "submit": {
- "rel": "submit",
- "meta": {
- "action_method": "POST",
- "questionnaire_id": "5588"
}
}, - "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
}
}
}
}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": "873",
- "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": "5659",
- "type": "questionnaires"
}
}
}
}, - "meta": {
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}Enqueue question creation; poll GET /jobs/:uuid.
| Authorization | string Bearer access token (see security schemes) |
required | object | ||||||
| |||||||
{- "data": {
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": true,
- "body": {
- "property1": "string",
- "property2": "string"
}, - "description": {
- "property1": "string",
- "property2": "string"
}, - "question_type": "single_option",
- "max_choices": 0
}, - "relationships": {
- "questionnaire": {
- "data": {
- "type": "questionnaires",
- "id": "string"
}
}
}
}
}{- "job_id": "2198d03d-f2c2-4522-becd-4641e05ea567",
- "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": "901",
- "type": "questions",
- "attributes": {
- "position": 0,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Natus dolores similique. 141910",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Rerum dignissimos reiciendis. 141911",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Repellat odit quis. 141912"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Cum non qui. 141913</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Harum ab esse. 141914</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Magni assumenda eligendi. 141915</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "short_answer"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "5669",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "902",
- "type": "questions",
- "attributes": {
- "position": 1,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Non blanditiis incidunt. 141961",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Minima ut molestiae. 141962",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Aut velit qui. 141963"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Minima vitae dolorem. 141964</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Rem et delectus. 141965</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Perferendis voluptatum consequatur. 141966</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "long_answer"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "5669",
- "type": "questionnaires"
}
}
}
}, - {
- "id": "903",
- "type": "questions",
- "attributes": {
- "position": 2,
- "mandatory": false,
- "body": {
- "en": "<script>alert(\"questionnaire_question_body\");</script> Magni enim unde. 142012",
- "fr": "<script>alert(\"questionnaire_question_body\");</script> Natus adipisci magnam. 142013",
- "machine_translations": {
- "es": "<script>alert(\"questionnaire_question_body\");</script> Omnis sequi reiciendis. 142014"
}
}, - "description": {
- "en": "<p><script>alert(\"questionnaire_question_description\");</script> Sed totam est. 142015</p>",
- "fr": "<p><script>alert(\"questionnaire_question_description\");</script> Qui odit recusandae. 142016</p>",
- "machine_translations": {
- "es": "<p><script>alert(\"questionnaire_question_description\");</script> Aut illo ut. 142017</p>"
}
}, - "max_choices": null,
- "max_characters": 0,
- "question_type": "single_option"
}, - "relationships": {
- "questionnaire": {
- "data": {
- "id": "5669",
- "type": "questionnaires"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null,
- "locale": "en",
- "requested_locale": "en",
- "fallback_from": null
}
}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.
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"
}
}
}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"
}
}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": "5341",
- "type": "meeting",
- "attributes": {
- "created_at": "2026-10-01T03:00:07Z",
- "updated_at": "2026-10-01T03:00:07Z"
}, - "relationships": {
- "space": {
- "data": {
- "id": "6256",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16842",
- "type": "meeting_component"
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"meetings\");</script> Meetings",
- "rel": "resource",
- "meta": {
- "space_id": "6256",
- "space_manifest": "participatory_processes",
- "component_id": "16842",
- "component_manifest": "meetings",
- "action_method": "GET"
}
}, - "self": {
- "title": "Meetings Details",
- "rel": "resource",
- "meta": {
- "component_id": "16842",
- "component_manifest": "meetings",
- "space_id": "6256",
- "space_manifest": "participatory_processes",
- "resource_id": "5341",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Meetings List",
- "rel": "resource",
- "meta": {
- "component_id": "16842",
- "component_manifest": "meetings",
- "space_id": "6256",
- "space_manifest": "participatory_processes",
- "resource_id": "5341",
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 50,
- "has_more": false,
- "next": null,
- "prev": null
}
}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).
Extended data: GET/PUT /proposals/{id}/extended_data (+ /sync); filter with filter[extended_data_cont] on index. See Extended data.
Draft authoring lives under the Draft Proposals tag.
Proposal detail
| id required | integer Proposal Id |
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| space_manifest | string Enum: "participatory_processes" "assemblies" "conferences" "initiatives" Space type |
| space_id | integer Space Id |
| component_id | integer Component Id |
| filter[voted_weight_not_in][] | Array of strings (voted_weight not IN filter) match none of voted_weight's values in array |
| filter[voted_weight_in][] | Array of strings (voted_weight IN filter) match one of voted_weight's values in array |
| filter[voted_weight_start] | string (voted_weight starts With filter) Example: filter[voted_weight_start]=some_string voted_weight starts with |
| filter[voted_weight_eq] | string (voted_weight equal filter) voted_weight is equal to |
| filter[voted_weight_not_eq] | string (voted_weight not equal filter) voted_weight is NOT equal to |
| filter[voted_weight_matches] | string (voted_weight like filter) Example: filter[voted_weight_matches]=%some_string matches voted_weight with |
| filter[voted_weight_blank] | boolean (voted_weight blank filter) voted_weight is null or empty |
| filter[state_not_in][] | Array of strings (state not IN filter) match none of state's values in array |
| filter[state_in][] | Array of strings (state IN filter) match one of state's values in array |
| filter[state_start] | string (state starts With filter) Example: filter[state_start]=some_string state starts with |
| filter[state_eq] | string (state equal filter) state is equal to |
| filter[state_not_eq] | string (state not equal filter) state is NOT equal to |
| filter[state_matches] | string (state like filter) Example: filter[state_matches]=%some_string matches state with |
| filter[state_blank] | boolean (state blank filter) state is null or empty |
| order | string Order by |
| order_direction | string Enum: "asc" "desc" Order direction |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "8276",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-10-01T02:40:30Z",
- "updated_at": "2026-10-01T02:40:30Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Animi omnis adipisci. 2847",
- "fr": "<script>alert(\"proposal_title\");</script> Nostrum vitae maxime. 2848"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Facilis voluptate provident. 2850</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Quo deserunt at. 2851</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "5481",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "14755",
- "type": "proposal_component"
}
}, - "state": {
- "data": {
- "id": "11684",
- "type": "proposal_state"
}, - "meta": {
- "token": "accepted"
}
}, - "author": {
- "data": {
- "id": "12061",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "12061",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Voluptatem eveniet distinctio. 2825",
- "rel": "resource",
- "meta": {
- "space_id": "5481",
- "space_manifest": "participatory_processes",
- "component_id": "14755",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "14755",
- "component_manifest": "proposals",
- "space_id": "5481",
- "space_manifest": "participatory_processes",
- "resource_id": "8276",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "14755",
- "component_manifest": "proposals",
- "space_id": "5481",
- "space_manifest": "participatory_processes",
- "resource_id": "8276",
- "action_method": "GET"
}
}, - "next": {
- "title": "Next Proposal",
- "rel": "resource",
- "meta": {
- "component_id": "14755",
- "component_manifest": "proposals",
- "space_id": "5481",
- "space_manifest": "participatory_processes",
- "resource_id": "8278",
- "action_method": "GET"
}
}, - "prev": {
- "title": "Previous Proposal",
- "rel": "resource",
- "meta": {
- "component_id": "14755",
- "component_manifest": "proposals",
- "space_id": "5481",
- "space_manifest": "participatory_processes",
- "resource_id": "8275",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
}Search proposals
| locales[] | Array of strings (Available locales) Items Enum: "en" "fr" "es" List of locale codes the organization exposes. |
| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| space_manifest | string Enum: "participatory_processes" "assemblies" "conferences" "initiatives" Space type |
| space_id | integer Space Id |
| component_id | integer Component Id |
| order | string Enum: "published_at" "rand" Order by |
| order_direction | string Enum: "asc" "desc" Order direction |
| filter[voted_weight_in][] | Array of strings (voted_weight IN filter) match one of voted_weight's values in array. Only available with [:impersonationFlow] flow |
| filter[voted_weight_eq] | string (voted_weight equal filter) voted_weight is equal to. Only available with [:impersonationFlow] flow |
| filter[voted_weight_lt] | string (voted_weight less than filter) voted_weight is less than. Only available with [:impersonationFlow] flow |
| filter[voted_weight_gt] | string (voted_weight greater than filter) voted_weight is greater than. Only available with [:impersonationFlow] flow |
| filter[voted_weight_present] | boolean (voted_weight present filter) voted_weight is not null and not empty. Only available with [:impersonationFlow] flow |
| filter[voted_weight_blank] | boolean (voted_weight blank filter) voted_weight is null or empty. Only available with [:impersonationFlow] flow |
| filter[state_not_in][] | Array of strings (state not IN filter) match none of state's values in array |
| filter[state_in][] | Array of strings (state IN filter) match one of state's values in array |
| filter[state_start] | string (state starts With filter) Example: filter[state_start]=some_string state starts with |
| filter[state_eq] | string (state equal filter) state is equal to |
| filter[state_not_eq] | string (state not equal filter) state is NOT equal to |
| filter[state_matches] | string (state like filter) Example: filter[state_matches]=%some_string matches state with |
| filter[state_blank] | boolean (state blank filter) state is null or empty |
| filter[extended_data_cont] | string Search on proposal extended_data. Requires |
| Authorization | string Bearer access token (see security schemes) |
{- "data": [ ],
- "meta": {
- "page": 1,
- "per_page": 50,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "202",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-10-01T02:51:40Z",
- "updated_at": "2026-10-01T02:51:40Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "9154",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "13272",
- "type": "users"
}
}
}
}
}Fetch a single vote by id. Conditional GET supported.
| id required | integer |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "206",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-10-01T02:51:42Z",
- "updated_at": "2026-10-01T02:51:42Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "9158",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "13280",
- "type": "users"
}
}
}
}
}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": "207",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-10-01T02:51:43Z",
- "updated_at": "2026-10-01T02:51:43Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "9160",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "13284",
- "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": "63caa84e-ed10-4c07-9650-36c131fd7a28",
- "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": "211",
- "type": "vote_proposals",
- "attributes": {
- "weight": 1,
- "created_at": "2026-10-01T02:51:49Z",
- "updated_at": "2026-10-01T02:51:49Z"
}, - "relationships": {
- "proposal": {
- "data": {
- "id": "9170",
- "type": "proposals"
}
}, - "author": {
- "data": {
- "id": "13304",
- "type": "users"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "source": "api"
}
}See Extended data.
| id required | string |
| object_path required | string |
| Authorization | string Bearer access token (see security schemes) |
required | object | ||
| |||
{- "data": { }
}{- "data": {
- "source": "sync"
}
}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.
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": "9002",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-10-01T02:49:39Z",
- "updated_at": "2026-10-01T02:49:39Z",
- "title": { },
- "body": { },
- "errors": {
- "title": [
- "Title cannot be blank"
], - "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "5950",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16302",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13071",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13071",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Aliquid aut pariatur. 97281",
- "rel": "resource",
- "meta": {
- "space_id": "5950",
- "space_manifest": "participatory_processes",
- "component_id": "16302",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16302",
- "component_manifest": "proposals",
- "space_id": "5950",
- "space_manifest": "participatory_processes",
- "resource_id": "9002",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16302",
- "component_manifest": "proposals",
- "space_id": "5950",
- "space_manifest": "participatory_processes",
- "resource_id": "9002",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "F05XMUE3Ba1El2ibARVAOluqGQHwtHeUnF9M9Gggl8g",
- "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": "9369",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-10-01T02:59:23Z",
- "updated_at": "2026-10-01T02:59:23Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Nesciunt perspiciatis occaecati. 132465"
}, - "body": {
- "fr": "<p><script>alert(\"proposal_body\");</script> Nihil illo est. 132468</p>"
}, - "errors": {
- "title": [ ],
- "body": [ ]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "6225",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16811",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13781",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13781",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Blanditiis occaecati quae. 132455",
- "rel": "resource",
- "meta": {
- "space_id": "6225",
- "space_manifest": "participatory_processes",
- "component_id": "16811",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16811",
- "component_manifest": "proposals",
- "space_id": "6225",
- "space_manifest": "participatory_processes",
- "resource_id": "9369",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16811",
- "component_manifest": "proposals",
- "space_id": "6225",
- "space_manifest": "participatory_processes",
- "resource_id": "9369",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "TmHEgVVnKHn-7BKBk7XTNfuCIX5JqAWYqx4vWKF95CA",
- "fields": [
- "title",
- "body"
]
}
}
}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": "87ead6ae-03b2-44c7-a4e7-18adbe00f7f8",
- "status": "pending",
- "data": null,
- "return_value": null,
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}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": "9180",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-10-01T02:52:17Z",
- "updated_at": "2026-10-01T02:52:17Z",
- "title": {
- "en": "<script>alert(\"proposal_title\");</script> Sint voluptatem aut. 105790",
- "fr": "<script>alert(\"proposal_title\");</script> Dolorem quo eos. 105791"
}, - "body": {
- "en": "<p><script>alert(\"proposal_body\");</script> Cum ut ex. 105793</p>",
- "fr": "<p><script>alert(\"proposal_body\");</script> Architecto et repellat. 105794</p>"
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "6043",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16391",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13327",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13327",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Maiores quia tempora. 105781",
- "rel": "resource",
- "meta": {
- "space_id": "6043",
- "space_manifest": "participatory_processes",
- "component_id": "16391",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16391",
- "component_manifest": "proposals",
- "space_id": "6043",
- "space_manifest": "participatory_processes",
- "resource_id": "9180",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16391",
- "component_manifest": "proposals",
- "space_id": "6043",
- "space_manifest": "participatory_processes",
- "resource_id": "9180",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true,
- "client_id": 4615
}
}
}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": "9194",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-10-01T02:54:44Z",
- "updated_at": "2026-10-01T02:54:44Z",
- "title": { },
- "body": { },
- "errors": {
- "title": [
- "Title cannot be blank"
], - "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "6117",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16467",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13500",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13500",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Consectetur qui doloremque. 113508",
- "rel": "resource",
- "meta": {
- "space_id": "6117",
- "space_manifest": "participatory_processes",
- "component_id": "16467",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16467",
- "component_manifest": "proposals",
- "space_id": "6117",
- "space_manifest": "participatory_processes",
- "resource_id": "9194",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16467",
- "component_manifest": "proposals",
- "space_id": "6117",
- "space_manifest": "participatory_processes",
- "resource_id": "9194",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "IiQo2_notxt6p7SgxslrYTQBTrfQtK_ktsimp0EFi2w",
- "fields": [
- "title",
- "body"
]
}
}
}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": "9202",
- "type": "draft_proposal",
- "attributes": {
- "created_at": "2026-10-01T02:55:09Z",
- "updated_at": "2026-10-01T02:55:09Z",
- "title": {
- "fr": "<script>alert(\"proposal_title\");</script> Aut dolor repudiandae. 114217"
}, - "body": { },
- "errors": {
- "title": [ ],
- "body": [
- "Body cannot be blank"
]
}
}, - "relationships": {
- "space": {
- "data": {
- "id": "6129",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16473",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13512",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13512",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"component_name\");</script> Atque consequatur dolorum. 114207",
- "rel": "resource",
- "meta": {
- "space_id": "6129",
- "space_manifest": "participatory_processes",
- "component_id": "16473",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16473",
- "component_manifest": "proposals",
- "space_id": "6129",
- "space_manifest": "participatory_processes",
- "resource_id": "9202",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16473",
- "component_manifest": "proposals",
- "space_id": "6129",
- "space_manifest": "participatory_processes",
- "resource_id": "9202",
- "action_method": "GET"
}
}
}, - "meta": {
- "publishable": false,
- "client_id": "vxozP7yj77o_hRhEnrMoSWYSZwbemXQ8OFIrqDxf1_I",
- "fields": [
- "title",
- "body"
]
}
}
}Durable records for asynchronous API writes (decidim_rest_full_api_jobs).
When a mutating route returns HTTP 202, the body includes job_id (UUID). Poll GET /jobs/{id} without a Bearer token—the UUID is the capability—or list jobs with the same OAuth application and resource owner via GET /jobs (Bearer required).
Filter the index with filter[command_key] (job name, e.g. draft_proposals#create) and filter[status] (pending, processing, completed, failed). Delete a job with DELETE /jobs/{id} (same OAuth context as the list).
Returns async jobs for the same OAuth application, resource owner (when applicable), and organization as the Bearer token used to originate those jobs.
page defaults to 1; per_page defaults to 25 and is clamped to 100.
filter[command_key]: job name (e.g. draft_proposals#create, forms/questions#create)filter[status]: pending, processing, completed, or failedSupports ETag / If-None-Match on the collection.
Bearer token required (same OAuth context as the jobs being listed).
| filter[command_key_not_in][] | Array of strings (command_key not IN filter) match none of command_key's values in array |
| filter[command_key_in][] | Array of strings (command_key IN filter) match one of command_key's values in array |
| filter[command_key_start] | string (command_key starts With filter) Example: filter[command_key_start]=some_string command_key starts with |
| filter[command_key_eq] | string (command_key equal filter) command_key is equal to |
| filter[command_key_not_eq] | string (command_key not equal filter) command_key is NOT equal to |
| filter[command_key_matches] | string (command_key like filter) Example: filter[command_key_matches]=%some_string matches command_key with |
| filter[command_key_blank] | boolean (command_key blank filter) command_key is null or empty |
| filter[status_not_in][] | Array of strings (status not IN filter) Items Enum: "pending" "processing" "completed" "failed" match none of status's values in array |
| filter[status_in][] | Array of strings (status IN filter) Items Enum: "pending" "processing" "completed" "failed" match one of status's values in array |
| filter[status_start] | string (status starts With filter) Example: filter[status_start]=some_string status starts with |
| filter[status_eq] | string (status equal filter) Enum: "pending" "processing" "completed" "failed" status is equal to |
| filter[status_not_eq] | string (status not equal filter) Enum: "pending" "processing" "completed" "failed" status is NOT equal to |
| filter[status_matches] | string (status like filter) Example: filter[status_matches]=%some_string matches status with |
| filter[status_blank] | boolean (status blank filter) status is null or empty |
| page | integer Page number for pagination |
| per_page | integer Number of items per page |
| Authorization required | string Bearer access token: |
{- "data": [
- {
- "id": "689c3be0-1041-4a9f-8b16-bcb69d351ae2",
- "status": "completed",
- "command_key": "draft_proposals#create",
- "created_at": "2026-10-01T02:51:57.611Z",
- "updated_at": "2026-10-01T02:51:57.611Z",
- "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "db9ca429-6b6e-44c8-96b5-653c4c538765",
- "status": "completed",
- "command_key": "draft_proposals#create",
- "created_at": "2026-10-01T02:56:08.335Z",
- "updated_at": "2026-10-01T02:56:08.335Z",
- "error_class": null,
- "error_message": null,
- "data": {
- "ok": true
}, - "return_value": {
- "ok": true
}, - "links": {
- "self": {
- "title": "API job status",
- "rel": "resource",
- "meta": {
- "action_method": "GET"
}
}
}
}Remove a 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 |
{ }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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6NTY2MCwidXNlcl9pZCI6MTIzMzYsImludml0ZWRfYXQiOm51bGwsInR5cGUiOiJzcGFjZV9hZG1pbmlzdHJhdG9yIn0",
- "type": "role",
- "attributes": {
- "type": "space_administrator",
- "user_id": 12336,
- "resource_id": 5660,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-10-01T02:43:28Z",
- "updated_at": "2026-10-01T02:43:28Z"
}
}
], - "meta": {
- "page": 1,
- "per_page": 50,
- "has_more": false,
- "next": null,
- "prev": null
}
}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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6NTk0MiwidXNlcl9pZCI6MTMwNTUsImludml0ZWRfYXQiOm51bGwsInR5cGUiOiJzcGFjZV9wcml2YXRlX21lbWJlciJ9",
- "type": "role",
- "attributes": {
- "type": "space_private_member",
- "user_id": 13055,
- "resource_id": 5942,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-10-01T02:49:19Z",
- "updated_at": "2026-10-01T02:49:19Z"
}
}
}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": "eyJyZXNvdXJjZV90eXBlIjoiRGVjaWRpbTo6UGFydGljaXBhdG9yeVByb2Nlc3MiLCJyZXNvdXJjZV9pZCI6NTk2NywidXNlcl9pZCI6MTMwODksImludml0ZWRfYXQiOm51bGwsInR5cGUiOiJzcGFjZV9wcml2YXRlX21lbWJlciJ9",
- "type": "role",
- "attributes": {
- "type": "space_private_member",
- "user_id": 13089,
- "resource_id": 5967,
- "resource_type": "Decidim::ParticipatoryProcess",
- "invited_at": null,
- "accepted_invite": true,
- "created_at": "2026-10-01T02:50:06Z",
- "updated_at": "2026-10-01T02:50:06Z"
}
}
}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 |
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": "239",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-10-01T02:41:04Z",
- "updated_at": "2026-10-01T02:41:05Z"
}
}
}| id required | string |
| Authorization | string Bearer access token (see security schemes) |
{- "data": {
- "id": "257",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-10-01T03:01:10Z",
- "updated_at": "2026-10-01T03:01:10Z"
}
}
}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": "9016",
- "type": "proposal",
- "attributes": {
- "created_at": "2026-10-01T02:49:57Z",
- "updated_at": "2026-10-01T02:49:57Z",
- "title": { },
- "body": { }
}, - "relationships": {
- "space": {
- "data": {
- "id": "5964",
- "type": "participatory_processes"
}
}, - "component": {
- "data": {
- "id": "16316",
- "type": "proposal_component"
}
}, - "author": {
- "data": {
- "id": "13085",
- "type": "user"
}
}, - "coauthors": {
- "data": [
- {
- "id": "13085",
- "type": "user"
}
], - "meta": {
- "count": 1
}
}
}, - "links": {
- "related": {
- "title": "<script>alert(\"proposals\");</script> Proposals",
- "rel": "resource",
- "meta": {
- "space_id": "5964",
- "space_manifest": "participatory_processes",
- "component_id": "16316",
- "component_manifest": "proposals",
- "action_method": "GET"
}
}, - "self": {
- "title": "Proposals Details",
- "rel": "resource",
- "meta": {
- "component_id": "16316",
- "component_manifest": "proposals",
- "space_id": "5964",
- "space_manifest": "participatory_processes",
- "resource_id": "9016",
- "action_method": "GET"
}
}, - "collection": {
- "title": "Proposals List",
- "rel": "resource",
- "meta": {
- "component_id": "16316",
- "component_manifest": "proposals",
- "space_id": "5964",
- "space_manifest": "participatory_processes",
- "resource_id": "9016",
- "action_method": "GET"
}
}
}, - "meta": {
- "published": true
}
}
}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": "242",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "signing_secret": "5320728870e72c85cce4d8fe1033f9235b3086ac900dfc6dcca93d2072b33762",
- "created_at": "2026-10-01T02:52:40Z",
- "updated_at": "2026-10-01T02:52:40Z"
}
}
}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": "249",
- "type": "webhook_registration",
- "attributes": {
- "subscriptions": [
- "proposal_creation.succeeded"
], - "created_at": "2026-10-01T02:58:44Z",
- "updated_at": "2026-10-01T02:58:44Z"
}
}
], - "meta": {
- "page": 1,
- "per_page": 20,
- "has_more": false,
- "next": null,
- "prev": null
}
}