API Documentation

Skalio ID API Version 2

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

Changelog

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. Switching client applications to the v2 branch is highly recommended.

Major changes between v1 and v2:

  • 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/v2

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.

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.

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://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/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
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/v2/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.

A new organization is created. The new person becomes a member of the admin-team of the new organization. The organization receives product entitlement for spaces.


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://id.skalio.net/id/v2/oidc/discovery
Responses200
Headers
Content-Type: application/json
Body
{
  "issuer": "https://skalio.com",
  "jwksUrl": "https://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/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
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/v2/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.


POST https://id.skalio.net/id/v2/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
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/v2/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.


POST https://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/oidc/auth/form
Requestsexample 1
Headers
Content-Type: application/x-www-form-urlencoded
Body
state=f9f53e7539dc&id_token=abc.123.def&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/v2/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.


GET https://id.skalio.net/id/v2/oidc/auth
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200401403
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 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/v2/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.


Authentication using Skalio ID

GET https://id.skalio.net/id/v2/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/v2/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.


GET https://id.skalio.net/id/v1/auth/exists
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"
    }
  }
}

Get Delay-Token
GET/id/v1/auth/exists

This service is deprecated. For backwards compatibility, a static, fixed token is still being returned. However, this token is not required anymore.

Issues a delay token. This used to be required to authenticate the request to check whether an email address is in use.


POST https://id.skalio.net/id/v2/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"
    }
  }
}
Responses204400404

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

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/v2/auth/exists

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


POST https://id.skalio.net/id/v2/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
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
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/v2/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.

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://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/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/v2/auth/uid

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

A uid token cannot be revoked.

Requests must be authenticated with an ID token.


POST https://id.skalio.net/id/v2/auth/upgrade
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200400401403

The upgrade was successful and a new 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 does not have a valid authLevel.

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 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 primay email address of the person is not yet verified, or the provided token cannot be upgraded.

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."
        }
      }
    }
  }
}

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

If applicable, this request exchanges an ID token with low authLevel for a new ID token with a higher authLevel.

Its purpose is to ensure a smooth transition from unverified to verified person during the signup process. After a person has verified his primary address, he may use this request to exchange his ID token without re-authentication.

The ID token used to authenticate this request is blacklisted.

Requests must be authenticated with an ID token.


POST https://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/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/v2/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://id.skalio.net/id/v2/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.

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/v2/auth/reset

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


POST https://id.skalio.net/id/v2/auth/reset/s0ga45as-4.sd9ya5
Responses200404
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"
    }
  }
}

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/v2/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.

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

Requests must be authenticated with an access token.

GET https://id.skalio.net/id/v2/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"
    }
  ],
  "memberships": [
    {
      "organization": {
        "uid": "n_gwumunrj77j-r0",
        "name": "Example Inc",
        "hasAvatar": true
      },
      "teams": [
        {
          "uid": "as9wfals-as.2.3",
          "name": "Sales Department",
          "description": "Hello, world!",
          "privilege": "read"
        }
      ]
    }
  ]
}
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"
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "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, if set."
              },
              "hasAvatar": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "True if the organization has an avatar."
              }
            },
            "required": [
              "uid",
              "hasAvatar"
            ],
            "additionalProperties": false
          },
          "teams": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uid": {
                  "type": "string",
                  "enum": [
                    "as9wfals-as.2.3"
                  ],
                  "description": "Unique ID of the team"
                },
                "name": {
                  "type": "string",
                  "enum": [
                    "Sales Department"
                  ],
                  "description": "Name of the team"
                },
                "description": {
                  "type": "string",
                  "enum": [
                    ""
                  ],
                  "description": "Descriptive text"
                },
                "privilege": {
                  "type": "string",
                  "enum": [
                    "read",
                    "creator",
                    "admin"
                  ],
                  "description": "Privilege the person has in this organization"
                }
              },
              "required": [
                "uid",
                "name",
                "privilege"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "organization",
          "teams"
        ],
        "additionalProperties": false
      },
      "description": "List of organizations the person is a member of"
    }
  },
  "required": [
    "fingerprint",
    "emails",
    "memberships"
  ]
}

Get Profile
GET/id/v2/profile

This returns the complete profile of the principal.


