API Documentation

Skalio ID API Version 3

Welcome to the Skalio ID API, offering access to the Skalio ID project service. This document describes version 3 of the API.

Changelog

Major changes between v2 and v3:

Version 2 has been deprecated on 2023-04-14. It will remain available until further notice. Backwards compatibility will be attempted where possible, however this may result in a reduced information. Switching client applications to the v3 branch is highly recommended.

  • Signup no longer automatically creates organization and membership for the new person. A person must create or join an organization. Membership with a single organization is supported.

  • The ID token contains a ver claim, with value "3.0". This should help decoding the structure of tokens.

  • The ID token no longer holds the orgUnits claim. Instead the ID token contains the http://skalio.com/org_id and roles claims, describing organization membership and respective privileges.

  • An organization admin can manage its members by assigning roles.

  • A person can join an organization by accepting an invitation.

  • Upgrading an ID token is possible at any time. Depending on the circumstances, the claims of the ID token may not necessarily change. It can be seen as a refresh of the ID token.

  • An ID token can be parked and picked up again. This is helpful when redirecting authenticated persons to a different domain names in a web-browser.

  • Delay tokens have been removed. They are no longer issued or required.

Major changes between v1 and v2:

Version 1 has been deprecated on 2022-12-07. It will remain available until further notice. Backwards compatibility will be attempted where possible, however this may result in a reduced information.

  • Introduction of access tokens: most requests are authenticated by access tokens, which can be obtained by providing valid ID token.

  • Datastructure for organization has been split:

    • Fetching information about an organization from the public resource returns reduced information. In particular, subscription information is removed here. The same applies when navigating the profile of a person: the membership in an organization contains only limited information about it.
    • Accessing information via the authenticated organization resource provides full information, including subscriptions and the organizationProfile.
    • An organization can manage its avatar. Organization avatars are available via the public avatar resource.
    • The description of an organization has been removed due to lack of requirements.

Getting Started

Transport

The Spaces API is available via HTTPS only.

SSL 2.0 and SSL 3.0 are disabled.

The base URI for all resources is:

https://{hostname}/id/v3

Authorization

Most requests require an authorization token in order to function properly. See authentication and authorization for details.

Auth tokens follow the JSON Web Token format. To obtain an ID token, either provide valid credentials, complete the multi-factor authentication process, or provide your federated identity through Open ID connect. With a valid ID token, an access token can be obtained.

An ID token is long lived. During its validity, it can be used to obtain short lived access tokens from this or other backend services. Access tokens are used to authorize the interaction with the services. They are short lived and must be refreshed periodically.

Tokens are provided in the Authorization header of the HTTP request. Example:

