OAuth 2.0 API
Standards-based OAuth 2.0 / OpenID Connect — authorize, token, introspect.
The OIDC service is a standards-compliant OAuth 2.0 / OpenID Connect provider: authorization, token issuance and introspection, discovery and JWKS. Drop 1Kosmos into any OIDC-aware application as the identity provider.
14 endpoints
across 12 resource groups.
ECDSA-signed
every request is signed with your key pair.
JSON over HTTPS
predictable REST, conventional status codes.
OpenAPI 3.0
Base URL
All OAuth 2.0 endpoints are relative to your environment host. Examples on this page use the 1Kosmos pilot environment — swap in your production root when you go live.
Content type
Requests and responses use application/json.
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/healthz' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
Authentication
OAuth 2.0 uses ECDSA key-pair authentication. Each request carries your credentials as
HTTP headers; verification-grade calls additionally sign the request body. Retrieve the system signing
key from /publickeys.
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/healthz' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/healthz", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/healthz",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())Errors
OAuth 2.0 uses conventional HTTP status codes: 2xx success, 4xx a problem
with the request, 5xx a service-side error.
| Status | Meaning | Description |
|---|---|---|
| 200 / 204 | OK | The request succeeded. |
| 400 | Bad Request | Validation failed. |
| 401 | Unauthorized | Missing or invalid credentials. |
| 403 | Forbidden | Authenticated, but not permitted. |
| 404 | Not Found | The resource does not exist. |
| 500 | Server Error | Something went wrong on our side. |
{
"statusCode": 400,
"error": "Bad Request",
"message": "Validation error"
}Authorize
Authorization endpoint.
Authorize
Used to request an authorization code.
Note:This api does not work on swagger, please use postman based on details on swagger
Note: this endpoint redirects
This end-point requires redirecting to OIDC consent end-point.
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
| Name | Type | Description |
|---|---|---|
| state | string | Opaque value used to maintain state between the request and the callback |
| nonce | string | string value used to associate a Client session with an ID Token |
| client_idrequired | string | OAuth 2.0 Client Identifier valid at the Authorization Server |
| response_typerequired | string | OAuth 2.0 Response Type value that determines the authorization processing flow |
| scoperequired | string | specify the access privileges when issuing an Access Token |
| redirect_urirequired | string | Redirection URI to which the response will be sent |
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize?state=<state>&nonce=<nonce>&client_id=<client_id>&response_type=<response_type>&scope=<scope>&redirect_uri=<redirect_uri>' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize?state=<state>&nonce=<nonce>&client_id=<client_id>&response_type=<response_type>&scope=<scope>&redirect_uri=<redirect_uri>", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize?state=<state>&nonce=<nonce>&client_id=<client_id>&response_type=<response_type>&scope=<scope>&redirect_uri=<redirect_uri>",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())// no response body
Authorize
Used to request an authorization code.
- If the proof_of_authentication_jwt token is specified and the operation is successful, then the response contains a location header
containing a URL to the redirect_uri containing an authorization code parameter. If the operation fails, the then the response contains a
location header containing a URL to the redirect_uri and an error parameter.
- If the proof_of_authentication_jwt is NOT specified then this API does not work correctly. It will redirect to the AdminX UI oidc consent endpoint page.
The AdminX returns the javascript code for the consent page in the response body panel.
Please use Postman for the non-proof_of_authentication_jwt use case.
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
curl -X POST 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize", {
method: "POST",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.post(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/authorize",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())// no response body
// no response body
Service Key
Service Key endpoints.
Get service keys
This endpoint returns available service keys. The license you are using must be of authLevel 'system'
Headers
licensekey (required)
License key encrypted with ECDSA
requestid (required)
JSON string encrypted with ECDSA which should contain "appid" (string), "uuid" (string) and "ts" (number) representing epoch timestamp in seconds - it shouldn't be more or less than 'environment.allowed_time_span' seconds from now
publickey (required)
Public key
Returns
Returns array with service keys
| Name | Type | Description |
|---|---|---|
| requestidrequired | string | JSON string encrypted with ECDSA which should contain "appid" (string), "uuid" (string) and "ts" (number) representing epoch timestamp in seconds - it shouldn't be more or less than 'environment.allowed_time_span' seconds from now / Try Authorize 🔒 |
| publickeyrequired | string | Public Key / Try Authorize 🔒 |
| licensekeyrequired | string | License key encrypted with ECDSA / Try Authorize 🔒 |
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/servicekeys' \ -H 'requestid: <ecdsa-requestid>' \ -H 'publickey: <public-key>' \ -H 'licensekey: YOUR_LICENSE_KEY' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/servicekeys", {
method: "GET",
headers: {
"requestid": "<ecdsa-requestid>",
"publickey": "<public-key>",
"licensekey": "YOUR_LICENSE_KEY",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/servicekeys",
headers={
"requestid": "<ecdsa-requestid>",
"publickey": "<public-key>",
"licensekey": "YOUR_LICENSE_KEY",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())[
{
"tag": "xxxxx",
"keyId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx",
"keySecret": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx",
"type": "xxxxx"
}
]// no response body
// no response body
// no response body
Reset Service Key
This endpoint resets service key for given keyId. Deletes current one and recreates a new one. The license you are using must be of authLevel 'system'
Parameters
keyId (required)
The keyId of service key to reset
Headers
licensekey (required)
License key encrypted with ECDSA
requestid (required)
JSON string encrypted with ECDSA which should contain "appid" (string), "uuid" (string) and "ts" (number) representing epoch timestamp in seconds - it shouldn't be more or less than 'environment.allowed_time_span' seconds from now
publickey (required)
Public key
Returns
Returns re-created service key
| Name | Type | Description |
|---|---|---|
| keyIdrequired | string | keyId of service key to reset |
| Name | Type | Description |
|---|---|---|
| requestidrequired | string | JSON string encrypted with ECDSA which should contain "appid" (string), "uuid" (string) and "ts" (number) representing epoch timestamp in seconds - it shouldn't be more or less than 'environment.allowed_time_span' seconds from now / Try Authorize 🔒 |
| publickeyrequired | string | Public Key / Try Authorize 🔒 |
| licensekeyrequired | string | License key encrypted with ECDSA / Try Authorize 🔒 |
curl -X DELETE 'https://pilot-root.1kosmos.net/oauth2/servicekey/<keyId>' \ -H 'requestid: <ecdsa-requestid>' \ -H 'publickey: <public-key>' \ -H 'licensekey: YOUR_LICENSE_KEY' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/servicekey/<keyId>", {
method: "DELETE",
headers: {
"requestid": "<ecdsa-requestid>",
"publickey": "<public-key>",
"licensekey": "YOUR_LICENSE_KEY",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.delete(
"https://pilot-root.1kosmos.net/oauth2/servicekey/<keyId>",
headers={
"requestid": "<ecdsa-requestid>",
"publickey": "<public-key>",
"licensekey": "YOUR_LICENSE_KEY",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())// no response body
Discovery
OIDC discovery document.
Discovery
Get discovery
Returns
Returns a set of OpenID Connect values that can be retrieved by OIDC clients
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/community/<community>/.well-known/openid-configuration' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/.well-known/openid-configuration", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/.well-known/openid-configuration",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json()){
"authorization_endpoint": "string",
"claims_parameter_supported": "string",
"claims_supported": "string",
"code_challenge_methods_supported": "string",
"end_session_endpoint": "string",
"grant_types_supported": "string",
"id_token_signing_alg_values_supported": "string",
"issuer": "string",
"jwks_uri": "string",
"authorization_response_iss_parameter_supported": "string",
"response_modes_supported": "string",
"response_types_supported": "string",
"scopes_supported": "string",
"subject_types_supported": "string",
"token_endpoint_auth_methods_supported": "string",
"token_endpoint_auth_signing_alg_values_supported": "string",
"token_endpoint": "string",
"request_object_signing_alg_values_supported": "string",
"request_parameter_supported": "string",
"request_uri_parameter_supported": "string",
"require_request_uri_registration": "string",
"userinfo_endpoint": "string",
"introspection_endpoint": "string",
"introspection_endpoint_auth_methods_supported": "string",
"introspection_endpoint_auth_signing_alg_values_supported": "string",
"claim_types_supported": "string"
}{
"error": "string",
"error_description": "string"
}EAM
EAM endpoints.
EAM Context
Fetch EAM pre-authentication context (oid/tid) from a server-side interaction record.
This endpoint is called by nodex-admin-api during the Entra EAM flow to retrieve the oid and tid extracted from the validated id_token_hint. These values are never sent to the browser.
Requires ECDSA service-to-service authentication (publickey, requestid, licensekey headers).
| Name | Type | Description |
|---|---|---|
| communityrequired | string | Community name |
| uidrequired | string | OIDC interaction UID |
| Name | Type | Description |
|---|---|---|
| requestidrequired | string | JSON string encrypted with ECDSA which should contain "appid" (string), "uuid" (string) and "ts" (number) / Try Authorize 🔒 |
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/interaction/<uid>/eam-context' \ -H 'requestid: <ecdsa-requestid>' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/interaction/<uid>/eam-context", {
method: "GET",
headers: {
"requestid": "<ecdsa-requestid>",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/interaction/<uid>/eam-context",
headers={
"requestid": "<ecdsa-requestid>",
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json()){
"oid": "string",
"tid": "string"
}// no response body
// no response body
ECDSA Helper
ECDSA Helper endpoints.
Encrypt and decrypt the data string by public key and private key.
Encrypt and decrypt the data string by public key and private key.
Parameters
method (optional)
The method parameter is type of enum. Default value is encrypt.
This parameter only accepts following values
encrypt, decrypt
Request Body
dataStr (required)
The dataStr key is type of string.
publicKey (required)
The publicKey is type of string.
privateKey (required)
The privateKey is type of string.
Returns
Returns the encrypted/decrypted string.
This API throw an error if something goes wrong. A common source of error is public or private key is not valid.
| Name | Type | Description |
|---|---|---|
| method | string | — |
| Field | Type | Description |
|---|---|---|
| dataStr | string | — |
| publicKey | string | — |
| privateKey | string | — |
curl -X POST 'https://pilot-root.1kosmos.net/oauth2/ecdsa_helper/<method>' \
-H 'keyId: YOUR_KEY_ID' \
-H 'keySecret: YOUR_KEY_SECRET' \
-H 'license: YOUR_LICENSE_KEY' \
-H 'Content-Type: application/json' \
-d '{"dataStr": "Hey, This is example data string.", "publicKey": "xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx=", "privateKey": "xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx="}'const res = await fetch("https://pilot-root.1kosmos.net/oauth2/ecdsa_helper/<method>", {
method: "POST",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"dataStr": "Hey, This is example data string.",
"publicKey": "xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx=",
"privateKey": "xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx="
})
});
const data = await res.json();import requests
res = requests.post(
"https://pilot-root.1kosmos.net/oauth2/ecdsa_helper/<method>",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
},
json={
"dataStr": "Hey, This is example data string.",
"publicKey": "xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx=",
"privateKey": "xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxx="
},
)
print(res.json()){
"data": "xxxxxxxxxxxxxxxxxxxx"
}Environment
Environment endpoints.
/environment
Provide details regarding the environments.
Returns
Returns an environment object
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/environment' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/environment", {
method: "GET",
headers: {
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/environment",
headers={
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())// no response body
Healthz
Healthz endpoints.
Get healthz.
Get healthz
Returns
Returns a healthz object
- ``
version = <git-tag>.<commit-id>.<dob>``
- ``
git-tag``: When code is compiled from a git-tag, this must carry the tag name. This should match one of the git tags. - ``
commit-id``: This is the git-commit-id. eg: When code is built from this, the hex code, in the end, is the commit it. - ``
dob``: Date Of Build. This is epoc-time-in-se conds that tell the time when the build was created. - if the code is not built from a git-tag, then the ``
version =<commit-id>.<dob>``
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/healthz' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/healthz", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/healthz",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json()){
"status": "all services operational",
"publicKey": "//same as <service>/publickeys endpoint",
"code": "200",
"version": "xxxx.xxxx.xxxx"
}Introspection
Token introspection.
Introspection
Note: Requires basicAuth with client id as username and client secret as password
Returns
Returns the active state of an OAuth 2.0 Access token and to determine meta-information about this token
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
curl -X POST 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/introspect'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/introspect", {
method: "POST",
headers: {
}
});
const data = await res.json();import requests
res = requests.post(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/introspect",
headers={
}
)
print(res.json()){
"active": "string",
"sub": "string",
"client_id": "string",
"exp": "string",
"iat": "string",
"iss": "string",
"scope": "string",
"token_type": "string"
}{
"error": "string",
"error_description": "string"
}JWKS
Public signing keys.
JWKS
Get jwks
Returns
Used to request the key(s) an OpenID client can use to sign and/or encrypt token
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/jwks' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/jwks", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/jwks",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json())[
{
"crv": "string",
"x": "string",
"y": "string",
"d": "string",
"kty": "string",
"kid": "string",
"alg": "string",
"use": "string"
}
]{
"error": "string",
"error_description": "string"
}Public Key
Public Key endpoints.
Get system's public key.
Get system's public key.
Returns
Returns a public key object
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/publickeys' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/publickeys", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/publickeys",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json()){
"publicKey": ""
}// no response body
Request Token
Token issuance.
Request Tokens
Used to request tokens. Note: Requires basicAuth with client id as username and client secret as password
Response
Returns access, id and refresh tokens.
| Name | Type | Description |
|---|---|---|
| communityrequired | string | community name |
curl -X POST 'https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/token'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/token", {
method: "POST",
headers: {
}
});
const data = await res.json();import requests
res = requests.post(
"https://pilot-root.1kosmos.net/oauth2/community/<community>/v1/token",
headers={
}
)
print(res.json()){
"access_token": "string",
"id_token": "string",
"refresh_token": "string",
"scope": "string",
"token_type": "string",
"expires_in": 0
}{
"error": "string",
"error_description": "string"
}Service Directory
Service Directory endpoints.
Get all service directories.
Get all service directories.
Returns
Returns all service directories.
curl -X GET 'https://pilot-root.1kosmos.net/oauth2/sd' \ -H 'keyId: YOUR_KEY_ID' \ -H 'keySecret: YOUR_KEY_SECRET' \ -H 'license: YOUR_LICENSE_KEY'
const res = await fetch("https://pilot-root.1kosmos.net/oauth2/sd", {
method: "GET",
headers: {
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
});
const data = await res.json();import requests
res = requests.get(
"https://pilot-root.1kosmos.net/oauth2/sd",
headers={
"keyId": "YOUR_KEY_ID",
"keySecret": "YOUR_KEY_SECRET",
"license": "YOUR_LICENSE_KEY"
}
)
print(res.json()){
"name1": "https://xxx.xxxxxx.xxx/xxxxx",
"name2": "https://xxx.xxxxxx.xxx/xxxxx",
"name3": "https://xxx.xxxxxx.xxx/xxxxx"
}