PUT https://id.skalio.net/id/v2/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"
    }
  ],
  "memberships": [
    {
      "organization": {
        "uid": "n_gwumunrj77j-r0",
        "name": "Example Inc",
        "hasAvatar": true
      },
      "teams": [
        {
          "uid": "as9wfals-as.2.3",
          "name": "Sales Department",
          "description": "Hello, world!",
          "privilege": "read"
        }
      ]
    }
  ]
}
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"
    },
    "memberships": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "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, if set."
              },
              "hasAvatar": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "True if the organization has an avatar."
              }
            },
            "required": [
              "uid",
              "hasAvatar"
            ],
            "additionalProperties": false
          },
          "teams": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "uid": {
                  "type": "string",
                  "enum": [
                    "as9wfals-as.2.3"
                  ],
                  "description": "Unique ID of the team"
                },
                "name": {
                  "type": "string",
                  "enum": [
                    "Sales Department"
                  ],
                  "description": "Name of the team"
                },
                "description": {
                  "type": "string",
                  "enum": [
                    ""
                  ],
                  "description": "Descriptive text"
                },
                "privilege": {
                  "type": "string",
                  "enum": [
                    "read",
                    "creator",
                    "admin"
                  ],
                  "description": "Privilege the person has in this organization"
                }
              },
              "required": [
                "uid",
                "name",
                "privilege"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "organization",
          "teams"
        ],
        "additionalProperties": false
      },
      "description": "List of organizations the person is a member of"
    }
  },
  "required": [
    "fingerprint",
    "emails",
    "memberships"
  ]
}

Update Profile
PUT/id/v2/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.


DELETE https://id.skalio.net/id/v2/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/v2/profile

Deletes the account permanently. Cascades to other applications.


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.

Requests must be authenticated with an access token.

PUT https://id.skalio.net/id/v2/profile/avatar
Requestsexample 1
Headers
Content-Type: image/jpg
Authorization: Bearer abcdef.123456.ghijkl
Body
{... payload ...}
Responses200400
Headers
Content-Type: image/jpeg
Location: /id/v2/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/v2/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 and re-encoded to JPG.

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


GET https://id.skalio.net/id/v2/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/v2/profile/avatar?height={height}

Return the persons avatar if one has been uploaded.

In addition to the Authorization header, this request alternatively accepts the valid access token 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://id.skalio.net/id/v2/profile/avatar
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204
This response has no content.

Delete Avatar
DELETE/id/v2/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.


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.

Managing email addresses requires a valid ID token. Request for or confirmation of a email verification message does not require authentication.

Requests must be authenticated with an access token.

GET https://id.skalio.net/id/v2/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/v2/profile/emails

Lists all email addresses of the person.


POST https://id.skalio.net/id/v2/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/v2/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/v2/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.


DELETE https://id.skalio.net/id/v2/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/v2/profile/emails/{address}

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

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

POST https://id.skalio.net/id/v2/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/v2/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.

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

POST https://id.skalio.net/id/v2/profile/emails/bob@example.org/verify
Responses204429
This response has no content.

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/v2/profile/emails/{address}/verify

Requests verification of the email address again. Renders all previously sent verification messages regarding this email invalid. Note: if the address has been verified already, this request is successful, but will not trigger a new verification message.

The resource is rate-limit-protected. Verification for an address can only be triggered once per minute.

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

POST https://id.skalio.net/id/v2/confirm/bxno3kikie5js6hi
Requestsexample 1
Headers
Content-Type: application/json
Responses204403404
This response has no content.

The email address has already been verified

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 confirmation key is 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."
        }
      }
    }
  }
}

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

Completes the verification of an email address. This request does not require authentication!

URI Parameters
HideShow
key
string (required) Example: bxno3kikie5js6hi

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
sms Timebased one-time key, delivered via SMS 0 or 1
u2f Hardware token 0 or more
recovery Small number of one-time passcodes with unlimited expiration 0 or 1

Authenticator types sms and u2f are not yet supported.

Requests must be authenticated with an access token.

GET https://id.skalio.net/id/v2/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"
    }
  ]
}
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 key to a newly registered authenticator. Only shown once."
          },
          "dataUri": {
            "type": "string",
            "enum": [
              "null"
            ],
            "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
          }
        },
        "required": [
          "type",
          "uid",
          "registeredAt",
          "updatedAt",
          "verified"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "authenticators"
  ]
}