> GET /id/v3/profile HTTP/2
> Host: id.skalio.dev
> user-agent: insomnia/2023.4.0
> authorization: Bearer eyJraWQiOiI5ZnVkMmw4XzlkX3BpMncxIiwiYWxnIjoiRVMyNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwOi8vc2thbGlvLmNvbSIsImF1ZCI6Imh0dHA6Ly9za2FsaW8uY29tL2lkIiwic3ViIjoiOXpwd3JvaGQ0NWxqbHF5MCIsImV4cCI6MTcwMTA4MTI3OSwic2lkIjoiXzhzcWo2eXVydThmaDg4diIsInNjb3BlIjoiYWNjZXNzIiwicm9sZXMiOlsiT3JnYW5pemF0aW9uLkFkbWluIiwiU2VydmljZS5BbGwuVXNlIl19.st1e7O2qyq9Q6xYoq8E4sZ1Elst8n_4M9yH73HOGVwXcZTP2VrKV8ir8FjKm41EICd36lXeCYYaGl3My3PAjgw
> accept: */*

< HTTP/2 200
< ... response ...

In some cases, the backend may blacklist and recreate an ID token for the principal as a consequence of a request. The newly issued ID token can be found in the Authorization header in the response.

Rate Limiting

Many resources are protected against misuse or overload caused by badly behaving clients through rate limits according to the Leaky Bucket Algorithm as a Queue concept. Buckets are initially empty. Every request attempts to add a drop to the bucket. If the capacity does not allow this, the request is rejected (see ‘HTTP 509 Rate Limit Exceeded’ in section ‘Error handling’). Buckets drain over time, reducing their specific level and allowing new requests.

HTTP headers inform about the current bucket properties:

  • X-RateLimit-Limit

    The total capacity of the current bucket.

    Example:

    X-RateLimit-Limit: 60
  • X-RateLimit-Remaining

    The remaining capacity in the current bucket. Once this value is exhausted, future requests will be rejected until the bucket has been drained sufficiently.

    Example:

    X-RateLimit-Remaining: 42

Different resources use different buckets:

Resource Bucket Identifier Capacity Drainrate [1/s]
Login Email-address of user 3 1/15
Environment no limit n/a n/a

API Deprecation

Over time, the backend may change and a new version of the API will be released. To inform developers and clients of upcoming changes, the server indicates API deprecation by sending a Warning header with warning-code 229.

Example:

Warning: 299 - “API Deprecation Warning: Support for this request will be dropped soon, please update your client.”

While API deprecation is indicated, the API call will still function as documented. At a later stage, support for individual API calls up to the complete API-path may be dropped. This is indicated by responding with HTTP status code 410 (see section ‘Error handling’).

Payload format

Unless explicitely stated, request and response bodies are encoded in JSON format. Appropriate headers (Content-Type: application/json, Accept: application/json) must be set.

Timestamps are encoded in ISO 8601 format, including timezone offset from UTC. Example:

{ “validDate”: “2037-12-31T15:29:59+00:00” }

Error handling

The API responds with different HTTP Status Codes and messages:

  • HTTP 400 Bad Request

    The request cannot be processed for syntax reasons. This could be because of a missing field, an incorrect type or an invalid value. The error message might provide more information. Check your code against the documentation. Retrying the request will not improve your chances of success.

    Example:

    {
        "error": {
          "code": 400001,
          "message": "The request cannot be fulfilled.",
          "details": ["Invalid or unsupported value.", "Please consult the documentation."]
        }
      }
  • HTTP 401 Not Authorized

    Your request is missing an authenticated session ID, your session ID has expired, or your user is not valid. Obtain a new session and/or authenticate it (see the AuthResource).

  • HTTP 403 Forbidden

    Your request was syntactically correct, but violated somehing else. Possible reasons are feature- and/or contract-limitations, accessing someone else’s data without authorization. Retrying the request will lead to the same result. The details of the message will provide more details.

    Example:

    {
      "error": {
        "code": 403001,
        "message": "This request is forbidden.",
        "details": ["TTL is not acceptable"]
      }
    }
  • HTTP 404 Not Found

    The request could not be fulfilled, since the resource or entity at the URI does not exist (anymore). Retrying is futile.

  • HTTP 405 Method Not Allowed

    The resource or entity does not support the HTTP method. Please consult the documentation.

  • HTTP 406 Not Acceptable

    The backend cannot supply the response in the requested mediatype (as per the Accept request header). Please consult the documentation. You can retry your request, specifying appropriate headers.

  • HTTP 409 Conflict

    The request was not successful, because the a persistence-opertion failed. This can be temporary, or because another operation has modified the data in the meantime. Reread your data again, apply your changes and retry the request. You haven’t broken anything yet.

  • HTTP 410 Gone

    The request was once valid but is no longer acceptable. This is a permanent situation. It indicates that parts of the API have since been deprecated and support for them has been dropped. It is recommended to consult the documentation and update clients.

  • HTTP 413 Request Entity Too Large

    The backend is unwilling or unable to process a request body of this size.

  • HTTP 415 Unsupported Mediatype

    The backend does not support the request payload, as announced in the Content-Type header.

  • HTTP 416 Range Not Satisfiable

    This occurs when an upload or download request does not provide acceptable values for headers Range or Content-Range.

  • HTTP 500 Server Error

    Oops! It looks like something went horribly wrong in the backend. You might want to get in touch with us.

  • HTTP 503 Maintenance

    The host you’re addressing is currently undergoing maintenance and is not serving requests. You can retry your request until is being accepted again.

  • HTTP 509 Rate Limit Exceeded

    The request was not accepted because of a rate limit violation. The API is protected against overload and bruteforce attacks with rate limits. See the section on rate limiting for details. The response contains a Retry-After header (in seconds) to assist in retrying the request again.

    Example:

    Retry-After: 23

Internationalization

Message Bundles

GET https://free.teambeam.de/api/id/v3/i18n/de_DE
Requestsexample 1example 2

Request the message bundle in PO-file format.

Headers
Accept: text/x-gettext-translation
Responses200404
Headers
Content-Type: text/x-gettext-translation
Body
msgstr ""
"Project-Id-Version: SkalioPush\n"
"Report-Msgid-Bugs-To: info@skalio.com\n"
"POT-Creation-Date: 2019-05-02 11:20+0200\n"
"PO-Revision-Date: \n"
"Last-Translator: Skalio GmbH <info@skalio.com>\n"
"Language-Team: Skalio GmbH <info@skalio.com>\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.7.4\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: src/main/java/com/skalio/skp/exceptions/BadRequest.java:18
msgid "The data cannot be parsed. Please send well-formed requests."
msgstr "Das Format der Daten ist nicht korrekt. Bitte versuchen Sie es erneut."
[...]

The requested locale is not supported or does not exist.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Request the message bundle in JSON-encoded JED format.

Headers
Accept: application/json
Responses200404
Headers
Content-Type: application/json
Body
{
   "domain" : "messages",
   "locale_data" : {
      "messages" : {
         "Folder quota exceeded." : [
            "Verzeichnisvolumen überschritten."
         ],
         "Please use only recipient groups that actually contain recipients." : [
            "Bitte verwenden Sie nur Empfängergruppen, die auch Empfänger beinhalten."
         ],
         "Maximum number of concurrent API requests reached." : [
            "Maximale Anzahl gleichzeitiger API Requests erreicht."
         ],
[...]

The requested locale is not supported or does not exist.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get Message bundles
GET/id/v3/i18n/{locale}

Returns the message bundle in the requested locale.

URI Parameters
HideShow
locale
Locales (required) Example: de_DE

Requested locale


Authentication

Signup

In order to use Skalio ID and other services that depend on it, a person can register by signing up to the service.

POST https://free.teambeam.de/api/id/v3/signup
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "address": "bob@example.test",
  "password": "CorrectHorseBatteryStaple",
  "name": "Bob",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Primary email address of the new person"
    },
    "password": {
      "type": "string",
      "description": "New password"
    },
    "name": {
      "type": "string",
      "description": "Optional name of the person"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    }
  }
}
Responses200403
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The email address is already in use.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Signup
POST/id/v3/signup

Registers a new person. The returned ID token has a short validity and reduced functionality. To overcome this, the person must confirm the email address and then authenticate himself.

The ID token is also delivered via the Authorization header.


OIDC

In order to use services that depend on Skalio ID, a person can authenticate themselves using and external Identity provider based on the OpenID Connect and OAuth 2.0 concepts. This acts as an alternative to signing up for a Skalio ID account.

Multiple OAuth flows are supported.

GET https://free.teambeam.de/api/id/v3/oidc/discovery
Responses200
Headers
Content-Type: application/json
Body
{
  "issuer": "https://skalio.com",
  "jwksUrl": "https://id.skalio.net/id/v3/auth/keys",
  "authUrl": "null",
  "tokenUrl": "null",
  "userinfoUrl": "null",
  "revocationUrl": "null",
  "responseTypes": "null",
  "responseModes": "null",
  "scopes": "null",
  "grantTypes": "null"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "issuer": {
      "type": "string",
      "description": "Identifies the token issuer."
    },
    "jwksUrl": {
      "type": "string",
      "description": "URL where public keys can be retrieved."
    },
    "authUrl": {
      "type": "string",
      "description": "Future use."
    },
    "tokenUrl": {
      "type": "string",
      "description": "Future use."
    },
    "userinfoUrl": {
      "type": "string",
      "description": "Future use."
    },
    "revocationUrl": {
      "type": "string",
      "description": "Future use."
    },
    "responseTypes": {
      "type": "string",
      "description": "Future use."
    },
    "responseModes": {
      "type": "string",
      "description": "Future use."
    },
    "scopes": {
      "type": "string",
      "description": "Future use."
    },
    "grantTypes": {
      "type": "string",
      "description": "Future use."
    }
  },
  "required": [
    "issuer",
    "jwksUrl"
  ]
}

Discovery
GET/id/v3/oidc/discovery

Returns the OpenID Connect discovery document. Applications and services integrating with Skalio ID for authentication purposes can query the backend for API endpoints regarding OpenID connect services.

This endpoint is ideally also available under the alias /.well-known/openid-configuration.

Full compliance with OpenID Connect is work in progress. Currently, the discovery document only provides the URL to the JSON Web Key Set.


POST https://free.teambeam.de/api/id/v3/oidc/auth/implicit
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}
Responses200400401403
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The external token is not provided, invalid or is missing fields.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The email address described in the external token is not verified.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The email address is already in use.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Implicit flow
POST/id/v3/oidc/auth/implicit

Authenticates the person based on an ID token from an external OIDC identity provider. If necessary, a Skalio ID person is created referencing the subject of the external ID token. Finally, a Skalio ID token is issued and returned.

The ID token is also delivered via the Authorization header.

If the external ID token matches a Skalio ID organization, the person becomes a member of that organization. This may fail if the organization’s member limit has been reached, in which case the authentication fails.


POST https://free.teambeam.de/api/id/v3/oidc/auth/code
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "code": "63ad6c5ac1614b5a",
  "issuer": "https://example.net",
  "clientId": "org.example.service.app.iOS",
  "code_verifier `ab12cd34`": "Hello, world!"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "code": {
      "type": "string",
      "description": "The authorization code as created by the external Identity provider."
    },
    "issuer": {
      "type": "string",
      "description": "The identifier of the extern identity provider."
    },
    "clientId": {
      "type": "string",
      "description": "The client ID that was used by the client when requesting the authorization code from the external identity provider."
    },
    "code_verifier `ab12cd34`": {
      "type": "string",
      "description": "A nonce that shall be used when requesting the token from the remote identity provider."
    }
  },
  "required": [
    "code",
    "issuer",
    "clientId"
  ]
}
Responses200400401403409
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The authorization code is not provided, invalid or missing fields.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The referenced ID provider cannot be found. Interacting with the external ID provider was not successful.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The email address is already in use.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Communication with the external ID provider failed. Please retry authentication.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authorization code flow
POST/id/v3/oidc/auth/code

Authenticates the person by exchanging an authorization code for the external ID token from the external OIDC provider. If necessary, a Skalio ID person is created referencing the subject of the external ID token. Finally, a Skalio ID token is issued and returned.

The ID token is also delivered via the Authorization header.

If the external ID token matches a Skalio ID organization, the person becomes a member of that organization. This may fail if the organization’s member limit has been reached, in which case the authentication fails.


POST https://free.teambeam.de/api/id/v3/oidc/auth
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "redirectUrl": "https://host.example.net/callback"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "redirectUrl": {
      "type": "string",
      "description": "The requested URL to redirect the client after successful form-post flow."
    }
  },
  "required": [
    "redirectUrl"
  ]
}
Responses200400409
Headers
Content-Type: application/json
Body
{
  "state": "f9f53e7539dc",
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "description": "The identifier for the incoming authentication flow."
    },
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT."
    }
  },
  "required": [
    "state"
  ]
}

The payload is not provided, invalid or missing fields.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Database error. Please retry authentication.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Preflight
POST/id/v3/oidc/auth

This request must be used to announce incoming formpost requests beforehand. The backend creates and returns a new random value to be used as state in the subsequent form-post flow. The response also contains a short lived token referencing the state. This token can be used to pickup the actual Skalio ID token after completion of the formpost request by the external identity provider.


POST https://free.teambeam.de/api/id/v3/oidc/auth/form
Requestsexample 1
Headers
Content-Type: application/x-www-form-urlencoded
Body
state=f9f53e7539dc&id_token=abc.123.def&session_state=x1y2z3&user={...}&error=
Responses302400401409

The authentication was successful.

Headers
location: https://host.example.net/static/callback/

The authorization code is not provided, invalid or missing fields.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The referenced ID provider cannot be found. Interacting with the external ID provider was not successful.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Communication with the external ID provider failed. Please retry authentication.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Formpost flow
POST/id/v3/oidc/auth/form

Implements the endpoint where the external identity provider submits their ID token when authentication is executed via the formpost flow. If necessary, a Skalio ID person is created referencing the subject of the external ID token.

The client must have requested the creation of a state during the preflight request. This value must be used to initiate the form-post flow, and the external OIDC provider shall use it during its form-post here.

The response redirects the client to the URL that was registered during the preflight request. Possible error strings from the external identity provider will be appended to the redirect URL as query parameter error.

This resource is not intended to be used by clients. Instead, the external identity provider submits the ID token, and it is expected that the response is returned to the client.

Note: No Skalio ID token is created as part of this request. Instead, the client is expected to register the state in the preflight request and pickup the token afterwards.

If the external ID token matches a Skalio ID organization, the person becomes a member of that organization. This may fail if the organization’s member limit has been reached, in which case the authentication fails.

Supported parameters:

  • state (string, required): references the state created during pre-flight request.

  • id_token (string, required): the external JWT, identifying the person.

  • session_state (string, optional): an optional reference to the session of the original identity provider from which the request was issued. If set, can be used for single-logout.

  • user (JSON, optional): an optional JSON string, describing the details of the person. Only used by Apple.

  • error (string, optional): if present, it indicates the request was not successful.


GET https://free.teambeam.de/api/id/v3/oidc/auth
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401403
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The token is missing, invalid or expired. The state has expired or does not exist.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The Skalio ID token referenced by the state has already been claimed before.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Pickup ID token
GET/id/v3/oidc/auth

After completing the formpost flow, the client can use the token issued in the preflight request to fetch the Skalio ID token assigned to the state.

Note: the Skalio ID token matching the state can be picked up only once. Pickup must happen within 5 minutes of the incoming formpost, and with a valid pickup-token.

The ID token is also delivered via the Authorization header.


GET https://free.teambeam.de/api/id/v3/oidc/auth/logout?sid=x1y2z3
Responses204
This response has no content.

Single Logout
GET/id/v3/oidc/auth/logout?sid={sessionId}

API endpoint supporting OIDC front-channel logout. An external identity provider can call this endpoint to terminate all local sessions (= ID tokens) issued from within its session.

Only works, if the IDP previously issued ID tokens containing an sid claim, or specified the session_state in the form-post flow.

If a matching external session ID exists, all related Skalio ID tokens are blacklisted.

URI Parameters
HideShow
sessionId
string (required) Example: x1y2z3

The external session ID.


Authentication using Skalio ID

GET https://free.teambeam.de/api/id/v3/auth/keys
Responses200
Headers
Content-Type: application/json
Body
{
  "keys": [
    {
      "kid": "E7aBpD2f",
      "kty": "EC",
      "crv": "P-256",
      "x": "DtteGBtczOtBHwgKe8AjWzH9AOcDBl-kohJ6yHDJLFQ=",
      "y": "O5KV0_DeP7-MtZgVz9apsdJdWpg-GHMftTYLMIeRo6Q=",
      "use": "sig"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "keys": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kid": {
            "type": "string",
            "enum": [
              "E7aBpD2f"
            ],
            "description": "Key identifier."
          },
          "kty": {
            "type": "string",
            "enum": [
              "EC"
            ],
            "description": "Type of key. One of `EC`, `RSA`."
          },
          "crv": {
            "type": "string",
            "enum": [
              "P-256"
            ],
            "description": "Describes the EC curve."
          },
          "x": {
            "type": "string",
            "enum": [
              "DtteGBtczOtBHwgKe8AjWzH9AOcDBl-kohJ6yHDJLFQ="
            ],
            "description": "Position on the EC curve."
          },
          "y": {
            "type": "string",
            "enum": [
              "O5KV0_DeP7-MtZgVz9apsdJdWpg-GHMftTYLMIeRo6Q="
            ],
            "description": "Position on the EC curve."
          },
          "use": {
            "type": "string",
            "enum": [
              "sig"
            ],
            "description": "Purpose of the key."
          }
        },
        "required": [
          "kid",
          "kty",
          "crv",
          "x",
          "y",
          "use"
        ],
        "additionalProperties": false
      },
      "description": "List of possible public keys."
    }
  },
  "required": [
    "keys"
  ]
}

Get public signing keys
GET/id/v3/auth/keys

Returns a JSON Web Key Set containing public keys that can be used to verify token signed by this service. The JWT header field kid references the matching public key.

Keys are rotated automatically. It is advised to fetch the JWKS regularly and not cache its contents.


POST https://free.teambeam.de/api/id/v3/auth/exists
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "address": "bob@example.org"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Email address"
    }
  }
}
Responses200400404

The requested email address is in use by a Skalio ID person.

Headers
Content-Type: application/json
Body
{
  "provider": "http://skalio.com"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "enum": [
        "http://skalio.com",
        "https://appleid.apple.com",
        "https://accounts.google.com"
      ],
      "description": "References the identity provider of the person."
    }
  },
  "required": [
    "provider"
  ]
}

The payload is null or not valid.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The requested email address is not known to Skalio ID.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Exists
POST/id/v3/auth/exists

Checks whether an email address exists within Skalio ID, i.e. is associated with a Skalio ID person.

Clients can use the response to control the sign-in/sign-up process:

  • select the identity provider to authenticate against

  • correctly chose sign-in vs sign-up as the next step


POST https://free.teambeam.de/api/id/v3/auth/login
Requestsexample 1example 2

Single-factor or first-factor authentication

Headers
Content-Type: application/json
Body
{
  "email": "alice@example.net",
  "type": "bcrypt",
  "key": "CorrectHorseBatteryStaple"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Email address of a person"
    },
    "type": {
      "type": "string",
      "enum": [
        "bcrypt",
        "totp",
        "sms",
        "u2f",
        "recovery"
      ],
      "description": "Type of authenticator"
    },
    "key": {
      "type": "string",
      "description": "Authentication data"
    }
  }
}
Responses200401
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

Invalid credentials are rejected

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Second-factor authentication

Headers
Content-Type: application/json
Authorization: Bearer ...mfa-token...
Body
{
  "email": "alice@example.net",
  "type": "totp",
  "key": "123456"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Email address of a person"
    },
    "type": {
      "type": "string",
      "description": "Type of authenticator"
    },
    "key": {
      "type": "string",
      "description": "Authentication data"
    }
  }
}
Responses200400401
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

Mfa-token is missing or not valid. The authenticator is not supported or not verified.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Invalid credentials are rejected

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Login
POST/id/v3/auth/login

Authenticates a person based on given credentials (combination of identifier and authenticator).

If the person is using single-factor authentication or is completing multi-factor authentication, the response contains a JWT with scope idtoken. Such a token can be used to obtain an access token from this or other backend services.

The ID token is also delivered via the Authorization header.

Note: ID tokens must be kept safe and transmitted securely.

With multi-factor authentication enabled, the successful authentication using bcrypt results in a JWT with scope mfa. The authenticators claim describes available types of second-factor authenticators. This mfa-token must be provided in the authorization header when submitting the credentials containing the second factor.


GET https://free.teambeam.de/api/id/v3/auth
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "tokens": [
    {
      "jti": "abc123",
      "issuedTimestamp": "Hello, world!",
      "expirationTimestamp": "Hello, world!",
      "userAgent": "Hello, world!",
      "ip": "Hello, world!"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "tokens": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "jti": {
            "type": "string",
            "enum": [
              "abc123"
            ],
            "description": "Unique reference and identifier of this token"
          },
          "issuedTimestamp": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "Timestamp when the token was issued"
          },
          "expirationTimestamp": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "Timestamp when the token will expire"
          },
          "userAgent": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "The user agent of the client that requested the token"
          },
          "ip": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "The public IP address of the client that requested the token"
          }
        },
        "required": [
          "jti",
          "issuedTimestamp",
          "expirationTimestamp",
          "userAgent",
          "ip"
        ],
        "additionalProperties": false
      },
      "description": "List of tokens"
    }
  },
  "required": [
    "tokens"
  ]
}

List tokens
GET/id/v3/auth

Returns a list of unexpired ID tokens that have been issued for the person.

Requests must be authenticated with an ID token.


POST https://free.teambeam.de/api/id/v3/auth/uid
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

New UID token
POST/id/v3/auth/uid

Creates a new uid token. The token has a long lifetime and is used to identify this person in otherwise unauthenticated requests.

A uid token cannot be revoked.

Requests must be authenticated with an ID token.


POST https://free.teambeam.de/api/id/v3/auth/upgrade
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401

The upgrade was successful and a new token has been issued.

Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Upgrade ID token
POST/id/v3/auth/upgrade

Replaces the given ID token with a new ID token. The ID token used to authenticate this request is blacklisted. A token can be upgraded at any time.

Depending on the circumstances, the claims of the new ID token may have changed:

  • Verifying a previously unverified email address results in a higher authLevel.

  • Changes in memberships of organizations are reflected in the roles claim.

  • The expiration time of the original ID token is transferred to the refreshed token, unless the authLevel is changed.

The ID token is also delivered via the Authorization header.

Requests must be authenticated with an ID token.


POST https://free.teambeam.de/api/id/v3/auth/park
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401404

The ID token was accepted and a pickup token is issued in return. The original ID token is blacklisted.

Headers
Content-Type: application/json
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The ID token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No person found matching the ID token.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Park ID token
POST/id/v3/auth/park

Exchanges the ID token against a short-lived single-use pickup token with scope park.

In the process, the ID token is actually blacklisted and can no longer be used. When retrieving the parked ID token, a new token is issued.

Requests must be authenticated with an ID token.


GET https://free.teambeam.de/api/id/v3/auth/park
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401404

The pickup token was accepted and a new ID token is issued.

Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The pickup token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No parked token or person found matching the pickup token.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Retrieve parked ID token
GET/id/v3/auth/park

Returns the parked ID token previously handed in during the park request.

Since the original ID token was blacklisted during the park-request, the backend will issue a new ID token, but with the original validity time.

The ID token is also delivered via the Authorization header.

Requests must be authenticated with a pickup token with scope park.


POST https://free.teambeam.de/api/id/v3/auth/access?cookie=cookie
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401

An access token has been issued.

Headers
Content-Type: application/json
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Obtain access token
POST/id/v3/auth/access?cookie={cookie}

To interact with Skalio ID, a short lived access token is required.

Requests must be authenticated with an ID token.

URI Parameters
HideShow
cookie
boolean (optional) 

If true, the access token will be issued as a cookie as well. Default: false.


POST https://free.teambeam.de/api/id/v3/auth/logout?jti=jti
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403
This response has no content.

The requested token belongs to someone else.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Logout
POST/id/v3/auth/logout?jti={jti}

Deauthenticates a person and blacklists the token against further use. If no token is specified, the token that authenticates this request is blacklisted (self-logout).

Specifying keyword all as value to parameter jti ensures that the authenticated person is logged out everywhere. In other words, this ends all sessions of the authenticated person, including the active session.

Requests must be authenticated with an ID token.

URI Parameters
HideShow
jti
string (optional) 

optional transaction id of the token to be blacklisted. Use all to end all sessions.


POST https://free.teambeam.de/api/id/v3/auth/reset
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "address": "bob@example.org"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Email address"
    }
  }
}
Responses204403
This response has no content.

The requested email address does not exist or is not verified. The person has no password-based authenticator.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Password recovery
POST/id/v3/auth/reset

Triggers the password recovery process. The person must provide an existing, verified email address. The person must have a bcrypt authenticator.


POST https://free.teambeam.de/api/id/v3/auth/reset/s0ga45as-4.sd9ya5
Responses200404
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Body
{
  "token": "abcdef.123456.ghijkl"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "The Base64 encoded and signed JWT"
    }
  }
}

Key not found, or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Password reset
POST/id/v3/auth/reset/{key}

Authenticates the person based on the password recovery key. If the key is valid and not yet expired, it returns an ID token with short validity, containing a setPassword claim. When exchanged for an access token, this claim is transferred.

The ID token is also delivered via the Authorization header.

An access token containing the setPassword claim allows changing the bcrypt authenticator (“password”) without having to provide the current password.

URI Parameters
HideShow
key
string (required) Example: s0ga45as-4.sd9ya5

The key as sent in the password recovery email.


Profile

Profile Management

The subject of all requests in this resource is always the authenticated principal. It is not possible to list or modify the data of another person through this resource.

The profile contains several timestamps:

  • createdAt is set at account creation, never updated

  • lastLoginAt is set after every successful login

GET https://free.teambeam.de/api/id/v3/profile
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "name": "Horst Groby",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "uid": "533h18.ygguv_b_0",
  "hasAvatar": true,
  "fingerprint": [
    {
      "name": "christmasTree",
      "codePoint": 127876,
      "title": "christmas tree"
    }
  ],
  "createdAt": "2022-05-11T10:50:50Z",
  "lastLoginAt": "2022-06-17T12:46:56Z",
  "emails": [
    {
      "address": "bob@example.org",
      "primary": true,
      "verified": true,
      "removeAt": "null"
    }
  ],
  "membership": {
    "organization": {
      "uid": "n_gwumunrj77j-r0",
      "name": "Example Inc",
      "hasAvatar": true,
      "selfSignup": false,
      "locale": "de_DE",
      "timeZone": "Europe/Berlin",
      "globalSignature": "Hello, world!",
      "legalNoticeUrl": "https://www.example.test/imprint/",
      "privacyPolicyUrl": "https://www.example.test/privacy/",
      "hostname": "teambeam.example.test",
      "mfaRequired": false
    },
    "roles": [
      "Organization.Admin"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "fingerprint": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "christmasTree"
            ],
            "description": "The unique name of the emoji"
          },
          "codePoint": {
            "type": "number",
            "enum": [
              127876
            ],
            "description": "The emoji's codepoint in Unicode"
          },
          "title": {
            "type": "string",
            "enum": [
              "christmas tree"
            ],
            "description": "The english translation key"
          }
        },
        "required": [
          "name",
          "codePoint",
          "title"
        ],
        "additionalProperties": false
      },
      "description": "The persons fingerprint"
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the person was created"
    },
    "lastLoginAt": {
      "type": "string",
      "description": "Timestamp when the person has last authenticated"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Email address"
          },
          "primary": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "The primary address will receive notifications. Readonly."
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the owner has proven control over it. Readonly."
          },
          "removeAt": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "null",
              null
            ],
            "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
          }
        },
        "required": [
          "address",
          "primary",
          "verified",
          "removeAt"
        ],
        "additionalProperties": false
      },
      "description": "List of email addresses"
    },
    "membership": {
      "type": "object",
      "properties": {
        "organization": {
          "type": "object",
          "properties": {
            "uid": {
              "type": "string",
              "description": "Unique ID of the organization."
            },
            "name": {
              "type": "string",
              "description": "The name of the organization."
            },
            "hasAvatar": {
              "type": "boolean",
              "description": "True if the organization has an avatar."
            },
            "selfSignup": {
              "type": "boolean",
              "description": "Shows if the organization allows self-signup. This is true for the \"free\" organization."
            },
            "locale": {
              "type": "string",
              "enum": [
                "de_DE",
                "en_US",
                "fr_FR",
                "ru_RU",
                "ko_KR",
                "zh_CN",
                "zh_TW",
                "ja_JP"
              ],
              "description": "The default locale of the organization."
            },
            "timeZone": {
              "type": "string",
              "description": "The default time zone of the organization."
            },
            "globalSignature": {
              "type": "string",
              "description": "A corporate email signature."
            },
            "legalNoticeUrl": {
              "type": "string",
              "description": "A URL pointing to a legal notice document."
            },
            "privacyPolicyUrl": {
              "type": "string",
              "description": "A URL pointing to a privacy policy document."
            },
            "hostname": {
              "type": "string",
              "description": "The active hostname where the service for the organization is hosted."
            },
            "mfaRequired": {
              "type": "boolean",
              "description": "Shows if the organization requires members to use multi-factor authentication."
            }
          },
          "required": [
            "uid",
            "name",
            "hasAvatar",
            "selfSignup",
            "locale",
            "timeZone",
            "mfaRequired"
          ]
        },
        "roles": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "Organization.Admin",
              "Contract.Admin",
              "Contract.Read",
              "Service.Transfer.Use",
              "Service.Transfer.Archive.CreateRoot",
              "Service.Drive.CreateSpace",
              "Service.All.Use",
              "Service.Spaces.Use"
            ]
          },
          "description": "List of roles the person has in the organization; can be empty"
        }
      },
      "required": [
        "roles"
      ],
      "description": "Membership of an organization, or null if not a member"
    }
  },
  "required": [
    "fingerprint",
    "emails"
  ]
}

Get Profile
GET/id/v3/profile

This returns the complete profile of the principal.

Requests must be authenticated with an access token.


PUT https://free.teambeam.de/api/id/v3/profile
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "name": "Horst Groby",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    }
  }
}
Responses200
Headers
Content-Type: application/json
Body
{
  "name": "Horst Groby",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "uid": "533h18.ygguv_b_0",
  "hasAvatar": true,
  "fingerprint": [
    {
      "name": "christmasTree",
      "codePoint": 127876,
      "title": "christmas tree"
    }
  ],
  "createdAt": "2022-05-11T10:50:50Z",
  "lastLoginAt": "2022-06-17T12:46:56Z",
  "emails": [
    {
      "address": "bob@example.org",
      "primary": true,
      "verified": true,
      "removeAt": "null"
    }
  ],
  "membership": {
    "organization": {
      "uid": "n_gwumunrj77j-r0",
      "name": "Example Inc",
      "hasAvatar": true,
      "selfSignup": false,
      "locale": "de_DE",
      "timeZone": "Europe/Berlin",
      "globalSignature": "Hello, world!",
      "legalNoticeUrl": "https://www.example.test/imprint/",
      "privacyPolicyUrl": "https://www.example.test/privacy/",
      "hostname": "teambeam.example.test",
      "mfaRequired": false
    },
    "roles": [
      "Organization.Admin"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "fingerprint": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "christmasTree"
            ],
            "description": "The unique name of the emoji"
          },
          "codePoint": {
            "type": "number",
            "enum": [
              127876
            ],
            "description": "The emoji's codepoint in Unicode"
          },
          "title": {
            "type": "string",
            "enum": [
              "christmas tree"
            ],
            "description": "The english translation key"
          }
        },
        "required": [
          "name",
          "codePoint",
          "title"
        ],
        "additionalProperties": false
      },
      "description": "The persons fingerprint"
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the person was created"
    },
    "lastLoginAt": {
      "type": "string",
      "description": "Timestamp when the person has last authenticated"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Email address"
          },
          "primary": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "The primary address will receive notifications. Readonly."
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the owner has proven control over it. Readonly."
          },
          "removeAt": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "null",
              null
            ],
            "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
          }
        },
        "required": [
          "address",
          "primary",
          "verified",
          "removeAt"
        ],
        "additionalProperties": false
      },
      "description": "List of email addresses"
    },
    "membership": {
      "type": "object",
      "properties": {
        "organization": {
          "type": "object",
          "properties": {
            "uid": {
              "type": "string",
              "description": "Unique ID of the organization."
            },
            "name": {
              "type": "string",
              "description": "The name of the organization."
            },
            "hasAvatar": {
              "type": "boolean",
              "description": "True if the organization has an avatar."
            },
            "selfSignup": {
              "type": "boolean",
              "description": "Shows if the organization allows self-signup. This is true for the \"free\" organization."
            },
            "locale": {
              "type": "string",
              "enum": [
                "de_DE",
                "en_US",
                "fr_FR",
                "ru_RU",
                "ko_KR",
                "zh_CN",
                "zh_TW",
                "ja_JP"
              ],
              "description": "The default locale of the organization."
            },
            "timeZone": {
              "type": "string",
              "description": "The default time zone of the organization."
            },
            "globalSignature": {
              "type": "string",
              "description": "A corporate email signature."
            },
            "legalNoticeUrl": {
              "type": "string",
              "description": "A URL pointing to a legal notice document."
            },
            "privacyPolicyUrl": {
              "type": "string",
              "description": "A URL pointing to a privacy policy document."
            },
            "hostname": {
              "type": "string",
              "description": "The active hostname where the service for the organization is hosted."
            },
            "mfaRequired": {
              "type": "boolean",
              "description": "Shows if the organization requires members to use multi-factor authentication."
            }
          },
          "required": [
            "uid",
            "name",
            "hasAvatar",
            "selfSignup",
            "locale",
            "timeZone",
            "mfaRequired"
          ]
        },
        "roles": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "Organization.Admin",
              "Contract.Admin",
              "Contract.Read",
              "Service.Transfer.Use",
              "Service.Transfer.Archive.CreateRoot",
              "Service.Drive.CreateSpace",
              "Service.All.Use",
              "Service.Spaces.Use"
            ]
          },
          "description": "List of roles the person has in the organization; can be empty"
        }
      },
      "required": [
        "roles"
      ],
      "description": "Membership of an organization, or null if not a member"
    }
  },
  "required": [
    "fingerprint",
    "emails"
  ]
}

Update Profile
PUT/id/v3/profile

The principal can change only a select number of fields here. Others, such as email addresses need, to be changed via their respective resources.

Requests must be authenticated with an access token.


DELETE https://free.teambeam.de/api/id/v3/profile
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403
This response has no content.

The delete operation cannot be executed since its outcome would conflict with integrity constraints of the persons organization. The organization must be deleted first.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Account Deletion
DELETE/id/v3/profile

Deletes the account permanently. Cascades to other applications.

Requests must be authenticated with an access token.


Avatar Management

A person can upload an image to represent his account in public. The avatar image can later be requested without authorization by querying the public avatar resource.

PUT https://free.teambeam.de/api/id/v3/profile/avatar
Requestsexample 1
Headers
Content-Type: image/jpg
Authorization: Bearer abcdef.123456.ghijkl
Body
{... payload ...}
Responses200400
Headers
Content-Type: image/jpeg
Location: /id/v3/profile/avatar
Body
{... payload ...}

The image could not be processed.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Upload Avatar
PUT/id/v3/profile/avatar

The resource accept payload with the following content types only:

  • image/jpeg

  • image/png

  • image/gif

An uploaded avatar is cropped to a square size, resized multiple times and re-encoded to JPG:

  • 500x500

  • 240x240

  • 160x160

  • 80x80

Updating an avatar triggers a SignalingEvent of type PROFILE_AVATAR_UPDATED into the feed of interested persons.

Requests must be authenticated with an access token.


GET https://free.teambeam.de/api/id/v3/profile/avatar?height=80
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200404
Headers
Content-Type: image/jpeg
Etag: "213508"
Body
{... payload ...}

No avatar has been uploaded.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get Avatar
GET/id/v3/profile/avatar?height={height}

Return the avatar of the principal, if one has been uploaded.

Avatars get resized only during the upload of a new image. When requesting a specific height, the backend attempts to deliver the closest matching image, but will not resize it exactly to the requested dimensions.

Requests must be authenticated with an access token. The token may be provided in the Authorization header or in the form of a cookie with name acct. If both are present, the header will be evaluated only.

URI Parameters
HideShow
height
number (optional) Example: 80

the requested size of the avatar image


DELETE https://free.teambeam.de/api/id/v3/profile/avatar
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204
This response has no content.

Delete Avatar
DELETE/id/v3/profile/avatar

Removes the persons avatar if one has been uploaded.

Deleting an avatar triggers a SignalingEvent of type PROFILE_AVATAR_UPDATED into the feed of interested persons.

Requests must be authenticated with an access token.


Email Management

A person can register any number of email addresses for his account. Before an email address can be used, it must be verified. Email verification confirms that the person has control over the claimed address.

At all times, exactly one verified email address of a person is marked as primary. A person will receive notifications on his primary email address only.

Requesting and confirming verification of an email address is heavily rate-limited.

GET https://free.teambeam.de/api/id/v3/profile/emails
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "emails": [
    {
      "address": "bob@example.org",
      "primary": true,
      "verified": true,
      "removeAt": "null"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "emails": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Email address"
          },
          "primary": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "The primary address will receive notifications. Readonly."
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the owner has proven control over it. Readonly."
          },
          "removeAt": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "null",
              null
            ],
            "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
          }
        },
        "required": [
          "address",
          "primary",
          "verified",
          "removeAt"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "emails"
  ]
}

List addresses
GET/id/v3/profile/emails

Lists all email addresses of the person.

Requests must be authenticated with an access token.


POST https://free.teambeam.de/api/id/v3/profile/emails
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "address": "bob@example.org"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Email address"
    }
  }
}
Responses201400403
Headers
Content-Type: application/json
Location: /id/v3/profile/emails/{address}
Body
{
  "address": "bob@example.org",
  "primary": true,
  "verified": true,
  "removeAt": "null"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Email address"
    },
    "primary": {
      "type": "boolean",
      "description": "The primary address will receive notifications. Readonly."
    },
    "verified": {
      "type": "boolean",
      "description": "True if the owner has proven control over it. Readonly."
    },
    "removeAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
    }
  }
}

The requested email address is not valid.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The email address is already in use.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Register new Address
POST/id/v3/profile/emails

Creates a new unverified, secondary email address for this person and triggers the verification process. Throws an error, if the requested email address is already in use anywhere.

The primary address used during signup must be verified before additional addresses can be registered.

Requests must be authenticated with an access token.


DELETE https://free.teambeam.de/api/id/v3/profile/emails/bob@example.org
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403
This response has no content.

The requested email address is marked as primary or belongs to someone else.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Delete Email Address
DELETE/id/v3/profile/emails/{address}

Removes the requested address. Throws an error, if the requested address is marked as primary or belongs to someone else.

Requests must be authenticated with an access token.

URI Parameters
HideShow
address
string (required) Example: bob@example.org

POST https://free.teambeam.de/api/id/v3/profile/emails/bob@example.org/primary
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403404
This response has no content.

The requested email address is not yet verified or belongs to someone else.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The requested email address is not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Mark Address as Primary
POST/id/v3/profile/emails/{address}/primary

Marks the given address as the only primary address of all addresses of the person. Throws an error, if the address is not found, belongs to someone else or is not yet verified.

Requests must be authenticated with an access token.

URI Parameters
HideShow
address
string (required) Example: bob@example.org

POST https://free.teambeam.de/api/id/v3/profile/emails/bob@example.org/verify
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204404429
This response has no content.

The requested email address is not found or belongs to another person.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The rate-limit for this request has been exceeded.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 429002,
    "message": "Maximum number of concurrent API requests reached.",
    "details": [
      "Hello, world!",
      "Please try again after waiting some time."
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Request Address Verification
POST/id/v3/profile/emails/{address}/verify

Requests verification of the email address again. Renders all previously sent verification messages regarding this email invalid. This sends an email to the requested address containing a short verification key. The key is short-lived and is to be returned via the Confirm Address Verification endpoint.

Note: if the address has been verified already, this request is successful, but will not trigger a new verification message.

The resource is heavily rate-limit-protected. The person can trigger verification at most once per minute.

Requests must be authenticated with an access token.

URI Parameters
HideShow
address
string (required) Example: bob@example.org

POST https://free.teambeam.de/api/id/v3/confirm/A3CL
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204404429

The email address has been verified.

Headers
Authorization: Bearer ...new ID token...

The requested confirmation key is not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The rate-limit for this request has been exceeded.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 429002,
    "message": "Maximum number of concurrent API requests reached.",
    "details": [
      "Hello, world!",
      "Please try again after waiting some time."
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Confirm Address Verification
POST/id/v3/confirm/{key}

Completes the verification of an email address.

The resource is heavily rate-limit-protected. The person can send confirmation requests at most once per minute.

If this request verifies the first registered address, the response contains an updated ID token in the Authorization header. This can be used to replace the existing ID token without the need to use the upgrade resource.

Requests must be authenticated with an access token.

URI Parameters
HideShow
key
string (required) Example: A3CL

Confirmation key from the verification message.


Authenticator management

An authenticator is the means used to confirm the identity of a person. A person authenticates to a computer system or application by demonstrating that he or she has possession and control of an authenticator.

Multiple authenticators can be registered, depending on the type.

Type Description Supported cardinality
bcrypt Password exactly 1
totp Timebased one-time key 0 or 1
recovery Small number of one-time passcodes with unlimited expiration 0 or more

When an authenticator of type recovery is registered, the system will actually create a small number of individual recovery codes. Used recovery codes are removed from the system. The number of available recovery codes is visible in the cardinality field. When all recovery codes are are used in an authentication request or the authenticator is unregistered, the authenticator disappears.

GET https://free.teambeam.de/api/id/v3/profile/authenticators
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "authenticators": [
    {
      "type": "bcrypt",
      "name": "My password",
      "uid": "a9v_fas8gl57l.3",
      "registeredAt": "2020-05-26T07:31:57.298Z",
      "updatedAt": "2020-05-26T07:31:57.298Z",
      "verified": true,
      "key": "null",
      "dataUri": "null",
      "cardinality": 1
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "authenticators": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "bcrypt",
              "totp",
              "sms",
              "u2f",
              "recovery"
            ],
            "description": "The type of the authenticator"
          },
          "name": {
            "type": "string",
            "enum": [
              "My password"
            ],
            "description": "Personal description of the authenticator"
          },
          "uid": {
            "type": "string",
            "enum": [
              "a9v_fas8gl57l.3"
            ],
            "description": "Unique ID of the authenticator"
          },
          "registeredAt": {
            "type": "string",
            "enum": [
              "2020-05-26T07:31:57.298Z"
            ],
            "description": "Timestamp when the authenticator was created"
          },
          "updatedAt": {
            "type": "string",
            "enum": [
              "2020-05-26T07:31:57.298Z"
            ],
            "description": "Timestamp when the authenticator was last updated"
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True, if the authenticator has been verified"
          },
          "key": {
            "type": "string",
            "enum": [
              "null"
            ],
            "description": "This may include the server-generated key to a newly registered authenticator. Only shown once, during registration."
          },
          "dataUri": {
            "type": "string",
            "enum": [
              "null"
            ],
            "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
          },
          "cardinality": {
            "type": "number",
            "enum": [
              1
            ],
            "description": "Details the number of available authenticators of this type."
          }
        },
        "required": [
          "type",
          "uid",
          "registeredAt",
          "updatedAt",
          "verified",
          "cardinality"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "authenticators"
  ]
}

Get registered authenticators
GET/id/v3/profile/authenticators

Returns a list of all registered, verified authenticators of the person.

Requests must be authenticated with an access token.


POST https://free.teambeam.de/api/id/v3/profile/authenticators
Requestsexample 1example 2

Registers a new TOTP authenticator.

Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "type": "totp",
  "name": "Google Authenticator",
  "pubKey": "null"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "pubKey": {
      "type": "string",
      "description": "The public key. Depending on the type, it may be required."
    }
  },
  "required": [
    "type"
  ]
}
Responses201400403

Returns the shared secret for the TOTP authenticator. A QrCode, encoded in data URI scheme, supports convenient onboarding of an authenticator app.

Headers
Content-Type: application/json
Location: https://id.skalio.net/id/v3/profile/authenticators/a9v_fas8gl57l.3
Body
{
  "type": "totp",
  "name": "Google Authenticator",
  "uid": "3gvvyykfl139hpde",
  "registeredAt": "2020-05-26T07:31:57.298Z",
  "updatedAt": "2020-05-26T07:31:57.298Z",
  "verified": "false",
  "key": "QS7KLSIFCPPG5KYTXT4ELYIBNWAPNIDS",
  "dataUri": "data:image/png;base64,iVBORw0KG...",
  "cardinality": 1
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the authenticator"
    },
    "registeredAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was created"
    },
    "updatedAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was last updated"
    },
    "verified": {
      "type": "string",
      "description": "True, if the authenticator has been verified"
    },
    "key": {
      "type": "string",
      "description": "This may include the server-generated key to a newly registered authenticator. Only shown once, during registration."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    },
    "cardinality": {
      "type": "number",
      "description": "Details the number of available authenticators of this type."
    }
  },
  "required": [
    "type",
    "cardinality"
  ]
}

A field is missing or a value is incorrect. The authenticator-type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Credentials of this type cannot be registered any more. A federated identity is not allowed to register authenticators. A security requirement for registration of authenticators is not met.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Registers a new or replaces the existing recovery authenticator.

Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "type": "recovery",
  "name": "Backup codes",
  "pubKey": "null"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "pubKey": {
      "type": "string",
      "description": "The public key. Depending on the type, it may be required."
    }
  },
  "required": [
    "type"
  ]
}
Responses201400403

Returns the passcodes. Previously created passcodes are no longer valid.

Headers
Content-Type: application/json
Location: https://id.skalio.net/id/v3/profile/authenticators/a9v_fas8gl57l.3
Body
{
  "type": "recovery",
  "name": "Backup codes",
  "uid": "3gvvyykfl139hpde",
  "registeredAt": "2020-05-26T07:31:57.298Z",
  "updatedAt": "2020-05-26T07:31:57.298Z",
  "verified": "true",
  "key": "2zqtTtwCoqYw QExttcc6cycP orcFwD6CNaQe",
  "dataUri": "null",
  "cardinality": "3"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the authenticator"
    },
    "registeredAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was created"
    },
    "updatedAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was last updated"
    },
    "verified": {
      "type": "string",
      "description": "True, if the authenticator has been verified"
    },
    "key": {
      "type": "string",
      "description": "This may include the server-generated key to a newly registered authenticator. Only shown once, during registration."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    },
    "cardinality": {
      "type": "string",
      "description": "Details the number of available authenticators of this type."
    }
  },
  "required": [
    "type",
    "cardinality"
  ]
}

A field is missing or a value is incorrect. The authenticator-type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

A federated identity is not allowed to register authenticators. A security requirement for registration of authenticators is not met.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Register new authenticator
POST/id/v3/profile/authenticators

Registers new, additional authenticator.

Most authenticator types can be registered only once per person. Typically, they must be verified before they can be used.

The recovery authenticator can be re-registered, which replaces all existing passcodes. This authenticator also does not require verification. Once registered, the passcodes are ready to be used.

Depending on the type of authenticator, the shared secret is returned once in the key field. The user should persist the secret, since it cannot be retrieved afterwards. In some cases, an image is returned, encoded in data URI scheme, supporting the onboarding of an authenticator app.

  • totp: Authenticator seed secret is returned. QrCode is returned for easy setup of authenticator app.

  • recovery: All valid passcodes are returned, separated by a whitespace character.

Security protocol requires that the person has a “young” session, and has recently verified their primary email address. Specific ForbiddenExceptions will indicate, if a requirement was not met. The person then needs to resolve the requirement and retry the registration of the authenticator. Error codes:

Requests must be authenticated with an access token.


POST https://free.teambeam.de/api/id/v3/profile/authenticators/'3gvvyykfl139hpde'/verify
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "email": "alice@example.net",
  "type": "totp",
  "key": "123456"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Email address of a person"
    },
    "type": {
      "type": "string",
      "description": "Type of authenticator"
    },
    "key": {
      "type": "string",
      "description": "Authentication data"
    }
  }
}
Responses204400403404
Headers
Authorization: Bearer ...new ID token...

A field is missing or a value is incorrect. The authenticator-type is not supported (yet). The credentials-type does not match the authenticator-type.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Verification failed.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authenticator not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Verify registered authenticator
POST/id/v3/profile/authenticators/{uid}/verify

Proves the person’s control over a newly registered authenticator by authenticating against it. If successful, this marks the authenticator as verified.

If this request verifies the first additional authenticator, the response contains an updated ID token in the Authorization header. This can be used to replace the existing ID token without the need to use the upgrade resource.

Requests must be authenticated with an access token.

URI Parameters
HideShow
uid
string (required) Example: '3gvvyykfl139hpde'

The uid of the authenticator.


GET https://free.teambeam.de/api/id/v3/profile/authenticators/'a9v_fas8gl57l.3'
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Responses200404
Headers
Content-Type: application/json
Body
{
  "type": "bcrypt",
  "name": "My password",
  "uid": "a9v_fas8gl57l.3",
  "registeredAt": "2020-05-26T07:31:57.298Z",
  "updatedAt": "2020-05-26T07:31:57.298Z",
  "verified": true,
  "key": "null",
  "dataUri": "null",
  "cardinality": 1
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "bcrypt",
        "totp",
        "sms",
        "u2f",
        "recovery"
      ],
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the authenticator"
    },
    "registeredAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was created"
    },
    "updatedAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was last updated"
    },
    "verified": {
      "type": "boolean",
      "description": "True, if the authenticator has been verified"
    },
    "key": {
      "type": "string",
      "description": "This may include the server-generated key to a newly registered authenticator. Only shown once, during registration."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    },
    "cardinality": {
      "type": "number",
      "description": "Details the number of available authenticators of this type."
    }
  },
  "required": [
    "type",
    "cardinality"
  ]
}

Authenticator not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Fetch authenticator
GET/id/v3/profile/authenticators/{uid}

Returns the referenced authenticator.

Requests must be authenticated with an access token.

URI Parameters
HideShow
uid
string (required) Example: 'a9v_fas8gl57l.3'

The uid of the authenticator.


PUT https://free.teambeam.de/api/id/v3/profile/authenticators/'a9v_fas8gl57l.3'
Requestsexample 1
Headers
Content-Type: application/json
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "name": "My password",
  "pubKey": "new password",
  "authKey": "CorrectHorseBatteryStaple"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "pubKey": {
      "type": "string",
      "description": "The new public key, typically in plain text"
    },
    "authKey": {
      "type": "string",
      "description": "A key with which the update is authorized, typically in plain text"
    }
  }
}
Responses200400403404
Headers
Content-Type: application/json
Body
{
  "type": "bcrypt",
  "name": "My password",
  "uid": "a9v_fas8gl57l.3",
  "registeredAt": "2020-05-26T07:31:57.298Z",
  "updatedAt": "2020-05-26T07:31:57.298Z",
  "verified": true,
  "key": "null",
  "dataUri": "null",
  "cardinality": 1
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "bcrypt",
        "totp",
        "sms",
        "u2f",
        "recovery"
      ],
      "description": "The type of the authenticator"
    },
    "name": {
      "type": "string",
      "description": "Personal description of the authenticator"
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the authenticator"
    },
    "registeredAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was created"
    },
    "updatedAt": {
      "type": "string",
      "description": "Timestamp when the authenticator was last updated"
    },
    "verified": {
      "type": "boolean",
      "description": "True, if the authenticator has been verified"
    },
    "key": {
      "type": "string",
      "description": "This may include the server-generated key to a newly registered authenticator. Only shown once, during registration."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    },
    "cardinality": {
      "type": "number",
      "description": "Details the number of available authenticators of this type."
    }
  },
  "required": [
    "type",
    "cardinality"
  ]
}

A field is missing or a value is incorrect. The authenticator-type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authorization of the public-key change failed

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authenticator not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Update existing authenticator
PUT/id/v3/profile/authenticators/{uid}

Changes or updates the existing authenticator. The type cannot be changed.

Changing the public key is only allowed for type bcrypt and requires additional authorization. One of the following methods is acceptable:

  • The request contains an authKey, which validates successfully against the previous public key.

  • The authenticating access token contains setPassword claim with value true. This is the case after password recovery.

Changing the name only does not require additional authorization, and does not update field updatedAt.

Requests must be authenticated with an access token.

URI Parameters
HideShow
uid
string (required) Example: 'a9v_fas8gl57l.3'

The uid of the authenticator.


DELETE https://free.teambeam.de/api/id/v3/profile/authenticators/'a8as9ykd_0s93'
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204400403404
This response has no content.

The authenticator-type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Credentials cannot be unregistered.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authenticator not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Unregister authenticator
DELETE/id/v3/profile/authenticators/{uid}

Removes the authenticator, if the type allows for this.

Requests must be authenticated with an access token.

URI Parameters
HideShow
uid
string (required) Example: 'a8as9ykd_0s93'

The uid of the authenticator.


Invitations

Invitations

An invitation allows a person to join an organization with a set of privileges. Since a person can only be member of one organization at a time, in order to accept an invitation, a person must first end their current membership.

An invitation can be shared or personalized:

  • shared: A public, reusable invitation to join a public organization. Typically this is used to join the “free” organization.

  • personalized: The organization admin issues the invitation, specifying the email address of the invitee.

    • The invitee receives an email notification.
    • In order to accept the invitation, the person must have the specified address in his list of verified email addresses.
GET https://free.teambeam.de/api/id/v3/invitations
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401
Headers
Content-Type: application/json
Body
{
  "invitations": [
    {
      "key": "u7u1kzz8hq",
      "shared": true,
      "inviterUid": "533h18.ygguv_b_0",
      "roles": [
        "Organization.Admin"
      ],
      "organization": {
        "uid": "n_gwumunrj77j-r0",
        "name": "Example Inc",
        "hasAvatar": true,
        "selfSignup": false,
        "locale": "de_DE",
        "timeZone": "Europe/Berlin",
        "globalSignature": "Hello, world!",
        "legalNoticeUrl": "https://www.example.test/imprint/",
        "privacyPolicyUrl": "https://www.example.test/privacy/",
        "hostname": "teambeam.example.test",
        "mfaRequired": false
      }
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "invitations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "enum": [
              "u7u1kzz8hq"
            ],
            "description": "Identifies the invitation."
          },
          "shared": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "True, if it is a shared invitation."
          },
          "inviterUid": {
            "type": "string",
            "enum": [
              "533h18.ygguv_b_0"
            ],
            "description": "Unique ID of the person that issued the invitation"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Organization.Admin",
                "Contract.Admin",
                "Contract.Read",
                "Service.Transfer.Use",
                "Service.Transfer.Archive.CreateRoot",
                "Service.Drive.CreateSpace",
                "Service.All.Use",
                "Service.Spaces.Use"
              ]
            },
            "description": "List of roles that the invitation grants."
          },
          "organization": {
            "type": "object",
            "properties": {
              "uid": {
                "type": "string",
                "enum": [
                  "n_gwumunrj77j-r0"
                ],
                "description": "Unique ID of the organization."
              },
              "name": {
                "type": "string",
                "enum": [
                  "Example Inc"
                ],
                "description": "The name of the organization."
              },
              "hasAvatar": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "True if the organization has an avatar."
              },
              "selfSignup": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "Shows if the organization allows self-signup. This is true for the \"free\" organization."
              },
              "locale": {
                "type": "string",
                "enum": [
                  "de_DE",
                  "en_US",
                  "fr_FR",
                  "ru_RU",
                  "ko_KR",
                  "zh_CN",
                  "zh_TW",
                  "ja_JP"
                ],
                "description": "The default locale of the organization."
              },
              "timeZone": {
                "type": "string",
                "enum": [
                  "Europe/Berlin"
                ],
                "description": "The default time zone of the organization."
              },
              "globalSignature": {
                "type": "string",
                "enum": [
                  ""
                ],
                "description": "A corporate email signature."
              },
              "legalNoticeUrl": {
                "type": "string",
                "enum": [
                  "https://www.example.test/imprint/"
                ],
                "description": "A URL pointing to a legal notice document."
              },
              "privacyPolicyUrl": {
                "type": "string",
                "enum": [
                  "https://www.example.test/privacy/"
                ],
                "description": "A URL pointing to a privacy policy document."
              },
              "hostname": {
                "type": "string",
                "enum": [
                  "teambeam.example.test"
                ],
                "description": "The active hostname where the service for the organization is hosted."
              },
              "mfaRequired": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "Shows if the organization requires members to use multi-factor authentication."
              }
            },
            "required": [
              "uid",
              "name",
              "hasAvatar",
              "selfSignup",
              "locale",
              "timeZone",
              "mfaRequired"
            ],
            "additionalProperties": false,
            "description": "The public profile of the organization that extends the invitation."
          }
        },
        "required": [
          "key",
          "shared",
          "roles",
          "organization"
        ],
        "additionalProperties": false
      },
      "description": "List of invitations"
    }
  },
  "required": [
    "invitations"
  ]
}

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get available invitations
GET/id/v3/invitations

Fetches the list of invitations the person has access to.

Invitations may either be shared with anyone or specific to a person (personalized), in which case invitations are matched against verified email addresses of the person.

An invitation may reference the UID of the person that issued the invitation. If the inviter is removed later, the field is null.

Requests must be authenticated with an access token.


POST https://free.teambeam.de/api/id/v3/invitations/u7u1kzz8hq/accept
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204401403404
Headers
Authorization: Bearer new.idToken.123456

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The invitation is blocked from acceptance. See above for possible reasons.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No invitation is found matching the key.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Accept an invitation
POST/id/v3/invitations/{key}/accept

Accepts the invitation. The person joins the organization, is granted privileges as defined by the invitation.

A person can join an organization only if

  • they are not currently members of an organization anywhere, or they are member of the “free” organization,

  • the memberLimit of the target organization is not yet reached,

  • for personal invitations: the email-address of the person matches the invitation.

Joining an organization while being member of the “free” organization replaces the membership. Afterwards, the person is member of only the joined organization.

Since the organization membership changes, the backend issues a new ID token and blacklists all previous tokens of the person. The new token is delivered via the Authorization header. It also results in a PRIVILEGES_UPDATED SignalingEvent to the person.

Requests must be authenticated with an access token.

URI Parameters
HideShow
key
string (required) Example: u7u1kzz8hq

The invitation key.


POST https://free.teambeam.de/api/id/v3/invitations/u7u1kzz8hq/reject
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204401403404
This response has no content.

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

A shared invitation cannot be rejected.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No invitation is found matching the key.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Rejects an invitation
POST/id/v3/invitations/{key}/reject

Removes a personalized invitation. It results in a INVITATION_ACTIVITY SignalingEvent to the person.

Requests must be authenticated with an access token.

URI Parameters
HideShow
key
string (required) Example: u7u1kzz8hq

The invitation key.


Public

Request public information

It is possible for an authenticated person to retrieve public information about an entity. While the entity can be addressed by its unique ID, in some cases other search parameters are accepted, such as email.

Request are throttled. Caching and conditional GET requests are encouraged.

Requests may require authentication with a UID token.

GET https://free.teambeam.de/api/id/v3/public/profile/alice@example.net?_uidt=abc123.ghi456.jkl789
Responses200401403404
Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
{
  "uid": "533h18.ygguv_b_0",
  "name": "Horst Groby",
  "email": "alice@example.net",
  "hasAvatar": true,
  "fingerprint": [
    {
      "name": "christmasTree",
      "codePoint": 127876,
      "title": "christmas tree"
    }
  ],
  "locale": "de_DE",
  "timeZone": "Europe/Berlin"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "email": {
      "type": "string",
      "description": "Primary email address, if verified"
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "fingerprint": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "christmasTree"
            ],
            "description": "The unique name of the emoji"
          },
          "codePoint": {
            "type": "number",
            "enum": [
              127876
            ],
            "description": "The emoji's codepoint in Unicode"
          },
          "title": {
            "type": "string",
            "enum": [
              "christmas tree"
            ],
            "description": "The english translation key"
          }
        },
        "required": [
          "name",
          "codePoint",
          "title"
        ],
        "additionalProperties": false
      },
      "description": "The persons fingerprint"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    }
  },
  "required": [
    "uid",
    "hasAvatar",
    "fingerprint",
    "locale",
    "timeZone"
  ]
}

The UID token is missing or not valid.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The profile exists, but the account is disabled.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No profile matches the given key.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get the profile of a person
GET/id/v3/public/profile/{key}?_uidt={uidToken}

Fetches the public profile of any person whose profile is stored in Skalio ID. The key must match any of the following fields to select a profile:

  • UID of the person

  • an email address of the person

Please note that only verified email addresses are evaluated. Search by UID is supported, even if the person has no verified email address.

Searching by email address requires a valid UID token. Search by UID does not require authentication.

The response contains the primary email address of the person if it has been verified. The field may be empty, if none of the email addresses have been verified.

If the person is (temporarily) disabled, the server will return a ForbiddenException with response code 403.

URI Parameters
HideShow
key
string (required) Example: alice@example.net

UID or a verified email address of a person

uidToken
string (optional) Example: abc123.ghi456.jkl789

UID token (necessary for search)


GET https://free.teambeam.de/api/id/v3/public/avatar/key?height=80&_uidt=uidToken
Responses200401404
Headers
Content-Type: image/jpeg
Etag: "a1b2c3"
Body
{... payload ...}

The UID token is missing or not valid.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

No profile and no organization matches the given key, or it does not have an avatar.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get an avatar
GET/id/v3/public/avatar/{key}?height={height}&_uidt={uidToken}

Fetches the avatar of a person or organization. The key must match any of the following fields to select an avatar:

  • UID of the person

  • an email address of the person

  • UID of the organization

Please note that only verified email addresses are evaluated. Search by UID is supported, even if the person has no verified email address.

Avatars get resized only during the upload of a new image. When requesting a specific height, the backend attempts to deliver the closest matching image, but will not resize it exactly to the requested dimensions. It is the responsibility of a frontend to render the image in the exact required dimensions.

Searching by email address requires a valid UID token. Search by UID does not require authentication.

URI Parameters
HideShow
key
string (required) 

UID or a verified email address of a person, or UID of an organization

height
number (optional) Example: 80

requested height of the image

uidToken
string (optional) 

UID token (necessary for search)


GET https://free.teambeam.de/api/id/v3/public/organization/key
Responses200404
Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
{
  "uid": "n_gwumunrj77j-r0",
  "name": "Example Inc",
  "hasAvatar": true,
  "selfSignup": false,
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "globalSignature": "Hello, world!",
  "legalNoticeUrl": "https://www.example.test/imprint/",
  "privacyPolicyUrl": "https://www.example.test/privacy/",
  "hostname": "teambeam.example.test",
  "mfaRequired": false
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization."
    },
    "name": {
      "type": "string",
      "description": "The name of the organization."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    },
    "selfSignup": {
      "type": "boolean",
      "description": "Shows if the organization allows self-signup. This is true for the \"free\" organization."
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The default locale of the organization."
    },
    "timeZone": {
      "type": "string",
      "description": "The default time zone of the organization."
    },
    "globalSignature": {
      "type": "string",
      "description": "A corporate email signature."
    },
    "legalNoticeUrl": {
      "type": "string",
      "description": "A URL pointing to a legal notice document."
    },
    "privacyPolicyUrl": {
      "type": "string",
      "description": "A URL pointing to a privacy policy document."
    },
    "hostname": {
      "type": "string",
      "description": "The active hostname where the service for the organization is hosted."
    },
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    }
  },
  "required": [
    "uid",
    "name",
    "hasAvatar",
    "selfSignup",
    "locale",
    "timeZone",
    "mfaRequired"
  ]
}

No such entity.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get an organization
GET/id/v3/public/organization/{key}

Fetches the public profile of an organization. The key must match any of the following fields:

  • UID of an organization

  • hostname of an organization (active or inactive)

URI Parameters
HideShow
key
string (required) 

search term


GET https://free.teambeam.de/api/id/v3/public/assets/type
Responses200200404

Returns the logo.

Headers
Content-Type: image/png
Etag: "a1b2c3"
Body
[...]

Returns the theme.

Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
[...]

No such entity.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get an organization asset
GET/id/v3/public/assets/{type}

Fetches the asset of the organization. The organization is selected by matching against the request hostname.

The following asset types are supported:

  • logo: returns the organization’s logo as image/png

  • theme: returns the organization’s theme as a JSON file

URI Parameters
HideShow
type
AssetType (required) 

the type of asset


Organizations

An organization represents the entity that enters a contractual relationship with Skalio. An organization can have a profile, an avatar, members and subscriptions.

A person can be a member of none or exactly one organization. A dedicated organization exists that holds all members of the “freemium” service offering. This is called the “free” organization. All other organizations are “customer” organizations.

Roles assigned to a person control the privileges with which they interact with the organization or use its services and resources.

Organization Management

An organization admin can manage the organization profile, its members and invitations. The organization can be removed. A person can leave their own organization.

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "mfaRequired": false,
  "uid": "n_gwumunrj77j-r0",
  "externalUid": "e607e95f-ad60-1c8e-a888-34a4ae2b8418",
  "hasAvatar": false,
  "profile": {
    "name": "Example Inc",
    "locale": "de_DE",
    "timeZone": "Europe/Berlin",
    "legalNoticeUrl": "https://www.example.test/imprint/",
    "privacyPolicyUrl": "https://www.example.test/privacy/",
    "hostname": "teambeam.example.test",
    "inactiveHostnames": [
      "old.example.test"
    ]
  },
  "subscriptions": [
    {
      "orgUid": "n_gwumunrj77j-r0",
      "createdAt": "2022-05-11T10:50:50Z",
      "updated": "2022-05-11T10:50:50Z",
      "expiresAt": "2022-06-17T12:46:56Z",
      "status": "active",
      "domain": "spaces",
      "productId": "business",
      "displayName": "Novospace Business"
    }
  ],
  "memberCount": 1,
  "memberLimit": 5
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization. Readonly."
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID. Typically a MS Entra tenant ID."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    },
    "profile": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the organization. Null if none has been set yet."
        },
        "addressLine1": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "addressLine2": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "postCode": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "city": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "state": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "country": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "phoneNumber": {
          "type": "string",
          "description": "A phone number for the organization."
        },
        "locale": {
          "type": "string",
          "enum": [
            "de_DE",
            "en_US",
            "fr_FR",
            "ru_RU",
            "ko_KR",
            "zh_CN",
            "zh_TW",
            "ja_JP"
          ],
          "description": "The default locale of the organization."
        },
        "timeZone": {
          "type": "string",
          "description": "The default time zone of the organization."
        },
        "globalSignature": {
          "type": "string",
          "description": "A corporate email signature."
        },
        "legalNoticeUrl": {
          "type": "string",
          "description": "A URL pointing to a legal notice document."
        },
        "privacyPolicyUrl": {
          "type": "string",
          "description": "A URL pointing to a privacy policy document."
        },
        "hostname": {
          "type": "string",
          "description": "The active hostname where the service for the organization is hosted."
        },
        "inactiveHostnames": {
          "type": "array",
          "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
        }
      },
      "required": [
        "name",
        "locale",
        "timeZone",
        "inactiveHostnames"
      ],
      "description": "The profile of the organization."
    },
    "subscriptions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "orgUid": {
            "type": "string",
            "enum": [
              "n_gwumunrj77j-r0"
            ],
            "description": "Unique ID of the organization."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was initially created."
          },
          "updated": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was last updated."
          },
          "expiresAt": {
            "type": "string",
            "enum": [
              "2022-06-17T12:46:56Z"
            ],
            "description": "Timestamp when the subscription gets cancelled. `null` if subscription is not cancelled."
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "cancelled",
              "incomplete",
              "past_due",
              "incomplete_expired",
              "trialing",
              "unpaid",
              "active"
            ],
            "description": "The current status of the subscription. `null` if the subscription is not yet referencing a product."
          },
          "domain": {
            "type": "string",
            "enum": [
              "spaces",
              "skp"
            ],
            "description": "The domain of this product. Null, if the subscription is not yet referencing a product."
          },
          "productId": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "The name of this product, unique in the domain. `null` if the subscription is not yet referencing a product."
          },
          "displayName": {
            "type": "string",
            "enum": [
              "Novospace Business"
            ],
            "description": "A user-presentable string for the product. `null` if the subscription is not yet referencing a product."
          }
        },
        "required": [
          "orgUid",
          "createdAt",
          "updated"
        ],
        "additionalProperties": false
      },
      "description": "List of subscriptions"
    },
    "memberCount": {
      "type": "number",
      "description": "Number of members"
    },
    "memberLimit": {
      "type": "number",
      "description": "Max number of members"
    }
  },
  "required": [
    "mfaRequired",
    "uid",
    "hasAvatar",
    "profile",
    "subscriptions",
    "memberCount",
    "memberLimit"
  ]
}

Insufficient authorization to access the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Fetch organization
GET/id/v3/organizations/{uid}

Returns the organization referenced by the uid.

Requests must be authenticated with an access token. To access this API endpoint, the principal must be a member of the organization, regardless of the assigned role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


PUT https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "mfaRequired": false
}
Schema
{
  "type": "object",
  "properties": {
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    }
  },
  "required": [
    "mfaRequired"
  ],
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses200403404
Headers
Content-Type: application/json
Body
{
  "mfaRequired": false,
  "uid": "n_gwumunrj77j-r0",
  "externalUid": "e607e95f-ad60-1c8e-a888-34a4ae2b8418",
  "hasAvatar": false,
  "profile": {
    "name": "Example Inc",
    "locale": "de_DE",
    "timeZone": "Europe/Berlin",
    "legalNoticeUrl": "https://www.example.test/imprint/",
    "privacyPolicyUrl": "https://www.example.test/privacy/",
    "hostname": "teambeam.example.test",
    "inactiveHostnames": [
      "old.example.test"
    ]
  },
  "subscriptions": [
    {
      "orgUid": "n_gwumunrj77j-r0",
      "createdAt": "2022-05-11T10:50:50Z",
      "updated": "2022-05-11T10:50:50Z",
      "expiresAt": "2022-06-17T12:46:56Z",
      "status": "active",
      "domain": "spaces",
      "productId": "business",
      "displayName": "Novospace Business"
    }
  ],
  "memberCount": 1,
  "memberLimit": 5
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization. Readonly."
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID. Typically a MS Entra tenant ID."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    },
    "profile": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the organization. Null if none has been set yet."
        },
        "addressLine1": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "addressLine2": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "postCode": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "city": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "state": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "country": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "phoneNumber": {
          "type": "string",
          "description": "A phone number for the organization."
        },
        "locale": {
          "type": "string",
          "enum": [
            "de_DE",
            "en_US",
            "fr_FR",
            "ru_RU",
            "ko_KR",
            "zh_CN",
            "zh_TW",
            "ja_JP"
          ],
          "description": "The default locale of the organization."
        },
        "timeZone": {
          "type": "string",
          "description": "The default time zone of the organization."
        },
        "globalSignature": {
          "type": "string",
          "description": "A corporate email signature."
        },
        "legalNoticeUrl": {
          "type": "string",
          "description": "A URL pointing to a legal notice document."
        },
        "privacyPolicyUrl": {
          "type": "string",
          "description": "A URL pointing to a privacy policy document."
        },
        "hostname": {
          "type": "string",
          "description": "The active hostname where the service for the organization is hosted."
        },
        "inactiveHostnames": {
          "type": "array",
          "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
        }
      },
      "required": [
        "name",
        "locale",
        "timeZone",
        "inactiveHostnames"
      ],
      "description": "The profile of the organization."
    },
    "subscriptions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "orgUid": {
            "type": "string",
            "enum": [
              "n_gwumunrj77j-r0"
            ],
            "description": "Unique ID of the organization."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was initially created."
          },
          "updated": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was last updated."
          },
          "expiresAt": {
            "type": "string",
            "enum": [
              "2022-06-17T12:46:56Z"
            ],
            "description": "Timestamp when the subscription gets cancelled. `null` if subscription is not cancelled."
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "cancelled",
              "incomplete",
              "past_due",
              "incomplete_expired",
              "trialing",
              "unpaid",
              "active"
            ],
            "description": "The current status of the subscription. `null` if the subscription is not yet referencing a product."
          },
          "domain": {
            "type": "string",
            "enum": [
              "spaces",
              "skp"
            ],
            "description": "The domain of this product. Null, if the subscription is not yet referencing a product."
          },
          "productId": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "The name of this product, unique in the domain. `null` if the subscription is not yet referencing a product."
          },
          "displayName": {
            "type": "string",
            "enum": [
              "Novospace Business"
            ],
            "description": "A user-presentable string for the product. `null` if the subscription is not yet referencing a product."
          }
        },
        "required": [
          "orgUid",
          "createdAt",
          "updated"
        ],
        "additionalProperties": false
      },
      "description": "List of subscriptions"
    },
    "memberCount": {
      "type": "number",
      "description": "Number of members"
    },
    "memberLimit": {
      "type": "number",
      "description": "Max number of members"
    }
  },
  "required": [
    "mfaRequired",
    "uid",
    "hasAvatar",
    "profile",
    "subscriptions",
    "memberCount",
    "memberLimit"
  ]
}

Insufficient authentication-level or authorization to update the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Update organization details
PUT/id/v3/organizations/{uid}

Updates technical details of the organization referenced by the uid.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization and use multi-factor authentication.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


POST https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/leave
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204401404

The operation was successful. The person has left the organization, and a new ID token has been issued.

Headers
Authorization: Bearer mnopqr.7890123.stuvwx

The token is not valid or has expired.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The organization is not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Leave organization
POST/id/v3/organizations/{uid}/leave

A person can leave an organization if they are a member. This removes the person’s membership of the organization. The person’s account remains unchanged.

An organization must always have at least one person with role Organization.Admin assigned. If the “last administrator” attempts to leave the organization, the request is rejected. In this scenario, the person must either assign the role to someone else in the organization first, or remove the organization completely if no-one else is a member anymore.

Since the organization membership changes, the backend issues a new ID token and blacklists all previous tokens of the person. The new token is delivered via the Authorization header. It also results in a PRIVILEGES_UPDATED SignalingEvent to the person.

Requests must be authenticated with an access token.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


Profile management

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/profile
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "name": "Example Inc",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "legalNoticeUrl": "https://www.example.test/imprint/",
  "privacyPolicyUrl": "https://www.example.test/privacy/",
  "hostname": "teambeam.example.test",
  "inactiveHostnames": [
    "old.example.test"
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The name of the organization. Null if none has been set yet."
    },
    "addressLine1": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "addressLine2": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "postCode": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "city": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "state": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "country": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "phoneNumber": {
      "type": "string",
      "description": "A phone number for the organization."
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The default locale of the organization."
    },
    "timeZone": {
      "type": "string",
      "description": "The default time zone of the organization."
    },
    "globalSignature": {
      "type": "string",
      "description": "A corporate email signature."
    },
    "legalNoticeUrl": {
      "type": "string",
      "description": "A URL pointing to a legal notice document."
    },
    "privacyPolicyUrl": {
      "type": "string",
      "description": "A URL pointing to a privacy policy document."
    },
    "hostname": {
      "type": "string",
      "description": "The active hostname where the service for the organization is hosted."
    },
    "inactiveHostnames": {
      "type": "array",
      "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
    }
  },
  "required": [
    "name",
    "locale",
    "timeZone",
    "inactiveHostnames"
  ]
}

Insufficient authorization to access the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Fetch profile
GET/id/v3/organizations/{uid}/profile

Returns the profile of the organization referenced by the uid.

Requests must be authenticated with an access token. To access this API endpoint, the principal must be a member of the organization, regardless of the assigned role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


PUT https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/profile
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "name": "Example Inc",
  "addressLine1": "Hello, world!",
  "addressLine2": "Hello, world!",
  "postCode": "Hello, world!",
  "city": "Hello, world!",
  "state": "Hello, world!",
  "country": "Hello, world!",
  "phoneNumber": "Hello, world!",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "globalSignature": "Hello, world!",
  "legalNoticeUrl": "https://www.example.test/imprint/",
  "privacyPolicyUrl": "https://www.example.test/privacy/"
}
Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The name of the organization. Null if none has been set yet."
    },
    "addressLine1": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "addressLine2": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "postCode": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "city": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "state": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "country": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "phoneNumber": {
      "type": "string",
      "description": "A phone number for the organization."
    },
    "locale": {
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The default locale of the organization."
    },
    "timeZone": {
      "type": "string",
      "description": "The default time zone of the organization."
    },
    "globalSignature": {
      "type": "string",
      "description": "A corporate email signature."
    },
    "legalNoticeUrl": {
      "type": "string",
      "description": "A URL pointing to a legal notice document."
    },
    "privacyPolicyUrl": {
      "type": "string",
      "description": "A URL pointing to a privacy policy document."
    }
  },
  "required": [
    "name"
  ],
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses200403404
Headers
Content-Type: application/json
Body
{
  "name": "Example Inc",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "legalNoticeUrl": "https://www.example.test/imprint/",
  "privacyPolicyUrl": "https://www.example.test/privacy/",
  "hostname": "teambeam.example.test",
  "inactiveHostnames": [
    "old.example.test"
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "The name of the organization. Null if none has been set yet."
    },
    "addressLine1": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "addressLine2": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "postCode": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "city": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "state": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "country": {
      "type": "string",
      "description": "A part of the address of the organization."
    },
    "phoneNumber": {
      "type": "string",
      "description": "A phone number for the organization."
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The default locale of the organization."
    },
    "timeZone": {
      "type": "string",
      "description": "The default time zone of the organization."
    },
    "globalSignature": {
      "type": "string",
      "description": "A corporate email signature."
    },
    "legalNoticeUrl": {
      "type": "string",
      "description": "A URL pointing to a legal notice document."
    },
    "privacyPolicyUrl": {
      "type": "string",
      "description": "A URL pointing to a privacy policy document."
    },
    "hostname": {
      "type": "string",
      "description": "The active hostname where the service for the organization is hosted."
    },
    "inactiveHostnames": {
      "type": "array",
      "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
    }
  },
  "required": [
    "name",
    "locale",
    "timeZone",
    "inactiveHostnames"
  ]
}

Insufficient authorization to update the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Update profile
PUT/id/v3/organizations/{uid}/profile

Updates the profile of the organization referenced by the uid.

Updating the profile triggers a SignalingEvent of type ORGANIZATION_PROFILE_UPDATED into the feed of all members of the organization.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


Asset Management

A person can upload several assets to an organization. These can be used when branding a webpage or client, or in an email.

The following asset types are supported:

  • logo: returns the organization’s log as image/png

  • theme: returns the organization’s theme as a JSON file

Asset management requires the principal to have the Organization.Admin role within the selected organization. Alternatively, a person with role Cluster.AssetManagement can manage the assets of a foreign organization.

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/assets/type
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200200404

Returns the logo.

Headers
Content-Type: image/png
Etag: "a1b2c3"
Body
[...]

Returns the theme.

Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
[...]

No such entity.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get Asset
GET/id/v3/organizations/{uid}/assets/{type}

Fetches an asset of the organization.

The following asset types are supported:

  • logo: returns the organization’s logo as image/png

  • theme: returns the organization’s theme as a JSON file

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

type
AssetType (required) 

the type of asset


POST https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/assets/type
Requestsexample 1example 2

Upload a logo.

Headers
Content-Type: multipart/form-data; boundary=abc123
Authorization: Bearer abcdef.123456.ghijkl
Body
--abc123
Content-Disposition: form-data; name="file"
Content-Type: image/jpeg

JPEG {... binary data ...}

--abc123
Responses200

Returns the logo.

Headers
Content-Type: image/png
Etag: "a1b2c3"
Body
[...]

Upload the theme.

Headers
Content-Type: multipart/form-data; boundary=abc123
Authorization: Bearer abcdef.123456.ghijkl
Body
--abc123
Content-Disposition: form-data; name="file"
Content-Type: application/json

{
    "version": "v1.0",
    "backgroundColor": "#bebebe",
    ...
}

--abc123
Responses200400403404

Returns the theme.

Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
[...]

The payload is not supported or cannot be parsed.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Not authorized to update the asset.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Upload asset
POST/id/v3/organizations/{uid}/assets/{type}

Uploads an asset to the organization. The endpoint accepts multipart-formdata requests and expectes the payload in a formdata-part named file.

The following asset types are supported:

  • logo: accepts image/*, re-encodes it as image/png

    • The image must be larger than 10x10 pixels.
    • If the image is larger than 1000x110, it is resized into this container, keeping the aspect ratio intact.
  • theme: accepts and validates JSON

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

type
AssetType (required) 

the type of asset


DELETE https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/assets/type
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403404
This response has no content.

Insufficient authorization to manage the organization’s assets.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Delete asset
DELETE/id/v3/organizations/{uid}/assets/{type}

Deletes the asset from the organization.

The following asset types are supported:

  • logo: the organization’s logo

  • theme: the organization’s theme file

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

type
AssetType (required) 

the type of asset


Avatar Management

A person can upload an image to represent the organization in public. The avatar image can later be requested without authorization by querying the public avatar resource.

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/avatar?height=80
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: image/jpeg
Etag: "213508"
Body
{... payload ...}

Insufficient authorization to access the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found. No avatar has been uploaded.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get Avatar
GET/id/v3/organizations/{uid}/avatar?height={height}

Returns the organization’s avatar if one has been uploaded.

Avatars get resized only during the upload of a new image. When requesting a specific height, the backend attempts to deliver the closest matching image, but will not resize it exactly to the requested dimensions.

Requests must be authenticated with an access token. The token may be provided in the Authorization header or in the form of a cookie with name acct. If both are present, the header will be evaluated only. To access this API endpoint, the principal must be a member of the organization, regardless of the assigned role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

height
number (optional) Example: 80

the requested size of the avatar image


PUT https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/avatar
Requestsexample 1
Headers
Content-Type: image/jpg
Authorization: Bearer abcdef.123456.ghijkl
Body
{... payload ...}
Responses200400403404
Headers
Content-Type: image/jpeg
Location: /id/v3/profile/avatar
Body
{... payload ...}

The image could not be processed.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to update the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Upload Avatar
PUT/id/v3/organizations/{uid}/avatar

Uploading a new avatar requires admin privileges. The resource accept payload with the following content types only:

  • image/jpeg

  • image/png

  • image/gif

An uploaded avatar is cropped to a square size, resized multiple times and re-encoded to JPG:

  • 500x500

  • 240x240

  • 160x160

  • 80x80

Updating an avatar triggers a SignalingEvent of type ORGANIZATION_AVATAR_UPDATED into the feed of all members of the organization.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


DELETE https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/avatar
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403404
This response has no content.

Insufficient authorization to update the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Delete Avatar
DELETE/id/v3/organizations/{uid}/avatar

Removes the organization’s avatar if one has been uploaded. Requires admin privileges.

Deleting an avatar triggers a SignalingEvent of type ORGANIZATION_AVATAR_UPDATED into the feed of all members of the organization.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


Contractual documents

An organization is the legal entity that enters a contractual relationship with Skalio. Documents that describe the relationship can be managed here.

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/documents?type=dataProcessing&domain=spaces
Requestsexample 1example 2

Authentication via header

Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200400403404
Headers
Content-Type: application/pdf
Content-Disposition: filename*=UTF-8''AV%20Vertrag%20Novospace%20Premium%20%28n_gwumunrj77j-r0%29.pdf
Body
{... payload ...}

A required parameter is missing or has an invalid value.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to access the organization. The organization does not have a valid subscription for the product. The organization is missing its profile.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found. The requested document type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Authentication via cookie

Headers
Cookie: acct=abcdef.123456.ghijkl
Responses200400403404
Headers
Content-Type: application/pdf
Content-Disposition: filename*=UTF-8''AV%20Vertrag%20Novospace%20Premium%20%28n_gwumunrj77j-r0%29.pdf
Body
{... payload ...}

A required parameter is missing or has an invalid value.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to access the organization. The organization does not have a valid subscription for the product. The organization is missing its profile.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found. The requested document type is not supported (yet).

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Fetch document
GET/id/v3/organizations/{uid}/documents?type={docType}&domain={domain}

Renders and returns a contractual document for the organization. Depending on the type of document, additional query parameters may be required.

Before any contract documents can be rendered, the organization profile must have been created.

The person must have admin-privileges on the organization.

Document type Required parameters Note
dataProcessing domain The organization must have an active subscription in that product domain.

Requests must be authenticated with an access token. The token may be provided in the Authorization header or in the form of a cookie with name acct. If both are present, the header will be evaluated only. To access this API endpoint, the principal must be a member of the organization, regardless of the assigned role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

docType
LegalDocumentType (required) Example: dataProcessing

The type of document

domain
ProductDomain (optional) Example: spaces

Refers to a subscribed product. The parameter may be required, depending on the document type.


Membership management

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/members
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "members": [
    {
      "uid": "533h18.ygguv_b_0",
      "externalUid": "a03a45b7-2a14-c789-23a6-a9c6c8e42136",
      "externalIdentityProvider": "https://login.microsoftonline.com/common/v2.0",
      "name": "Horst Groby",
      "locale": "de_DE",
      "timeZone": "Europe/Berlin",
      "hasAvatar": true,
      "createdAt": "2022-05-11T10:50:50Z",
      "lastLoginAt": "2022-06-17T12:46:56Z",
      "emails": [
        {
          "address": "bob@example.org",
          "primary": true,
          "verified": true,
          "removeAt": "null"
        }
      ],
      "roles": [
        "Organization.Admin"
      ],
      "reference": "Hello, world!"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "members": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "uid": {
            "type": "string",
            "enum": [
              "533h18.ygguv_b_0"
            ],
            "description": "Unique ID of the person"
          },
          "externalUid": {
            "type": "string",
            "enum": [
              "a03a45b7-2a14-c789-23a6-a9c6c8e42136"
            ],
            "description": "Optional external UID, as defined by the external identity provider. `null` for local users."
          },
          "externalIdentityProvider": {
            "type": "string",
            "enum": [
              "https://login.microsoftonline.com/common/v2.0"
            ],
            "description": "Optional issuer-string of the identity provider that covers this person."
          },
          "name": {
            "type": "string",
            "enum": [
              "Horst Groby"
            ],
            "description": "Name of person, if set."
          },
          "locale": {
            "type": "string",
            "enum": [
              "de_DE",
              "en_US",
              "fr_FR",
              "ru_RU",
              "ko_KR",
              "zh_CN",
              "zh_TW",
              "ja_JP"
            ],
            "description": "The preferred locale of the person."
          },
          "timeZone": {
            "type": "string",
            "enum": [
              "Europe/Berlin"
            ],
            "description": "The person's timezone."
          },
          "hasAvatar": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the person has an avatar."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the person was created"
          },
          "lastLoginAt": {
            "type": "string",
            "enum": [
              "2022-06-17T12:46:56Z"
            ],
            "description": "Timestamp when the person has last authenticated"
          },
          "emails": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "address": {
                  "type": "string",
                  "enum": [
                    "bob@example.org"
                  ],
                  "description": "Email address"
                },
                "primary": {
                  "type": "boolean",
                  "enum": [
                    true
                  ],
                  "description": "The primary address will receive notifications. Readonly."
                },
                "verified": {
                  "type": "boolean",
                  "enum": [
                    true
                  ],
                  "description": "True if the owner has proven control over it. Readonly."
                },
                "removeAt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "enum": [
                    "null",
                    null
                  ],
                  "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
                }
              },
              "required": [
                "address",
                "primary",
                "verified",
                "removeAt"
              ],
              "additionalProperties": false
            },
            "description": "List of email addresses"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Organization.Admin",
                "Contract.Admin",
                "Contract.Read",
                "Service.Transfer.Use",
                "Service.Transfer.Archive.CreateRoot",
                "Service.Drive.CreateSpace",
                "Service.All.Use",
                "Service.Spaces.Use"
              ]
            },
            "description": "List of roles the person has in the organization; can be empty"
          },
          "reference": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "Optional reference string, visible only to the organization admin."
          }
        },
        "required": [
          "uid",
          "locale",
          "timeZone",
          "hasAvatar",
          "createdAt",
          "lastLoginAt",
          "emails",
          "roles"
        ],
        "additionalProperties": false
      },
      "description": "List of members of the organization"
    }
  },
  "required": [
    "members"
  ]
}

Insufficient authorization to access the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

List all members
GET/id/v3/organizations/{uid}/members

Returns all members of the selected organization.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


POST https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/members
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "uid": "533h18.ygguv_b_0",
  "roles": [
    "Organization.Admin"
  ],
  "reference": "Hello, world!"
}
Schema
{
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "roles": {
      "type": "array",
      "items": {
        "enum": [
          "Organization.Admin",
          "Contract.Admin",
          "Contract.Read",
          "Service.Transfer.Use",
          "Service.Transfer.Archive.CreateRoot",
          "Service.Drive.CreateSpace",
          "Service.All.Use",
          "Service.Spaces.Use"
        ]
      },
      "description": "List of roles the person has in the organization; can be empty"
    },
    "reference": {
      "type": "string",
      "description": "Optional reference string, visible only to the organization admin"
    }
  },
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses201400403404
Headers
Content-Type: application/json
Authorization: Bearer mnopqr.7890123.stuvwx
Location: /id/v3/organizations/n_gwumunrj77j-r0/members/533h18.ygguv_b_0
Body
{
  "uid": "533h18.ygguv_b_0",
  "externalUid": "a03a45b7-2a14-c789-23a6-a9c6c8e42136",
  "externalIdentityProvider": "https://login.microsoftonline.com/common/v2.0",
  "name": "Horst Groby",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "hasAvatar": true,
  "createdAt": "2022-05-11T10:50:50Z",
  "lastLoginAt": "2022-06-17T12:46:56Z",
  "emails": [
    {
      "address": "bob@example.org",
      "primary": true,
      "verified": true,
      "removeAt": "null"
    }
  ],
  "roles": [
    "Organization.Admin"
  ],
  "reference": "Hello, world!"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID, as defined by the external identity provider. `null` for local users."
    },
    "externalIdentityProvider": {
      "type": "string",
      "description": "Optional issuer-string of the identity provider that covers this person."
    },
    "name": {
      "type": "string",
      "description": "Name of person, if set."
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person."
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the person was created"
    },
    "lastLoginAt": {
      "type": "string",
      "description": "Timestamp when the person has last authenticated"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Email address"
          },
          "primary": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "The primary address will receive notifications. Readonly."
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the owner has proven control over it. Readonly."
          },
          "removeAt": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "null",
              null
            ],
            "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
          }
        },
        "required": [
          "address",
          "primary",
          "verified",
          "removeAt"
        ],
        "additionalProperties": false
      },
      "description": "List of email addresses"
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Organization.Admin",
          "Contract.Admin",
          "Contract.Read",
          "Service.Transfer.Use",
          "Service.Transfer.Archive.CreateRoot",
          "Service.Drive.CreateSpace",
          "Service.All.Use",
          "Service.Spaces.Use"
        ]
      },
      "description": "List of roles the person has in the organization; can be empty"
    },
    "reference": {
      "type": "string",
      "description": "Optional reference string, visible only to the organization admin."
    }
  },
  "required": [
    "uid",
    "locale",
    "timeZone",
    "hasAvatar",
    "createdAt",
    "lastLoginAt",
    "emails",
    "roles"
  ]
}

A required parameter is missing or has an invalid value.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to update the organization. Target person is not a member of this organization. Cannot drop own admin role.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Update roles of a member
POST/id/v3/organizations/{uid}/members

An organization administrator can update the role-assignments of a person. The person has to be a member already.

  • It is perfectly fine to remove all roles from a person. The person still remains an organization member, but without any privileges.

  • An organization administrator can update their own role-assignments. However, they cannot drop their own Organization.Admin role (this must be done by a different organization administrator).

Since the organization membership changes, the backend blacklists all previous tokens of the person. Afterwards, the person must re-authenticate themselves. It also results in a PRIVILEGES_UPDATED SignalingEvent to that person.

If an organization administrator updates their own role-assignments, a new ID token issued as part of this request. The new token is delivered via the Authorization header.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/members/533h18.ygguv_b_0
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "uid": "533h18.ygguv_b_0",
  "externalUid": "a03a45b7-2a14-c789-23a6-a9c6c8e42136",
  "externalIdentityProvider": "https://login.microsoftonline.com/common/v2.0",
  "name": "Horst Groby",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "hasAvatar": true,
  "createdAt": "2022-05-11T10:50:50Z",
  "lastLoginAt": "2022-06-17T12:46:56Z",
  "emails": [
    {
      "address": "bob@example.org",
      "primary": true,
      "verified": true,
      "removeAt": "null"
    }
  ],
  "roles": [
    "Organization.Admin"
  ],
  "reference": "Hello, world!"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID, as defined by the external identity provider. `null` for local users."
    },
    "externalIdentityProvider": {
      "type": "string",
      "description": "Optional issuer-string of the identity provider that covers this person."
    },
    "name": {
      "type": "string",
      "description": "Name of person, if set."
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The preferred locale of the person."
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the person was created"
    },
    "lastLoginAt": {
      "type": "string",
      "description": "Timestamp when the person has last authenticated"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "address": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Email address"
          },
          "primary": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "The primary address will receive notifications. Readonly."
          },
          "verified": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "True if the owner has proven control over it. Readonly."
          },
          "removeAt": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "null",
              null
            ],
            "description": "ISO 8601 timestamp when an unverified email address is being removed. Null if verified."
          }
        },
        "required": [
          "address",
          "primary",
          "verified",
          "removeAt"
        ],
        "additionalProperties": false
      },
      "description": "List of email addresses"
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Organization.Admin",
          "Contract.Admin",
          "Contract.Read",
          "Service.Transfer.Use",
          "Service.Transfer.Archive.CreateRoot",
          "Service.Drive.CreateSpace",
          "Service.All.Use",
          "Service.Spaces.Use"
        ]
      },
      "description": "List of roles the person has in the organization; can be empty"
    },
    "reference": {
      "type": "string",
      "description": "Optional reference string, visible only to the organization admin."
    }
  },
  "required": [
    "uid",
    "locale",
    "timeZone",
    "hasAvatar",
    "createdAt",
    "lastLoginAt",
    "emails",
    "roles"
  ]
}

Insufficient authorization to fetch the membership.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Person or organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get member
GET/id/v3/organizations/{uid}/members/{personUid}

Fetches details of the membership.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

personUid
string (required) Example: 533h18.ygguv_b_0

The uid of the person


DELETE https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/members/533h18.ygguv_b_0?inform=false
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403404
Headers
Authorization: Bearer mnopqr.7890123.stuvwx

Insufficient authorization to remove the membership. Unable to remove last organization admin.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Remove membership
DELETE/id/v3/organizations/{uid}/members/{personUid}?inform={inform}

Removes the person as a member of the organization. This deletes the account of the person and triggers the deletion of the person’s data in other backends. All ID tokens of the person are blacklisted.

If requested, an email is sent to the person, informing them of their account deletion.

An organization must always have at least one member with Organization.Admin role. Removing the “last administrator” is rejected.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

personUid
string (required) Example: 533h18.ygguv_b_0

The uid of the person

inform
boolean (optional) Example: false

Notify the person of their removal


Invitation management

An invitation allows a person to join an organization with a set of privileges. Since a person can only be member of one organization at a time, in order to accept an invitation, a person must first end their current membership.

A personalized invitation is addressed to an email address. It can only be accepted if it matches a verified email address of the person. Only one active invitation per email address is allowed. In order to change the invitation, it must be revoked and re-issued.

A person can only be invited if they are not yet a member of the organization.

A person can reject an invitation. This is visible in the status: rejected.

GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/invitations
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "invitations": [
    {
      "invitee": "bob@example.org",
      "roles": [
        "Organization.Admin"
      ],
      "reference": "Hello, world!",
      "key": "u7u1kzz8hq",
      "createdAt": "2022-05-11T10:50:50Z",
      "status": "shared",
      "inviterUid": "533h18.ygguv_b_0"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "invitations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "invitee": {
            "type": "string",
            "enum": [
              "bob@example.org"
            ],
            "description": "Set to the email address of the intended recipient."
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Organization.Admin",
                "Contract.Admin",
                "Contract.Read",
                "Service.Transfer.Use",
                "Service.Transfer.Archive.CreateRoot",
                "Service.Drive.CreateSpace",
                "Service.All.Use",
                "Service.Spaces.Use"
              ]
            },
            "description": "List of roles that the invitation grants."
          },
          "reference": {
            "type": "string",
            "enum": [
              ""
            ],
            "description": "Internal reference text describing the invitation. Only visible to administrators."
          },
          "key": {
            "type": "string",
            "enum": [
              "u7u1kzz8hq"
            ],
            "description": "Identifies the invitation."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the invitation was initially created."
          },
          "status": {
            "type": "string",
            "enum": [
              "shared",
              "invited",
              "accepted",
              "rejected",
              "assigned"
            ],
            "description": "The current status of the invitation."
          },
          "inviterUid": {
            "type": "string",
            "enum": [
              "533h18.ygguv_b_0"
            ],
            "description": "Unique ID of the person that issued the invitation"
          }
        },
        "required": [
          "roles",
          "key",
          "createdAt",
          "status"
        ],
        "additionalProperties": false
      },
      "description": "List of invitations"
    }
  },
  "required": [
    "invitations"
  ]
}

Insufficient authorization to access the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

List all invitations
GET/id/v3/organizations/{uid}/invitations

Returns all invitations of the selected organization. An invitation that has been accepted is converted into a membership and won’t be shown here.

An invitation may reference the UID of the person that issued the invitation. If the inviter is removed later, the field is null.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


POST https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/invitations
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "invitee": "bob@example.org",
  "roles": [
    "Organization.Admin"
  ],
  "reference": "Hello, world!"
}
Schema
{
  "type": "object",
  "properties": {
    "invitee": {
      "type": "string",
      "description": "Set to the email address of the intended recipient."
    },
    "roles": {
      "type": "array",
      "items": {
        "enum": [
          "Organization.Admin",
          "Contract.Admin",
          "Contract.Read",
          "Service.Transfer.Use",
          "Service.Transfer.Archive.CreateRoot",
          "Service.Drive.CreateSpace",
          "Service.All.Use",
          "Service.Spaces.Use"
        ]
      },
      "description": "List of roles that the invitation grants."
    },
    "reference": {
      "type": "string",
      "description": "Internal reference text describing the invitation. Only visible to administrators."
    }
  },
  "required": [
    "roles"
  ],
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses201400403404
Headers
Content-Type: application/json
Location: /id/v3/organizations/n_gwumunrj77j-r0/invitations/u7u1kzz8hq
Body
{
  "invitee": "bob@example.org",
  "roles": [
    "Organization.Admin"
  ],
  "key": "u7u1kzz8hq",
  "createdAt": "2022-05-11T10:50:50Z",
  "status": "invited",
  "inviterUid": "533h18.ygguv_b_0"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "invitee": {
      "type": "string",
      "description": "Set to the email address of the intended recipient."
    },
    "roles": {
      "type": "array",
      "description": "List of roles that the invitation grants."
    },
    "reference": {
      "type": "string",
      "description": "Internal reference text describing the invitation. Only visible to administrators."
    },
    "key": {
      "type": "string",
      "description": "Identifies the invitation."
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the invitation was initially created."
    },
    "status": {
      "type": "string",
      "description": "The current status of the invitation."
    },
    "inviterUid": {
      "type": "string",
      "description": "Unique ID of the person that issued the invitation"
    }
  },
  "required": [
    "roles",
    "key",
    "createdAt",
    "status"
  ]
}

A required parameter is missing or has an invalid value.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to issue an invitation.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Create a new invitation
POST/id/v3/organizations/{uid}/invitations

An organization administrator can invite a person to join the organization. If set, the contents of the invitee field must match a verified email address of the person in order for them to accept the invitation.

If the invitee field is set, the backend will issue a notification to the given email address. If it corresponds to a verified email address of a person, an INVITATION_ACTIVITY SignalingEvent is sent to that person as well.

It is perfectly fine to issue an invitation without roles. The person would then become a member of the organization without any privileges.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


GET https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/invitations/u7u1kzz8hq
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "invitee": "bob@example.org",
  "roles": [
    "Organization.Admin"
  ],
  "key": "u7u1kzz8hq",
  "createdAt": "2022-05-11T10:50:50Z",
  "status": "invited",
  "inviterUid": "533h18.ygguv_b_0"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "invitee": {
      "type": "string",
      "description": "Set to the email address of the intended recipient."
    },
    "roles": {
      "type": "array",
      "description": "List of roles that the invitation grants."
    },
    "reference": {
      "type": "string",
      "description": "Internal reference text describing the invitation. Only visible to administrators."
    },
    "key": {
      "type": "string",
      "description": "Identifies the invitation."
    },
    "createdAt": {
      "type": "string",
      "description": "Timestamp when the invitation was initially created."
    },
    "status": {
      "type": "string",
      "description": "The current status of the invitation."
    },
    "inviterUid": {
      "type": "string",
      "description": "Unique ID of the person that issued the invitation"
    }
  },
  "required": [
    "roles",
    "key",
    "createdAt",
    "status"
  ]
}

Insufficient authorization to fetch the invitation.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Person or organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Get invitation
GET/id/v3/organizations/{uid}/invitations/{key}

Fetches details of the invitation.

An invitation may reference the UID of the person that issued the invitation. If the inviter is removed later, the field is null.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

key
string (required) Example: u7u1kzz8hq

The invitation key


DELETE https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/invitations/u7u1kzz8hq
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403404
This response has no content.

Insufficient authorization to remove the invitation.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Revoke invitation
DELETE/id/v3/organizations/{uid}/invitations/{key}

Removes the invitation.

If the invitee field is set, the backend will issue an INVITATION_ACTIVITY SignalingEvent to that person.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization

key
string (required) Example: u7u1kzz8hq

The invitation key


Data migration

These endpoints are intended for migration from an existing system to Skalio ID.

POST https://free.teambeam.de/api/id/v3/organizations
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses201

The operation was successful.

Headers
Content-Type: application/json
Location: /id/v3/organizations/n_gwumunrj77j-r0
Body
{
  "mfaRequired": false,
  "uid": "n_gwumunrj77j-r0",
  "externalUid": "e607e95f-ad60-1c8e-a888-34a4ae2b8418",
  "hasAvatar": false,
  "profile": {
    "name": "Example Inc",
    "locale": "de_DE",
    "timeZone": "Europe/Berlin",
    "legalNoticeUrl": "https://www.example.test/imprint/",
    "privacyPolicyUrl": "https://www.example.test/privacy/",
    "hostname": "teambeam.example.test",
    "inactiveHostnames": [
      "old.example.test"
    ]
  },
  "subscriptions": [
    {
      "orgUid": "n_gwumunrj77j-r0",
      "createdAt": "2022-05-11T10:50:50Z",
      "updated": "2022-05-11T10:50:50Z",
      "expiresAt": "2022-06-17T12:46:56Z",
      "status": "active",
      "domain": "spaces",
      "productId": "business",
      "displayName": "Novospace Business"
    }
  ],
  "memberCount": 1,
  "memberLimit": 5
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization. Readonly."
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID. Typically a MS Entra tenant ID."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    },
    "profile": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the organization. Null if none has been set yet."
        },
        "addressLine1": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "addressLine2": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "postCode": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "city": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "state": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "country": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "phoneNumber": {
          "type": "string",
          "description": "A phone number for the organization."
        },
        "locale": {
          "type": "string",
          "enum": [
            "de_DE",
            "en_US",
            "fr_FR",
            "ru_RU",
            "ko_KR",
            "zh_CN",
            "zh_TW",
            "ja_JP"
          ],
          "description": "The default locale of the organization."
        },
        "timeZone": {
          "type": "string",
          "description": "The default time zone of the organization."
        },
        "globalSignature": {
          "type": "string",
          "description": "A corporate email signature."
        },
        "legalNoticeUrl": {
          "type": "string",
          "description": "A URL pointing to a legal notice document."
        },
        "privacyPolicyUrl": {
          "type": "string",
          "description": "A URL pointing to a privacy policy document."
        },
        "hostname": {
          "type": "string",
          "description": "The active hostname where the service for the organization is hosted."
        },
        "inactiveHostnames": {
          "type": "array",
          "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
        }
      },
      "required": [
        "name",
        "locale",
        "timeZone",
        "inactiveHostnames"
      ],
      "description": "The profile of the organization."
    },
    "subscriptions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "orgUid": {
            "type": "string",
            "enum": [
              "n_gwumunrj77j-r0"
            ],
            "description": "Unique ID of the organization."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was initially created."
          },
          "updated": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was last updated."
          },
          "expiresAt": {
            "type": "string",
            "enum": [
              "2022-06-17T12:46:56Z"
            ],
            "description": "Timestamp when the subscription gets cancelled. `null` if subscription is not cancelled."
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "cancelled",
              "incomplete",
              "past_due",
              "incomplete_expired",
              "trialing",
              "unpaid",
              "active"
            ],
            "description": "The current status of the subscription. `null` if the subscription is not yet referencing a product."
          },
          "domain": {
            "type": "string",
            "enum": [
              "spaces",
              "skp"
            ],
            "description": "The domain of this product. Null, if the subscription is not yet referencing a product."
          },
          "productId": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "The name of this product, unique in the domain. `null` if the subscription is not yet referencing a product."
          },
          "displayName": {
            "type": "string",
            "enum": [
              "Novospace Business"
            ],
            "description": "A user-presentable string for the product. `null` if the subscription is not yet referencing a product."
          }
        },
        "required": [
          "orgUid",
          "createdAt",
          "updated"
        ],
        "additionalProperties": false
      },
      "description": "List of subscriptions"
    },
    "memberCount": {
      "type": "number",
      "description": "Number of members"
    },
    "memberLimit": {
      "type": "number",
      "description": "Max number of members"
    }
  },
  "required": [
    "mfaRequired",
    "uid",
    "hasAvatar",
    "profile",
    "subscriptions",
    "memberCount",
    "memberLimit"
  ]
}

Create organization
POST/id/v3/organizations

This endpoint is used for migration of customers only.

Creates a new organization, organization profile and hostname. The organization has no members or subscriptions. A customer account at the subscription management system is created and linked to the organization.

A random active hostname is created, if the imported profile did not specify one.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Cluster.Admin role.


PUT https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/import/person
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200

The operation was successful.

Headers
Content-Type: application/json
Body
{
  "mfaRequired": false,
  "uid": "n_gwumunrj77j-r0",
  "externalUid": "e607e95f-ad60-1c8e-a888-34a4ae2b8418",
  "hasAvatar": false,
  "profile": {
    "name": "Example Inc",
    "locale": "de_DE",
    "timeZone": "Europe/Berlin",
    "legalNoticeUrl": "https://www.example.test/imprint/",
    "privacyPolicyUrl": "https://www.example.test/privacy/",
    "hostname": "teambeam.example.test",
    "inactiveHostnames": [
      "old.example.test"
    ]
  },
  "subscriptions": [
    {
      "orgUid": "n_gwumunrj77j-r0",
      "createdAt": "2022-05-11T10:50:50Z",
      "updated": "2022-05-11T10:50:50Z",
      "expiresAt": "2022-06-17T12:46:56Z",
      "status": "active",
      "domain": "spaces",
      "productId": "business",
      "displayName": "Novospace Business"
    }
  ],
  "memberCount": 1,
  "memberLimit": 5
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "mfaRequired": {
      "type": "boolean",
      "description": "Shows if the organization requires members to use multi-factor authentication."
    },
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization. Readonly."
    },
    "externalUid": {
      "type": "string",
      "description": "Optional external UID. Typically a MS Entra tenant ID."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    },
    "profile": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the organization. Null if none has been set yet."
        },
        "addressLine1": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "addressLine2": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "postCode": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "city": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "state": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "country": {
          "type": "string",
          "description": "A part of the address of the organization."
        },
        "phoneNumber": {
          "type": "string",
          "description": "A phone number for the organization."
        },
        "locale": {
          "type": "string",
          "enum": [
            "de_DE",
            "en_US",
            "fr_FR",
            "ru_RU",
            "ko_KR",
            "zh_CN",
            "zh_TW",
            "ja_JP"
          ],
          "description": "The default locale of the organization."
        },
        "timeZone": {
          "type": "string",
          "description": "The default time zone of the organization."
        },
        "globalSignature": {
          "type": "string",
          "description": "A corporate email signature."
        },
        "legalNoticeUrl": {
          "type": "string",
          "description": "A URL pointing to a legal notice document."
        },
        "privacyPolicyUrl": {
          "type": "string",
          "description": "A URL pointing to a privacy policy document."
        },
        "hostname": {
          "type": "string",
          "description": "The active hostname where the service for the organization is hosted."
        },
        "inactiveHostnames": {
          "type": "array",
          "description": "Non-null, possibly empty array of no-longer-active hostnames of the organization."
        }
      },
      "required": [
        "name",
        "locale",
        "timeZone",
        "inactiveHostnames"
      ],
      "description": "The profile of the organization."
    },
    "subscriptions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "orgUid": {
            "type": "string",
            "enum": [
              "n_gwumunrj77j-r0"
            ],
            "description": "Unique ID of the organization."
          },
          "createdAt": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was initially created."
          },
          "updated": {
            "type": "string",
            "enum": [
              "2022-05-11T10:50:50Z"
            ],
            "description": "Timestamp when the subscription was last updated."
          },
          "expiresAt": {
            "type": "string",
            "enum": [
              "2022-06-17T12:46:56Z"
            ],
            "description": "Timestamp when the subscription gets cancelled. `null` if subscription is not cancelled."
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "cancelled",
              "incomplete",
              "past_due",
              "incomplete_expired",
              "trialing",
              "unpaid",
              "active"
            ],
            "description": "The current status of the subscription. `null` if the subscription is not yet referencing a product."
          },
          "domain": {
            "type": "string",
            "enum": [
              "spaces",
              "skp"
            ],
            "description": "The domain of this product. Null, if the subscription is not yet referencing a product."
          },
          "productId": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "The name of this product, unique in the domain. `null` if the subscription is not yet referencing a product."
          },
          "displayName": {
            "type": "string",
            "enum": [
              "Novospace Business"
            ],
            "description": "A user-presentable string for the product. `null` if the subscription is not yet referencing a product."
          }
        },
        "required": [
          "orgUid",
          "createdAt",
          "updated"
        ],
        "additionalProperties": false
      },
      "description": "List of subscriptions"
    },
    "memberCount": {
      "type": "number",
      "description": "Number of members"
    },
    "memberLimit": {
      "type": "number",
      "description": "Max number of members"
    }
  },
  "required": [
    "mfaRequired",
    "uid",
    "hasAvatar",
    "profile",
    "subscriptions",
    "memberCount",
    "memberLimit"
  ]
}

Import organization profile
PUT/id/v3/organizations/{uid}/import/person

This endpoint is used for migration of customers only.

Updates an existing organization, overwriting organization profile and hostnames. Does not change memberships or subscriptions.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Cluster.Admin role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


POST https://free.teambeam.de/api/id/v3/organizations/n_gwumunrj77j-r0/import/person
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Body
{
  "email": "bob@example.org",
  "name": "Bob",
  "passwordHash": "$2a$12$iFJH7Yxc7qfz5QLQ7W4.m.9swQZN9ty7QMv8G2OsoPjy10GBemaPm",
  "locale": "de_DE",
  "timeZone": "Europe/Berlin",
  "roles": [
    "Organization.Admin"
  ]
}
Schema
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Email address of the person"
    },
    "name": {
      "type": "string",
      "description": "The name of the person"
    },
    "passwordHash": {
      "type": "string",
      "description": "Salted bcrypt hash of the persons password"
    },
    "locale": {
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP",
        "de_DE"
      ],
      "description": "The locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The timezone of the person"
    },
    "roles": {
      "type": "array",
      "items": {
        "enum": [
          "Organization.Admin",
          "Contract.Admin",
          "Contract.Read",
          "Service.Transfer.Use",
          "Service.Transfer.Archive.CreateRoot",
          "Service.Drive.CreateSpace",
          "Service.All.Use",
          "Service.Spaces.Use"
        ]
      },
      "description": "Set of roles of the person"
    }
  },
  "required": [
    "email",
    "passwordHash",
    "locale",
    "timeZone"
  ],
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses201400403404
Headers
Content-Type: application/json
Location: /id/v3/public/profile/533h18.ygguv_b_0
Body
{
  "uid": "533h18.ygguv_b_0",
  "name": "Horst Groby",
  "email": "alice@example.net",
  "hasAvatar": true,
  "fingerprint": [
    {
      "name": "christmasTree",
      "codePoint": 127876,
      "title": "christmas tree"
    }
  ],
  "locale": "de_DE",
  "timeZone": "Europe/Berlin"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the person"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "email": {
      "type": "string",
      "description": "Primary email address, if verified"
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the person has an avatar."
    },
    "fingerprint": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "enum": [
              "christmasTree"
            ],
            "description": "The unique name of the emoji"
          },
          "codePoint": {
            "type": "number",
            "enum": [
              127876
            ],
            "description": "The emoji's codepoint in Unicode"
          },
          "title": {
            "type": "string",
            "enum": [
              "christmas tree"
            ],
            "description": "The english translation key"
          }
        },
        "required": [
          "name",
          "codePoint",
          "title"
        ],
        "additionalProperties": false
      },
      "description": "The persons fingerprint"
    },
    "locale": {
      "type": "string",
      "enum": [
        "de_DE",
        "en_US",
        "fr_FR",
        "ru_RU",
        "ko_KR",
        "zh_CN",
        "zh_TW",
        "ja_JP"
      ],
      "description": "The locale of the person"
    },
    "timeZone": {
      "type": "string",
      "description": "The person's timezone"
    }
  },
  "required": [
    "uid",
    "hasAvatar",
    "fingerprint",
    "locale",
    "timeZone"
  ]
}

A required parameter is missing or has an invalid value.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Insufficient authorization to update the organization.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Import person into organization
POST/id/v3/organizations/{uid}/import/person

This endpoint is used for migration of customers only.

This imports a person into Skalio ID and grants them membership in the organization, assigning the requested privileges. The person is matched by email address: if a person is not found, it is being created.

  1. find person by email; create it, if not found:

    • create person
    • create email address of person
  2. if a password hash was provided, create bcrypt authenticator for the person

  3. assign person to organization, if not already a member

  4. set roles of organization membership

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Cluster.Admin role.

URI Parameters
HideShow
uid
string (required) Example: n_gwumunrj77j-r0

The uid of the organization


Products & Subscriptions

Products

GET https://free.teambeam.de/api/id/v3/products?domain=skp
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200
Headers
Content-Type: application/json
Body
{
  "products": [
    {
      "domain": "spaces",
      "productId": "business",
      "displayName": "Novospace Business",
      "description": "1 TB Speicherplatz"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "enum": [
              "spaces",
              "skp"
            ],
            "description": "The domain of this product."
          },
          "productId": {
            "type": "string",
            "enum": [
              "business"
            ],
            "description": "The name of this product, unique in the domain."
          },
          "displayName": {
            "type": "string",
            "enum": [
              "Novospace Business"
            ],
            "description": "A name to display to users, not localized."
          },
          "description": {
            "type": "string",
            "enum": [
              "1 TB Speicherplatz"
            ],
            "description": "A text to display to users, not localized."
          }
        },
        "required": [
          "domain",
          "productId"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "products"
  ]
}

List all products
GET/id/v3/products?domain={domain}

Returns a list of products registered in Skalio ID.

Requests must be authenticated with an access token.

URI Parameters
HideShow
domain
ProductDomain (optional) Example: skp

An optional filter to limit listing of products


Subscriptions

POST https://free.teambeam.de/api/id/v3/subscriptions/stripe/checkout/skp/pro
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404409
Headers
Content-Type: application/json
Body
{
  "url": "https://billing.stripe.com/session/test_YWNjdF8xTEJhbWlKL",
  "expiresAt": "2022-07-20T13:48:15Z"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The URL to the Stripe checkout or customer portal session."
    },
    "expiresAt": {
      "type": "string",
      "description": "If not null, the URL expires at this time."
    }
  },
  "required": [
    "url"
  ]
}

Insufficient authorization to access the organization, or Stripe subscription exists already.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization or product not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Error during interaction with Stripe. Please retry.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Stripe Checkout Session
POST/id/v3/subscriptions/stripe/checkout/{domain}/{productId}

In order to purchase the initial subscription of a product from a specific domain, a person can start a checkout-session with Stripe. Within this checkout session, the customer can purchase a subscription to a product. This creates an organization matching the Stripe “customer”, assigning the person as organization admin.

Since this triggers the initial shopping experience, this resource is limited to persons without an organization.

The response contains a URL to the checkout page hosted at Stripe. It is valid for a short time only; check the expiration timestamp.

Requests must be authenticated with an access token.

URI Parameters
HideShow
domain
ProductDomain (required) Example: skp

The domain of the product

productId
string (required) Example: pro

The ID of the product


POST https://free.teambeam.de/api/id/v3/subscriptions/stripe/portal
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404409
Headers
Content-Type: application/json
Body
{
  "url": "https://billing.stripe.com/session/test_YWNjdF8xTEJhbWlKL",
  "expiresAt": "null"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "The URL to the Stripe checkout or customer portal session."
    },
    "expiresAt": {
      "type": [
        "string",
        "null"
      ],
      "description": "If not null, the URL expires at this time."
    }
  },
  "required": [
    "url"
  ]
}

Insufficient authorization to access the organization, or Stripe subscription is missing.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "This request is forbidden.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Organization not found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Error during interaction with Stripe. Please retry.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The data could not be stored.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Stripe Customer Portal Session
POST/id/v3/subscriptions/stripe/portal

Once an organization has subscribed to a product, the subscription can be managed in the Stripe Customer Portal. A session can be requested here. The expiresAt field of the session is always null.

Requests must be authenticated with an access token. To access this API endpoint, the principal must have the Organization.Admin role within the organization.


POST https://free.teambeam.de/api/id/v3/subscriptions/stripe/webhook
Requestsexample 1
Headers
Stripe-Signature: t=1657712964,v1=042f971bf4e348dc0bdba7d557100196ae4127aea2dad7211e65df9446f0bcb8,v0=6632de3a68b216e69ad451a9986e0c1669fc2bc6e22f95ce39f5a4f4ebfe3657.
Body
{
  "id": "evt_1LL44GJXiQM2QqDHF8LVf4sc",
  "object": "event",
  "api_version": "2020-08-27",
  "created": 1657712964,
  "data": {
    ...
  },
  "livemode": false,
  "pending_webhooks": 2,
  "request": {
    "id": "req_w14UUe3JUFTChi",
    "idempotency_key": "3acbc3ad-4e68-4833-9247-ab333649bc5e"
  },
  "type": "billing_portal.session.created"
}
Responses202400
This response has no content.

Data cannot be parsed, or signature verification failed.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Stripe Event Webhook Endpoint
POST/id/v3/subscriptions/stripe/webhook

An endpoint where Stripe can post events as webhooks to. Events are verified against the Stripe-Signature and persisted into the database.


Feedback

Submit feedback

POST https://free.teambeam.de/api/id/v3/feedback?_uidt=abc123.ghi456.jkl789
Requestsexample 1
Headers
Content-Type: application/json
Body
{
  "productId": "spaces",
  "email": "bob@example.test",
  "name": "Horst Groby",
  "stars": 3,
  "issues": [
    "works well",
    "fast speed"
  ],
  "context": [
    "de_DE",
    "iOS"
  ],
  "comment": "I love it",
  "type": "manual"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "productId": {
      "type": "string",
      "enum": [
        "spaces",
        "skp"
      ],
      "description": "The ID of the product the feedback relates to."
    },
    "email": {
      "type": "string",
      "description": "The email address of the person who provided the feedback."
    },
    "name": {
      "type": "string",
      "description": "The name of the person who provided the feedback."
    },
    "stars": {
      "type": "number",
      "description": "Value must be 0 < x <= 5. Denominates happiness with the product."
    },
    "issues": {
      "type": [
        "array",
        "null"
      ],
      "description": "A number of tags that the user selects describing his problems or satisfactions."
    },
    "context": {
      "type": [
        "array",
        "null"
      ],
      "description": "A number of tags that the client selects describing the context of the feedback."
    },
    "comment": {
      "type": [
        "string",
        "null"
      ],
      "description": "End user comment."
    },
    "type": {
      "type": "string",
      "enum": [
        "manual",
        "eventDriven",
        "supportRequest"
      ],
      "description": "The type of submitted feedback."
    }
  },
  "required": [
    "productId"
  ]
}
Responses204400401429
This response has no content.
Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}
Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "Authentication failed or missing.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}
Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 429002,
    "message": "Maximum number of concurrent API requests reached.",
    "details": [
      "Hello, world!",
      "Please try again after waiting some time."
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

Submit feedback
POST/id/v3/feedback?_uidt={uidToken}

Applications can submit user feedback for analysis by Skalio staff.

This resource is rate-limit protected. A person may submit up to one feedback per minute.

Requests must be authenticated with a UID token.

  • email must be provided when submitting support requests.

  • stars must be provided when submitting feedback requests.

URI Parameters
HideShow
uidToken
string (required) Example: abc123.ghi456.jkl789

UID token


GET https://free.teambeam.de/api/id/v3/legal/com.skalio.spaces/privacyPolicy
Responses200400404
Headers
Content-Type: text/plain
Body
{... payload ...}

The type is not supported

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The request cannot be fulfilled.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

The productId or type could not be found.

Headers
Content-Type: application/json
Body
{
  "error": {
    "code": 0,
    "message": "The requested object does not exist.",
    "details": [
      "Hello, world!"
    ]
  }
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "number",
          "description": "The error code"
        },
        "message": {
          "type": "string",
          "description": "English error message."
        },
        "details": {
          "type": "array",
          "description": "English details to error."
        }
      }
    }
  }
}

SCIM

The System for Cross-domain Identity Management is described in detail here.

The documentation here is only meant to demonstrate the base URL of the SCIM service and the available endpoints. The RFC has details how to use the endpoints.

SCIM

GET https://free.teambeam.de/api/id/v3/scim/Schemas
Responses200
Headers
Content-Type: application/json

Schema
GET/id/v3/scim/Schemas

Implements the Schemas-endpoint as per the RFC.


GET https://free.teambeam.de/api/id/v3/scim/Users
Responses200
Headers
Content-Type: application/json

Users
GET/id/v3/scim/Users

Implements the Users-endpoint as per the RFC.


Generated by aglio on 19 Sep 2024