---
updatedAt: 2026-07-27T05:02:23.000Z
agentTools:
  projectIndex: https://developers.vygo.app/llms.txt
---

# Update Users

This request enables the update of an existing user account. If the user does not exist, this request will send an invite to the user. It is important to note that the user's first name, last name, and email cannot be updated.

 **IMPORTANT:** Fields within the user object are optional. Any fields provided will be used to pre-fill the associated onboarding questions. Data provided must be an exact match to onboarding answers in the Vygo platform.

Each field provided replaces the user's existing answers for that field in full. Send a field only when you intend to set its complete new value. Answers are matched against your organisation's active tags by label or code. Use the Tag Groups request to retrieve the valid values for each field, and the Users request to read a user's current answers before updating. **An answer that does not match any tag is silently ignored**: the request still reports success and the unmatched value is not applied. Sending an empty array for a field clears all of the user's answers for that field. Free-text answers to tag groups that allow custom answers cannot be set through this request. Sending the free text will not match a tag; keep the group's own tag label (e.g. `Other`) in the answers you send to preserve an existing custom answer.

# OpenAPI definition

```json
{
  "openapi": "3.0.0",
  "info": {
    "title": "Vygo API",
    "description": "\nFor authentication, pass your API key via the \"x-api-key\" header with each request.\n \nYou can create your API keys in the **admin > developer** section of the Vygo platform. All new keys will be created in '***Test Mode***' by default. This will allow you to test your configuration and receive *'prod-like'* responses without triggering the operation. You will need '**Organisation Admin**' level permission to access the developer section of the platform.\n\nThe Vygo API has a rate limit of 100 requests per minute. Duplicate requests will return a 200 or 202 status unless an error occurs. \n\n*Each API endpoint has its own limits on the amount of data that can be posted or retrieved in a single request. Refer to individual endpoint docs for that limit.*\n\nEvery error response uses the shape `{ \"error\": <message>, \"code\": <machine-readable code> }`.\nRate-limit status is returned on each response via the `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers; a 429 also includes `Retry-After`.\n",
    "version": "6.1",
    "contact": {}
  },
  "servers": [
    {
      "url": "https://api.vygoapp.com"
    }
  ],
  "tags": [
    {
      "name": "Users",
      "description": "User related API triggers"
    }
  ],
  "paths": {
    "/users/update": {
      "post": {
        "operationId": "update-users",
        "tags": [
          "Users"
        ],
        "summary": "Update Users",
        "description": "This request enables the update of an existing user account. If the user does not exist, this request will send an invite to the user. It is important to note that the user's first name, last name, and email cannot be updated.\n\n **IMPORTANT:** Fields within the user object are optional. Any fields provided will be used to pre-fill the associated onboarding questions. Data provided must be an exact match to onboarding answers in the Vygo platform.\n\nEach field provided replaces the user's existing answers for that field in full. Send a field only when you intend to set its complete new value. Answers are matched against your organisation's active tags by label or code. Use the Tag Groups request to retrieve the valid values for each field, and the Users request to read a user's current answers before updating. **An answer that does not match any tag is silently ignored**: the request still reports success and the unmatched value is not applied. Sending an empty array for a field clears all of the user's answers for that field. Free-text answers to tag groups that allow custom answers cannot be set through this request. Sending the free text will not match a tag; keep the group's own tag label (e.g. `Other`) in the answers you send to preserve an existing custom answer.",
        "parameters": [
          {
            "name": "x-api-key",
            "in": "header",
            "description": "You must provide your API key in the header of each request.",
            "required": true,
            "example": "Enter your API key",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/updateUsers"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Request accepted for processing",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inviteUsers202Response"
                }
              }
            },
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            }
          },
          "400": {
            "description": "Invalid request. A query or body parameter failed validation.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inline_response_400"
                }
              }
            }
          },
          "401": {
            "description": "API key is missing, invalid, or has been revoked.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inline_response_401"
                }
              }
            }
          },
          "406": {
            "description": "Too many records in a single request (max 200).",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inline_response_406"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inline_response_429"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error.",
            "headers": {
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/XRateLimitLimit"
              },
              "X-RateLimit-Remaining": {
                "$ref": "#/components/headers/XRateLimitRemaining"
              },
              "X-RateLimit-Reset": {
                "$ref": "#/components/headers/XRateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/inline_response_500"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "updateUsers": {
        "required": [
          "users"
        ],
        "type": "object",
        "properties": {
          "users": {
            "description": "Min items: 1 | Max items: 200",
            "maxItems": 200,
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/updateUsers_users"
            }
          }
        }
      },
      "updateUsers_users": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "description": "Max length: 100",
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "example": "studentID@university.edu"
          },
          "user": {
            "$ref": "#/components/schemas/userObject"
          }
        },
        "additionalProperties": false
      },
      "inviteUsers202Response": {
        "type": "object",
        "properties": {
          "invalidEmails": {
            "type": "array",
            "items": {
              "type": "string",
              "example": "john@do"
            }
          },
          "invalidEmailCount": {
            "type": "number",
            "example": 1
          },
          "duplicateEmails": {
            "type": "array",
            "items": {
              "type": "string",
              "example": "john@doe.com"
            }
          },
          "duplicateEmailCount": {
            "type": "number",
            "example": 1
          },
          "message": {
            "type": "string",
            "example": "200 valid emails sent for processing. 1 emails were invalid. 1 emails were duplicates."
          },
          "validEmailCount": {
            "type": "number",
            "example": 198
          },
          "production": {
            "type": "boolean",
            "example": true
          }
        }
      },
      "userObject": {
        "description": "Details that your would like to update. All fields are optional.",
        "type": "object",
        "properties": {
          "studentId": {
            "description": "Student ID \n This will map to the 'Student ID' field in onboarding (if enabled)",
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "example": "s1823829933"
          },
          "externalId": {
            "description": "User ID, Employee ID, User Name etc. \n This will map to the 'External ID' field in onboarding (if enabled)",
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "example": "doej1"
          },
          "entryYear": {
            "description": "Year student applied for entry. This will pre-fill the 'Study start date' onboarding question (if enabled).",
            "maxLength": 4,
            "minLength": 4,
            "type": "string",
            "example": "2022"
          },
          "entryMonth": {
            "description": "Month student applied for entry. This will pre-fill the 'Study start date' onboarding question (if enabled).",
            "maxLength": 2,
            "minLength": 1,
            "type": "string",
            "example": "09"
          },
          "courses": {
            "description": "Course(s) the student is currently taking. This will map to the 'courses' onboarding question type (if enabled).",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Civil Engineering"
            }
          },
          "educationAttainment": {
            "description": "The highest level of education the student has attained. This will map to the 'education attainment' onboarding question type (if enabled).",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Masters"
            }
          },
          "demographicIdentification": {
            "description": "The demographic identification of the student. This will map to the 'demographic identification' onboarding question type (if enabled).",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Mature age student"
            }
          },
          "studyStage": {
            "description": "The study stage of the student. This will map to the 'study stage' onboarding question type (if enabled).",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Masters - First year student"
            }
          },
          "areasOfExpertise": {
            "description": "The areas of expertise of the student. This will map to the 'ares of expertise' onboarding question type (if enabled).",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Mathematics"
            }
          },
          "[mappingFieldName]": {
            "description": "Any additional onboarding questions that you have created can be pre-filled by setting a mapping field name on the question and then providing answers here.",
            "type": "array",
            "items": {
              "type": "string",
              "example": "Answer to question"
            }
          }
        }
      },
      "inline_response_401": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message.",
            "example": "API key is missing or invalid"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "AUTHENTICATION_ERROR"
            ],
            "example": "AUTHENTICATION_ERROR"
          }
        }
      },
      "inline_response_406": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message.",
            "example": "Exceeded record limit of 200 by 5"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "RECORD_LIMIT_EXCEEDED"
            ],
            "example": "RECORD_LIMIT_EXCEEDED"
          }
        }
      },
      "inline_response_429": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message.",
            "example": "Rate limit exceeded"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "RATE_LIMIT_EXCEEDED"
            ],
            "example": "RATE_LIMIT_EXCEEDED"
          }
        }
      },
      "inline_response_400": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message.",
            "example": "Invalid page parameter"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "VALIDATION_ERROR"
            ],
            "example": "VALIDATION_ERROR"
          }
        }
      },
      "inline_response_500": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "Human-readable error message.",
            "example": "Internal server error"
          },
          "code": {
            "type": "string",
            "description": "Machine-readable error code.",
            "enum": [
              "INTERNAL_ERROR"
            ],
            "example": "INTERNAL_ERROR"
          }
        }
      }
    },
    "securitySchemes": {
      "api_key": {
        "type": "apiKey",
        "name": "x-api-key",
        "in": "header"
      }
    },
    "headers": {
      "XRateLimitLimit": {
        "description": "Maximum number of requests allowed in the current window.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "XRateLimitRemaining": {
        "description": "Requests remaining in the current window.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "XRateLimitReset": {
        "description": "Unix epoch (seconds) at which the current rate-limit window resets.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying after a 429.",
        "schema": {
          "type": "integer",
          "format": "int32"
        }
      }
    }
  }
}
```