Skip to content

SCIM Reference

Authentication

To authenticate to the Canva SCIM API, your client requests must provide a Bearer token in the Authorization header.

Generate an access token

Generate the access token from your team's settings in your Canva account. Only team administrators and owners of Canva for Teams or Canva for Education have access to generate a SCIM access token.

  1. Log in to your Canva account.

  2. Click the gear icon to go to your Account settings.

  3. In the side menu, under your team's settings, click SSO & provisioning.

  4. Under SCIM, select Enable SCIM user provisioning.

    NOTE: Each time the slider is toggled, the current access token is revoked and a new token is created.

  5. Copy the access token.

The SCIM access token is unique to your Canva team, and there's only a single access token active at any one time. It is a long-lived token, so make sure it's stored securely.

Create Group

Creates a user group in a Canva team.

The displayName of the group can't already be in use by an existing group within the same Canva Team.

NOTE: You can't provide a list of group members when creating a group. To add users to a group, you can use either the PUT or PATCH operations after the group is created.

HTTP method and URL path

POST https://www.canva.com/_scim/v2/Groups

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="displayName" type="string" required> The name of the group, suitable for display to end-users. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request POST 'https://www.canva.com/_scim/v2/Groups' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group", "displayName": "White rabbits" }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups", {
  method: "POST",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
    "displayName": "White rabbits"
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("POST", HttpRequest.BodyPublishers.ofString("{\"schemas\": \"urn:ietf:params:scim:schemas:core:2.0:Group\", \"displayName\": \"White rabbits\"}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
    "displayName": "White rabbits"
}

response = requests.post("https://www.canva.com/_scim/v2/Groups",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Post,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": \"urn:ietf:params:scim:schemas:core:2.0:Group\", \"displayName\": \"White rabbits\"}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
	  "displayName": "White rabbits"
	}`)

	url := "https://www.canva.com/_scim/v2/Groups"
	req, _ := http.NewRequest("POST", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups", CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => "urn:ietf:params:scim:schemas:core:2.0:Group", "displayName" => "White rabbits" ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request['Authorization'] = 'Bearer {token}'
request['Content-Type'] = 'application/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
  "displayName": "White rabbits"
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 201 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the group. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the group.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `Group`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the group, suitable for display to end-users. </Prop>

<Prop name="members" type="object[]" required mode="output"> NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "GAFgrpb1abC",
  "meta": {
    "resourceType": "Group",
    "created": "2023-09-18T06:08:35Z"
  },
  "displayName": "White rabbits",
  "members": []
}

Error responses

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Group with name {group_name} already exists.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Group with name White rabbits already exists.",
  "status": "409"
}

Create User

Using information from an identity provider (IdP), create a Canva user in a Canva team.

The values for the email or userName parameters must be unique and can't already be in use.

This API is rate limited to 1 request per second.

HTTP method and URL path

POST https://www.canva.com/_scim/v2/Users

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="userName" type="string" required> A unique identifier for the user. </Prop>

<Prop name="emails" type="object[]" required> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="externalId" type="string"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="displayName" type="string"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="name" type="name"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string"> The user's default location, for example en_AU. </Prop>

<Prop name="role" type="string"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="active" type="boolean"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Users endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request POST 'https://www.canva.com/_scim/v2/Users' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "externalId": "{idp_provided_external_id}", "userName": "aliddell", "displayName": "Alice Liddell", "name": { "givenName": "Alice", "familyName": "Liddell" }, "emails": [ { "primary": true, "value": "alice@acme.com", "type": "work" } ], "locale": "en_US", "role": "Member" }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Users", {
  method: "POST",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": [
      "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "externalId": "{idp_provided_external_id}",
    "userName": "aliddell",
    "displayName": "Alice Liddell",
    "name": {
      "givenName": "Alice",
      "familyName": "Liddell"
    },
    "emails": [
      {
        "primary": true,
        "value": "alice@acme.com",
        "type": "work"
      }
    ],
    "locale": "en_US",
    "role": "Member"
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Users"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("POST", HttpRequest.BodyPublishers.ofString("{\"schemas\": [\"urn:ietf:params:scim:schemas:core:2.0:User\"], \"externalId\": \"{idp_provided_external_id}\", \"userName\": \"aliddell\", \"displayName\": \"Alice Liddell\", \"name\": {\"givenName\": \"Alice\", \"familyName\": \"Liddell\"}, \"emails\": [{\"primary\": true, \"value\": \"alice@acme.com\", \"type\": \"work\"}], \"locale\": \"en_US\", \"role\": \"Member\"}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "externalId": "{idp_provided_external_id}",
    "userName": "aliddell",
    "displayName": "Alice Liddell",
    "name": {
        "givenName": "Alice",
        "familyName": "Liddell"
    },
    "emails": [
        {
            "primary": True,
            "value": "alice@acme.com",
            "type": "work"
        }
    ],
    "locale": "en_US",
    "role": "Member"
}

response = requests.post("https://www.canva.com/_scim/v2/Users",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Post,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Users"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": [\"urn:ietf:params:scim:schemas:core:2.0:User\"], \"externalId\": \"{idp_provided_external_id}\", \"userName\": \"aliddell\", \"displayName\": \"Alice Liddell\", \"name\": {\"givenName\": \"Alice\", \"familyName\": \"Liddell\"}, \"emails\": [{\"primary\": true, \"value\": \"alice@acme.com\", \"type\": \"work\"}], \"locale\": \"en_US\", \"role\": \"Member\"}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": [
	    "urn:ietf:params:scim:schemas:core:2.0:User"
	  ],
	  "externalId": "{idp_provided_external_id}",
	  "userName": "aliddell",
	  "displayName": "Alice Liddell",
	  "name": {
	    "givenName": "Alice",
	    "familyName": "Liddell"
	  },
	  "emails": [
	    {
	      "primary": true,
	      "value": "alice@acme.com",
	      "type": "work"
	    }
	  ],
	  "locale": "en_US",
	  "role": "Member"
	}`)

	url := "https://www.canva.com/_scim/v2/Users"
	req, _ := http.NewRequest("POST", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Users", CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "externalId" => "{idp_provided_external_id}", "userName" => "aliddell", "displayName" => "Alice Liddell", "name" => [ "givenName" => "Alice", "familyName" => "Liddell" ], "emails" => [ [ "primary" => true, "value" => "alice@acme.com", "type" => "work" ] ], "locale" => "en_US", "role" => "Member" ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Users')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request['Authorization'] = 'Bearer {token}'
request['Content-Type'] = 'application/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "externalId": "{idp_provided_external_id}",
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "locale": "en_US",
  "role": "Member"
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 201 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the user. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `User`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="userName" type="string" required mode="output"> A unique identifier for the user. </Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="emails" type="object[]" required mode="output"> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required mode="output"&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required mode="output"&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required mode="output"&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="active" type="boolean" required mode="output"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop>

<Prop name="role" type="string" required mode="output"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="externalId" type="string" mode="output"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="name" type="name" mode="output"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string" mode="output"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string" mode="output"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string" mode="output"> The user's default location, for example en_AU. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "UAFdxab1abC",
  "externalId": "abcd1234",
  "meta": {
    "resourceType": "User",
    "created": "2023-09-18T06:08:35Z"
  },
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "active": true,
  "locale": "en_US",
  "role": "Member"
}

Error responses

400 Bad request

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No SSO configurations found, please check the settings page. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No SSO configurations found, please check the settings page",
  "status": "400"
}