Get registered authenticators
GET/id/v2/profile/authenticators

Returns a list of all registered authenticators of the person.


POST https://id.skalio.net/id/v2/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/v2/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..."
}
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 key to a newly registered authenticator. Only shown once."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    }
  },
  "required": [
    "type"
  ]
}

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.

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/v2/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"
}
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 key to a newly registered authenticator. Only shown once."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    }
  },
  "required": [
    "type"
  ]
}

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.

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/v2/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.


POST https://id.skalio.net/id/v2/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
This response has no content.

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/v2/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.

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

The uid of the authenticator.


GET https://id.skalio.net/id/v2/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"
}
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 key to a newly registered authenticator. Only shown once."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    }
  },
  "required": [
    "type"
  ]
}

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/v2/profile/authenticators/{uid}

Returns the referenced authenticator.

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

The uid of the authenticator.


PUT https://id.skalio.net/id/v2/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"
}
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 key to a newly registered authenticator. Only shown once."
    },
    "dataUri": {
      "type": "string",
      "description": "This may include an image in data-URI format, representing the key of a newly registered authenticator."
    }
  },
  "required": [
    "type"
  ]
}

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/v2/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.

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

The uid of the authenticator.


DELETE https://id.skalio.net/id/v2/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/v2/profile/authenticators/{uid}

Removes authenticator, if their type allows for this.

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

The uid of the authenticator.


Public

Request public information

It is possible for an authenticated person to retrieve public information about an entity.

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

Requests must be authenticated with a UID token.

GET https://id.skalio.net/id/v2/public/profile/533h18.ygguv_b_0?_uidt=abc123.ghi456.jkl789
Responses200401404
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"
    }
  ]
}
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"
    }
  },
  "required": [
    "fingerprint"
  ]
}

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 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/v2/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.

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.

URI Parameters
HideShow
key
string (required) Example: 533h18.ygguv_b_0

UID or a verified email address of a person

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

UID token


GET https://id.skalio.net/id/v2/public/avatar/uid?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/v2/public/avatar/{uid}?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.

URI Parameters
HideShow
uid
string (required) 

UID of a person or organization

height
number (optional) Example: 80

requested height of the image

uidToken
string (required) 

UID token


GET https://id.skalio.net/id/v2/public/organization/uid?_uidt=uidToken
Responses200401404
Headers
Content-Type: application/json
Etag: "a1b2c3"
Body
{
  "uid": "n_gwumunrj77j-r0",
  "name": "Example Inc",
  "hasAvatar": true
}
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, if set."
    },
    "hasAvatar": {
      "type": "boolean",
      "description": "True if the organization has an avatar."
    }
  },
  "required": [
    "uid",
    "hasAvatar"
  ]
}

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 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/v2/public/organization/{uid}?_uidt={uidToken}

Fetches the public profile of an organization.

URI Parameters
HideShow
uid
string (required) 

UID of an organization

uidToken
string (required) 

UID token


Organizations

Organization Management

Requests must be authenticated with an access token. Modifications require authorization, such as membership in a group with administration privileges.

GET https://id.skalio.net/id/v2/organizations/n_gwumunrj77j-r0
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
Body
{
  "uid": "n_gwumunrj77j-r0",
  "hasAvatar": true,
  "profile": {
    "name": "Example Inc",
    "addressLine1": "Hello, world!",
    "addressLine2": "Hello, world!",
    "postCode": "Hello, world!",
    "city": "Hello, world!",
    "state": "Hello, world!",
    "country": "Hello, world!",
    "phoneNumber": "Hello, world!"
  },
  "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"
    }
  ]
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "uid": {
      "type": "string",
      "description": "Unique ID of the organization. Readonly."
    },
    "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."
        }
      },
      "required": [
        "name"
      ],
      "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"
    }
  },
  "required": [
    "uid",
    "hasAvatar",
    "profile",
    "subscriptions"
  ]
}

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/v2/organizations/{uid}

Returns the organization referenced by the uid.

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

The uid of the organization


DELETE https://id.skalio.net/id/v2/organizations/n_gwumunrj77j-r0
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses204403
This response has no content.

