---
title: "Create / Update User"
method: POST
path: "/users"
tags: ["Users"]
---

# Create / Update User

`POST /users`

Upserts a user by email address. If no user with the given email exists, a new user is created and a 201 response is returned. If a user with that email already exists, their record is updated and a 200 response is returned. Note: if the user belongs to an organization other than your own organization or one of its child organizations, their core profile fields (name, email, password) cannot be modified — only their membership role within your organization can be adjusted.

## Request body

- UserWriteRequest — Request body for creating or updating a user.
  - `first_name` string, required — The first name of the user
  - `last_name` string, required — The last name of the user
  - `email` string, required — The email for the user
  - `password` string — The user's password. Must be at least 10 characters and include letters and numbers.
  - `org` string — Optional. The slug of the organization to assign the user to. Defaults to your partner organization. Must be your own organization or one of its child organizations.
  - `invite_code` string — Optional. The invitation code for the target organization. When supplied, this takes precedence over the org field and determines which organization the user is added to.
  - `birthday` string, YYYY-MM-DD, required — The birthday for the user
  - `gender` 'M' | 'F' | 'N', required — The gender for the user
  - `phone` string — Optional. The phone number for the user.
  - `role` 'VOLUNTEER' | 'ORGANIZER' | 'ADMIN' — Optional. The user's role within your organization. Defaults to VOLUNTEER when not provided. Possible values: `VOLUNTEER` — standard volunteer member; `ORGANIZER` — can create and manage projects and events; `ADMIN` — organization administrator with full management access.

## Response `200`

A user with the provided email already existed and has been updated. Returns the updated user record.

- object
  - `code` string
  - `message` string
  - `data` UserResource — VOMO User
    - `type` string — VOMO object type
    - `id` string — User's ID (cast to string)
    - `first_name` string — User's First Name
    - `last_name` string — User's Last Name
    - `full_name` string — User's full name
    - `email` string — User's Email
    - `address` string — User's Address
    - `phone` string — User's Phone Number
    - `birthday` string, YYYY-MM-DD — The birthday for the user
    - `gender` 'F' | 'M' | 'O' | 'N' — The gender for the user. Possible values: `F` — Female; `M` — Male; `O` — Other; `N` — Prefer not to say.
    - `updated_at` string, date-time — The date and time the user was updated at
    - `created_at` string, date-time — The date and time the user was created at
    - `user_status` 'PENDING' | 'VERIFIED' | 'GUEST' | 'ANON_GUEST' — The User's account status. Possible values: `PENDING` — account created but email not yet verified; `VERIFIED` — active, verified member; `GUEST` — signed up for an event without a full account; `ANON_GUEST` — anonymous guest participant.
    - `membership_status` 'ACCEPTED' | 'PENDING' | 'REMOVED' | 'REJECTED' | 'INACTIVE' | 'LOBBY' — The User's membership status for the current org. Present only when the user has a membership record for the org. Possible values: `ACCEPTED` — active member; `PENDING` — invitation sent, not yet accepted; `REMOVED` — membership removed by an organizer; `REJECTED` — invitation declined by the user; `INACTIVE` — membership deactivated; `LOBBY` — user is in the join queue awaiting approval.
    - `membership_role` 'ADMIN' | 'ORGANIZER' | 'VOLUNTEER' — The User's membership role for the current org. Present only when the user has a membership record for the org. These are the standard membership roles surfaced to partners. Possible values: `ADMIN` — organization administrator with full management access; `ORGANIZER` — can create and manage projects and events; `VOLUNTEER` — standard volunteer member.

## Other responses

- `201` — No user with the provided email existed; a new user has been created and added to your organization. Returns the newly created user record.
- `400` — The organization slug or ID provided in the request does not match any organization in your family.
- `401` — Authentication credentials are missing or invalid.
- `422` — One or more request fields failed validation. This can occur from the request rules (e.g. missing email) or from the inline password requirement when creating a new user.
- `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)