403 Forbidden

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Email domain not authorized for SCIM.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Email domain not authorized for SCIM.",
  "status": "403"
}

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values:

  * `userName not available`
  * `Account with email can not be updated. User needs to accept SSO linking`
  * `Account with email already exists. User must first log in with SAML to confirm account ownership`
  * `Account with email is soft deleted. The user must first log in to reactivate their account`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "userName not available",
  "status": "409"
}

Delete Group

Deletes a user group. Users in the group are not removed.

HTTP method and URL path

DELETE https://www.canva.com/_scim/v2/Groups/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the group. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request DELETE 'https://www.canva.com/_scim/v2/Groups/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", {
  method: "DELETE",
  headers: {
    "Authorization": "Bearer {token}",
  },
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .method("DELETE", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}"
}

response = requests.delete("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}",
    headers=headers
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Delete,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	url := "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"
	req, _ := http.NewRequest("DELETE", url, nil)
	req.Header.Add("Authorization", "Bearer {token}")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "DELETE", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', ), ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups/{canva_scim_id}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Delete.new(url)
request['Authorization'] = 'Bearer {token}'

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns the status code 204 No content without a response body.

Error responses

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is group {canva_scim_id} not found. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "group {canva_scim_id} not found",
  "status": "404"
}

Delete User

The Canva SCIM API doesn't implement a REST DELETE operation for a SCIM user.

To deprovision a SCIM user, you can use the PATCH operation to set the user's active attribute to false. For more information, see Update individual attributes for a user.

Get Group

Gets information for a user group.

NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface.

HTTP method and URL path

GET https://www.canva.com/_scim/v2/Groups/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the group. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request GET 'https://www.canva.com/_scim/v2/Groups/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", {
  method: "GET",
  headers: {
    "Authorization": "Bearer {token}",
  },
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}"
}

response = requests.get("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}",
    headers=headers
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Get,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	url := "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Add("Authorization", "Bearer {token}")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', ), ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups/{canva_scim_id}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer {token}'

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the group. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the group.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `Group`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the group, suitable for display to end-users. </Prop>

<Prop name="members" type="object[]" required mode="output"> NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "GAFgrpb1abC",
  "meta": {
    "resourceType": "Group",
    "created": "2023-09-18T06:08:35Z"
  },
  "displayName": "White rabbits",
  "members": []
}

Error responses

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is group {canva_scim_id} not found. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "group {canva_scim_id} not found",
  "status": "404"
}

Get User

Gets information for a user.

HTTP method and URL path

GET https://www.canva.com/_scim/v2/Users/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the user. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Users/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request GET 'https://www.canva.com/_scim/v2/Users/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Users/{canva_scim_id}", {
  method: "GET",
  headers: {
    "Authorization": "Bearer {token}",
  },
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}"
}

response = requests.get("https://www.canva.com/_scim/v2/Users/{canva_scim_id}",
    headers=headers
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Get,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	url := "https://www.canva.com/_scim/v2/Users/{canva_scim_id}"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Add("Authorization", "Bearer {token}")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Users/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', ), ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Users/{canva_scim_id}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer {token}'

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the user. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `User`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="userName" type="string" required mode="output"> A unique identifier for the user. </Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="emails" type="object[]" required mode="output"> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required mode="output"&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required mode="output"&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required mode="output"&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="active" type="boolean" required mode="output"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop>

<Prop name="role" type="string" required mode="output"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="externalId" type="string" mode="output"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="name" type="name" mode="output"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string" mode="output"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string" mode="output"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string" mode="output"> The user's default location, for example en_AU. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "UAFdxab1abC",
  "externalId": "abcd1234",
  "meta": {
    "resourceType": "User",
    "created": "2023-09-18T06:08:35Z"
  },
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "active": true,
  "locale": "en_US",
  "role": "Member"
}

Error responses

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No user found for id {canva_scim_id}. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No user found for id {canva_scim_id}",
  "status": "404"
}

List Groups

Gets a paginated list of all user groups in a Canva team.

