---
title: "Update a Project"
method: PUT
path: "/projects/{id}"
tags: ["Projects"]
---

# Update a Project

`PUT /projects/{id}`

Updates an existing volunteer project. All required project fields must be supplied. Serving dates are upserted: a date with an existing id is updated, a date with no id is created, and a date is removed only when it is included with status 'deleted' — omitting a date from the request does NOT delete it. The project_type (dated vs. anytime) cannot be changed after creation.

## Path parameters

- `id` integer, required

## Request body

- ProjectWriteRequest — Request body for creating or updating a project.
  - `name` string, required — The name of the project
  - `description` string, required — A description for the project
  - `details` string — Emphasize important details such as shoes to wear or items to bring. This information goes in the signup confirmation email, and is a great place to detail next steps in a Project
  - `allow_guests` boolean, required — Whether to allow volunteers to bring guests
  - `age_limit` integer, required — The minimum age a volunteer must be
  - `volunteer_question` string — Ask your volunteers to provide additional information about themselves as they register. This field will be required to join the Serving Date.
  - `participant_approval_required` boolean, required — Volunteers must be approved by the organizer before their spot is reserved.
  - `background_check_required` boolean — Volunteers must have a background check before signing up for your Project.
  - `show_volunteer_counter` boolean, required — Display number of participants. Note that this will only show on the project page if it is an Anytime project
  - `volunteer_counter_threshold` integer, required — The minimum number of volunteers signed up before the counter is shown. Note that this will only show on the project page if it is an Anytime project
  - `draft` boolean — When a project is in draft, it will not be viewable by anyone.
  - `privacy` 'PUBLIC' | 'PRIVATE' | 'UNLISTED', required — The visibility of the project. Possible values: `PUBLIC` — accessible by all VOMO users; `PRIVATE` — accessible only by members of the organization (those in the People list); `UNLISTED` — not listed publicly but accessible via direct link.
  - `organization_id` integer — The Organization ID to post the project to. Note, you must be part of the organization to post a project to it.
  - `images` ImageInput[]
    - `l` string — A large size of the image
    - `s` string — A small size of the image
    - `o` string — The original size of the image
  - `point_person` PointPerson — A contact person to meet on the day of the project. This contact info goes in the signup confirmation email, but this person does not receive notifications.
    - `name` string, nullable
    - `phone` string, nullable
    - `email` string, nullable
  - `categories` CategoryReference[]
    - `id` integer
  - `campaigns` CampaignReference[] — A list of existing campaigns to associate with the project. For organizations without a hub experience, at least one campaign is required; otherwise this is optional.
    - `id` integer
  - `attachment_files` AttachmentFileInput[]
    - `file` string, required — A URL to the file
    - `filename` string, required — The display name of the file
  - `owners` OwnerInput[], required
    - `id` integer — The VOMO user ID of the person who should be assigned as an owner
    - `is_primary_owner` boolean — Whether or not this is a primary owner. There must be one primary owner per project.
    - `send_notifications` boolean — Whether this owner should receive project notifications.
  - `links` LinkInput[]
    - `title` string, nullable
    - `link` string, uri, nullable
  - `address` Address, required — An address in Google Maps API format.
    - `lat` number, float
    - `lng` number, float
    - `country` string
    - `locality` string
    - `timezone` string
    - `postal_code` string
    - `country_short` string
    - `locality_short` string
    - `formatted_address` string
    - `postal_code_short` string
    - `administrative_area_level_1` string
    - `administrative_area_level_1_short` string
  - `project_type` 'dated' | 'anytime' — The scheduling type for the project. Cannot be changed after a project has been created. Possible values: `dated` — the project has specific dates and times when volunteers are needed; `anytime` — volunteers can participate at any time, with no fixed schedule.
  - `dates` ProjectDateInput[]
    - `id` string, nullable — The ID of the serving date. Provide it to update an existing date; omit it to create a new date. Omitting an existing date does NOT delete it — a date is removed only when it is included in the request with status 'deleted'.
    - `starts_at` string — That date and time the project will start. The time should be set to the project's timezone.
    - `ends_at` string — That date and time the project will end. The time should be set to the project's timezone.
    - `status` 'existing' | 'deleted', nullable — Default 'existing'. Set to 'deleted' to remove an existing date — see id property for full upsert semantics.
    - `roles` RoleInput[]
      - `id` string, nullable — The ID of the role. When provided, will update an existing role. When not provided, will create a new role. If an existing role ID is omitted, that role will be deleted -- unless a volunteer with an active (non-denied, non-left) signup is assigned to it on an upcoming date, in which case the request will be rejected with a 422 and no changes will be saved.
      - `name` string — The name of the role.
      - `description` string — The description for the role
      - `capacity` integer — The capacity for the role
    - `items` ItemInput[]
      - `id` string, nullable — The ID of the item. When provided, will update an existing item. When not provided, will create a new item. If an existing item ID is omitted, that item will be deleted -- unless a volunteer with an active (non-denied, non-left) signup is assigned to it on an upcoming date, in which case the request will be rejected with a 422 and no changes will be saved.
      - `name` string — The name of the item that is needed
      - `description` string — The description for the item
      - `capacity` integer — The total number of items needed

