Skip to main content
Creating a proposal locks a bond from the user’s wallet, sized at proposalBondBps of supply, which is reclaimed with bonds/withdraw after settlement. Only one proposal can be active per governance at a time, and a second returns active_proposal_exists.

Shared Fields

The default vote duration is 600 seconds, which is ten minutes and short for a real governance decision. We recommend setting voteDurationSeconds explicitly rather than relying on the default.

POST /partner/v1/governance/proposals/update-content

Proposes a change to token metadata. This is the only multipart endpoint in the Partner API, because it can carry a new image. Content type: multipart/form-data Send only the fields you want to change, since omitted fields are left alone and an empty string clears a text field.
There are two distinct empty-change errors and they are not interchangeable. Sending no patch fields at all fails fast with 400 invalid_input, whereas sending fields whose values match what is already on-chain reaches the builder and fails with no_metadata_changes.
Validation failures on website, twitter, and telegram currently return 500 internal rather than 400. These are permanent failures rather than transient ones, so they should not be placed on an automatic retry path. We recommend validating these three fields on your own side before submitting. See Error Handling.
On success, the response additionally carries metadataUri and imageUri for the newly pinned content.

POST /partner/v1/governance/proposals/extend-mutability

Proposes extending the window during which metadata can still be changed. A governance can only be extended once, and a second attempt returns mutability_already_extended. Extensions are also capped, so an over-long request returns mutability_extension_exceeds_cap.

POST /partner/v1/governance/proposals/finalize-metadata

Proposes locking metadata permanently. Once metadata is finalized, no further content proposals are possible for that token.

POST /partner/v1/governance/metadata/finalize-expired

Finalizes metadata whose mutability window has already lapsed. This is housekeeping rather than a governance decision, since it records on-chain what is already true.
This endpoint accepts voteDurationSeconds for schema consistency but ignores it, since there is nothing to vote on.
Calling it before the window expires returns metadata_still_mutable.

POST /partner/v1/governance/bonds/withdraw

Reclaims the bond locked when creating a proposal, after settlement. Returns no_proposal_bond if the proposal never had one, and proposal_bond_already_withdrawn if it was already reclaimed.

Response

The metadataUri and imageUri fields appear only on update-content, and other identifiers are present where they apply.
A status of processed means the transaction was included in a block rather than rooted. Confirm the signature against Solana through your own RPC before showing the user a settled result.

Errors