> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://virtuous.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://virtuous.ferndocs.com/_mcp/server.

# Update a Project

PUT https://api.vomo.org/v1/projects/{id}
Content-Type: application/json

Reference: https://virtuous.ferndocs.com/reference/volunteer/projects/update-project

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `id` (long, required) — The ID for the project to be updated

### Body (application/json)

This endpoint expects an object.

- `name` (string, required) — The name of the project
- `description` (string, required) — A description for the 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, required) — Ask your volunteers to provide additional information about themselves as they register. This field will be required to join the Serving Date.
- `dates` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItems, required) — Update Project
- `details` (string, optional) — 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
- `participant_approval_required` (boolean, optional) — Volunteers must be approved by the organizer before their spot is reserved.
- `background_check_required` (boolean, optional) — Volunteers must have a background check before signing up for your Project.
- `show_volunteer_counter` (boolean, optional) — Display number of participants. Note that this will only show on the project page if it is an Anytime project
- `volunteer_counter_threshold` (integer, optional) — 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, optional) — When a project is in draft, it will not be viewable by anyone.
- `privacy` (enum, optional) — Public is accessible by all VOMO users. Private is accessible only by the members of your Organization (those people in your People list).
  - Allowed values: `PUBLIC`, `PRIVATE`, `UNLISTED`
- `organization_id` (integer, optional) — The Organization ID to post the project to. Note, you must be part of the organization to post a project to it.
- `images` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaImagesItems, optional) — Update Project
- `point_person` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaPointPersonItems, optional) — 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.
- `categories` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaCategoriesItems, optional) — Update Project
- `campaigns` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaCampaignsItems, optional) — Update Project
- `attachment_files` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaAttachmentFilesItems, optional) — Update Project
- `owners` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaOwnersItems, optional) — Update Project
- `links` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaLinksItems, optional) — Update Project
- `address` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaAddressItems, optional) — The address where the project will take place. The format used is the standard Google address API.
- `project_type` (enum, optional) — Note: this cannot be changed after a project has been created! If the project has specific dates and times which volunteers are needed, it is dated. If there are no specific dates or times, it is an anytime.
  - Allowed values: `dated`, `anytime`

## Response

### 200

successful operation

- `any`

## Types

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItems

- `id` (string, optional) — The ID of the date. When provided, will update an existing date. When not provided, will create a new date. If an existing date ID is ommitted, that date will be deleted.
- `starts_at` (string, optional) — That date and time the project will start. The time should be set to the project's timezone.
- `ends_at` (string, optional) — That date and time the project will end. The time should be set to the project's timezone.
- `roles` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItemsRolesItems, optional) — Update Project
- `items` (list of ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItemsItemsItems, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaImagesItems

- `l` (string, optional) — A large size of the image
- `s` (string, optional) — A small size of the image
- `o` (string, optional) — The original size of the image

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaPointPersonItems

- `name` (string, optional) — Update Project
- `phone` (string, optional) — Update Project
- `email` (string, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaCategoriesItems

- `id` (integer, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaCampaignsItems

- `id` (integer, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaAttachmentFilesItems

- `file` (string, optional) — A URL to the file
- `filename` (string, optional) — The display name of the file

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaOwnersItems

- `id` (integer, optional) — The VOMO user ID of the person who should be assigned as an owner
- `is_primary_owner` (boolean, optional) — Wether or not this is a primary owner. There must be one primary owner per project.
- `send_notifications` (boolean, optional) — Wether this owner should recieve project notifications.

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaLinksItems

- `title` (string, optional) — Update Project
- `link` (string, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaAddressItems

- `lat` (string, optional) — Update Project
- `lng` (string, optional) — Update Project
- `country` (string, optional) — Update Project
- `locality` (string, optional) — Update Project
- `timezone` (string, optional) — Update Project
- `postal_code` (string, optional) — Update Project
- `country_short` (string, optional) — Update Project
- `locality_short` (string, optional) — Update Project
- `formatted_address` (string, optional) — Update Project
- `postal_code_short` (string, optional) — Update Project
- `administrative_area_level_1` (string, optional) — Update Project
- `administrative_area_level_1_short` (string, optional) — Update Project

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItemsRolesItems

- `id` (string, optional) — 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 ommitted, that role will be deleted.
- `name` (string, optional) — The name of the role.
- `description` (string, optional) — The description for the role
- `capacity` (integer, optional) — The capacity for the role

### ProjectsIdPutRequestBodyContentApplicationJsonSchemaDatesItemsItemsItems

- `id` (string, optional) — 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 ommitted, that item will be deleted.
- `name` (string, optional) — The name of the item that is needed
- `description` (string, optional) — The description for the item
- `capacity` (integer, optional) — The total number of items needed

## Examples

**Request**

```json
{
  "name": "Community Gathering",
  "description": "Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.",
  "allow_guests": 1,
  "age_limit": 13,
  "volunteer_question": "What is your t-shirt size?",
  "dates": [
    {}
  ]
}
```

**Response**

```json
{
  "data": {
    "type": "project",
    "id": "1234",
    "project_name": "Volunteer Project",
    "description": "A project description.",
    "url": "https://app.vomo.org/opportunity/1234",
    "organization": "VOMO",
    "organization_slug": "vomoslug",
    "author_id": 1234,
    "address": {
      "lat": 33.214561,
      "lng": -96.614456,
      "route": "Elm Street",
      "country": "United States",
      "locality": "McKinney",
      "timezone": "America/Chicago",
      "postal_code": "75069",
      "route_short": "Elm St",
      "country_short": "US",
      "street_number": "610",
      "locality_short": "McKinney",
      "formatted_address": "610 Elm St Suite 800, McKinney, TX 75069, USA",
      "postal_code_short": "75069",
      "street_number_short": "610",
      "administrative_area_level_1": "Texas",
      "administrative_area_level_1_short": "TX"
    },
    "anytime": 0,
    "created_at": "2020-01-01T12:00:00+00:00",
    "updated_at": "2020-01-01T12:00:00+00:00",
    "published_at": "2020-01-01T12:00:00+00:00",
    "draft": false,
    "campaigns": [
      {
        "type": "campaign",
        "id": "1",
        "campaign_name": "Together",
        "description": "Example description.",
        "url": "http://app.vomo.org/initiative/together",
        "organization": "VOMO",
        "organization_slug": "vomo",
        "author_id": 1,
        "logo_url": "https://s3.amazonaws.com/awakenmycity/j2/7Z/r4-s.jpg",
        "created_at": "2016-03-07T07:49:41+00:00",
        "updated_at": "2018-08-02T08:10:48+00:00"
      },
      {
        "type": "campaign",
        "campaign_id": "2",
        "campaign_name": "City Serve DC",
        "description": "",
        "url": "http://app.vomo.org/initiative/cityservedc",
        "organization": "VOMO",
        "organization_slug": "vomo",
        "author_id": 1,
        "logo_url": "https://s3.amazonaws.com/awakenmycity/j2/7Z/r4-s.jpg",
        "created_at": "2016-03-07T07:49:41+00:00",
        "updated_at": "2018-08-02T08:10:48+00:00"
      }
    ],
    "next_date": {
      "type": "project_date",
      "id": 5678,
      "starts_at": "2020-01-01T12:00:00+00:00",
      "ends_at": "2020-01-01T12:00:00+00:00",
      "participant_count": 20
    },
    "all_dates": [
      {
        "type": "project_date",
        "id": 5678,
        "starts_at": "2020-01-01T12:00:00+00:00",
        "ends_at": "2020-01-01T12:00:00+00:00",
        "participant_count": 20
      }
    ],
    "images": [
      "https://vomo-cdn.com/media/2019/01/01-sulmLi2Z-l.jpg",
      "https://vomo-cdn.com/media/2019/01/02-lkjfdL23-l.jpg"
    ]
  }
}
```

**SDK Code**

```python Projects_updateProject_example
import requests

url = "https://api.vomo.org/v1/projects/1"

payload = {
    "name": "Community Gathering",
    "description": "Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.",
    "allow_guests": 1,
    "age_limit": 13,
    "volunteer_question": "What is your t-shirt size?",
    "dates": [{}]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript Projects_updateProject_example
const url = 'https://api.vomo.org/v1/projects/1';
const options = {
  method: 'PUT',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"name":"Community Gathering","description":"Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.","allow_guests":1,"age_limit":13,"volunteer_question":"What is your t-shirt size?","dates":[{}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Projects_updateProject_example
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.vomo.org/v1/projects/1"

	payload := strings.NewReader("{\n  \"name\": \"Community Gathering\",\n  \"description\": \"Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.\",\n  \"allow_guests\": 1,\n  \"age_limit\": 13,\n  \"volunteer_question\": \"What is your t-shirt size?\",\n  \"dates\": [\n    {}\n  ]\n}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Projects_updateProject_example
require 'uri'
require 'net/http'

url = URI("https://api.vomo.org/v1/projects/1")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"Community Gathering\",\n  \"description\": \"Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.\",\n  \"allow_guests\": 1,\n  \"age_limit\": 13,\n  \"volunteer_question\": \"What is your t-shirt size?\",\n  \"dates\": [\n    {}\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java Projects_updateProject_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://api.vomo.org/v1/projects/1")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Community Gathering\",\n  \"description\": \"Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.\",\n  \"allow_guests\": 1,\n  \"age_limit\": 13,\n  \"volunteer_question\": \"What is your t-shirt size?\",\n  \"dates\": [\n    {}\n  ]\n}")
  .asString();
```

```php Projects_updateProject_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.vomo.org/v1/projects/1', [
  'body' => '{
  "name": "Community Gathering",
  "description": "Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.",
  "allow_guests": 1,
  "age_limit": 13,
  "volunteer_question": "What is your t-shirt size?",
  "dates": [
    {}
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Projects_updateProject_example
using RestSharp;

var client = new RestClient("https://api.vomo.org/v1/projects/1");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"name\": \"Community Gathering\",\n  \"description\": \"Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.\",\n  \"allow_guests\": 1,\n  \"age_limit\": 13,\n  \"volunteer_question\": \"What is your t-shirt size?\",\n  \"dates\": [\n    {}\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Projects_updateProject_example
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "name": "Community Gathering",
  "description": "Inviting & meeting new neighbors of the community. Serving meals, setup game stations, face paintings for kids...etc.",
  "allow_guests": 1,
  "age_limit": 13,
  "volunteer_question": "What is your t-shirt size?",
  "dates": [[]]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.vomo.org/v1/projects/1")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```