# Update teammate's permissions

## API Overview

Twilio SendGrid's Teammates feature allows multiple users, or "Teammates," to work from a single SendGrid account.

Teammates enables groups of users with different roles and responsibilities to share one account, where each of these users has access to varying SendGrid features depending on their needs. By only giving your individual team members access to the features that they need to do their jobs, you can limit access to sensitive areas of your account. Teammates allows you to add, remove, and manage different users. See the [**Teammate Permissions** documentation](/docs/sendgrid/ui/account-and-settings/teammate-permissions) for more information about managing user permissions.

> \[!NOTE]
>
> Free and Essentials plans allow for adding one Teammate per account and do not offer Single Sign-On (SSO), while Pro and higher plans allow for up to 1,000 Teammates and include SSO and other features. To learn more about the different Email API plans, see the pricing page]\(https://sendgrid.com/en-us/pricing).

## Teammates vs Subusers

You can think of Subusers like subaccounts. Each Subuser account is its own email ecosystem with isolated contacts, templates, suppressions, and data. Subusers feed off their parent account email credits, and all billing rolls up to the parent account. Teammates may have access to a parent account, a group of Subusers, or a single Subuser account only.

## Operation overview

```json
{"path":"https://api.sendgrid.com/v3/teammates/{username}","method":"patch","servers":[{"url":"https://api.sendgrid.com","description":"for global users and subusers"},{"url":"https://api.eu.sendgrid.com","description":"for EU regional subusers"}]}
```

**This endpoint allows you to update a teammate’s permissions.**

To turn a teammate into an admin, the request body should contain an `is_admin` set to `true`. Otherwise, set `is_admin` to `false` and pass in all the scopes that a teammate should have.

**Only the parent user or other admin teammates can update another teammate’s permissions.**

**Admin users can only update permissions.**

## Operation details

### Authentication

API Key

### Headers

```json
[{"in":"header","name":"Authorization","required":true,"default":"Bearer <<YOUR_API_KEY_HERE>>","schema":{"type":"string"}},{"name":"on-behalf-of","in":"header","description":"The `on-behalf-of` header allows you to make API calls from a parent account on behalf of the parent's Subusers or customer accounts. You will use the parent account's API key when using this header. When making a call on behalf of a customer account, the property value should be \"account-id\" followed by the customer account's ID (e.g., `on-behalf-of: account-id <account-id>`). When making a call on behalf of a Subuser, the property value should be the Subuser's username (e.g., `on-behalf-of: <subuser-username>`). See [**On Behalf Of**](/docs/sendgrid/api-reference/how-to-use-the-sendgrid-v3-api/on-behalf-of) for more information.","required":false,"schema":{"type":"string"},"refName":"#/components/parameters/OnBehalfOf","modelName":"__components_parameters_OnBehalfOf"}]
```

### Path parameters

```json
[{"name":"username","in":"path","description":"The username of the teammate that you want to retrieve.","required":true,"schema":{"type":"string"}}]
```

### Request body

```json
{"schema":{"type":"object","required":["scopes","is_admin"],"example":{"scopes":["user.profile.read","user.profile.edit"],"is_admin":false},"properties":{"scopes":{"type":"array","description":"Provide list of scopes that should be given to teammate. If specifying list of scopes, is_admin should be set to False.","items":{"type":"string"}},"is_admin":{"type":"boolean","description":"Set to True if this teammate should be promoted to an admin user. If True, scopes should be an empty array."}}},"encodingType":"application/json"}
```

### Responses

```json
[{"responseCode":"200","schema":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","description":"Teammate's username"},"first_name":{"type":"string","description":"Teammate's first name"},"last_name":{"type":"string","description":"Teammate's last name"},"email":{"type":"string","description":"Teammate's email address"},"scopes":{"type":"array","description":"Scopes given to teammate","items":{"type":"string"}},"user_type":{"type":"string","description":"Indicate the type of user: owner user, teammate admin user, or normal teammate","enum":["admin","owner","teammate"],"refName":"UserType2","modelName":"UserType2"},"is_admin":{"type":"boolean","description":"Set to true if teammate has admin priveleges"},"phone":{"type":"string","description":"(optional) Teammate's phone number"},"website":{"type":"string","description":"(optional) Teammate's website"},"address":{"type":"string","description":"(optional) Teammate's address"},"address2":{"type":"string","description":"(optional) Teammate's address"},"city":{"type":"string","description":"(optional) Teammate's city"},"state":{"type":"string","description":"(optional) Teammate's state"},"zip":{"type":"string","description":"(optional) Teammate's zip"},"country":{"type":"string","description":"(optional) Teammate's country"}}},"examples":{"response":{"value":{"username":"teammate1","first_name":"Jane","last_name":"Doe","email":"teammate1@example.com","scopes":["user.profile.read","user.profile.edit"],"user_type":"teammate","is_admin":false,"phone":"123-345-3453","website":"www.example.com","company":"ACME Inc.","address":"123 Acme St","address2":"","city":"City","state":"CA","country":"USA","zip":"12345"}}}}}}},{"responseCode":"400","schema":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"field":{"type":"string"}}}}}},"examples":{"response":{"value":{"errors":[{"message":"one or more of given scopes are invalid","field":"scopes"}]}}}}}}},{"responseCode":"404","schema":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"errors":{"type":"array","items":{"type":"object","properties":{"message":{"type":"string"},"field":{"type":"string"}}}}}},"examples":{"response":{"value":{"errors":[{"message":"username not found","field":"username"}]}}}}}}}]
```

Update teammate's permissions

```js
const client = require("@sendgrid/client");
client.setApiKey(process.env.SENDGRID_API_KEY);

const username = "username";
const data = {
  scopes: ["user.profile.read", "user.profile.edit"],
  is_admin: false,
};

const request = {
  url: `/v3/teammates/${username}`,
  method: "PATCH",
  body: data,
};

client
  .request(request)
  .then(([response, body]) => {
    console.log(response.statusCode);
    console.log(response.body);
  })
  .catch((error) => {
    console.error(error);
  });
```

```python
import os
from sendgrid import SendGridAPIClient


sg = SendGridAPIClient(os.environ.get("SENDGRID_API_KEY"))

username = "username"
data = {"scopes": ["user.profile.read", "user.profile.edit"], "is_admin": False}

response = sg.client.teammates._(username).patch(request_body=data)

print(response.status_code)
print(response.body)
print(response.headers)
```

```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SendGrid;

public class Program {
    public static async Task Main() {
        string apiKey = Environment.GetEnvironmentVariable("SENDGRID_API_KEY");
        var client = new SendGridClient(apiKey);

        var username = "username";
        var data =
            @"{
            ""scopes"": [
                ""user.profile.read"",
                ""user.profile.edit""
            ],
            ""is_admin"": false
        }";

        var response = await client.RequestAsync(
            method: SendGridClient.Method.PATCH,
            urlPath: $"teammates/{username}",
            requestBody: data);

        Console.WriteLine(response.StatusCode);
        Console.WriteLine(response.Body.ReadAsStringAsync().Result);
        Console.WriteLine(response.Headers.ToString());
    }
}
```

```java
import com.sendgrid.*;
import java.io.IOException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Arrays;

public class Example {
    public static void main(String[] args) throws IOException {
        try {
            SendGrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));
            Request request = new Request();
            request.setMethod(Method.PATCH);
            request.setEndpoint("/teammates/username");
            request.setBody(new JSONObject(new HashMap<String, Object>() {
                {
                    put("scopes", Arrays.asList("user.profile.read", "user.profile.edit"));
                    put("is_admin", false);
                }
            }).toString());
            Response response = sg.api(request);
            System.out.println(response.getStatusCode());
            System.out.println(response.getBody());
            System.out.println(response.getHeaders());
        } catch (IOException ex) {
            throw ex;
        }
    }
}
```

```go
package main

import (
	"fmt"
	"github.com/sendgrid/sendgrid-go"
	"os"
)

func main() {
	apiKey := os.Getenv("SENDGRID_API_KEY")
	host := "https://api.sendgrid.com"
	request := sendgrid.GetRequest(apiKey, "/v3/teammates/username", host)
	request.Method = "PATCH"
	request.Body = []byte(`{
  "scopes": [
    "user.profile.read",
    "user.profile.edit"
  ],
  "is_admin": false
}`)
	response, err := sendgrid.API(request)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	} else {
		fmt.Println(response.StatusCode)
		fmt.Println(response.Body)
		fmt.Println(response.Headers)
	}
}
```

```php
<?php
// Uncomment the next line if you're using a dependency loader (such as Composer) (recommended)
// require 'vendor/autoload.php';

// Uncomment next line if you're not using a dependency loader (such as Composer)
// require_once '<PATH TO>/sendgrid-php.php';

$apiKey = getenv("SENDGRID_API_KEY");
$sg = new \SendGrid($apiKey);
$request_body = json_decode('{
    "scopes": [
        "user.profile.read",
        "user.profile.edit"
    ],
    "is_admin": false
}');
$username = "username";

try {
    $response = $sg->client
        ->teammates()
        ->_($username)
        ->patch($request_body);
    print $response->statusCode() . "\n";
    print_r($response->headers());
    print $response->body() . "\n";
} catch (Exception $ex) {
    echo "Caught exception: " . $ex->getMessage();
}
```

```ruby
require 'sendgrid-ruby'
include SendGrid

sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
data = JSON.parse('{
  "scopes": [
    "user.profile.read",
    "user.profile.edit"
  ],
  "is_admin": false
}')
username = "username"

response = sg.client.teammates._(username).patch(request_body: data)
puts response.status_code
puts response.headers
puts response.body
```

```bash
curl -X PATCH "https://api.sendgrid.com/v3/teammates/username" \
--header "Authorization: Bearer $SENDGRID_API_KEY" \
--header "Content-Type: application/json" \
--data '{"scopes": ["user.profile.read", "user.profile.edit"], "is_admin": false}'
```