You can use the startIndex and count parameters to control the pagination of the response.

You can also provide a filter parameter to narrow down the groups returned to only include those matching the filter.

NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface.

HTTP method and URL path

GET https://www.canva.com/_scim/v2/Groups

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop> </Prop.List>

Query parameters

<Prop.List> <Prop name="startIndex" type="integer"> Used to paginate the response: the index of the first result to return. </Prop>

<Prop name="count" type="integer"> Used to paginate the response: the number of results to return. Must be between 1 and 10. </Prop>

<Prop name="filter" type="string"> A filter to narrow down the results returned, using the equals (eq) query parameter. The following filters are supported:

* Return the group matching the SCIM `displayName` value: `displayName eq "{display_name}"`.

  For example: `GET /_scim/v2/Groups?filter=displayName%20eq%20"White rabbits"`

</Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request GET 'https://www.canva.com/_scim/v2/Groups' \ --header 'Authorization: Bearer {token}' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups", {
  method: "GET",
  headers: {
    "Authorization": "Bearer {token}",
  },
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups"))
            .header("Authorization", "Bearer {token}")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}"
}

response = requests.get("https://www.canva.com/_scim/v2/Groups",
    headers=headers
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Get,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	url := "https://www.canva.com/_scim/v2/Groups"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Add("Authorization", "Bearer {token}")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', ), ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer {token}'

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:ListResponse. </Prop.Extras> </Prop>

<Prop name="totalResults" type="integer" required mode="output"> The total number of results matching the query. </Prop>

<Prop name="startIndex" type="integer" required mode="output"> The index of the first result. </Prop>

<Prop name="itemsPerPage" type="integer" required mode="output"> The number of results returned in the current page. </Prop>

<Prop name="resources" type="ScimGroupResponse[]" required mode="output"> An array of the groups returned in the current page of results.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;resources&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="schemas" type="string[]" required mode="output"&gt;
      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:Group`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="id" type="string" required mode="output"&gt;
      The Canva-generated SCIM ID for the group.
    &lt;/Prop&gt;

    &lt;Prop name="meta" type="object" required mode="output"&gt;
      Meta properties for the group.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="resourceType" type="string" required mode="output"&gt;
            The SCIM resource type of the object.

            &lt;Prop.Extras&gt;
              **Available values:** The only valid value is `Group`.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;

          &lt;Prop name="created" type="string" required mode="output"&gt;
            The timestamp when the object was created.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="displayName" type="string" required mode="output"&gt;
      The name of the group, suitable for display to end-users.
    &lt;/Prop&gt;

    &lt;Prop name="members" type="object[]" required mode="output"&gt;
      NOTE: The `members` array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:ListResponse"
  ],
  "totalResults": 1,
  "startIndex": 1,
  "itemsPerPage": 10,
  "resources": [
    {
      "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:Group"
      ],
      "id": "GAFgrpb1abC",
      "meta": {
        "resourceType": "Group",
        "created": "2023-09-18T06:08:35Z"
      },
      "displayName": "White rabbits",
      "members": []
    }
  ]
}

Error responses

403 Forbidden

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Unsupported filter field. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Unsupported filter field",
  "status": "403"
}

List Users

Gets a paginated list of all users in a Canva team, including inactive users.

You can use the startIndex and count parameters to control the pagination of the response.

You can also provide a filter parameter to narrow down the users returned to only include those matching the filter.

HTTP method and URL path

GET https://www.canva.com/_scim/v2/Users

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop> </Prop.List>

Query parameters

<Prop.List> <Prop name="startIndex" type="integer"> Used to paginate the response: the index of the first result to return. </Prop>

<Prop name="count" type="integer"> Used to paginate the response: the number of results to return. Must be between 1 and 10. </Prop>

<Prop name="filter" type="string"> A filter to narrow down the results returned, using the equals (eq) query parameter. The following filters are supported:

* Return the user matching the SCIM `userName` value: `userName eq "{saml_name_id}"`.

  For example: `GET /_scim/v2/Users?filter=userName%20eq%20"aliddell"`
* Return the user matching the SCIM `externalId` value: `externalId eq "{idp_provided_external_id}"`.

  For example: `GET /_scim/v2/Users?filter=externalId%20eq%20"abcdefgh12345678"`

</Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Users endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request GET 'https://www.canva.com/_scim/v2/Users' \ --header 'Authorization: Bearer {token}' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Users", {
  method: "GET",
  headers: {
    "Authorization": "Bearer {token}",
  },
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Users"))
            .header("Authorization", "Bearer {token}")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}"
}

response = requests.get("https://www.canva.com/_scim/v2/Users",
    headers=headers
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Get,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Users"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	url := "https://www.canva.com/_scim/v2/Users"
	req, _ := http.NewRequest("GET", url, nil)
	req.Header.Add("Authorization", "Bearer {token}")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Users", CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', ), ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Users')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer {token}'

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:ListResponse. </Prop.Extras> </Prop>

<Prop name="totalResults" type="integer" required mode="output"> The total number of results matching the query. </Prop>

<Prop name="startIndex" type="integer" required mode="output"> The index of the first result. </Prop>

<Prop name="itemsPerPage" type="integer" required mode="output"> The number of results returned in the current page. </Prop>

<Prop name="resources" type="ScimUserResponse[]" required mode="output"> An array of the users returned in the current page of results.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;resources&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="schemas" type="string[]" required mode="output"&gt;
      The URIs of the SCIM schemas.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="id" type="string" required mode="output"&gt;
      The Canva-generated SCIM ID for the user.
    &lt;/Prop&gt;

    &lt;Prop name="meta" type="object" required mode="output"&gt;
      Meta properties for the user.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="resourceType" type="string" required mode="output"&gt;
            The SCIM resource type of the object.

            &lt;Prop.Extras&gt;
              **Available values:** The only valid value is `User`.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;

          &lt;Prop name="created" type="string" required mode="output"&gt;
            The timestamp when the object was created.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="userName" type="string" required mode="output"&gt;
      A unique identifier for the user.
    &lt;/Prop&gt;

    &lt;Prop name="displayName" type="string" required mode="output"&gt;
      The name of the user, suitable for display to end-users.
    &lt;/Prop&gt;

    &lt;Prop name="emails" type="object[]" required mode="output"&gt;
      The email address for the user.

      NOTE: The Canva SCIM API only supports one email address for each user.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="primary" type="boolean" required mode="output"&gt;
            Whether the email is the primary address. Only one email address for a user can be the primary one.
          &lt;/Prop&gt;

          &lt;Prop name="value" type="string" required mode="output"&gt;
            The email address.
          &lt;/Prop&gt;

          &lt;Prop name="type" type="string" required mode="output"&gt;
            The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

            &lt;Prop.Extras&gt;
              **Available values:** The only valid value is `work`.
            &lt;/Prop.Extras&gt;
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="active" type="boolean" required mode="output"&gt;
      Whether the user account is active. Setting this to `false` deprovisions the user in Canva.
    &lt;/Prop&gt;

    &lt;Prop name="role" type="string" required mode="output"&gt;
      The role of the user.

      If an invalid value is provided, the role defaults to `Member`.

      NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

      &lt;Prop.Extras&gt;
        **Default value:** `Member`

        **Available values:**

        * `Member`
        * `Teacher`
        * `Staff`
        * `Admin`
        * `Template-designer`
        * `Aide`
        * `Administrator`
        * `School administrator`
        * `School`
        * `Tenant`
        * `Faculty`
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="externalId" type="string" mode="output"&gt;
      A string that is an identifier for the resource as defined by the provisioning client.
    &lt;/Prop&gt;

    &lt;Prop name="name" type="name" mode="output"&gt;
      The components of the user's name.

      &lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;}&gt;
        &lt;Prop.List&gt;
          &lt;Prop name="givenName" type="string" mode="output"&gt;
            The first or 'given' name for the user.
          &lt;/Prop&gt;

          &lt;Prop name="familyName" type="string" mode="output"&gt;
            The last or 'family' name for the user.
          &lt;/Prop&gt;
        &lt;/Prop.List&gt;
      &lt;/PillAccordion&gt;
    &lt;/Prop&gt;

    &lt;Prop name="locale" type="string" mode="output"&gt;
      The user's default location, for example `en_AU`.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:ListResponse"
  ],
  "totalResults": 1,
  "startIndex": 1,
  "itemsPerPage": 10,
  "resources": [
    {
      "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
      ],
      "id": "UAFdxab1abC",
      "externalId": "abcd1234",
      "meta": {
        "resourceType": "User",
        "created": "2023-09-18T06:08:35Z"
      },
      "userName": "aliddell",
      "displayName": "Alice Liddell",
      "name": {
        "givenName": "Alice",
        "familyName": "Liddell"
      },
      "emails": [
        {
          "primary": true,
          "value": "alice@acme.com",
          "type": "work"
        }
      ],
      "active": true,
      "locale": "en_US",
      "role": "Member"
    }
  ]
}

Error responses

400 Bad request

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No SSO configurations found, please check the settings page. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No SSO configurations found, please check the settings page",
  "status": "400"
}

403 Forbidden

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Unsupported filter field. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Unsupported filter field",
  "status": "403"
}

Update All Information Group

Replaces an existing group's information.

You must provide all the information for the group, as if you're creating the group for the first time. Any existing information for the group that isn't provided, including group members, is removed.

The members attribute of a group is an array of users, with each user represented as a value attribute that corresponds to the user's Canva SCIM ID.

If you only want to update a some of the group's attributes, you can use the PATCH operation.

NOTE: A maximum of 1000 group members are allowed in a PUT request.

NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface.

HTTP method and URL path

PUT https://www.canva.com/_scim/v2/Groups/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the group. </Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="displayName" type="string" required> The name of the group, suitable for display to end-users. </Prop>

<Prop name="members" type="object[]" required> The members of the group.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;members&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="value" type="string" required&gt;
      The Canva-generated SCIM ID for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request PUT 'https://www.canva.com/_scim/v2/Groups/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group", "displayName": "White rabbits", "members": [ { "value": "UAFdxab1abC" } ] }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", {
  method: "PUT",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
    "displayName": "White rabbits",
    "members": [
      {
        "value": "UAFdxab1abC"
      }
    ]
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("PUT", HttpRequest.BodyPublishers.ofString("{\"schemas\": \"urn:ietf:params:scim:schemas:core:2.0:Group\", \"displayName\": \"White rabbits\", \"members\": [{\"value\": \"UAFdxab1abC\"}]}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
    "displayName": "White rabbits",
    "members": [
        {
            "value": "UAFdxab1abC"
        }
    ]
}

response = requests.put("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Put,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": \"urn:ietf:params:scim:schemas:core:2.0:Group\", \"displayName\": \"White rabbits\", \"members\": [{\"value\": \"UAFdxab1abC\"}]}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
	  "displayName": "White rabbits",
	  "members": [
	    {
	      "value": "UAFdxab1abC"
	    }
	  ]
	}`)

	url := "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"
	req, _ := http.NewRequest("PUT", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => "urn:ietf:params:scim:schemas:core:2.0:Group", "displayName" => "White rabbits", "members" => [ [ "value" => "UAFdxab1abC" ] ] ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups/{canva_scim_id}')
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/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": "urn:ietf:params:scim:schemas:core:2.0:Group",
  "displayName": "White rabbits",
  "members": [
    {
      "value": "UAFdxab1abC"
    }
  ]
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the group. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the group.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `Group`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the group, suitable for display to end-users. </Prop>

<Prop name="members" type="object[]" required mode="output"> NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "GAFgrpb1abC",
  "meta": {
    "resourceType": "Group",
    "created": "2023-09-18T06:08:35Z"
  },
  "displayName": "White rabbits",
  "members": []
}