## Response `200`

Returns the updated project record in full detail, reflecting all changes made in this request including any serving date additions, updates, or deletions.

- object
  - `code` integer
  - `message` string
  - `data` ProjectDetailResource — A VOMO Project
    - `type` string — The VOMO object type
    - `id` string — The VOMO project id (cast to string)
    - `project_name` string — The name of the project
    - `description` string — A description for the project
    - `details` string, nullable — Additional details for volunteers, included in the signup confirmation email.
    - `url` string — A URL to the project
    - `organization_id` integer — The Organization ID the project belongs to.
    - `organization` string — The Organization name the project belongs to.
    - `organization_slug` string — The Organization slug the project belongs to.
    - `author_id` integer, nullable — The VOMO user ID of the person who created the project.
    - `owners` object[]
      - `id` integer — The VOMO user ID of the person who is an owner
      - `is_primary_owner` boolean — Whether or not this is a primary owner. There must be one primary owner per project.
      - `send_notifications` boolean — Whether this owner should receive project notifications.
    - `address` object, nullable — The address where the project will take place, in Google Maps API format.
      - `lat` string
      - `lng` string
      - `country` string
      - `locality` string
      - `timezone` string
      - `postal_code` string
      - `country_short` string
      - `locality_short` string
      - `formatted_address` string
      - `postal_code_short` string
      - `administrative_area_level_1` string
      - `administrative_area_level_1_short` string
    - `anytime` boolean — Whether the project is an anytime (open-ended) project with no specific serving dates.
    - `anywhere` boolean, nullable — Whether the project can be done anywhere (no fixed location).
    - `draft` boolean — When true, the project is in draft mode and not publicly viewable.
    - `created_at` string, date-time — The date and time the project was created at
    - `updated_at` string, date-time — The date and time the project was updated at
    - `published_at` string — The date and time the project was published. Empty string if not yet published.
    - `campaigns` CampaignResource[]
      - `type` string — The VOMO object type
      - `id` string — The VOMO campaign ID (cast to string)
      - `campaign_name` string — The name of the campaign
      - `description` string — The description for the campaign
      - `url` string — A URL to the campaign on VOMO
      - `organization` string — The organization name the campaign is in
      - `organization_id` integer, nullable — The Organization ID the campaign belongs to.
      - `organization_slug` string, nullable — The organization slug the campaign is in
      - `author_id` integer — The VOMO user ID of the person who created the campaign
      - `logo_url` string — The URL for the campaign logo image
      - `updated_at` string, date-time — The date and time the campaign was updated at
      - `created_at` string, date-time — The date and time the campaign was created at
    - `certificates` CertificateResource[]
      - `id` integer — The ID of the certification
      - `name` string — The name of the certification
      - `requirement` string, nullable — A description / requirement for the certification
      - `slug` string — The slug for the certification
      - `expiration_in_months` integer, nullable — The certification default expiration after completion in months
      - `creator_id` integer, nullable — The ID of the certification creator
      - `organization_id` integer, nullable — The ID of the organization the certification belongs to
      - `created_at` string, date-time — The date and time the certification was created at
      - `updated_at` string, date-time — The date and time the certification was last updated at
    - `form_completions` FormCompletionResource[]
      - `type` string — The type of VOMO Object
      - `id` integer — The ID of the form completion
      - `form_id` integer — The ID of the form
      - `user_id` integer — The ID of the user who completed the form
      - `project_id` integer, nullable — The ID of the project this form submission is associated with
      - `participation_id` integer, nullable — The ID of the participation this form submission is associated with
      - `updated_at` string, date-time — The date and time the form completion was updated at
      - `created_at` string, date-time — The date and time the form completion was created at
      - `field_responses` FormFieldResponseResource[] — The form field responses
        - `type` string — The type of VOMO Object
        - `id` integer — The ID of the response
        - `form_completion_id` integer — The ID of the form completion
        - `user_id` integer — The ID of the user who completed the form field
        - `field_id` integer — The ID of the form field
        - `value` string, nullable — The raw answer value for this field response. What this contains varies by field type: SHORTTEXT and LONGTEXT — the text the volunteer entered; DROPDOWN — the name of the selected option; GROUP — a JSON array of group IDs the volunteer was assigned to; DOCUMENTUPLOAD — the identifier of the uploaded file; WAIVER — the acceptance string; MULTIPLESELECT — not currently populated (selections for multiple-select fields are stored separately and are not returned in this field).
    - `next_date` HappeningResource — A VOMO Happening
      - `type` string — The type of VOMO object
      - `id` integer — Project Date ID
      - `starts_at` string, date-time — The date and time when a Project Date will start
      - `ends_at` string, date-time — The date and time when a Project Date will end
      - `participant_count` integer — The total number of confirmed participants for this date
    - `images` string[] — An array of project image URLs (large size).
    - `point_person` object — Identify a person to contact or meet on the day of the Project. This contact info goes in the signup confirmation email, but this person does not receive notifications.
      - `name` string
      - `phone` string
      - `email` string
    - `allow_guests` boolean — Whether to allow volunteers to bring guests
    - `age_limit` integer — The minimum age a volunteer must be
    - `volunteer_question` string — Ask your volunteers to provide additional information about themselves as they register. This field will be required to join the Serving Date.
    - `participant_approval_required` boolean — Volunteers must be approved by the organizer before their spot is reserved.
    - `background_check_required` boolean — Volunteers must have a background check before signing up for your Project.
    - `show_volunteer_counter` boolean — Display number of participants. Note that this will only show on the project page if it is an Anytime project
    - `volunteer_counter_threshold` integer — The minimum number of volunteers signed up before the counter is shown. Note that this will only show on the project page if it is an Anytime project
    - `privacy` 'PUBLIC' | 'PRIVATE' | 'UNLISTED' — The visibility of the project. Possible values: `PUBLIC` — accessible by all VOMO users; `PRIVATE` — accessible only by members of the organization (those in the People list); `UNLISTED` — not listed publicly but accessible via direct link.
    - `all_dates` HappeningResource[] — All serving dates for the project. Present only when the 'happenings' relation is loaded.
      - `type` string — The type of VOMO object
      - `id` integer — Project Date ID
      - `starts_at` string, date-time — The date and time when a Project Date will start
      - `ends_at` string, date-time — The date and time when a Project Date will end
      - `participant_count` integer — The total number of confirmed participants for this date

## Other responses

- `401` — Authentication credentials are missing or invalid.
- `404` — No project exists with the provided ID.
- `422` — One or more request fields failed validation. Check the errors map for details.
- `429` — You have exceeded the rate limit of 30 requests per minute per API key.
- `500` — An unexpected server error occurred.

---

[API](https://skmtc.dev/vomo/apis/vomo-api.md) · [All operations](https://skmtc.dev/vomo/apis/vomo-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/vomo/vomo-api/revisions/1582d52b5f1f/schema)
