API-referentie
Assets exporteren
Assets worden geëxporteerd met de assets_paged-query. Elke asset bevat CIA-scores (vertrouwelijkheid, integriteit, beschikbaarheid), gekoppelde controls, risico's en informatietypen.
Basisquery
query ExportAssets($first: Int, $after: String, $filter: AssetFilter) {
assets_paged(first: $first, after: $after, filter: $filter) {
edges {
node {
id
sequenceId
customId
name
description
notBefore
expires
archived
confidentiality
integrity
availability
mao
rto
rpo
informationTypes
controls {
id
sequenceId
name
}
risks {
id
sequenceId
name
treatment
}
assignments {
assignmentType
user {
name
email
}
}
attributes {
key
value
}
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Variabelen voor de eerste pagina:
{ "first": 50, "after": null, "filter": {} }
Belangrijke velden
sequenceId: het leesbare nummer zoals getoond in de UI (bijv. A-7)customId: optionele aangepaste identifier ingesteld door je teamconfidentiality/integrity/availability: CIA-impactscores (schaal 1-3)mao: Maximum Acceptable Outage (ISO 8601 Duur, bijv.PT4H)rto: Recovery Time Objective (ISO 8601 Duur)rpo: Recovery Point Objective (ISO 8601 Duur)informationTypes: soorten informatie die door deze asset worden verwerkt (bijv.CUSTOMER_INFORMATION,FINANCIAL_RECORDS)
Volledig exportscript (Python)
import requests
import csv
GRAPHQL_URL = "https://portal.tidalcontrol.com/graphql"
QUERY = """
query ExportAssets($first: Int, $after: String, $filter: AssetFilter) {
assets_paged(first: $first, after: $after, filter: $filter) {
edges {
node {
id
sequenceId
customId
name
description
notBefore
expires
archived
confidentiality
integrity
availability
mao
rto
rpo
informationTypes
controls { id sequenceId name }
risks { id sequenceId name treatment }
assignments { assignmentType user { name email } }
}
}
pageInfo { hasNextPage endCursor }
}
}
"""
def graphql(query, variables, access_token):
r = requests.post(
GRAPHQL_URL,
json={"query": query, "variables": variables},
headers={"Authorization": f"Bearer {access_token}"},
)
r.raise_for_status()
result = r.json()
if "errors" in result:
raise RuntimeError(result["errors"])
return result["data"]
def export_assets(access_token, include_archived=False):
assets = []
cursor = None
asset_filter = {"archived": include_archived} if include_archived else {}
while True:
data = graphql(
QUERY,
{"first": 50, "after": cursor, "filter": asset_filter},
access_token,
)
page = data["assets_paged"]
assets.extend(edge["node"] for edge in page["edges"])
if not page["pageInfo"]["hasNextPage"]:
break
cursor = page["pageInfo"]["endCursor"]
return assets
def to_csv(assets, output_path):
if not assets:
print("Geen assets gevonden.")
return
with open(output_path, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow([
"ID", "Volgnummer", "Aangepast ID", "Naam", "Omschrijving",
"Startdatum", "Vervaldatum", "Gearchiveerd",
"Vertrouwelijkheid", "Integriteit", "Beschikbaarheid",
"MAO", "RTO", "RPO",
"Informatietypen", "Gekoppelde controls", "Gekoppelde risico's", "Eigenaren",
])
for a in assets:
owners = [
asgn["user"]["email"]
for asgn in a["assignments"]
if asgn["assignmentType"] == "OWNER"
]
writer.writerow([
a["id"],
a["sequenceId"],
a.get("customId", ""),
a["name"],
a.get("description", ""),
a.get("notBefore", ""),
a.get("expires", ""),
a["archived"],
a.get("confidentiality", ""),
a.get("integrity", ""),
a.get("availability", ""),
a.get("mao", ""),
a.get("rto", ""),
a.get("rpo", ""),
", ".join(a.get("informationTypes") or []),
", ".join(c["name"] for c in a["controls"]),
", ".join(r["name"] for r in a["risks"]),
", ".join(owners),
])
print(f"{len(assets)} assets geëxporteerd naar {output_path}")
if __name__ == "__main__":
ACCESS_TOKEN = "eyJhbGci..."
assets = export_assets(ACCESS_TOKEN)
to_csv(assets, "assets_export.csv")
Filtervoorbeelden
Assets met hoge impact:
{ "filter": { "impact": ["HIGH"] } }
Assets gekoppeld aan een specifieke control:
{ "filter": { "controls": ["control-uuid-hier"] } }
Assets toegewezen aan een specifieke gebruiker:
{ "filter": { "assignees": ["gebruiker-uuid-hier"] } }
Assets gekoppeld aan een specifiek framework:
{ "filter": { "frameworks": ["framework-uuid-hier"] } }
Alleen tellen
query {
assets_count(filter: { archived: false })
}
- Vorige
- Controls exporteren
- Volgende
- Issues exporteren