# Get account
Source: https://docs.goodgrants.com/api-reference/account/get-account
/api-reference/openapi-v2_3.yaml get /account
Get the account associated with the API key.
# Create action task
Source: https://docs.goodgrants.com/api-reference/action-tasks/create-action-task
/api-reference/openapi-v2_3.yaml post /action-task
Create an action task.
# Delete action task
Source: https://docs.goodgrants.com/api-reference/action-tasks/delete-action-task
/api-reference/openapi-v2_3.yaml delete /action-task/{token}
Delete the action task identified by the specified token.
# Get action task
Source: https://docs.goodgrants.com/api-reference/action-tasks/get-action-task
/api-reference/openapi-v2_3.yaml get /action-task/{token}
Get the action task identified by the specified token.
# List action tasks
Source: https://docs.goodgrants.com/api-reference/action-tasks/list-action-tasks
/api-reference/openapi-v2_3.yaml get /action-task
List action tasks.
# Comment on allocation payment
Source: https://docs.goodgrants.com/api-reference/allocation-payments/comment-on-allocation-payment
/api-reference/openapi-v2_3.yaml post /allocation-payment/comment
Add a comment to the allocation payment identified by the slug in the request body.
# Create allocation payment
Source: https://docs.goodgrants.com/api-reference/allocation-payments/create-allocation-payment
/api-reference/openapi-v2_3.yaml post /allocation-payment
Create an allocation payment.
# Delete allocation payment
Source: https://docs.goodgrants.com/api-reference/allocation-payments/delete-allocation-payment
/api-reference/openapi-v2_3.yaml delete /allocation-payment/{allocation_payment_slug}
Delete the allocation payment identified by the specified slug.
# Get allocation payment
Source: https://docs.goodgrants.com/api-reference/allocation-payments/get-allocation-payment
/api-reference/openapi-v2_3.yaml get /allocation-payment/{allocation_payment_slug}
Get the allocation payment identified by the specified slug.
# List allocation payments
Source: https://docs.goodgrants.com/api-reference/allocation-payments/list-allocation-payments
/api-reference/openapi-v2_3.yaml get /allocation-payment
List allocation payments.
# Update allocation payment
Source: https://docs.goodgrants.com/api-reference/allocation-payments/update-allocation-payment
/api-reference/openapi-v2_3.yaml put /allocation-payment/{allocation_payment_slug}
Update the allocation payment identified by the specified slug.
# Allocation created
Source: https://docs.goodgrants.com/api-reference/allocations/allocation-created
/api-reference/openapi-v2_3.yaml webhook allocation-created
# Allocation payment created
Source: https://docs.goodgrants.com/api-reference/allocations/allocation-payment-created
/api-reference/openapi-v2_3.yaml webhook allocation-payment-created
# Allocation payment deleted
Source: https://docs.goodgrants.com/api-reference/allocations/allocation-payment-deleted
/api-reference/openapi-v2_3.yaml webhook allocation-payment-deleted
# Allocation payment status changed
Source: https://docs.goodgrants.com/api-reference/allocations/allocation-payment-status-changed
/api-reference/openapi-v2_3.yaml webhook allocation-payment-status-changed
# Allocation payment updated
Source: https://docs.goodgrants.com/api-reference/allocations/allocation-payment-updated
/api-reference/openapi-v2_3.yaml webhook allocation-payment-updated
# Create allocation
Source: https://docs.goodgrants.com/api-reference/allocations/create-allocation
/api-reference/openapi-v2_3.yaml post /allocation
Create an allocation.
# Delete allocation
Source: https://docs.goodgrants.com/api-reference/allocations/delete-allocation
/api-reference/openapi-v2_3.yaml delete /allocation/{allocation_slug}
Delete the allocation identified by the specified slug.
# Get allocation
Source: https://docs.goodgrants.com/api-reference/allocations/get-allocation
/api-reference/openapi-v2_3.yaml get /allocation/{allocation_slug}
Get the allocation identified by the specified slug.
# List allocations
Source: https://docs.goodgrants.com/api-reference/allocations/list-allocations
/api-reference/openapi-v2_3.yaml get /allocation
List allocations.
# Update allocation
Source: https://docs.goodgrants.com/api-reference/allocations/update-allocation
/api-reference/openapi-v2_3.yaml put /allocation/{allocation_slug}
Update the allocation identified by the specified slug.
# Update application category
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-application-category
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/update-category
Update the category for the application identified by the specified slug.
# Update application chapter
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-application-chapter
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/update-chapter
Update the chapter for the application identified by the specified slug.
# Update application field
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-application-field
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/update-field/{field_slug}
Update a field for the application identified by the specified slug.
# Update application title
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-application-title
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/update-title
Update the title for the application identified by the specified slug.
# Update attachment field
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-attachment-field
/api-reference/openapi-v2_3.yaml put /attachment/{token}/update-field/{field_slug}
Update an attachment field for the attachment identified by the specified token.
# Update contributor field
Source: https://docs.goodgrants.com/api-reference/applications-realtime/update-contributor-field
/api-reference/openapi-v2_3.yaml put /contributor/{contributor_slug}/update-field/{field_slug}
Update a contributor field for the contributor identified by the specified slug.
# Action task created
Source: https://docs.goodgrants.com/api-reference/applications/action-task-created
/api-reference/openapi-v2_3.yaml webhook action-task-created
# Action task submitted
Source: https://docs.goodgrants.com/api-reference/applications/action-task-submitted
/api-reference/openapi-v2_3.yaml webhook action-task-submitted
# Application chapter changed
Source: https://docs.goodgrants.com/api-reference/applications/application-chapter-changed
/api-reference/openapi-v2_3.yaml webhook application-chapter-changed
# Application copied
Source: https://docs.goodgrants.com/api-reference/applications/application-copied
/api-reference/openapi-v2_3.yaml webhook application-copied
# Application created
Source: https://docs.goodgrants.com/api-reference/applications/application-created
/api-reference/openapi-v2_3.yaml webhook application-created
# Application deleted
Source: https://docs.goodgrants.com/api-reference/applications/application-deleted
/api-reference/openapi-v2_3.yaml webhook application-deleted
# Application marked eligible
Source: https://docs.goodgrants.com/api-reference/applications/application-marked-eligible
/api-reference/openapi-v2_3.yaml webhook application-eligible
# Application marked ineligible
Source: https://docs.goodgrants.com/api-reference/applications/application-marked-ineligible
/api-reference/openapi-v2_3.yaml webhook application-ineligible
# Application moderated
Source: https://docs.goodgrants.com/api-reference/applications/application-moderated
/api-reference/openapi-v2_3.yaml webhook application-moderated
# Application resubmitted
Source: https://docs.goodgrants.com/api-reference/applications/application-resubmitted
/api-reference/openapi-v2_3.yaml webhook application-resubmitted
# Application submitted
Source: https://docs.goodgrants.com/api-reference/applications/application-submitted
/api-reference/openapi-v2_3.yaml webhook application-submitted
# Application tagged
Source: https://docs.goodgrants.com/api-reference/applications/application-tagged
/api-reference/openapi-v2_3.yaml webhook application-tagged
# Application updated
Source: https://docs.goodgrants.com/api-reference/applications/application-updated
/api-reference/openapi-v2_3.yaml webhook application-updated
# Applications category changed
Source: https://docs.goodgrants.com/api-reference/applications/applications-category-changed
/api-reference/openapi-v2_3.yaml webhook applications-category-changed
# Collaborator invited
Source: https://docs.goodgrants.com/api-reference/applications/collaborator-invited
/api-reference/openapi-v2_3.yaml webhook collaborator-invited
# Create application
Source: https://docs.goodgrants.com/api-reference/applications/create-application
/api-reference/openapi-v2_3.yaml post /application
Create an application.
# Delete application
Source: https://docs.goodgrants.com/api-reference/applications/delete-application
/api-reference/openapi-v2_3.yaml delete /application/{application_slug}
Delete the application identified by the specified slug. The application is moved to the trash and can be restored; it is not permanently removed.
# Field value updated
Source: https://docs.goodgrants.com/api-reference/applications/field-value-updated
/api-reference/openapi-v2_3.yaml webhook field-value-updated
# Get application
Source: https://docs.goodgrants.com/api-reference/applications/get-application
/api-reference/openapi-v2_3.yaml get /application/{application_slug}
Get the application identified by the specified slug.
# List applications
Source: https://docs.goodgrants.com/api-reference/applications/list-applications
/api-reference/openapi-v2_3.yaml get /application
List applications.
# Tag application
Source: https://docs.goodgrants.com/api-reference/applications/tag-application
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/tag/{tags}
Add tags to the application identified by the specified slug.
# Untag application
Source: https://docs.goodgrants.com/api-reference/applications/untag-application
/api-reference/openapi-v2_3.yaml delete /application/{application_slug}/tag/{tags}
Remove tags from the application identified by the specified slug.
Removing a tag that is not currently applied to the application has no effect and still returns `201` with the current tags for the application. Inspect `tags` in the response to confirm the result.
# Update application
Source: https://docs.goodgrants.com/api-reference/applications/update-application
/api-reference/openapi-v2_3.yaml put /application/{application_slug}
Update the application identified by the specified slug.
Only the properties you include in the request body are updated; omitted properties keep their current values.
Within `entry_fields`, only the field slugs you include are updated, and any field slug that does not exist on the form for the application is ignored. For most field types the value you supply replaces the stored value. Table fields are merged cell by cell: include only the cells you want to change, and send a cell with an empty value to clear it.
# Upload application file
Source: https://docs.goodgrants.com/api-reference/applications/upload-application-file
/api-reference/openapi-v2_3.yaml post /application/{application_slug}/upload/{field_slug}
Upload a file to the specified field for the application identified by the specified slug.
Use this operation to upload a file to a file field on the application.
The uploaded file is validated and stored before the response is returned; the file itself is processed shortly after. A `GET` on the returned `Location` immediately after the `201` may briefly return a response with a `null` body until processing is complete.
# Assignment completed
Source: https://docs.goodgrants.com/api-reference/assignments/assignment-completed
/api-reference/openapi-v2_3.yaml webhook assignment-completed
# Assignment created
Source: https://docs.goodgrants.com/api-reference/assignments/assignment-created
/api-reference/openapi-v2_3.yaml webhook assignment-created
# Create assignment
Source: https://docs.goodgrants.com/api-reference/assignments/create-assignment
/api-reference/openapi-v2_3.yaml post /assignment
Create a new assignment.
# Delete assignment
Source: https://docs.goodgrants.com/api-reference/assignments/delete-assignment
/api-reference/openapi-v2_3.yaml delete /assignment/{assignment_slug}
Delete the assignment identified by the specified slug.
Only assignments with `method` of `manual` or `random` can be deleted. Other methods (`automatic`, `stray`, `recused`) return `422`.
# Get assignment
Source: https://docs.goodgrants.com/api-reference/assignments/get-assignment
/api-reference/openapi-v2_3.yaml get /assignment/{assignment_slug}
Get the assignment identified by the specified slug.
# List assignments
Source: https://docs.goodgrants.com/api-reference/assignments/list-assignments
/api-reference/openapi-v2_3.yaml get /assignment
List assignments that match the specified filters.
# Recuse assignment
Source: https://docs.goodgrants.com/api-reference/assignments/recuse-assignment
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/recuse
Recuse a reviewer from the assignment for the specified application.
# Unrecuse assignment
Source: https://docs.goodgrants.com/api-reference/assignments/unrecuse-assignment
/api-reference/openapi-v2_3.yaml put /application/{application_slug}/unrecuse
Remove a reviewer recusal from the assignment for the specified application.
# Create attachment
Source: https://docs.goodgrants.com/api-reference/attachments/create-attachment
/api-reference/openapi-v2_3.yaml post /application/{application_slug}/attachment/{tab_slug}
Create an attachment on the specified application under the specified tab.
The tab must be of type `Attachments`; tabs of other types are rejected.
Attachment fields are linked to the attachment and are distinct from form fields. If the attachment has no attachment fields, you can omit `attachment_fields` from the request body.
The uploaded file is validated and stored before the response is returned; the attachment itself is finalized shortly after. A `GET` on the returned `Location` immediately after the `201` may briefly return a response with a `null` body until finalization is complete.
# Delete attachment
Source: https://docs.goodgrants.com/api-reference/attachments/delete-attachment
/api-reference/openapi-v2_3.yaml delete /attachment/{token}
Delete the attachment identified by the specified token. Unknown tokens return `400 Bad Request`.
# Get attachment
Source: https://docs.goodgrants.com/api-reference/attachments/get-attachment
/api-reference/openapi-v2_3.yaml get /attachment/{token}
Get the attachment identified by the specified token. Unknown tokens return `400 Bad Request`.
# List attachments
Source: https://docs.goodgrants.com/api-reference/attachments/list-attachments
/api-reference/openapi-v2_3.yaml get /attachment
List attachments.
# Update attachment
Source: https://docs.goodgrants.com/api-reference/attachments/update-attachment
/api-reference/openapi-v2_3.yaml put /attachment/{token}
Update the attachment identified by the specified token.
Every property in the request body is optional; only properties that are supplied are written. Properties that are omitted retain their current value. On success the response carries the post-update attachment representation.
Attachment fields are linked to the attachment and are distinct from form fields. If the attachment has no attachment fields, you can omit `attachment_fields` from the request body.
# Create category
Source: https://docs.goodgrants.com/api-reference/categories/create-category
/api-reference/openapi-v2_3.yaml post /category
Create a category.
# Delete category
Source: https://docs.goodgrants.com/api-reference/categories/delete-category
/api-reference/openapi-v2_3.yaml delete /category/{category_slug}
Delete the category identified by the specified slug.
Any child categories are not deleted. They move up one level in the hierarchy to take the place of the deleted category.
# Get category
Source: https://docs.goodgrants.com/api-reference/categories/get-category
/api-reference/openapi-v2_3.yaml get /category/{category_slug}
Get the category identified by the specified slug.
The response includes all category fields.
Images include a download link.
# List categories
Source: https://docs.goodgrants.com/api-reference/categories/list-categories
/api-reference/openapi-v2_3.yaml get /category
List categories.
# Update category
Source: https://docs.goodgrants.com/api-reference/categories/update-category
/api-reference/openapi-v2_3.yaml put /category/{category_slug}
Update the category identified by the specified slug.
# Upload category file
Source: https://docs.goodgrants.com/api-reference/categories/upload-category-file
/api-reference/openapi-v2_3.yaml post /category/{category_slug}/upload
Upload a file for the category identified by the specified slug.
Use this operation to upload a category image.
The uploaded file is validated and stored before the response is returned; the image itself is processed shortly after. A `GET` on the returned `Location` immediately after the `201` may briefly return a response with a `null` body until processing is complete.
# Create chapter
Source: https://docs.goodgrants.com/api-reference/chapters/create-chapter
/api-reference/openapi-v2_3.yaml post /chapter
Create a chapter.
# Delete chapter
Source: https://docs.goodgrants.com/api-reference/chapters/delete-chapter
/api-reference/openapi-v2_3.yaml delete /chapter/{chapter_slug}
Delete the chapter identified by the specified slug.
# Get chapter
Source: https://docs.goodgrants.com/api-reference/chapters/get-chapter
/api-reference/openapi-v2_3.yaml get /chapter/{chapter_slug}
Get the chapter identified by the specified slug.
# List chapters
Source: https://docs.goodgrants.com/api-reference/chapters/list-chapters
/api-reference/openapi-v2_3.yaml get /chapter
List chapters.
# Update chapter
Source: https://docs.goodgrants.com/api-reference/chapters/update-chapter
/api-reference/openapi-v2_3.yaml put /chapter/{chapter_slug}
Update the chapter identified by the specified slug.
# Upload chapter file
Source: https://docs.goodgrants.com/api-reference/chapters/upload-chapter-file
/api-reference/openapi-v2_3.yaml post /chapter/{chapter_slug}/upload
Upload a file for the chapter identified by the specified slug.
Use this operation to upload a chapter image.
The uploaded file is validated and stored before the response is returned; the image itself is processed shortly after. A `GET` on the returned `Location` immediately after the `201` may briefly return a response with a `null` body until processing is complete.
# Create contributor
Source: https://docs.goodgrants.com/api-reference/contributors/create-contributor
/api-reference/openapi-v2_3.yaml post /contributor
Create a contributor.
# Delete contributor
Source: https://docs.goodgrants.com/api-reference/contributors/delete-contributor
/api-reference/openapi-v2_3.yaml delete /contributor/{contributor_slug}
Delete the contributor identified by the specified slug.
# Get contributor
Source: https://docs.goodgrants.com/api-reference/contributors/get-contributor
/api-reference/openapi-v2_3.yaml get /contributor/{contributor_slug}
Get the contributor identified by the specified slug.
# List contributors
Source: https://docs.goodgrants.com/api-reference/contributors/list-contributors
/api-reference/openapi-v2_3.yaml get /contributor
List contributors.
# Update contributor
Source: https://docs.goodgrants.com/api-reference/contributors/update-contributor
/api-reference/openapi-v2_3.yaml put /contributor/{contributor_slug}
Update the contributor identified by the specified slug.
# List documents
Source: https://docs.goodgrants.com/api-reference/documents/list-documents
/api-reference/openapi-v2_3.yaml get /document
List documents.
# Versioning
Source: https://docs.goodgrants.com/docs/additional/versioning
Good Grants uses semantic versioning with major and minor versions.
* **MAJOR** version: Incremented for incompatible changes.
* **MINOR** version: Incremented for minor breaking changes.
Use the following `Accept` header values for version 2.3:
```bash theme={null}
application/vnd.Creative Force.v2.3+json
application/vnd.Creative Force.v2.3+xml
```
To use an earlier API version, replace `2.3` with the required version number.
# Webhook payloads
Source: https://docs.goodgrants.com/docs/additional/webhook-payloads
Payload structure and signature validation for Good Grants webhooks.
Webhook payloads are provided in JSON format and always contain the following attributes:
Enumerated string with possible values being one of the events described in the [Available subscriptions](/docs/additional/webhook-subscriptions) page.
ISO 8601 formatted datetime value, for example `2020-01-01T00:00:00Z`.
Machine-readable event key that fired the webhook. Enumerated string with possible values matching the event codes described in the [Available subscriptions](/docs/additional/webhook-subscriptions) page.
Enumerated string with the following possible values:
* `ui` (default)
* `api`
### Signature
Use the `Signature` header to validate the webhook payload.
The signature value is generated with this algorithm, using the **Signing key** specified in the webhook and the JSON payload:
```php PHP theme={null}
$signature = hash_hmac('sha256', $payloadJsonString, $signingKey);
```
```js JavaScript theme={null}
const crypto = require('crypto');
const signature = crypto
.createHmac('sha256', signingKey)
.update(payloadJsonString)
.digest('hex');
```
```python Python theme={null}
import hmac
import hashlib
signature = hmac.new(
signingKey.encode(),
payloadJsonString.encode(),
hashlib.sha256
).hexdigest()
```
```csharp C# theme={null}
using System.Security.Cryptography;
using System.Text;
var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(signingKey));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(payloadJsonString));
var signature = BitConverter.ToString(hash).Replace("-", "").ToLower();
```
```java Java theme={null}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec keySpec = new SecretKeySpec(
signingKey.getBytes("UTF-8"), "HmacSHA256");
mac.init(keySpec);
byte[] hash = mac.doFinal(payloadJsonString.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String signature = sb.toString();
```
Generate the same value in your endpoint and compare it with the `Signature` header value.
# Available subscriptions
Source: https://docs.goodgrants.com/docs/additional/webhook-subscriptions
Events you can subscribe to with Good Grants webhooks.
Subscribe to any of the following events when creating or editing a webhook:
## Allocation events
| Event | Description |
| ----------------------------------- | -------------------------------------------------- |
| `allocation_created` | Fired when a new allocation is created. |
| `allocation_payment_created` | Fired when an allocation payment is created. |
| `allocation_payment_deleted` | Fired when an allocation payment is deleted. |
| `allocation_payment_status_changed` | Fired when an allocation payment's status changes. |
| `allocation_payment_updated` | Fired when an allocation payment is updated. |
## Application events
| Event | Description |
| ------------------------------- | ------------------------------------------------------------- |
| `action_task_created` | Fired when an action task is created for a reviewer. |
| `action_task_submitted` | Fired when an action task is submitted by a reviewer. |
| `application_chapter_changed` | Fired when an application's chapter is changed. |
| `application_copied` | Fired when an application is copied. |
| `application_created` | Fired when a new application is created. |
| `application_deleted` | Fired when an application is deleted. |
| `application_eligible` | Fired when an application is marked as eligible. |
| `application_ineligible` | Fired when an application is marked as ineligible. |
| `application_moderated` | Fired when an application is moderated. |
| `application_resubmitted` | Fired when an application is resubmitted by the applicant. |
| `application_submitted` | Fired when an application is submitted by the applicant. |
| `application_tagged` | Fired when a tag is applied to an application. |
| `application_updated` | Fired when an existing application is updated. |
| `applications_category_changed` | Fired when an application's category is changed. |
| `collaborator_invited` | Fired when a collaborator is invited to an application. |
| `field_value_updated` | Fired when a custom field value is updated on an application. |
## Assignment events
| Event | Description |
| ---------------------- | ------------------------------------------------------ |
| `assignment_completed` | Fired when an assignment is completed by a reviewer. |
| `assignment_created` | Fired when a new assignment is created for a reviewer. |
## Document events
| Event | Description |
| ------------------ | ----------------------------------------------------- |
| `document_created` | Fired when a new document is added to an application. |
| `document_deleted` | Fired when a document is removed from an application. |
| `document_updated` | Fired when an existing document is updated. |
## Grant report events
| Event | Description |
| ------------------------ | --------------------------------------- |
| `grant_report_created` | Fired when a grant report is created. |
| `grant_report_submitted` | Fired when a grant report is submitted. |
## Grant status events
| Event | Description |
| ---------------------- | --------------------------------------- |
| `grant_status_changed` | Fired when a grant's status is changed. |
## Order payment events
| Event | Description |
| ----------------------- | ------------------------------------------------------ |
| `order_payment_pending` | Fired when an order payment is marked as pending. |
| `order_payment_success` | Fired when an order payment is completed successfully. |
## User events
| Event | Description |
| ----------------------- | ------------------------------------------------- |
| `membership_registered` | Fired when a new user registers or is created. |
| `role_granted` | Fired when a role is granted to a user. |
| `user_updated` | Fired when an existing user's profile is updated. |
# Webhooks management
Source: https://docs.goodgrants.com/docs/additional/webhooks-management
Create, edit, and delete Good Grants webhooks.
## Create a webhook
Navigate to *Settings > Integrations > Webhooks*, then click on **New webhook**:
Use a clear name so you can identify which integration a webhook belongs to later, especially when managing several webhooks.
Use this key to validate the webhook payload [signature](/docs/additional/webhook-payloads#signature).
Choose which events trigger this webhook. See [Available subscriptions](/docs/additional/webhook-subscriptions) for the full list.
## Edit an existing webhook
To edit an existing webhook, go to *Settings > Integrations > Webhooks*, then click the name of the webhook, or open the overflow action menu and click **Edit**.
## Delete an existing webhook
**Deleting a webhook is permanent. The integration stops receiving events immediately, and you cannot undo this action.**
To delete an existing webhook, go to *Settings > Integrations > Webhooks*, pen the overflow action menu for the webhook, click **Delete**, then confirm by clicking **OK**.
# API keys management
Source: https://docs.goodgrants.com/docs/authentication/api-keys-management
Generate, edit, and revoke Good Grants API keys.
## API key scopes
API scopes allow you to restrict access for third parties using an API key. Use a scope to protect your and your applicants' data by limiting what third parties can access.
You can apply one of the following scopes to any API key:
* **Read only** - Use for `GET` operations, restricted to viewing data associated with the endpoint.
* **Read / Write** - Use for `GET`, `POST`, `PUT`, `PATCH`, and `DELETE` operations, covering create, update, and delete actions on data associated with the endpoint (set by default).
## Manage API keys
### Generate a new API key
Navigate to *Settings > Integrations > API Keys*, then click on **Generate API Key**:
Use a clear name or purpose so you can identify which integration a key belongs to later, especially when managing several keys.
Select **Read only** for `GET` operations only, or **Read / Write** for full access (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`).
### Update an existing API key
To update an existing API key, go to *Settings > Integrations > API Keys*, then click on the name of API keyname, or open the overflow action menu and click **Edit**.
### Revoke an existing API key
**Revoking an API key is permanent. Any integration using the key immediately loses access, and you cannot undo this action.**
To revoke an existing API key, go to *Settings > Integrations > API Keys*, open the overflow action menu for the key, click **Revoke**, then confirm by clicking **OK**.
# Authentication
Source: https://docs.goodgrants.com/docs/authentication/index
Authenticate Good Grants API requests using a private API key.
If you do not use an API key for your requests, or if you use
a key from the wrong account, your call will return a `403 Forbidden` error.
Authentication is performed by setting the following request header:
Valid API key used for authentication and authorisation.
Example:
```bash Request theme={null}
curl -H "x-api-key: {api_key}" \
-H "Accept: application/vnd.Creative Force.v2.3+json" \
https://api.us.cr4ce.com/account
```
# AI-optimised documentation
Source: https://docs.goodgrants.com/docs/docs-for-ai/ai-optimized-documentation
Access AI-optimised content and quick integrations from the context menu on any Good Grants docs page.
## Overview
Every Good Grants documentation page includes a menu for quick access to AI-optimised content and AI tool integrations, so you get assistance without leaving the page.
## Context menu access
Open the dropdown beside the page header on any Good Grants documentation page to reveal the AI integration options.
## Available options
### Page content options
#### Copy page
Copies the page content as plain Markdown, useful for sharing text or basic copy-paste.
#### View as Markdown
Displays the page as raw Markdown text. Use this when pasting content into an AI tool for analysis or questions.
### MCP server integration
#### Copy MCP server URL
Copies the MCP server URL for manual configuration, suited to custom setups or AI tools that support MCP.
One-click connectors for MCP-compatible IDEs are also available from the same dropdown.
### Additional context
**Full documentation context**
`llms-full.txt` bundles the complete Good Grants documentation into a single AI-friendly file, available at [`https://docs.goodgrants.com/llms-full.txt`](https://docs.goodgrants.com/llms-full.txt). Use it when an AI tool needs full context across the Good Grants API rather than a single page.
For step-by-step MCP server setup and troubleshooting, see [Docs MCP](/docs/additional/docs-mcp).
## How to use
### For direct AI tool access
1. Open any Good Grants documentation page
2. Click the header dropdown
3. Pick the option matching your preferred AI tool
### For manual AI tool usage
1. Open any Good Grants documentation page
2. Click the header dropdown
3. Choose **Copy page**
4. Paste the content into your AI tool of choice and start asking questions
### For comprehensive context
* Go to `https://docs.goodgrants.com/llms-full.txt`.
* Copy the link or the file contents for full documentation context.
* Use this when a question touches several parts of the Good Grants docs.
### For MCP server setup
1. Open any Good Grants documentation page
2. Click the header dropdown
3. Choose **Copy MCP server URL**, or use the one-click **Connect to Cursor** or **Connect to VS Code** buttons
4. See [Docs MCP](/docs/additional/docs-mcp) for the full setup walkthrough
## Best practices
### Provide context
* Mention the specific API endpoints involved in your question.
* Describe your use case, such as applications, webhooks, or authentication.
* Name the Good Grants resources you are working with.
* For questions spanning multiple topics, pull in `llms-full.txt` for broader context.
### Combine with the MCP server
* Reach for the context menu for quick, one-off AI questions.
* Set up [Docs MCP](/docs/additional/docs-mcp) for full AI tool integration during ongoing development.
* The two work well together. Combine them for the best results.
## Disclaimer
AI agents are not infallible. They can misread instructions, make mistakes, or return inaccurate output. Good Grants makes no guarantee about the accuracy of anything an AI agent retrieves or does through this MCP server. Reviewing and verifying any API requests or code generated through agentic workflows is your responsibility.
# Docs MCP
Source: https://docs.goodgrants.com/docs/docs-for-ai/docs-mcp
Connect AI tools to the Good Grants API documentation using the Model Context Protocol.
## Overview
The Good Grants docs MCP server gives any [MCP](https://modelcontextprotocol.io)-compatible AI tool a direct connection to the Good Grants API documentation. Instead of guessing how the API works, the AI searches the docs and grounds its answers in current content.
**Without the docs MCP:**
```
You: "List all applications in a season"
AI: *generates code that might use the wrong endpoint*
```
**With the docs MCP:**
```
You: "List all applications in a season"
AI: *searches Good Grants docs automatically*
AI: *generates code using the correct endpoint*
```
## How it helps you
When you connect the docs MCP to your AI tools, the AI becomes a Good Grants expert and:
* Generates accurate code using current API endpoints, parameters, and request bodies.
* Answers specific questions about the API, authentication, and webhooks.
* Suggests best practices for working with applications, categories, assignments, and more.
* Finds the right documentation when you are stuck on implementation.
The docs MCP server provides documentation `search` only. It does not make API calls. To use the Good Grants API itself, include your API key in requests as described in the [authentication guide](/docs/authentication/index).
## Server URL
```
https://docs.goodgrants.com/mcp
```
Add this URL to any MCP-compatible client. Most clients accept either a URL-based remote MCP server or a manual entry in their MCP configuration file.
## Configuration
### URL-based connection
If your client supports remote MCP servers, paste the server URL into its connector settings.
### File-based configuration
If your client uses an `mcp.json` (or equivalent) configuration file, add an entry like:
```json theme={null} theme={null}
{
"mcpServers": {
"Good Grants": {
"url": "https://docs.goodgrants.com/mcp"
}
}
}
```
### One-click connectors
Many Good Grants documentation pages include one-click MCP connectors in the dropdown next to the document header. See [AI-Optimised Documentation](/docs/additional/ai-optimized-documentation) for details.
## Test your MCP connection
Once configured, verify the connection by asking your AI tool:
```
What MCP tools do you have available?
```
You should see the Good Grants documentation search tool listed. Then try:
```
Search the Good Grants docs for information about applications
```
The AI searches and returns relevant Good Grants documentation.
## Troubleshooting
### Connection issues
MCP server not connecting:
* Verify the URL is exactly `https://docs.goodgrants.com/mcp`.
* Check your internet connection.
* Restart your AI tool after configuration.
Search tool not available:
* Confirm the MCP server was added correctly.
* Try removing and re-adding the server configuration.
* Check the MCP support documentation for your AI tool.
### Search issues
Search returns no results:
* Try different search terms.
* Use more general terms, for example `application` instead of `application field API`.
* Verify the MCP connection is working.
## Additional resources
* [Model Context Protocol documentation](https://modelcontextprotocol.io/docs/tutorials/use-remote-mcp-server#connecting-to-a-remote-mcp-server)
* [Mintlify MCP documentation](https://mintlify.com/docs/ai/model-context-protocol)
* [AI-Optimised Documentation](/docs/additional/ai-optimized-documentation)
## Disclaimer
AI agents make errors, misinterpret instructions, or produce inaccurate output. Good Grants does not guarantee the accuracy of any information retrieved or action taken by an AI agent using this MCP server. You are solely responsible for reviewing and verifying any API requests or code generated through agentic workflows.
# Good Grants API
Source: https://docs.goodgrants.com/docs/getting-started/index
Integrate Good Grants with your websites, applications, and internal systems using the API.
## Introduction
**API version:** 2.3
Use the API to exchange data between Good Grants and external platforms.
The API is available on **Premium** and **Enterprise** subscriptions.
For information on upgrading, see [**Using the billing portal**](https://help.goodgrants.com/hc/en-gb/articles/4409665904655-Using-the-billing-portal#h_01HBC9JWHSK3KEVQFM2FSHR0GR).
## Available resources
Use the API to list, retrieve, create, update, delete, and upload data across the following resource groups:
* Account
* Category
* Chapter
* Round
* Season
* User
* Action task
* Application
* Application (realtime)
* Attachment
* Contributor
* File
* Form
* Assignment
* Leaderboard
* Score set
* Document
* Field
* Webhook
* Allocation
* Allocation payment
* Fund
* Grant status
* Order
* Tax
## Get support
For API questions or beta program access, email [support@goodgrants.com](mailto:support@goodgrants.com).
# Fields
Source: https://docs.goodgrants.com/docs/requests/fields
Field types and data types for the Good Grants API.
Fields form an integral part of your application form. They collect information about applications, users, attachments, contributors, and referees.
Good Grants provides a wide range of field types you can use to collect exactly the information you need from applicants. Many field types include additional configuration options, such as file size limits or minimum and maximum word counts.
For a full list of field types and their configuration options, see the [**Field types overview**](https://help.goodgrants.com/hc/en-gb/articles/360001955095-Field-types) Help Centre article.
### Field data types
| Field | Type | Notes |
| :--------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Checkbox | Boolean | |
| Checkbox list | Array | Options must exactly match the field value, not the label, including letter case.
Example: `["Item 1", "Item 2"]` |
| Content | String | |
| Country | String | Accepts the two-letter country code from the [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) list.
Example: `AU` for Australia |
| Currency | Float | Accepts a numeric currency amount value. |
| Date | Date | Accepts a date in [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.
Example: `2025-12-08T08:58:50Z` or `2025-10-08` |
| Date and time | Date | Same as Date field. |
| Drop-down list | String | Options must exactly match the field value (not label) including letter case. |
| Email | String | Must follow standard email format, for example [name@domain.com](mailto:name@domain.com). |
| File upload (single) | JSON string | A JSON string containing two properties: `filename` and `data`.
See the [**Upload application file**](/api-reference/applications/upload-application-file) or [**Upload user file**](/api-reference/users/upload-user-file) endpoints |
| Numeric | Float | Accepts any numeric input. |
| Phone number | String | Must be a valid phone number in international format, including a leading `+`. |
| Radio buttons | String | Options must exactly match the field value (not label) including letter case. |
| Table | JSON string | Example:
`{`
`"slug": {`
`"B1": "valueB1",`
`"C1": "valueC1",`
`"B2": "valueB2",`
`"C2": "valueC2"`
`}`
`}` |
| Text (single line) | String | |
| Text area (multi-line) | String | |
| Time | String | Must follow the following format: `00:00` |
| URL | String | Must begin with `https://`. |
# Files
Source: https://docs.goodgrants.com/docs/requests/files
File upload requirements for the Good Grants API.
## Base64 encoding
File upload endpoints accept base64-encoded strings that represent the file to upload. Most programming languages can convert files to base64 strings. If your API client does not support this directly, use a separate conversion tool before sending the request.
```bash cURL expandable theme={null}
# Encode a file to Base64 and send in a JSON payload
BASE64_FILE=$(base64 -w 0 document.pdf)
curl -X POST "https://api.us.cr4ce.com/application/{application_slug}/upload/{field_slug}" \
-H "Accept: application/vnd.Creative Force.v2.3+json" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"file\": \"$BASE64_FILE\", \"filename\": \"document.pdf\"}"
# The -w 0 flag prevents line wrapping in the Base64 output
```
```php PHP expandable theme={null}
$fileContent = file_get_contents('/path/to/your/file.pdf');
$base64 = base64_encode($fileContent);
$payload = json_encode([
'file' => $base64,
'filename' => 'document.pdf'
]);
$ch = curl_init('https://api.us.cr4ce.com/application/{application_slug}/upload/{field_slug}');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Accept: application/vnd.Creative Force.v2.3+json',
'x-api-key: YOUR_API_KEY',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
```
```js JavaScript expandable theme={null}
const fs = require('fs');
const https = require('https');
const fileBuffer = fs.readFileSync('/path/to/your/file.pdf');
const base64 = fileBuffer.toString('base64');
const payload = JSON.stringify({
file: base64,
filename: 'document.pdf'
});
const options = {
hostname: 'api.us.cr4ce.com',
path: '/application/{application_slug}/upload/{field_slug}',
method: 'POST',
headers: {
'Accept': 'application/vnd.Creative Force.v2.3+json',
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(payload)
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => console.log(data));
});
req.write(payload);
req.end();
```
```python Python expandable theme={null}
import base64
import json
import requests
with open('/path/to/your/file.pdf', 'rb') as f:
base64_content = base64.b64encode(f.read()).decode('utf-8')
response = requests.post(
'https://api.us.cr4ce.com/application/{application_slug}/upload/{field_slug}',
headers={
'Accept': 'application/vnd.Creative Force.v2.3+json',
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'file': base64_content,
'filename': 'document.pdf'
}
)
```
```csharp C# expandable theme={null}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
var fileBytes = File.ReadAllBytes("/path/to/your/file.pdf");
var base64 = Convert.ToBase64String(fileBytes);
var payload = new
{
file = base64,
filename = "document.pdf"
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Accept", "application/vnd.Creative Force.v2.3+json");
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY");
var json = JsonSerializer.Serialize(payload);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync("https://api.us.cr4ce.com/application/{application_slug}/upload/{field_slug}", content);
```
```java Java expandable theme={null}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
var fileBytes = Files.readAllBytes(Paths.get("/path/to/your/file.pdf"));
var base64 = Base64.getEncoder().encodeToString(fileBytes);
var json = String.format(
"{\"file\":\"%s\",\"filename\":\"document.pdf\"}", base64
);
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.us.cr4ce.com/application/{application_slug}/upload/{field_slug}"))
.header("Accept", "application/vnd.Creative Force.v2.3+json")
.header("x-api-key", "YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
```
# Headers
Source: https://docs.goodgrants.com/docs/requests/request-headers
Required and optional headers for the Good Grants API.
Defines the API version to use and response format.
**Allowed values:**
* `application/vnd.Creative Force.v2.3+json`
* `application/vnd.Creative Force.v2.3+xml`
Valid API key used for authentication and authorisation. Refer to [Authentication](/docs/authentication).
Defines the languages included in the response. If non are provided, the account default language is returned.
You can request multiple languages using a comma-separated string of languages.
**Allowed values:**
* `all` (overrides any other values present)
* `ar_AR`, `bg_BG`, `bn_IN`, `ca_ES`, `cs_CZ`, `cy_GB`, `da_DK`, `de_DE`, `en_GB`, `en_US`, `el_GR`, `es_NN`, `es_LA`, `fa_NN`, `fi_FI`, `fr_FR`, `fr_CA`, `he_IL`, `hi_IN`, `it_IT`, `ja_JP`, `ko_KR`, `lt_LT`, `ms_MY`, `nl_NL`, `nb_NO`, `pl_PL`, `pt_BR`, `ru_RU`, `sl_SI`, `sv_SE`, `sw_NN`, `th_TH`, `uk_UA`, `vi_VN`, `zh_CN`, `zh_HK`
The selected language must be supported by your account or a `400 Bad Request` error
is returned.
# Servers
Source: https://docs.goodgrants.com/docs/requests/servers
Regional endpoints for the Good Grants API.
## Regional endpoints
Accounts are bound to a specific region, with regional endpoints providing optimal performance. You must use the endpoint that matches your account's region — requests sent to the wrong region are rejected.
| Region | Endpoint |
| ----------- | ------------------ |
| Australasia | `api.au.cr4ce.com` |
| Canada | `api.ca.cr4ce.com` |
| EU | `api.eu.cr4ce.com` |
| Hong Kong | `api.hk.cr4ce.com` |
| US | `api.us.cr4ce.com` |
If you send a request to the wrong region, the API returns a `500` error with the correct URL:
```json theme={null}
{
"message": "The account related to this API key resides in a different region. Please try the following url instead: https://api.eu.cr4ce.com",
"status_code": 500
}
```
# Pagination
Source: https://docs.goodgrants.com/docs/responses/pagination
Navigate paginated Good Grants API responses using page query parameters and helper links.
Our APIs support offset-based pagination with the query parameter `?page=1`. Use `?per_page=` to control the number of records returned per page (between `1` and `100`, default `10`).
```bash Request theme={null}
# Get the first page with 5 results per page
curl "https://api.us.cr4ce.com/user?page=1&per_page=5"
# Get the next page
curl "https://api.us.cr4ce.com/user?page=2&per_page=5"
```
Paginated resource responses contain a specific set of pagination helper links in the
top-level object.
Use these links to navigate to different pages of data.
```json Response theme={null}
{
"current_page": 1,
"data": [],
"first_page_url": "https://api.us.cr4ce.com/user?page=1&per_page=5",
"from": 1,
"last_page": 10,
"last_page_url": "https://api.us.cr4ce.com/user?page=10&per_page=5",
"next_page_url": "https://api.us.cr4ce.com/user?page=2&per_page=5",
"path": "https://api.us.cr4ce.com/user",
"per_page": 5,
"prev_page_url": "",
"to": 10,
"total": 200
}
```
## Paginated results
Paginated responses usually include the following fields:
Number of the page returned by this response. The first page is `1`.
Array containing resource information.
URL of the first page in the result set. Relative when the requested page is beyond the last page.
Position of the first record on this page within the full result set. The first record is at position `1`. `null` when the requested page is beyond the last page.
Number of the last page. Equals the total number of pages.
URL of the last page in the result set. Relative when the requested page is beyond the last page.
URL of the next page in the result set. Empty string when the current page is the last page.
Canonical URL of the endpoint, without query parameters.
Maximum number of records returned per page.
URL of the previous page in the result set. Empty string when the current page is the first page.
Position of the last record on this page within the full result set. `null` when the requested page is beyond the last page.
Total number of records across all pages.
# Rate limits
Source: https://docs.goodgrants.com/docs/responses/rate-limits
Understand rate limits and ingestion constraints for the Good Grants API.
Good Grants applies rate limits to maintain platform stability and reduce service disruptions.
Rate limiting is set at **60 requests per API key per minute**. Requests above this limit return a `429 TOO MANY REQUESTS` response.
All API responses include the following headers so you can monitor and manage your request rate:
Maximum number of requests allowed per minute.
**Example:** `60`
Number of requests remaining in the current rate limit window.
**Example:** `58`
Unix timestamp when the rate limit window resets.
**Example:** `1783470988`
When you receive a `429` error, the rate limit headers are replaced with a `Retry-After` header indicating the number of seconds to wait before retrying.
### File upload size limits
File uploads are limited to a maximum size of **256 MB**. Requests exceeding this limit return a `413 PAYLOAD TOO LARGE` response.
## Retry recommendations
Implement retry logic for `429` and `503` errors using an exponential backoff strategy with randomised jitter to avoid overwhelming the server.
Only retry after the time indicated by the `Retry-After` header (in seconds) has elapsed. Immediate retries will always receive a `429` error.
**Example retry strategy:**
1. Receive a `429` or `503` error.
2. Read the `Retry-After` header value (seconds).
3. Wait for the specified duration plus a random jitter (0-5 seconds).
4. Retry the request.
5. If the request fails again, double the wait time and repeat.
# Formats
Source: https://docs.goodgrants.com/docs/responses/response-formats
Understand Good Grants API response formats.
## Response formats
Responses are provided in `JSON` or `XML` format.
Set the `Accept` header to choose the response format.
Accepted formats:
* `application/vnd.Creative Force.v2.3+json`
* `application/vnd.Creative Force.v2.3+xml`
# Headers
Source: https://docs.goodgrants.com/docs/responses/response-headers
Understand Good Grants API response headers.
## Response headers
Entity tag for the selected representation. Used for caching and conditional requests.
URI of the newly created resource. Returned in `201 CREATED` responses.
Number of seconds the client should wait before retrying. Returned in `429 TOO MANY REQUESTS` responses.
**Example:** `60`
Maximum number of requests allowed per minute.
**Example:** `60`
Number of requests remaining in the current rate limit window.
**Example:** `58`
Unix timestamp when the rate limit window resets.
**Example:** `1783470988`
# Status codes and errors
Source: https://docs.goodgrants.com/docs/responses/status-codes
Understand HTTP status codes, error responses, and retry recommendations for the Good Grants API.
## Response status codes
The API uses conventional HTTP status codes to indicate success or failure:
### Success codes
| Status code | Name | Description |
| :----------------- | :--------- | :------------------------------------------------------------------------------------------ |
| 200 | OK | The request has succeeded. |
| 201 | CREATED | The request has succeeded and a new resource has been created as a result. |
| 204 | NO CONTENT | The request has succeeded but there is no content to send in the response for this request. |
### Error codes
| Status code | Name | Description |
| :----------------- | :-------------------- | :---------------------------------------------------------------------------------------------------------------- |
| 400 | BAD REQUEST | The server could not understand the request due to invalid syntax. |
| 401 | UNAUTHORIZED | The request has not been applied because it lacks valid authentication credentials for the target resource. |
| 403 | FORBIDDEN | The server understood the request but refuses to authorize it. Check your API key scope. |
| 404 | NOT FOUND | The requested resource doesn't exist. |
| 409 | CONFLICT | The request conflicts with the current state of the server. |
| 413 | PAYLOAD TOO LARGE | The request entity is larger than the limits defined by the server (256 MB max for file uploads). |
| 422 | UNPROCESSABLE ENTITY | The request was well-formed but was unable to be followed due to semantic errors. |
| 429 | TOO MANY REQUESTS | You have sent too many requests in a given amount of time. See the `Retry-After` header. |
| 500 | INTERNAL SERVER ERROR | Something went wrong on the server. |
| 503 | SERVICE UNAVAILABLE | The service is temporarily unavailable. Check [status.goodgrants.com](https://status.goodgrants.com) for updates. |
## Error responses
When a request fails, the response includes an error object with details:
Human-readable error message.
Object containing specific error details, including field-level validation errors.
HTTP status code.
### Example error response
```json Response theme={null}
{
"message": "Invalid filter names and / or values.",
"errors": {
"invalid_filter_values": {
"per_page": "Value must be a number. You provided [abc].",
"category": "Value is not a valid slug. Must contain only letters and be exactly 8 characters long."
}
},
"status_code": 400
}
```
# Create document
Source: https://docs.goodgrants.com/api-reference/documents/create-document
/api-reference/openapi-v2_3.yaml post /document
Create a document.
Documents are generated asynchronously. A successful request returns `202 Accepted` with an empty body and does not include a `Location` header.
The generated document does not exist yet when the response is returned. Poll `GET /document` to retrieve it once generation completes.
# Delete document
Source: https://docs.goodgrants.com/api-reference/documents/delete-document
/api-reference/openapi-v2_3.yaml delete /document/{document_slug}
Delete the document identified by the specified slug.
# Document created
Source: https://docs.goodgrants.com/api-reference/documents/document-created
/api-reference/openapi-v2_3.yaml webhook document-created
# Document deleted
Source: https://docs.goodgrants.com/api-reference/documents/document-deleted
/api-reference/openapi-v2_3.yaml webhook document-deleted
# Document updated
Source: https://docs.goodgrants.com/api-reference/documents/document-updated
/api-reference/openapi-v2_3.yaml webhook document-updated
# Get document
Source: https://docs.goodgrants.com/api-reference/documents/get-document
/api-reference/openapi-v2_3.yaml get /document/{document_slug}
Get the document identified by the specified slug.
# Create field
Source: https://docs.goodgrants.com/api-reference/fields/create-field
/api-reference/openapi-v2_3.yaml post /field
Create a field.
You cannot create `formula` or `ai` field types through the API.
# List fields
Source: https://docs.goodgrants.com/api-reference/fields/list-fields
/api-reference/openapi-v2_3.yaml get /field
List fields.
# Get file information
Source: https://docs.goodgrants.com/api-reference/files/get-file-information
/api-reference/openapi-v2_3.yaml get /file/{token}
Get file information for the file identified by the specified token. Unknown tokens return `400 Bad Request`.
# Get form
Source: https://docs.goodgrants.com/api-reference/forms/get-form
/api-reference/openapi-v2_3.yaml get /form/{form_slug}
Get the form identified by the specified slug.
# List forms
Source: https://docs.goodgrants.com/api-reference/forms/list-forms
/api-reference/openapi-v2_3.yaml get /form
List forms.
# Create fund
Source: https://docs.goodgrants.com/api-reference/funds/create-fund
/api-reference/openapi-v2_3.yaml post /fund
Create a fund.
# Delete fund
Source: https://docs.goodgrants.com/api-reference/funds/delete-fund
/api-reference/openapi-v2_3.yaml delete /fund/{fund_slug}
Delete the fund identified by the specified slug.
# Get fund
Source: https://docs.goodgrants.com/api-reference/funds/get-fund
/api-reference/openapi-v2_3.yaml get /fund/{fund_slug}
Get the fund identified by the specified slug.
# List funds
Source: https://docs.goodgrants.com/api-reference/funds/list-funds
/api-reference/openapi-v2_3.yaml get /fund
List funds.
# Update fund
Source: https://docs.goodgrants.com/api-reference/funds/update-fund
/api-reference/openapi-v2_3.yaml put /fund/{fund_slug}
Update the fund identified by the specified slug.
# Grant report created
Source: https://docs.goodgrants.com/api-reference/grant-reports/grant-report-created
/api-reference/openapi-v2_3.yaml webhook grant-report-created
# Grant report submitted
Source: https://docs.goodgrants.com/api-reference/grant-reports/grant-report-submitted
/api-reference/openapi-v2_3.yaml webhook grant-report-submitted
# Get grant status
Source: https://docs.goodgrants.com/api-reference/grant-statuses/get-grant-status
/api-reference/openapi-v2_3.yaml get /grant-status/{grant_status_slug}
Get the grant status identified by the specified slug.
# Grant status changed
Source: https://docs.goodgrants.com/api-reference/grant-statuses/grant-status-changed
/api-reference/openapi-v2_3.yaml webhook grant-status-changed
# List grant statuses
Source: https://docs.goodgrants.com/api-reference/grant-statuses/list-grant-statuses
/api-reference/openapi-v2_3.yaml get /grant-status
List grant statuses.
# List leaderboard results
Source: https://docs.goodgrants.com/api-reference/leaderboard/list-leaderboard-results
/api-reference/openapi-v2_3.yaml get /leaderboard
List leaderboard results. A missing or unresolvable `score_set` parameter returns `404 Not Found`.
# Get round
Source: https://docs.goodgrants.com/api-reference/rounds/get-round
/api-reference/openapi-v2_3.yaml get /round/{round_slug}
Get the round identified by the specified slug.
# List rounds
Source: https://docs.goodgrants.com/api-reference/rounds/list-rounds
/api-reference/openapi-v2_3.yaml get /round
List rounds.
# Get score set
Source: https://docs.goodgrants.com/api-reference/score-sets/get-score-set
/api-reference/openapi-v2_3.yaml get /score-set/{score_set_slug}
Get the score set identified by the specified slug.
# List score sets
Source: https://docs.goodgrants.com/api-reference/score-sets/list-score-sets
/api-reference/openapi-v2_3.yaml get /score-set
List score sets.
# Get season
Source: https://docs.goodgrants.com/api-reference/seasons/get-season
/api-reference/openapi-v2_3.yaml get /season/{season_slug}
Get the season identified by the specified slug.
# List seasons
Source: https://docs.goodgrants.com/api-reference/seasons/list-seasons
/api-reference/openapi-v2_3.yaml get /season
List seasons.
# List taxes
Source: https://docs.goodgrants.com/api-reference/taxes/list-taxes
/api-reference/openapi-v2_3.yaml get /tax
List taxes.
# Create user
Source: https://docs.goodgrants.com/api-reference/users/create-user
/api-reference/openapi-v2_3.yaml post /user
Create a user.
# Delete user
Source: https://docs.goodgrants.com/api-reference/users/delete-user
/api-reference/openapi-v2_3.yaml delete /user/{user_slug}
Delete the user identified by the specified slug.
# Get user
Source: https://docs.goodgrants.com/api-reference/users/get-user
/api-reference/openapi-v2_3.yaml get /user/{user_slug}
Get the user identified by the specified slug or email address.
The response includes all user fields. File fields include a download link.
# Get user auth token
Source: https://docs.goodgrants.com/api-reference/users/get-user-auth-token
/api-reference/openapi-v2_3.yaml get /user/{user_slug}/auth-token
Get an SSO auth token for the specified user.
Use the token to log the user into the app using SSO.
Learn how to integrate Good Grants with your own SSO provider.
# List users
Source: https://docs.goodgrants.com/api-reference/users/list-users
/api-reference/openapi-v2_3.yaml get /user
List users.
# Restore user
Source: https://docs.goodgrants.com/api-reference/users/restore-user
/api-reference/openapi-v2_3.yaml post /user/{user_slug}/restore
Restore the previously deleted user identified by the specified slug.
# Role granted
Source: https://docs.goodgrants.com/api-reference/users/role-granted
/api-reference/openapi-v2_3.yaml webhook role-granted
# Update user
Source: https://docs.goodgrants.com/api-reference/users/update-user
/api-reference/openapi-v2_3.yaml put /user/{user_slug}
Update the user identified by the specified slug.
# Upload user file
Source: https://docs.goodgrants.com/api-reference/users/upload-user-file
/api-reference/openapi-v2_3.yaml post /user/{user_slug}/upload/{field_slug}
Upload a file to the specified field for the user identified by the specified slug.
Use this operation to upload a file to a file field on the user.
The uploaded file is validated and stored before the response is returned; the file itself is processed shortly after. A `GET` on the returned `Location` immediately after the `201` may briefly return a response with a `null` body until processing is complete.
# User created
Source: https://docs.goodgrants.com/api-reference/users/user-created
/api-reference/openapi-v2_3.yaml webhook membership-registered
# User updated
Source: https://docs.goodgrants.com/api-reference/users/user-updated
/api-reference/openapi-v2_3.yaml webhook user-updated
# Create webhook
Source: https://docs.goodgrants.com/api-reference/webhooks/create-webhook
/api-reference/openapi-v2_3.yaml post /webhook
Create a webhook.
Each webhook subscribes to one or more events. When a subscribed event occurs, the webhook URL receives a payload describing the event.
**Supported subscription events:**
* allocation\_created
* allocation\_payment\_created
* allocation\_payment\_deleted
* allocation\_payment\_status\_changed
* allocation\_payment\_updated
* application\_category\_changed
* application\_chapter\_changed
* application\_copied
* application\_created
* application\_deleted
* application\_eligible
* application\_ineligible
* application\_moderated
* application\_resubmitted
* application\_submitted
* application\_tagged
* application\_updated
* assignment\_completed
* assignment\_created
* collaborator\_invited
* document\_created
* document\_deleted
* document\_updated
* field\_value\_updated
* grant\_report\_created
* grant\_report\_submitted
* grant\_status\_changed
* membership\_registered (user created)
* order\_payment\_pending
* order\_payment\_success
* review\_task\_created
* review\_task\_submitted
* role\_granted
* user\_updated
# Delete webhook
Source: https://docs.goodgrants.com/api-reference/webhooks/delete-webhook
/api-reference/openapi-v2_3.yaml delete /webhook/{webhook_slug}
Delete the webhook identified by the specified slug.
# Get webhook
Source: https://docs.goodgrants.com/api-reference/webhooks/get-webhook
/api-reference/openapi-v2_3.yaml get /webhook/{webhook_slug}
Get the webhook identified by the specified slug.
# List webhooks
Source: https://docs.goodgrants.com/api-reference/webhooks/list-webhooks
/api-reference/openapi-v2_3.yaml get /webhook
List webhooks.
# Update webhook
Source: https://docs.goodgrants.com/api-reference/webhooks/update-webhook
/api-reference/openapi-v2_3.yaml put /webhook/{webhook_slug}
Update the webhook identified by the specified slug.