All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Add changelog to documents that auto-publish to WordPress.
GET /fundersnow supports theisCollaborativequery parameter to filter funders by their collaborative status.
- Added
createdByfield to funders, sources, opportunities, changemakers, and data providers. BaseFieldcan now be of typedateanddate_time.GET /changemakersnow supports the_contentquery parameter to search changemakers by name using full-text search.- Proposals now include a
changemakersarray containing shallow changemaker data for all associated changemakers. - Permission grants now support optional
conditionsthat restrict which entities the grant applies to based on entity data. The initial implementation supports filteringproposalFieldValuescope bybaseFieldCategoryusing theinoperator. - Permission grants can now be updated via
PUT /permissionGrants/:permissionGrantId. All mutable fields are replaced with the provided values.
- Permission grants for users no longer require the user to exist in the PDC database. Grants can now reference any Keycloak user UUID, matching the existing behavior for user group grants.
- ProposalVersion creation now requires
edit | proposalscope (checked viahas_proposal_permission) instead ofedit | funderscope. Existing funder permission grants witheditverb andfunderscope have been migrated to also includeproposalscope. - Opportunity creation now requires
create | opportunityscope on funder permission grants (previouslyedit | funder). - Viewing opportunities, application forms, application form fields, and bulk upload tasks now uses
opportunityscope instead offunderscope. - Creating and editing application forms and application form fields now uses
edit | opportunityscope instead ofedit | funder. - Creating bulk upload tasks now requires
create | proposalscope instead ofedit | opportunity. - Application form field queries now enforce permission checks via
has_opportunity_permission. - Existing funder permission grants with
funderscope have been migrated to also includeopportunityscope. Newcreate | opportunitygrants have been created for users who hadedit | funder. - Creating changemaker field values now requires
create | changemakerFieldValuescope (previously requirededit | changemaker). This scope can be granted at the changemaker context level. - Existing changemaker permissions with
changemakerscope have been migrated to also includechangemakerFieldValuescope, ensuring backward compatibility.
- Bundle
totalnow reflects the count of results matching the current query filters, permissions, and search terms. Previously it returned the full table row count regardless of any applied filters. - Permission checks for userGroup-based grants now correctly ignore expired ephemeral user group associations.
applicationFormFieldnow has aninputTypefield to provide rendering hints for UIs rendering the fields.
GET /filesendpoint to retrieve a paginated list of files. Users see only files they created; administrators can see all files and filter by creator using thecreatedByparameter.- Added optional
namefield toApplicationFormentity for human-readable display.
- Viewing changemaker field values now requires explicit
view | changemakerFieldValuescope, unless the field haspublicsensitivity classification. This scope can be granted at the changemaker context level. - Viewing proposal field values now requires explicit
view | proposalFieldValuescope. This scope can be granted at the proposalFieldValue, proposal, opportunity, funder, or changemaker context level. Users with onlyview | proposalscope will see proposals with emptyfieldValuesarrays. - Existing permissions with
proposalscope have been migrated to also includeproposalFieldValuescope, ensuring backward compatibility. - Migrated changemaker permissions to the unified
permission_grantstable. Changemaker permissions should now be managed via the/permissionGrantsendpoints. - Migrated funder permissions to the unified
permission_grantstable. Funder permissions should now be managed via the/permissionGrantsendpoints. - Migrated data provider permissions to the unified
permission_grantstable. Data provider permissions should now be managed via the/permissionGrantsendpoints. - Migrated opportunity permissions to the unified
permission_grantstable. Opportunity permissions should now be managed via the/permissionGrantsendpoints. - The
permissionsproperty has been removed from theUsertype entirely. All permission checks are now performed asynchronously via the permission_grants table. - Viewing proposals, proposal versions, and changemaker-proposal associations now requires
view | proposalscope instead of inheriting fromview | funderorview | changemaker. Theview | proposalscope can be granted at the proposal, opportunity, funder, or changemaker context level and will be inherited appropriately.
- Legacy changemaker permission endpoints have been removed:
PUT /users/{userKeycloakUserId}/changemakers/{changemakerId}/permissions/{permission}DELETE /users/{userKeycloakUserId}/changemakers/{changemakerId}/permissions/{permission}PUT /userGroups/{keycloakOrganizationId}/changemakers/{changemakerId}/permissions/{permission}DELETE /userGroups/{keycloakOrganizationId}/changemakers/{changemakerId}/permissions/{permission}
UserChangemakerPermissionandUserGroupChangemakerPermissionschemas have been removed from the OpenAPI spec.- Legacy funder permission endpoints have been removed:
PUT /users/{userKeycloakUserId}/funders/{funderShortCode}/permissions/{permission}DELETE /users/{userKeycloakUserId}/funders/{funderShortCode}/permissions/{permission}PUT /userGroups/{keycloakOrganizationId}/funders/{funderShortCode}/permissions/{permission}DELETE /userGroups/{keycloakOrganizationId}/funders/{funderShortCode}/permissions/{permission}
UserFunderPermissionandUserGroupFunderPermissionschemas have been removed from the OpenAPI spec.- Legacy data provider permission endpoints have been removed:
PUT /users/{userKeycloakUserId}/dataProviders/{dataProviderShortCode}/permissions/{permission}DELETE /users/{userKeycloakUserId}/dataProviders/{dataProviderShortCode}/permissions/{permission}PUT /userGroups/{keycloakOrganizationId}/dataProviders/{dataProviderShortCode}/permissions/{permission}DELETE /userGroups/{keycloakOrganizationId}/dataProviders/{dataProviderShortCode}/permissions/{permission}
UserDataProviderPermissionandUserGroupDataProviderPermissionschemas have been removed from the OpenAPI spec.- Legacy opportunity permission endpoints have been removed:
PUT /users/{userKeycloakUserId}/opportunities/{opportunityId}/permissions/{opportunityPermission}DELETE /users/{userKeycloakUserId}/opportunities/{opportunityId}/permissions/{opportunityPermission}PUT /userGroups/{keycloakOrganizationId}/opportunities/{opportunityId}/permissions/{opportunityPermission}DELETE /userGroups/{keycloakOrganizationId}/opportunities/{opportunityId}/permissions/{opportunityPermission}
UserOpportunityPermissionandUserGroupOpportunityPermissionschemas have been removed from the OpenAPI spec.
Changemaker.fieldsfile values are now decorated withdownloadUrlto allow access to file contents.ChangemakerProposal.proposal.versions[].fieldValuesfile values are now decorated withdownloadUrl.
PermissionGrantentity type now exists to represent permission grants that give a user or user group specific permissions on a context entity and its related entities.GET /permissionGrantsendpoint now exists to retrieve a paginated list of permission grants. Requires administrator role.POST /permissionGrantsendpoint now exists to create a new permission grant. Requires administrator role.GET /permissionGrants/{permissionGrantId}endpoint now exists to retrieve a specific permission grant by ID. Requires administrator role.DELETE /permissionGrants/{permissionGrantId}endpoint now exists to delete a specific permission grant by ID. Requires administrator role.PermissionGrantEntityTypeschema now exists to enumerate entity types that can be referenced in permission grants.PermissionGrantVerbschema now exists to enumerate permission verbs (view,create,edit,delete,manage).
GET /applicationForm/{applicationFormId}/proposalDataCsvreturns an application form in a usable csv format for making bulk uploadsapplicationFormIdis now a field onbulkUploadTasks
ApplicationFormsare no longer created during a bulk upload, and bulk uploads must now explicitly reference an existing application form on creation.
ChangemakerFieldValueBatchentities now have acreatedByattribute tracking the user who created the batch.GET /changemakerFieldValueBatchesendpoint now exists to retrieve a paginated list of changemaker field value batches.GET /changemakerFieldValueBatches/:batchIdendpoint now exists to retrieve a specific changemaker field value batch by ID.GET /changemakerFieldValuesendpoint now exists to retrieve a paginated list of changemaker field values with optional filtering bychangemakerFieldValueBatchandchangemaker.GET /changemakerFieldValues/:fieldValueIdendpoint now exists to retrieve a specific changemaker field value by ID.FieldValueBasetype now exists as a common base forProposalFieldValueandChangemakerFieldValue.Changemaker.fieldsnow includesChangemakerFieldValueobjects in addition toProposalFieldValueobjects, with source-based priority determining the "gold" value per base field.
ProposalFieldValueandChangemakerFieldValueOpenAPI schemas now useallOfto extendFieldValueBase.Changemaker.fieldsOpenAPI schema now usesoneOfto accept eitherProposalFieldValueorChangemakerFieldValueitems.
ChangemakerFieldValueBatchentity type now exists to group changemaker field values that were imported together from an external source.POST /changemakerFieldValueBatchesendpoint now exists to create changemaker field value batches.ChangemakerFieldValueentity type now exists to represent field values directly associated with changemakers.POST /changemakerFieldValuesendpoint now exists to create changemaker field values.
GET /baseFieldsnow has an optionalsensitivityClassificationsparameter.GET /baseFieldsby default returns non-forbidden base fields.
BulkUploadentities now have acreatedByUserattribute.
POST /changemakersOpenAPI documentation was improved.
Fileentities are now decorated with adownloadUrlwhen appropriate.
Fileis now properly documented as potentially having apresignedPostattribute.
ProposalFieldValuenow includes afileattribute if the field value references a validFile.
BulkUploadTasknow accepts a nullableattachmentsArchiveFileId.
GET /tasks/bulkUploadsnow includesBulkUploadLogentries underlogs.
BaseFieldcan now be of typefile.S3Bucketnow exists.
BaseFieldis now properly documented as being allowed to be typecurrency.
Filenow has ans3BucketNameattribute as well as ans3Bucketattribute, and no longer has a has abucketNameorbucketRegionattribute.BulkUploadTaskno longer stores file metadata, but instead requires aproposalsDataFileIdattribute which references aFile.id.
/presignedPostRequestshas been renamed to/filesand the returnedFileentity has additional attributes.
Proposalentities now include deepOpportunitydata.
- The required fields associated with
UserGroupChangemakerPermission,UserGroupDataProviderPermission, andUserGroupFunderPermissionare now correctly documented. - The various opportunity permission endpoints are now correctly documented.
- Funders now have a
isCollaborativeattribute. - Added
FunderCollaborativeMemberentity type to represent collaborators on Funders, which extend funder permissions to other funder collaborators. - Added
FunderCollaborativeInvitationentity type to represent invitations to collaborate on a funder.
- A new
PUT /users/{userId}/opportunities/{opportunityId}/permissions/{opportunityPermission}endpoint now exists - A new
DELETE /users/{userId}/opportunities/{opportunityId}/permissions/{opportunityPermission}endpoint now exists - A new
PUT /userGroups/{keycloakOrganizationId}/opportunities/{opportunityId}/permissions/{opportunityPermission}endpoint now exists - A new
DELETE /userGroups/{keycloakOrganizationId}/opportunities/{opportunityId}/permissions/{opportunityPermission}endpoint now exists
ApplicationFormFieldnow have aninstructionsattribute.
GET /proposalsnow accepts afunderquerystring filter which returns a subset of proposals based on the funder of the proposal's opportunity.
- The
BaseField.scopeattribute is nowBaseField.categoryand includes several additional values.
ProposalFieldValuesnow have agoodAsOfattribute.BaseFieldsnow have asensitivityClassificationattribute.
BaseFieldsare now primary keyed on theshortCodevalue, and have had corresponding foreign keys in theApplicationFormFieldandBaseFieldLocalizationtables updated to match.
BaseFieldsnow have avalueRelevanceHoursattribute which signal how long values associated with the base field are considered relevant.
OpportunityandBulkUploadTasknow require afunderShortCodeon creation.
- Add and remove fiscal sponsors using
PUTandDELETEon/changemakers/{changemakerId}/fiscalSponsors/{fiscalSponsorChangemakerId}. - There is now a type
ShallowChangemakeravailable. Changemakernow has afiscalSponsorsattribute, a list ofShallowChangemaker.
- Manage user-funder permissions using
PUT, andDELETEon/user/{keycloakUserId}/funders/{funderShortCode}/permissions/{permission}. - Manage user-data-provider permissions using
PUT, andDELETEon/user/{keycloakUserId}/funders/{funderShortCode}/permissions/{permission}. - Manage user-group-changemaker permissions using
PUT, andDELETEon/userGroups/{keycloakOrganizationId}/changemaker/{changemakerId}/permissions/{permission}. - Manage user-group-data-provider permissions using
PUT, andDELETEon/userGroups/{keycloakOrganizationId}/dataProvider/{dataProviderShortCode}/permissions/{permission} - Manage user-group-funder permissions using
PUT, andDELETEon/userGroups/{keycloakOrganizationId}/funders/{funderShortCode}/permissions/{permission} - Manage user-funder permissions using
PUT, andDELETEon/user/{keycloakUserId}/funders/{funderShortCode}/permissions/{permission}. - Update changemaker attributes using
PATCHon/changemakers/{changemakerId}. This was available in the API starting 2025-01-30 under the previous version number.
Changemakernow haskeycloakOrganizationId, the UUID in Keycloak for the related Organization.
Fundernow haskeycloakOrganizationId, the UUID in Keycloak for the related Organization.
- Upgraded to use OpenAPI Specification 3.1.
DataProvidertype now haskeycloakOrganizationId, the UUID in Keycloak for the related Organization.
- Manage user changemaker permissions using
GET,PUT, andDELETEon/user/{keycloakUserId}/changemakers/{changemakerId}/permissions/{permission}.
Changemakertype was missing the fields property.
Usertype had an inaccurate specification regarding permission attributes.
BulkUploadis nowBulkUploadTask.GET /bulkUploadandPOST /bulkUploadare nowGET /tasks/bulkUploadandPOST /tasks/bulkUpload. Future jobs for the graphile-worker will be routed undertasksas well.
Usernow has apermissionsattribute which includes information about various granted permissions.
SourceBundleis now present in the swagger spec.GET /sourcesis now correctly documented as returning aSourceBundle.
Organizationis nowChangemaker.OrganizationProposalis nowChangemakerProposal.
Users.idno longer exists;keycloakUserIdis now the primary identifier of any givenUser.Proposal.createdByis now a UUID reference to the creator'skeycloakUserId.ProposalVersion.createdByis now a UUID reference to the creator'skeycloakUserId.BulkUpload.createdByis now a UUID reference to the creator'skeycloakUserId.
authenticationIdis nowkeycloakUserId(a UUID) in theUserentity, as well as for any endpoints that allowed filtering byauthenticationId.
createdByis now an attribute ofProposalVersion.
- New
Funderentity type with correspondingPUTandGETendpoints. - New
DataProviderentity type with correspondingPUTandGETendpoints. - New
Sourceentity type with correspondingPUTandGETendpoints. sourceIdis now an attribute ofBulkUpload.sourceIdis now an attribute ofProposalVersion.
- The
BulkUploadBundleentity now exists, and the/bulkUploadsendpoint is properly documented to return that type.
- Several read-only fields were improperly defined, resulting in improper SDK results.
WritablePresignedPostRequestwill no longer require a populatedpresignedPost.
- Created a new
PresignedPostentity type instead of directly embedding the definition inPresignedPostRequest.
- The
OrganizationsattributeemployerIdentificationNumberhas been removed.
- Several fields that were marked as optional are now properly marked as required.
BaseFieldnow has ascopeattribute.
- The GET
/opportunitiesendpoint now returns anOpportunityBundleand accepts pagination parameters. - Added a new
OrganizationattributetaxIdwhich contains the same value asemployerIdentificationNumber. - Deprecated the
OrganizationsattributeemployerIdentificationNumber. Please update your clients to usetaxIdinstead.
- The
BulkUploadentity now has acreatedByattribute. - The
Proposalentity now has acreatedByattribute. - The
/proposalsendpoint now supports acreatedByfilter. - The
Usertype now exists. - The GET
/usersendpoint now exists.
- The
/bulkUploadsendpoint will now only return bulk uploads associated with the current user. - The
/proposalsendpoint will now only return proposals associated with the current user.
- The
data_typefield of theBaseFieldentity is now an enum of acceptable types. - The
ProposalFieldValueentity now has ais_validfield.
- The
/applicationFormsendpoint now returns anApplicationFormBundle. - The
/applicationFormsendpoint now returns deepApplicationFormobjects. - The
/applicationForms/:idendpoint now returns a deep `ApplicationForm object.
- The
/applicationForms/:idendpoint no longer has aincludeFieldsquery parameter, as it always includes deep fields.
- The
OrganizationProposalentity now exists. - The
OrganizationProposalBundleentity now exists. - It is now possible to filter
/proposalsin terms of organization. - It is now possible to filter
/organizationsin terms of proposal.
- The
Applicantentity no longer exists. - All
/applicants/*endpoints are removed. - The
applicantIdattribute ofProposalhas been removed.
- The
Organizationentity now exists. - The GET
/organizationsendpoint now exists. - The GET
/organizations:idendpoint now exists. - The POST
/organizationsendpoint now exists.
- The
GETandPOST/canonicalFieldsendpoints have been renamed to/baseFields. - The
CanonicalFieldschema type has been renamed toBaseField. - The
ApplicationFormField.canonicalFieldIdattribute of the has been renamed toApplicationFormField.baseFieldId.
- The
GET /proposalsendpoint now returns a newBundlewrapper around response data.