Error responses

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is group {canva_scim_id} not found. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "group {canva_scim_id} not found",
  "status": "404"
}

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Group with name {group_name} already exists.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Group with name White rabbits already exists.",
  "status": "409"
}

Update All Information User

Replaces an existing user's information.

You must provide all the information for the existing user, as if you're provisioning the user for the first time. This removes any existing information for the user that isn't provided.

If you only want to update a few of the user's attributes, you can use the PATCH operation.

HTTP method and URL path

PUT https://www.canva.com/_scim/v2/Users/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the user. </Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="userName" type="string" required> A unique identifier for the user. </Prop>

<Prop name="emails" type="object[]" required> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="externalId" type="string"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="displayName" type="string"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="name" type="name"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string"> The user's default location, for example en_AU. </Prop>

<Prop name="role" type="string"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="active" type="boolean"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Users/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request PUT 'https://www.canva.com/_scim/v2/Users/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "externalId": "{idp_provided_external_id}", "userName": "aliddell", "displayName": "Alice Liddell", "name": { "givenName": "Alice", "familyName": "Liddell" }, "emails": [ { "primary": true, "value": "alice@acme.com", "type": "work" } ], "locale": "en_US", "role": "Member" }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Users/{canva_scim_id}", {
  method: "PUT",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": [
      "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "externalId": "{idp_provided_external_id}",
    "userName": "aliddell",
    "displayName": "Alice Liddell",
    "name": {
      "givenName": "Alice",
      "familyName": "Liddell"
    },
    "emails": [
      {
        "primary": true,
        "value": "alice@acme.com",
        "type": "work"
      }
    ],
    "locale": "en_US",
    "role": "Member"
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("PUT", HttpRequest.BodyPublishers.ofString("{\"schemas\": [\"urn:ietf:params:scim:schemas:core:2.0:User\"], \"externalId\": \"{idp_provided_external_id}\", \"userName\": \"aliddell\", \"displayName\": \"Alice Liddell\", \"name\": {\"givenName\": \"Alice\", \"familyName\": \"Liddell\"}, \"emails\": [{\"primary\": true, \"value\": \"alice@acme.com\", \"type\": \"work\"}], \"locale\": \"en_US\", \"role\": \"Member\"}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
    ],
    "externalId": "{idp_provided_external_id}",
    "userName": "aliddell",
    "displayName": "Alice Liddell",
    "name": {
        "givenName": "Alice",
        "familyName": "Liddell"
    },
    "emails": [
        {
            "primary": True,
            "value": "alice@acme.com",
            "type": "work"
        }
    ],
    "locale": "en_US",
    "role": "Member"
}

