From 2.0.5 to 2.1.0

Between StoredSafe 2.0.5 and 2.1.0 there is a few minor changes in the format of returned data. A few fields and some new endpoints have been added.

New fields

  • HEADERS
  • CALLINFO.audit
    • Returned at login, information about warning and/or violations from the StoredSafe server.
  • BREADCRUMB
    • Returned by the /object endpoint. List parent objects, when object is not in the root of the vault.
  • ERRORCODES
    • Returned when errors occur.
    • The ERRORS field still exists and displays user-facing error messages.
    • CALLINFO.errorcodes will be set to 1 if ERRORCODES exist.
    • CALLINFO.error will be set to 1 if ERRORS exist.

It is now possible to send the StoredSafe token as a header instead of as a parameter by using x-http-token: your-storedsafe-token.

Changed fields

Most results that previously was returned in object form (key-value), is now returned as lists where each object has the field id.

Some fields has changed name, to better reflect its purpose.

  • Vault
    • Field: GROUP => VAULT (specific vault) / VAULTS
    • Type: Object => Array (field id)
  • Object
    • Field: OBJECT => OBJECT (/object endpoint) / OBJECTS (/vault endpoint)
    • Type: Object => Array (field id)
  • Templates
    • Field: TEMPLATESINFO (/object och /vault endpoint) -> TEMPLATES
    • Type: Object => Array (field INFO.id)
    • TEMPLATES.INFO
      • Field: INFO => info
    • TEMPLATES.STRUCTURE
      • Field: STRUCTURE => structure
      • Type: Object => Array (field fieldname)

Note

The /template endpoint has changed from Object => Array but is otherwise unchanged from 2.0.5

Examples

JSON example #1

GET /api/1.0/vault

Using StoredSafe v2.0.5:

{
  ...
  "GROUP": {
    "10": {
      "id": "10",
      "groupname": "Vault 1",
      ...
    },
    ...
  },
}

Using StoredSafe v2.1.0:

{
  ...
  "VAULTS": [
    {
      "id": "10",
      "groupname": "Vault 1",
      ...
    },
    ...
  ],
}

JSON example #2

GET /api/1.0/vault/:vaultid

Using StoredSafe v2.0.5:

{
  "GROUP": {
    "id": "10",
    "groupname": "Vault 1",
    ...
  },
  "OBJECT": {
    "6": {
      "id": "6",
      "parentid": "0",
      "templateid": "1",
      "groupid": "10",
      ...
    },
  },
  "TEMPLATESINFO": {
    "1": {
      "INFO": {
        "id": "1",
        ...
      },
      "STRUCTURE": {
        "host": {
          ...
        },
        "username": {
          ...
        }
      }
    }
  }
}

Using StoredSafe v2.1.0:

{
  "VAULT": {
    "id": "10",
    "groupname": "Vault 1",
    ...
  },
  "OBJECTS": [
    {
      "id": "6",
      "parentid": "0",
      "templateid": "1",
      "groupid": "10",
      ...
    },
  ],
  "TEMPLATES": [
    {
      "INFO": {
        "id": "1",
        ...
      },
      "STRUCTURE": [
        {
          "fieldname": "host",
          ...
        },
        {
          "fieldname": "username",
          ...
        }
      ]
    }
  ]
}

Python Example

Using StoredSafe v2.0.5:

import requests

host = "old.storedsafe.com"
token = "my-storedsafe-token"

## Retrieve vault 10
res = requests.get(f"https://{host}/api/1.0/vault", params={ 'token': token }).json()
vault_10 = res['GROUP']['10']

# Retrieve objekt 6
res = requests.get(f"https://{host}/api/1.0/object/6", headers={ 'x-http-token': token }).json()
object_6 = res['OBJECT']['6']

## Print all object and template names for all objects in vault 10
res = requests.get(f"https://{host}/api/1.0/vault/10", params={ 'token': token }).json()
[print(obj['objectname'], template['INFO']['name']) for _id, obj in res['OBJECT'] for template_id, template in res['TEMPLATESINFO'] if obj['templateid'] == template_id]

Using StoredSafe v2.1.0:

import requests

host = "new.storedsafe.com"
token = "my-storedsafe-token"

## Retrieve vault 10
res = requests.get(f"https://{host}/api/1.0/vault", headers={ 'x-http-token': token }).json()
# Hitta vault med ID 10
vault_10 = next((vault for vault in vaults['VAULTS'] if vault['id'] == '10'), None)

# Retrieve object 6
res = requests.get(f"https://{host}/api/1.0/object/6", headers={ 'x-http-token': token }).json()
object_6 = None
if res['OBJECT']:
  object_6 = res['OBJECT'][0] # First and only object

## Print all object and template names for all objects in vault 10
res = requests.get(f"https://{host}/api/1.0/vault/10", headers={ 'x-http-token': token }).json()
[print(obj['objectname'], template['info']['name']) for obj in res['OBJECTS'] for template in res['TEMPLATES'] if obj['templateid'] == template['info']['id']]