Insufficient authorization to delete 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."
        }
      }
    }
  }
}

Delete organization
DELETE/id/v2/organizations/{uid}

Permanently deletes the organization referenced by the uid. The delete request is cascaded to other backend application, where related data might get deleted as well.

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

The uid of the organization


Profile Mangement

Requests must be authenticated with an access token. Modifications require authorization, such as membership in a group with administration privileges.

GET https://id.skalio.net/id/v2/organizations/n_gwumunrj77j-r0/profile
Requestsexample 1
Headers
Authorization: Bearer abcdef.123456.ghijkl
Responses200403404
Headers
Content-Type: application/json
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!"
}
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."
    }
  },
  "required": [
    "name"
  ]
}

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/v2/organizations/{uid}/profile

Returns the profile of the organization referenced by the uid.

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

The uid of the organization


PUT https://id.skalio.net/id/v2/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!"
}
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."
    }
  },
  "required": [
    "name"
  ],
  "$schema": "http://json-schema.org/draft-04/schema#"
}
Responses200403404
Headers
Content-Type: application/json
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!"
}
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."
    }
  },
  "required": [
    "name"
  ]
}

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/v2/organizations/{uid}/profile

Updates the profile of the organization referenced by the uid. Requires admin privileges.

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

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

The uid of the organization


Avatar Mangement

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.

Requests must be authenticated with an access token. Modifications require authorization, such as membership in a group with administration privileges.

GET https://id.skalio.net/id/v2/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/v2/organizations/{uid}/avatar?height={height}

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

In addition to the Authorization header, this request alternatively accepts the valid access token in the form of a cookie with name acct. If both are present, the header will be evaluated only.

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://id.skalio.net/id/v2/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/v2/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/v2/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 and re-encoded to JPG.

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

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

The uid of the organization


DELETE https://id.skalio.net/id/v2/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/v2/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.

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.

Requests must be authenticated with an access token. Modifications require authorization, such as membership in a group with administration privileges.

GET https://id.skalio.net/id/v2/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/v2/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.

In addition to the Authorization header, this request alternatively accepts the valid access token in the form of a cookie with name acct. If both are present, the header will be evaluated only.

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.


Products & Subscriptions

Products

Requests must be authenticated with an access token.

GET https://id.skalio.net/id/v2/products?domain=spaces
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/v2/products?domain={domain}

Returns a list of products registered in Skalio ID.

URI Parameters
HideShow
domain
ProductDomain (optional) Example: spaces

An optional filter to limit listing of products


Subscriptions

The principal must have admin privileges in the organization he is managing.

Requests must be authenticated with an access token.

POST https://id.skalio.net/id/v2/subscriptions/stripe/pep6umv2hzzhhj64/checkout/spaces/business
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/v2/subscriptions/stripe/{orgUid}/checkout/{domain}/{productId}

In order to purchase the initial subscription in product domain, a person can perform a checkout with Stripe. Note: an organization can have only one subscription in the given product domain. The checkout session expires after a short period of time, check the expiresAt field to be prepared.

URI Parameters
HideShow
orgUid
string (required) Example: pep6umv2hzzhhj64

The UID of the organization

domain
ProductDomain (required) Example: spaces

The domain of the product

productId
string (required) Example: business

The ID of the product


POST https://id.skalio.net/id/v2/subscriptions/stripe/pep6umv2hzzhhj64/portal/spaces
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/v2/subscriptions/stripe/{orgUid}/portal/{domain}

Once a subscription for the product domain exists, it can be managed in the Stripe Customer Portal. A session can be requested here. The expiresAt field of the session is always null.

URI Parameters
HideShow
orgUid
string (required) Example: pep6umv2hzzhhj64

The UID of the organization

domain
ProductDomain (required) Example: spaces

The domain of the product


POST https://id.skalio.net/id/v2/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/v2/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

Requests must be authenticated with a UID token.

POST https://id.skalio.net/id/v2/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/v2/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.

Note: email must be provided when submitting support requests.

Note: stars must be provided when submitting feedback requests.

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

UID token


GET https://id.skalio.net/id/v2/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."
        }
      }
    }
  }
}

Generated by aglio on 08 Apr 2024