response = requests.put("https://www.canva.com/_scim/v2/Users/{canva_scim_id}",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Put,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": [\"urn:ietf:params:scim:schemas:core:2.0:User\"], \"externalId\": \"{idp_provided_external_id}\", \"userName\": \"aliddell\", \"displayName\": \"Alice Liddell\", \"name\": {\"givenName\": \"Alice\", \"familyName\": \"Liddell\"}, \"emails\": [{\"primary\": true, \"value\": \"alice@acme.com\", \"type\": \"work\"}], \"locale\": \"en_US\", \"role\": \"Member\"}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": [
	    "urn:ietf:params:scim:schemas:core:2.0:User"
	  ],
	  "externalId": "{idp_provided_external_id}",
	  "userName": "aliddell",
	  "displayName": "Alice Liddell",
	  "name": {
	    "givenName": "Alice",
	    "familyName": "Liddell"
	  },
	  "emails": [
	    {
	      "primary": true,
	      "value": "alice@acme.com",
	      "type": "work"
	    }
	  ],
	  "locale": "en_US",
	  "role": "Member"
	}`)

	url := "https://www.canva.com/_scim/v2/Users/{canva_scim_id}"
	req, _ := http.NewRequest("PUT", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Users/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "PUT", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "externalId" => "{idp_provided_external_id}", "userName" => "aliddell", "displayName" => "Alice Liddell", "name" => [ "givenName" => "Alice", "familyName" => "Liddell" ], "emails" => [ [ "primary" => true, "value" => "alice@acme.com", "type" => "work" ] ], "locale" => "en_US", "role" => "Member" ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Users/{canva_scim_id}')
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/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "externalId": "{idp_provided_external_id}",
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "locale": "en_US",
  "role": "Member"
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the user. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `User`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="userName" type="string" required mode="output"> A unique identifier for the user. </Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="emails" type="object[]" required mode="output"> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required mode="output"&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required mode="output"&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required mode="output"&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="active" type="boolean" required mode="output"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop>

<Prop name="role" type="string" required mode="output"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="externalId" type="string" mode="output"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="name" type="name" mode="output"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string" mode="output"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string" mode="output"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string" mode="output"> The user's default location, for example en_AU. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "UAFdxab1abC",
  "externalId": "abcd1234",
  "meta": {
    "resourceType": "User",
    "created": "2023-09-18T06:08:35Z"
  },
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "active": true,
  "locale": "en_US",
  "role": "Member"
}

Error responses

400 Bad request

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No SSO configurations found, please check the settings page. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No SSO configurations found, please check the settings page",
  "status": "400"
}

403 Forbidden

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Email domain not authorized for SCIM.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Email domain not authorized for SCIM.",
  "status": "403"
}

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No user found for id {canva_scim_id}. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No user found for id {canva_scim_id}",
  "status": "404"
}

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values:

  * `userName not available`
  * `Account with email can not be updated. User needs to accept SSO linking`
  * `Account with email already exists. User must first log in with SAML to confirm account ownership`
  * `Account with email is soft deleted. The user must first log in to reactivate their account`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "userName not available",
  "status": "409"
}

Update Individual Attributes Group

Updates individual attributes for a group. To update a group's attributes, you must use the correct syntax for the operation, as defined in the SCIM specification.

The value attribute of an operation on the members path is an array of users, with each user represented as a value attribute that corresponds to the user's Canva SCIM ID.

For example, to remove a particular user from the group and add two others, you could use a request body similar to the following:

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
  ],
  "Operations": [
    {
      "op": "remove",
      "path": "members[value eq \"UAFdxab1abC\"]"
    },
    {
      "op": "add",
      "path": "members",
      "value": [
        {
          "value": "UAFdxcd1cdE"
        },
        {
          "value": "UAFdxfg1fgH"
        }
      ]
    }
  ]
}

WARNING: Doing a replace operation on the members path replaces the entire member list in the group. Doing a replace operation on the members path should be done in a separate request from any other add or remove operations on group membership.

NOTE: For add or remove operations, a maximum of 1000 group members are allowed in each value array.

NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface.

HTTP method and URL path

PATCH https://www.canva.com/_scim/v2/Groups/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the group. </Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:api:messages:2.0:PatchOp`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="Operations" type="object[]" required> List of patch operations

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;Operations&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="op" type="string" required&gt;
      The SCIM patch operation to perform.

      &lt;Prop.Extras&gt;
        **Available values:**

        * `add`
        * `remove`
        * `replace`
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="path" type="string"&gt;
      An attribute path describing the target of the operation. For more information, see the SCIM specification.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="object"&gt;
      The value to add, remove, or replace.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Groups/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request PATCH 'https://www.canva.com/_scim/v2/Groups/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": [ "urn:ietf:params:scim:api:messages:2.0:PatchOp" ], "Operations": [ { "op": "add", "path": "members", "value": [ { "value": "UAFdxcd1cdE" } ] } ] }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", {
  method: "PATCH",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": [
      "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ],
    "Operations": [
      {
        "op": "add",
        "path": "members",
        "value": [
          {
            "value": "UAFdxcd1cdE"
          }
        ]
      }
    ]
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("PATCH", HttpRequest.BodyPublishers.ofString("{\"schemas\": [\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"], \"Operations\": [{\"op\": \"add\", \"path\": \"members\", \"value\": [{\"value\": \"UAFdxcd1cdE\"}]}]}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ],
    "Operations": [
        {
            "op": "add",
            "path": "members",
            "value": [
                {
                    "value": "UAFdxcd1cdE"
                }
            ]
        }
    ]
}

response = requests.patch("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Patch,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": [\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"], \"Operations\": [{\"op\": \"add\", \"path\": \"members\", \"value\": [{\"value\": \"UAFdxcd1cdE\"}]}]}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": [
	    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
	  ],
	  "Operations": [
	    {
	      "op": "add",
	      "path": "members",
	      "value": [
	        {
	          "value": "UAFdxcd1cdE"
	        }
	      ]
	    }
	  ]
	}`)

	url := "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}"
	req, _ := http.NewRequest("PATCH", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Groups/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "PATCH", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => [ "urn:ietf:params:scim:api:messages:2.0:PatchOp" ], "Operations" => [ [ "op" => "add", "path" => "members", "value" => [ [ "value" => "UAFdxcd1cdE" ] ] ] ] ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Groups/{canva_scim_id}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request['Authorization'] = 'Bearer {token}'
request['Content-Type'] = 'application/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
  ],
  "Operations": [
    {
      "op": "add",
      "path": "members",
      "value": [
        {
          "value": "UAFdxcd1cdE"
        }
      ]
    }
  ]
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:schemas:core:2.0:Group. </Prop.Extras> </Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the group. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the group.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `Group`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the group, suitable for display to end-users. </Prop>

<Prop name="members" type="object[]" required mode="output"> NOTE: The members array returned in a group's API response is always empty, even if there are members in the group. To see members of a group, you must use the Canva web interface. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "GAFgrpb1abC",
  "meta": {
    "resourceType": "Group",
    "created": "2023-09-18T06:08:35Z"
  },
  "displayName": "White rabbits",
  "members": []
}

Error responses

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is group {canva_scim_id} not found. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "group {canva_scim_id} not found",
  "status": "404"
}

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Group with name {group_name} already exists.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Group with name White rabbits already exists.",
  "status": "409"
}

Update Individual Attributes User

Updates individual attributes for a user. To update a user's attributes, you must use the correct syntax for the operation, as defined in the SCIM specification.

For example, to update a user's work email and familyName values, use the following for the request body:

json
{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
  "Operations": [
    {
      "op": "replace",
      "path": "emails[type eq \"work\"].value",
      "value": "my.new.email@example.com"
    },
    {
      "op": "replace",
      "path": "name.familyName",
      "value": "New-Family-Name"
    }
  ]
}

To deprovision a SCIM user, you can use an operation to set the active attribute to false. For example:

json
{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
  "Operations": [
    {
      "op": "replace",
      "path": "active",
      "value": false
    }
  ]
}

Alternatively, you can provide an operation's value object as a list of paths and values to modify. For example:

json
{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
  "Operations": [
    {
      "op": "add",
      "value": {
        "name.givenName": "New-Given-Name",
        "name.familyName": "New-Family-Name",
        "externalId": "abcd1234"
      }
    }
  ]
}

HTTP method and URL path

PATCH https://www.canva.com/_scim/v2/Users/{canva_scim_id}

Header parameters

<Prop.List> <Prop name="Authorization" type="string" required> Provides credentials to authenticate the request, in the form of a Bearer token.

For example: `Authorization: Bearer {token}`

</Prop>

<Prop name="Content-Type" type="string" required> Indicates the media type of the information sent in the request. This must be set to application/scim+json.

For example: `Content-Type: application/scim+json`

</Prop> </Prop.List>

Path parameters

<Prop.List> <Prop name="canva_scim_id" type="string" required> The Canva-generated SCIM ID for the user. </Prop> </Prop.List>

Body parameters

<Prop.List> <Prop name="schemas" type="string[]" required> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:api:messages:2.0:PatchOp`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="Operations" type="object[]" required> List of patch operations

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;Operations&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="op" type="string" required&gt;
      The SCIM patch operation to perform.

      &lt;Prop.Extras&gt;
        **Available values:**

        * `add`
        * `remove`
        * `replace`
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="path" type="string"&gt;
      An attribute path describing the target of the operation. For more information, see the SCIM specification.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="object"&gt;
      The value to add, remove, or replace.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop> </Prop.List>

Example request

Examples for using the /_scim/v2/Users/{canva_scim_id} endpoint:

<Tabs storageKey="example.language" disableContentTransition> <Tab name="cURL"> sh curl --request PATCH 'https://www.canva.com/_scim/v2/Users/{canva_scim_id}' \ --header 'Authorization: Bearer {token}' \ --header 'Content-Type: application/scim+json' \ --data '{ "schemas": [ "urn:ietf:params:scim:api:messages:2.0:PatchOp" ], "Operations": [ { "op": "replace", "path": "name.familyName", "value": "Liddell" } ] }' </Tab>

<Tab name="Node.js"> ```js const fetch = require("node-fetch");

fetch("https://www.canva.com/_scim/v2/Users/{canva_scim_id}", {
  method: "PATCH",
  headers: {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json",
  },
  body: JSON.stringify({
    "schemas": [
      "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ],
    "Operations": [
      {
        "op": "replace",
        "path": "name.familyName",
        "value": "Liddell"
      }
    ]
  }),
})
  .then(async (response) => {
    const data = await response.json();
    console.log(data);
  })
  .catch(err => console.error(err));
```

</Tab>

<Tab name="Java"> ```java import java.io.IOException; import java.net.URI; import java.net.http.*;

public class ApiExample {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"))
            .header("Authorization", "Bearer {token}")
            .header("Content-Type", "application/scim+json")
            .method("PATCH", HttpRequest.BodyPublishers.ofString("{\"schemas\": [\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"], \"Operations\": [{\"op\": \"replace\", \"path\": \"name.familyName\", \"value\": \"Liddell\"}]}"))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient().send(
            request,
            HttpResponse.BodyHandlers.ofString()
        );
        System.out.println(response.body());
    }
}
```

</Tab>

<Tab name="Python"> ```py import requests

headers = {
    "Authorization": "Bearer {token}",
    "Content-Type": "application/scim+json"
}

data = {
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ],
    "Operations": [
        {
            "op": "replace",
            "path": "name.familyName",
            "value": "Liddell"
        }
    ]
}

response = requests.patch("https://www.canva.com/_scim/v2/Users/{canva_scim_id}",
    headers=headers,
    json=data
)
print(response.json())
```

</Tab>

<Tab name="C#"> ```csharp using System.Net.Http;

var client = new HttpClient();
var request = new HttpRequestMessage
{
  Method = HttpMethod.Patch,
  RequestUri = new Uri("https://www.canva.com/_scim/v2/Users/{canva_scim_id}"),
  Headers =
  {
    { "Authorization", "Bearer {token}" },
  },
  Content = new StringContent(
    "{\"schemas\": [\"urn:ietf:params:scim:api:messages:2.0:PatchOp\"], \"Operations\": [{\"op\": \"replace\", \"path\": \"name.familyName\", \"value\": \"Liddell\"}]}",
    Encoding.UTF8,
    "application/scim+json"
  ),
};

using (var response = await client.SendAsync(request))
{
  response.EnsureSuccessStatusCode();
  var body = await response.Content.ReadAsStringAsync();
  Console.WriteLine(body);
};
```

</Tab>

<Tab name="Go"> ```go package main

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

func main() {
	payload := strings.NewReader(`{
	  "schemas": [
	    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
	  ],
	  "Operations": [
	    {
	      "op": "replace",
	      "path": "name.familyName",
	      "value": "Liddell"
	    }
	  ]
	}`)

	url := "https://www.canva.com/_scim/v2/Users/{canva_scim_id}"
	req, _ := http.NewRequest("PATCH", url, payload)
	req.Header.Add("Authorization", "Bearer {token}")
	req.Header.Add("Content-Type", "application/scim+json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}
```

</Tab>

<Tab name="PHP"> ```php $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://www.canva.com/_scim/v2/Users/{canva_scim_id}", CURLOPT_CUSTOMREQUEST => "PATCH", CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => array( 'Authorization: Bearer {token}', 'Content-Type: application/scim+json', ), CURLOPT_POSTFIELDS => json_encode([ "schemas" => [ "urn:ietf:params:scim:api:messages:2.0:PatchOp" ], "Operations" => [ [ "op" => "replace", "path" => "name.familyName", "value" => "Liddell" ] ] ]) ));

$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);

if (empty($err)) {
  echo $response;
} else {
  echo "Error: " . $err;
}
```

</Tab>

<Tab name="Ruby"> ```ruby require 'net/http' require 'uri'

url = URI('https://www.canva.com/_scim/v2/Users/{canva_scim_id}')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Patch.new(url)
request['Authorization'] = 'Bearer {token}'
request['Content-Type'] = 'application/scim+json'
request.body = <<REQUEST_BODY
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:PatchOp"
  ],
  "Operations": [
    {
      "op": "replace",
      "path": "name.familyName",
      "value": "Liddell"
    }
  ]
}
REQUEST_BODY

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

</Tab> </Tabs>

Success response

If successful, the endpoint returns a 200 response with a JSON body with the following parameters:

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> The URIs of the SCIM schemas.

&lt;Prop.Extras&gt;
  **Available values:** The only valid value is `urn:ietf:params:scim:schemas:core:2.0:User`.
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="id" type="string" required mode="output"> The Canva-generated SCIM ID for the user. </Prop>

<Prop name="meta" type="object" required mode="output"> Meta properties for the user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;meta&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="resourceType" type="string" required mode="output"&gt;
      The SCIM resource type of the object.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `User`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;

    &lt;Prop name="created" type="string" required mode="output"&gt;
      The timestamp when the object was created.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="userName" type="string" required mode="output"> A unique identifier for the user. </Prop>

<Prop name="displayName" type="string" required mode="output"> The name of the user, suitable for display to end-users. </Prop>

<Prop name="emails" type="object[]" required mode="output"> The email address for the user.

NOTE: The Canva SCIM API only supports one email address for each user.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;emails&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="primary" type="boolean" required mode="output"&gt;
      Whether the email is the primary address. Only one email address for a user can be the primary one.
    &lt;/Prop&gt;

    &lt;Prop name="value" type="string" required mode="output"&gt;
      The email address.
    &lt;/Prop&gt;

    &lt;Prop name="type" type="string" required mode="output"&gt;
      The type of email address for the user. The Canva SCIM API only supports `work` as the type of the email address.

      &lt;Prop.Extras&gt;
        **Available values:** The only valid value is `work`.
      &lt;/Prop.Extras&gt;
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="active" type="boolean" required mode="output"> Whether the user account is active. Setting this to false deprovisions the user in Canva. </Prop>

<Prop name="role" type="string" required mode="output"> The role of the user.

If an invalid value is provided, the role defaults to `Member`.

NOTE: Except for `Member`, all other role values map to the Canva "Brand Designer" role. For more information on Canva roles, see Team roles and permissions.

&lt;Prop.Extras&gt;
  **Default value:** `Member`

  **Available values:**

  * `Member`
  * `Teacher`
  * `Staff`
  * `Admin`
  * `Template-designer`
  * `Aide`
  * `Administrator`
  * `School administrator`
  * `School`
  * `Tenant`
  * `Faculty`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="externalId" type="string" mode="output"> A string that is an identifier for the resource as defined by the provisioning client. </Prop>

<Prop name="name" type="name" mode="output"> The components of the user's name.

&lt;PillAccordion title={&lt;&gt;Properties of &lt;strong&gt;name&lt;/strong&gt;&lt;/&gt;} defaultExpanded={true}&gt;
  &lt;Prop.List&gt;
    &lt;Prop name="givenName" type="string" mode="output"&gt;
      The first or 'given' name for the user.
    &lt;/Prop&gt;

    &lt;Prop name="familyName" type="string" mode="output"&gt;
      The last or 'family' name for the user.
    &lt;/Prop&gt;
  &lt;/Prop.List&gt;
&lt;/PillAccordion&gt;

</Prop>

<Prop name="locale" type="string" mode="output"> The user's default location, for example en_AU. </Prop> </Prop.List>

Example response

json
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "UAFdxab1abC",
  "externalId": "abcd1234",
  "meta": {
    "resourceType": "User",
    "created": "2023-09-18T06:08:35Z"
  },
  "userName": "aliddell",
  "displayName": "Alice Liddell",
  "name": {
    "givenName": "Alice",
    "familyName": "Liddell"
  },
  "emails": [
    {
      "primary": true,
      "value": "alice@acme.com",
      "type": "work"
    }
  ],
  "active": true,
  "locale": "en_US",
  "role": "Member"
}

Error responses

400 Bad request

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No SSO configurations found, please check the settings page. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No SSO configurations found, please check the settings page",
  "status": "400"
}

403 Forbidden

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is Email domain not authorized for SCIM.. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "Email domain not authorized for SCIM.",
  "status": "403"
}

404 Not found

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values: The only valid value is No user found for id {canva_scim_id}. </Prop.Extras> </Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "No user found for id {canva_scim_id}",
  "status": "404"
}

409 Conflict

<Prop.List> <Prop name="schemas" type="string[]" required mode="output"> <Prop.Extras> Available values: The only valid value is urn:ietf:params:scim:api:messages:2.0:Error. </Prop.Extras> </Prop>

<Prop name="detail" type="string" required mode="output"> <Prop.Extras> Available values:

  * `userName not available`
  * `Account with email can not be updated. User needs to accept SSO linking`
  * `Account with email already exists. User must first log in with SAML to confirm account ownership`
  * `Account with email is soft deleted. The user must first log in to reactivate their account`
&lt;/Prop.Extras&gt;

</Prop>

<Prop name="status" type="string" required mode="output"> The HTTP status code of the error. </Prop> </Prop.List>

Example error response

json
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:Error"
  ],
  "detail": "userName not available",
  "status": "409"
}

Users Groups And Teams

Canva users are organized into organizations, teams, and groups. For Canva Enterprise customers, an Organization is the largest organizational unit, and can contain many teams, groups, and users. For non-enterprise customers, a Team is the largest organizational unit.

All users are in at least one team; including Canva Free and Canva Pro users, who are in their own (individual) teams. Users in a team have access to all content shared with that team and can easily share content with other team members.

Groups belong to a team and can't be shared between two teams. Users don't need to be part of a group, but they can be in one or more groups.

Canva Developer Documentation SOP Site