# https://api.asergo.com/v1/schema llms.txt - [API Schema Overview](https://api.asergo.com/v1/schema): API schema for managing actions, tickets, and user permissions. ##Schema "Shared Action result, holds status for actions invoked" type ActionPayload { "Indicates the requested action was successful" success: Boolean! "Additional information about the result" information: String "Warnings related to the completed action" warning: String "Errors occured dureing the action" error: String } "Content of a new ticket entry" input AddTicketResponseInput { "Ticket ID" id: TicketId! "Content of message (In HTML)" body: String! "Attachments" attachment: [AttachmentCreate!] } "Result for a message reply " type AddTicketResponsePayload { ticket: Ticket } """ Address details Object identified by parent object ID. """ type Address { street: String! street2: String! city: String! country: CountryISO zip: String "Country as string value" countryString( "Locale string see [javadocs](https://commons.apache.org/proper/commons-lang/javadocs/api-3.6/org/apache/commons/lang3/LocaleUtils.html#toLocale-java.lang.String-)" locale: String): String } """ Updates for an address. Only fields supplied are updated """ input AddressUpdate { "Street update" street: String street2: String "City" city: String "Country" country: CountryISO "Zip" zip: String } "Cpu architecture" enum Architecture { X386 Amd64 Other Unknown } "Attachment details and content" type Attachment { id: AttachmentId! updated: Timestamp! "Human readable label for the attachment" displayName: String! "The filename, eg. logs.log" filename: String! mimetype: String! created( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! size( "size format" format: BytesUnits = Human): BytesBinary! data: String! "Thumbnail data if present, base64 encoded" thumbnail: String @deprecated(reason: "Will be removed in the future, content always empty") "Link to file, the file will be shown in browser. Validation is needed in the same way as the graphql API, by a cookie with the token, a request header 'X-Auth-Token' with the token or a request parameter 'token'" link: String! "Download link to attachment, the attachment will be downloaded. Validation is needed in the same way as the graphql API, by a cookie with the token, a request header 'X-Auth-Token' with the token or a request parameter 'token'" downloadLink: String! "Link to attachment thumbnail (or original if no thumbnail exists). Validation is needed in the same way as the graphql API, by a cookie with the token, a request header 'X-Auth-Token' with the token or a request parameter 'token'" thumbnailLink: String } "New attachment details and content" input AttachmentCreate { "Human readable label for the attachment" displayName: String! "Filename for attachment" filename: String! "attachment content Base64 encoded" dataBase64: String! } scalar AttachmentId type Billing { """ Company subscriptions Access for users with role : Administrator || Accounting Required permissions: Accounting: read """ subscriptions(ordering: SubscriptionsOrder): SubscriptionsCollection! """ Subscription details Access for users with role : Administrator || Accounting Required permissions: Accounting: read """ subscription(id: SubscriptionId!): SaleSubscription! } enum BootDevice { NoOverride "Boot from first disk" Disk DiskSafe "Boot inti Diagnostic mode" Diagnostic "Use PXE (Preboot Execution Environment) as boot option" Pxe "Boot into BIOS" Bios Cdrom } scalar BytesBinary scalar BytesDecimal "the format of the bytes" enum BytesUnits { "return in Bytes" Bytes "return in best human readable resolution (kb, mb, gb, tb, ..)" Human "return in KiloByte" KiloByte "return in MegaByte" MegaByte "return in GigaByte" GigaByte } "Classless Inter-Domain Routing" scalar Cidr "Object identified by parent object ID." type ClustersCollection { nodes: [KubernetesCluster!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! } "Company details" type Company { id: CompanyId! updated: Timestamp! "Company name" name: String! website: String "Company address" address: Address phone: String note: String appraisal: String useByAsergoMarketingAccepted: Boolean! """ Billing area Access for users with role : Administrator || Accounting Required permissions: Accounting: read """ billing: Billing """ Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ servers: ServersCollection! """ Access for users with role : Administrator Required permissions: User management: read """ invites(ordering: InvitesOrder): InvitesCollection! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ kubernetes: ClustersCollection! """ Access for users with role : Administrator Required permissions: Object storage: Viewer """ objectStorage: ObjectStorageCollection! services(ordering: DashboardServicesOrder): DashboardServicesCollection! """ Config file content for your kubectl. Save config file in the kube config directory : ~/.kube/config Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ kubectlConfig: String """ Public Authoritative name server Access for users with role : Administrator || Technical Required permissions: DNS domain: read """ domains(ordering: DnsDomainsOrder): DnsDomainsCollection! """ Access for users with role : Administrator Required permissions: OpenID Connect: read """ oidc(ordering: OidcClientOrder): OidcClientCollection! "Company logo url" logo: String logoSize( "size format" format: BytesUnits = Human): BytesBinary """ Legal Owner can see all contacts, other users can only see users with dashboard access Access for users with role : Administrator || Technical || Accounting Required permissions: Users: read """ users(ordering: UsersOrder): UsersCollection! } "CompanyChangeEvent indicates updates for company details" type CompanyChangeEvent { company: CompanyId! type: EventChangeType! data: Company } "Client company ID" scalar CompanyId "CompanyUpdateEvent indicates updates related to current company" type CompanyUpdateEvent { type: EventChangeType! company: Company user: User userInvite: UserInviteDetails supportTicket: Ticket kubernetes: KubernetesCluster } """ Updates for a company. Only fields supplied are updated """ input CompanyUpdateInput { "Update Company name" name: String phone: String note: String "Address updates" address: AddressUpdate website: String appraisal: String useByAsergoMarketingAccepted: Boolean } "Company update result" type CompanyUpdatePayload { company: Company error: String warning: String success: Boolean! } "Complete a invitation." input CompleteUserInviteInput { "Invitation token, received by email" token: String! "Username" username: String! """ Password Must be longer than 5 and contain #, !, -, _, $, ?, * or a number """ password: String! } "Result of user creation" type CompleteUserInvitePayload { success: Boolean! error: String } "Contact request content" input ContactRequestInput { "Email address we will respond to" email: String! "Your Name" name: String subject: String! "Body of your request" content: String! "Media your request is submitted from, eg. website/dashboard/app" origin: String type: ContactRequestType } "result of contact request" type ContactRequestPayload { success: Boolean! information: String warning: String error: String } "Type of contact request" enum ContactRequestType { "Support" SupportType "Abuse" AbuseType "Sales" SalesType } """ ISO 3166-1 alpha-3 country code. Also accepts ISO 3166-1 alpha-2 country codes and country names in English, German, Danish and French """ scalar CountryISO type Cpu implements Part { architecture: Architecture! "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } "Invite an existing contact to the company dashboard with caller as invite. The user will receive an email with the invitation and a link to create a login to the dashboard" input CreateContactInviteInput { "User ID to the Contact" id: UserId! "Legal Authority rights give access to everything. Accounting, Servers, etc. Only users with Legal Authority can manage users" legalAuthorityAccess: Boolean! "User have access to all server, network etc." technicalAccess: Boolean! "User have access to invoices and billing information" accountingAccess: Boolean! "Message that will be included in the email to the Contact" message: String! } "Create a object storage" input CreateObjectStorageInput { company: CompanyId name: String! """ "Control internet access. If no whitelist is supplied access from anywhere is granted. If an empty list is supplied, only access from within ASERGO networks If a access list is supplied access from access list and ASERGO networks" """ accessList: [String!] description: String! } "object storage creation result" type CreateObjectStoragePayload { data: ObjectStorageBucket error: String warning: String success: Boolean! } input CreatePasswordCredential { "New username" username: String! "New password" password: String! } input CreateServiceAccountInput { name: String! note: String passwordCredential: CreatePasswordCredential } "Create a invitation to the company dashboard with caller as invite. The user will receive an email with the invitation and a link to create a login to the dashboard" input CreateUserInviteInput { "Name on the user to invite" userName: String! "Email the invite is sent to" userEmail: String! "Legal Authority rights give access to everything. Accounting, Servers, etc. Only users with Legal Authority can manage users" legalAuthorityAccess: Boolean! "User have access to all server, network etc." technicalAccess: Boolean! "User have access to invoices and billing information" accountingAccess: Boolean! "Message that will be included in the email to the Contact" message: String! } interface Credential { type: String! } "Object identified by parent object ID." type CredentialsCollection { nodes: [Credential!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! passwordCount: Int! oauthCount: Int! } "Dashboard area information" type Dashboard { "area identifier" id: String! parent: String "Area type" type: String! "Dashboard title" title: String! "If area is disabled" active: Boolean! maintenance: Boolean! "Area information" info: String "Warning for dashboard area" warningMessage: String debug: Boolean! } "Dashboard loading status and information, including url for remote dashboards" type DashboardLoadPayload { success: Boolean! error: String "Dashboard info" info: Dashboard "Remote dashboard url" url: String } "Dashboard notification" type DashboardNotification { "Notification content" content: String! timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "Describes a service available in customer dashboard, proxy, etc." type DashboardService { "unique service identifier" id: DashboardServiceId! active: Boolean! maintenance: Boolean! type: ServiceVariantType! "The name of the service" name: String! description: String! cluster: K8sClusterId } scalar DashboardServiceId "Object identified by parent object ID." type DashboardServicesCollection { nodes: [DashboardService!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: DashboardServicesOrder } "DashboardServices field to sort collection by" enum DashboardServicesOrder { NAME COMPANY CLUSTER } scalar DeviceId type Disk implements Part { diskType: DiskType bytesDecimal( "size format" format: BytesUnits = Human): BytesDecimal! raidInfo: DiskRaidInfo "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } type DiskRaidInfo { id: InventoryPartId! deviceId: String! } enum DiskType { Hdd Ssd Other Unknown } "Dns domain" type DnsDomain { "unique domain identifier" id: DnsDomainId! "List of domain records." records: [DnsRecord!]! "domain name." name: String! "Zone file content for the domain/zone." zoneFile: String! } scalar DnsDomainId "DNS domain result" type DnsDomainPayload { data: DnsDomain error: String warning: String success: Boolean! } "Object identified by parent object ID." type DnsDomainsCollection { nodes: [DnsDomain!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: DnsDomainsOrder } "DnsDomains field to sort collection by" enum DnsDomainsOrder { DOMAIN } "Dns record for a single domain" type DnsRecord { "unique record identifier" id: DnsRecordId! "The host name, service, or alias defined by the record." name: String! "DNS record type, supported types: A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SOA, SRV, TXT" type: DnsRecordType! """ Variable content depending on record type. For example: * For a A record would be the IPv4 address to which the domain will be mapped. * For a CAA record, it would contain the domain name of the CA being granted permission to issue certificates. * For a CNAME, MX, NS, SRV record, it should be a full hostname. """ content: String! "Indicate which of the servers listed as MX records it should attempt to use first." priority: Int "Time to live in seconds, default 1800" ttl: Int "The port for SRV records." port: Int "The weight for SRV records." weight: Int "An unsigned integer between 0-255 used for CAA records." flags: Int "The parameter tag for CAA records. Valid values are \"issue\", \"issuewild\", or \"iodef\"" tag: String } scalar DnsRecordId "Full dns record details, all fields will be replaced" input DnsRecordInput { "unique record identifier" id: DnsRecordId! """ The host name, service, or alias defined by the record. Required by: A, AAAA, CAA, CNAME, TXT, SRV """ name: String! """ DNS record type, supported types: A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SOA, SRV, TXT Customers are only allowed to create records of types: A, AAAA, CAA, MX, NS, TXT, CNAME, SRV """ type: DnsRecordType! """ Variable content depending on record type. For example: * For a A record would be the IPv4 address to which the domain will be mapped. * For a CAA record, it would contain the domain name of the CA being granted permission to issue certificates. * For a CNAME, MX, NS, SRV record, it should be a full hostname. * For a TXT record, it should be a text string not wrapped in quotes. """ content: String! """ Indicate which of the servers listed as MX records it should attempt to use first. Required by: MX, SRV """ priority: Int "Time to live in seconds, default 1800" ttl: Int """ The port for SRV records. Required by: SRV """ port: Int """ The weight for SRV records. Required by: SRV """ weight: Int """ An unsigned integer between 0-255 used for CAA records. Required by: CAA """ flags: Int """ The parameter tag for CAA records. Valid values are "issue", "issuewild", or "iodef" Required by: CAA """ tag: String } "DNS record type" enum DnsRecordType { A AAAA ALIAS CAA CNAME MX NS PTR SOA SRV TXT } scalar DnsServerId "Dns domain updates" type DnsUpdateEvent { id: DnsDomainId! type: EventChangeType! domain: DnsDomain } "Create a new domain for" input DomainCreateInput { "DNS server id, for customer dns \"ns1.asergo.com\" should be used and is default value" server: DnsServerId "Domain name to create all in lowercase, [a-z0-9][a-z0-9\\.-]{1,61}[a-z0-9]\\.[a-z]{2,}" domain: String! "Initial DNS records for the record" records: [DomainRecordCreate!]! } "Data for new record to create" input DomainRecordCreate { """ The host name, service, or alias defined by the record. Required by: A, AAAA, CAA, CNAME, TXT, SRV """ name: String! "DNS record type, supported types: A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SOA, SRV, TXT" type: DnsRecordType! """ Variable content depending on record type. For example: * For a A record would be the IPv4 address to which the domain will be mapped. * For a CAA record, it would contain the domain name of the CA being granted permission to issue certificates. * For a CNAME, MX, NS, SRV record, it should be a full hostname. * For a TXT record, it should be a text string not wrapped in quotes. """ content: String! """ Indicate which of the servers listed as MX records it should attempt to use first. Required by: MX, SRV """ priority: Int "Time to live in seconds, default 1800" ttl: Int """ The port for SRV records. Required by: SRV """ port: Int """ The weight for SRV records. Required by: SRV """ weight: Int """ An unsigned integer between 0-255 used for CAA records. Required by: CAA """ flags: Int """ The parameter tag for CAA records. Valid values are "issue", "issuewild", or "iodef" Required by: CAA """ tag: String } "Update records for a domain" input DomainUpdateInput { "DNS domain to add records for" domain: DnsDomainId! "Record ids to delete" deletedRecords: [DnsRecordId!]! "Existing records to update" updatedRecords: [DnsRecordInput!]! "New records to add to the domain" createdRecords: [DomainRecordCreate!]! } "Object identified by parent object ID." type EntriesCollection { nodes: [TicketEntry!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: EntriesOrder } "Entries field to sort collection by" enum EntriesOrder { CREATED } "Event change type, Please note that you in some cases can receive an updated event without on prior Created event for the same ID" enum EventChangeType { Created Updated Deleted } "Add follower to a ticket, followers can se and reply to the ticket" input FollowerAddInput { "Ticket ID " id: TicketId! "List of Identity ID's to to add as ticket follower" followers: [IdentityId!]! } "Remove a follower from a ticket, the follower can no longer see the ticket but will still be able to reply to mails they have sent in the past" input FollowerRemoveInput { "Ticket ID " id: TicketId! "List of Identity ID's to to remove as ticket follower" followers: [IdentityId!]! } type Generic implements Part { "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } """ servers current status Object identified by parent object ID. """ type HardwareCurrentStatus { powerState: PowerState timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "unique ID for hardware, this includes servers, virtual servers, K8sPod etc." scalar HardwareId "Details or an IP located on a server" type HardwareIp { ip: Cidr! dnsName: String interface: InterfaceId "IP usage" usage: [Usage!]! "Gateway" gateway: String "Netmask" netmask: String "Raw I value without bitmask" raw: String! } "Server log message" type HardwareLogMessage implements ServerEvent { level: String! hardware: String! message: String! timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "User or Company identity" type Identity { id: String! "name of user or company" name: String! email: String user: User company: Company } "Object identified by parent object ID." type IdentityCollection { nodes: [Identity!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: IdentityOrder } "unique identifier for a person or a company (CompanyId or UserId) " scalar IdentityId "Identity field to sort collection by" enum IdentityOrder { NAME EMAIL } enum IdentityType { Operator Client } scalar Index scalar InterfaceId "Object identified by parent object ID." type InterfacesCollection { nodes: [NetworkInterface!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! } scalar InventoryPartId "Events for user invites" type InviteEvent { id: UserInviteId! type: EventChangeType! invite: UserInviteDetails } enum InviteType { InviteNewDashboard InviteNewUser } "Object identified by parent object ID." type InvitesCollection { nodes: [UserInviteDetails!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: InvitesOrder } "Invites field to sort collection by" enum InvitesOrder { STATUS EXPIRE } "A list of IP ranges" type IpRangeList { ranges: [String!]! } "Updates for an IP number" input IpUpdateInput { "Cidr representation of IP" id: Cidr! "Reverse dns name" dnsName: String } input IpWhitelistInput { "IP range to add/remove from IP whitelist" range: String! } "Status for IP whitelist mutation" type IpWhitelistPayload { success: Boolean! error: String list: IpRangeList! } "Object identified by parent object ID." type IpsCollection { nodes: [HardwareIp!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! } "Kubernetes apis information" type K8sClusterApi { name: String! versions: [K8sClusterApiVersion!]! } "Kubernetes apis version information" type K8sClusterApiVersion { version: String! groupVersion: String! } "unique ID for kubernetes cluster" scalar K8sClusterId "Kubernetes cluster information" type K8sClusterInformation { id: K8sClusterId! apis: [K8sClusterApi!]! nodes: [K8sClusterNodeInformation!]! kubernetesUpdates: [VersionDescription!]! networkStackUpdates: [VersionDescription!]! pods: PodsCollection! } "Kubernetes cluster item information" type K8sClusterNodeInformation { metadata: K8sClusterNodeMetaData! status: K8sClusterNodeStatus! spec: K8sClusterNodeItemSpec! id: K8sNodeId! isReady: Boolean! monitoringName: String osVersionInfo: VersionDescription k8sVersionInfo: VersionDescription osUpdates: [VersionDescription!]! "Primary node IP" node_ip: String "All node IPs" node_ips: [String!]! pods: PodsCollection! workload: WorkloadCollection! } "Kubernetes node speck information" type K8sClusterNodeItemSpec { unschedulable: Boolean taints: [K8sClusterNodeItemSpecTaints!] unschedulableTaint: K8sClusterNodeItemSpecTaints } "Kubernetes node speck taint information" type K8sClusterNodeItemSpecTaints { key: String! effect: String! timeAdded: String } "Kubernetes node metadata information" type K8sClusterNodeMetaData { name: String! uid: String! workerRole: String masterRole: String "Indicates if the node is in a upgrade process" upgradeInProgress: Boolean! "In case upgrade is in progress return upgrade status" upgradeStatus: String isMaster: Boolean! isWorker: Boolean! hardwareId: HardwareId } "Kubernetes node metadata information" type K8sClusterNodeStatus { capacity: K8sClusterNodeStatusCapacity! allocatable: K8sClusterNodeStatusCapacity! nodeInfo: K8sClusterNodeStatusNodeInfo! addresses: [KubeItemStatusAddress!]! conditions: [KubeItemStatusCondition!]! } "Kubernetes node metadata information" type K8sClusterNodeStatusCapacity { cpu: String! pods: String! hugepages2Mi: String hugepages: String memory: String! } "Kubernetes node metadata information" type K8sClusterNodeStatusNodeInfo { kernelVersion: String! kubeletVersion: String! containerRuntimeVersion: String! osVersion: String } "Kubernetes pod metadata" type K8sMetadata { uid: String! name: String! namespace: String! creationTimestamp: String ownerReferences: [K8sOwnerReferences!] } enum K8sNetworkOperatorType { Calico } "unique ID for kubernetes cluster node (worker or master)" scalar K8sNodeId "Kubernetes OwnerReferences" type K8sOwnerReferences { kind: String! name: String! controller: Boolean uid: String! } "Kubernetes pod condition" type K8sPodCondition { type: String! status: String! lastTransitionTime: String! reason: String } "Kubernetes pod details" type K8sPodDetails { spec: K8sPodSpec! metadata: K8sMetadata! status: K8sPodStatus! } "Kubernetes pod spec" type K8sPodSpec { nodeName: String serviceAccount: String priority: Int priorityClassName: String } "Kubernetes pod status" type K8sPodStatus { phase: String! startTime: String conditions: [K8sPodCondition!] conditionReady: K8sPodCondition isRunning: Boolean! } "Kubernetes node workload, including total replication count" type K8sWorkload { type: String! name: String! count: Int! totalReplicas: Int } "Kubernetes node address information" type KubeItemStatusAddress { type: String! address: String! } "Kubernetes node status condition" type KubeItemStatusCondition { type: String! status: String! message: String! lastTransitionTime: String! lastHeartbeatTime: String! reason: String! } "Kubernetes cluster details" type KubernetesCluster { id: K8sClusterId! name: String! "ASERGO kubernetes version" version: String! description: String! oidc: OidcClientId preReleases: Boolean! allowClusterAdmin: Boolean! highPriority: Boolean! k8sApi: String! "Maintenance job state." maintenanceJob: MaintenanceJobState "Cluster implementation details, nodes, pods, etc." implementation: K8sClusterInformation "Upgrade steps to meet specified or latest kubernetes version." upgradeGuide( "Target version" target: String): String """ Cluster API endpoint. Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ controlPlaneEndpoint: String """ Kubernetes version, empty if not detected, in case of multiple version larges version is returned Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ k8sVersion: String """ Is Zero trust network supported Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ zeroTrustNetworkSupported: Boolean """ Network operator type Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ networkStackOperator: K8sNetworkOperatorType """ Is Zero trust network enabled Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ zeroTrustNetworkEnabled: Boolean """ Network stack version Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ networkStackVersion: String """ Access for users with role : Required permissions: No customer access """ servers: ServersCollection! } "kubernetesCluster result" type KubernetesClusterPayload { data: KubernetesCluster error: String warning: String success: Boolean! } "Update kubernetes cluster" input KubernetesClusterUpdateInput { id: K8sClusterId! active: Boolean name: String description: String "Enable cluster to use pre released features" preReleases: Boolean "Control whatever users are allowed to have the 'Cluster Admin' permission level" allowClusterAdmin: Boolean """ Notify Asergo that this cluster is of the highest priority. Mark only one of your clusters as "highest priority" otherwise, this setting has no effect. """ highPriority: Boolean "zero-trust node network is a powerful security feature designed to improve the security of your Kubernetes cluster" zeroTrustNetworkEnabled: Boolean } "Event related to a k8s cluster" interface KubernetesEvent { message: String! } "Kubernetes log message" type KubernetesLogMessage implements KubernetesEvent { "debug, info, warn, error" level: String! cluster: String! message: String! "Log label, eg. upgrade, drain" label: String timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } type KubernetesMutation { """ Update kubernetes cluster Access for users with role : Administrator Required permissions: Kubernetes management: write """ update( "Cluster update type" input: KubernetesClusterUpdateInput!): KubernetesClusterPayload! """ Start kubernetes os upgrade process. Upgrade will run in the background. Status can be seen in metadata -> upgradeInProgress flag BETA: field may change Access for users with role : Administrator Required permissions: Kubernetes management: write """ upgradeK8sOsStart( "Kubernetes Cluster id" cluster: K8sClusterId!, "Kubernetes Cluster node ids" nodeNames: [K8sNodeId!]!, "Target version" target: String!): ActionPayload! """ Start kubernetes os upgrade process. Upgrade will run in the background. Status can be seen in metadata -> upgradeInProgress flag BETA: field may change Access for users with role : Administrator Required permissions: Kubernetes management: write """ upgradeK8sClusterStart( "Kubernetes Cluster id" cluster: K8sClusterId!, "Run upgrade in dry run to she changes" dryRun: Boolean!, "Target version" target: String!): ActionPayload! """ Start Patching of Talos Admission profiles BETA: field may change Access for users with role : Administrator Required permissions: Kubernetes management: write """ talosAdminssionPatchStart( "Kubernetes Cluster id" cluster: K8sClusterId!): ActionPayload! """ Start network stack upgrade BETA: field may change Access for users with role : Administrator Required permissions: Kubernetes management: write """ upgradeNetworkStackStart( "Kubernetes Cluster id" cluster: K8sClusterId!, "Target version" target: String!): ActionPayload! """ Reboot k8s node, use with care as this will potentially reboot the node without draining it first Access for users with role : Administrator Required permissions: Kubernetes management: write """ rebootNode( "Kubernetes Cluster id" cluster: K8sClusterId!, "Kubernetes Cluster node id" nodeName: K8sNodeId!): ActionPayload! } "Kubernetes update event" type KubernetesUpdateEvent implements KubernetesEvent { data: KubernetesCluster! timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! message: String! } "Kubernetes views" type KubernetesView { """ Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ clusters: ClustersCollection! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Kubernetes management: read """ cluster(id: K8sClusterId!): KubernetesCluster } input LoginInput { "Username" user: String! "Password" password: String! "Request how long time the token is valid in minutes (Max 240)" validInMin: Int "Request if the token should be allowed to renew it self" renewalAllowed: Boolean "One time password, generated with OTP app, can also be supplied later in upgradeToken" oneTimePassword: String } type LoginPayload { "The token in case the authentication is successful" token: WebToken "Indicates if the token need to be upgraded with a OneTimePassword, see upgradeToken" otpRequired: Boolean! "for the token" userId: UserId "Indicate that the login contains an error" error: String "Time where the token will expire" expireAt( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "Kubernetes maintenance job status" type MaintenanceJobState { kind: String! header: String! node: K8sNodeId success: Boolean! message: String! "Id to identify the job. Include it in any support requests" traceId: String "Is job still running." isRunning: Boolean! started( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! completed( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String } type Memory implements Part { bytesBinary( "size format" format: BytesUnits = Human): BytesBinary! "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } "String representation of a Monetary amount inclusive currency" scalar Money type Motherboard implements Part { "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } """ ### Mutations This is where all actions/functions is invoked. Mutations in GraphQL are analogous to REST’s POST and PUT The functions in our interface take some input an provide some payload as response. in example the function `updateCompany` will take `CompanyUpdateInput` as input parameters and return `CompanyUpdatePayload`. """ type Mutation { """ __Login__ by creating a token In case you have enabled One Time Password you can also supply the OTP password. """ createToken( "Password credential" input: LoginInput!): LoginPayload! """ Used to supply OneTimePassword if your token created from createToken require to be upgraded. (OTP is enabled and your IP does not match your IP whitelist) """ upgradeToken( "Password credential" input: UpgradeTokenInput!): LoginPayload! """ Used to supply OneTimePassword if your token created from createToken require to be upgraded. (OTP is enabled and your IP does not match your IP whitelist) """ checkToken( "UserToken, from oidc authentication" token: WebToken!): LoginPayload! """ Create new credentials for the API/Dashboard. Dashboard owner can't send password reset mails to all other users in the dashboard. The mail will contain the token used as argument to create new credential for the account """ resetCredential(input: PasswordResetInput!): PasswordUpdatePayload! "Post a contact request to ASERGO" contactRequest( "Request content" input: ContactRequestInput!): ContactRequestPayload! "Accept an invitation to access a dashboard (invitations are sent by email)" completeUserInvite( "Username and Password" input: CompleteUserInviteInput!): CompleteUserInvitePayload! "Accept an order" orderConfirm( "Order name" name: String!): OrderConfirmPayload! "All actions that require authentication" viewer( "UserToken, can be created from the mutation createToken" token: WebToken): ViewerMutation! } "Network interface" type NetworkInterface { id: InterfaceId! name: String management: Boolean! mac( "Delimiter" delimiter: String = ":", "Uppercase" uppercase: Boolean = false): String """ Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ ips: IpsCollection! } type OAuthTokenCredential implements Credential { tokenType: OAuthTokenType! token: String! type: String! } "The type of oauth token" enum OAuthTokenType { Facebook Google Twitter Unknown Unsupported } "Object Storage Bucket details" type ObjectStorageBucket { id: StorageId! "Bucket name" bucketName: String! generateBucketName: String! url: String! usage: ObjectStorageBucketUsage controls: ObjectStorageControl """ accessKeyId Access for users with role : Administrator Required permissions: Object storage: Editor """ accessKeyId: String """ secretAccessKey Access for users with role : Administrator Required permissions: Object storage: Editor """ secretAccessKey: String creation( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "Object Storage Bucket usage details" type ObjectStorageBucketUsage { "GByte used" gb: Float! gbMax: Float! blocks: Float! "Estimated monthly bucket price" priceEur: Float bytes( "size format" format: BytesUnits = Human): BytesDecimal! } "Object identified by parent object ID." type ObjectStorageCollection { """ Access for users with role : Administrator Required permissions: Object storage: Viewer """ nodes: [ObjectStorageBucket!]! """ total count, in case of missing permission to read -1 is returned Access for users with role : Administrator Required permissions: Object storage: Viewer """ totalCount: Int! } "Object Storage control details" type ObjectStorageControl { description: String! """ "Control internet access. If no whitelist is supplied access from anywhere is granted. If an empty list is supplied, only access from within ASERGO networks If a access list is supplied access from access list and ASERGO networks" """ accessWhitelist: [String!] } "Open ID connect client details" type OidcClient { id: OidcClientId! name: String! description: String! asergoManaged: Boolean! secret: String! redirectUris: [String!]! accessTokenTtl: Int refreshTokenTtl: Int refreshTokenMaxAge: Int validScopes: [ScopeType!]! isPublicClient: Boolean! claimExample: String! } "Object identified by parent object ID." type OidcClientCollection { nodes: [OidcClient!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: OidcClientOrder } "Create new Open ID connect client" input OidcClientCreateInput { name: String! description: String! scopes: [ScopeType!]! redirectUris: [String!]! } "Open ID connect client id" scalar OidcClientId "OidcClient field to sort collection by" enum OidcClientOrder { NAME } "OpenID Connect Client action result" type OidcClientPayload { data: OidcClient error: String warning: String success: Boolean! } "Update Open ID connect client" input OidcClientUpdateInput { id: OidcClientId! name: String description: String scope: [ScopeType!] accessTokenTtl: Int refreshTokenTtl: Int refreshTokenMaxAge: Int redirectUri: [String!] } "Generated One Time Password secret" type OneTimePasswordPayload { username: String! "Svg image with otp url, can be scanned with OTP app" svg: String! "The secret that is used by client app to generate OTP keys" secret: String! "URL to the SVG image containing the secret" svgResourceUrl: String } "result of order confirmation" type OrderConfirmPayload { success: Boolean! information: String warning: String error: String } "An server part, eg. disk, cpu, ." interface Part { "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } type PasswordCredential implements Credential { username: String! type: String! } input PasswordResetInput { "Password reset token received by email" token: WebToken! "New username" username: String! "New password" password: String! } input PasswordUpdateInput { "New username" username: String! "New password" password: String! "Current password is required when you change your own password, when setting for a Service account it can be omitted" currentPassword: String "Optional User to change password on. Only legal owners can change password for an Service Account" id: UserId } "Password update status" type PasswordUpdatePayload { success: Boolean! error: String password: PasswordCredential @deprecated(reason: "Replaced with data field") data: PasswordCredential } enum PermissionType { "Access to specific API area" ApiPermission "Access to specific service" ServicePermission "Access to kubernetes cluster API" KubernetesPermission } "Object identified by parent object ID." type PodsCollection { nodes: [K8sPodDetails!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! readyCount: Int! runningCount: Int! } type Port implements Part { physicalMac: String portType: PortType "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } enum PortType { Network_Rj45 Network_SFP Network_Rs232 Network_Other Power_C13 Power_C19 Power_Other Other } "Server has performed an power event" type PowerEvent implements ServerEvent { message: String! } enum PowerRequest { "Power on" PowerOn "Power off HARD" PowerOff "Issue a Power off by ACPI" PowerOffGraceful PowerCycle "Boot into Diagnostic mode" Diagnostic "Reboot server" Reset } enum PowerState { PowerOn "Powered off" PowerOff "Currently shutting down" ShuttingDown Booting "Can't determine power state" Unknown NotSupported } "Information about our products" type ProductCatalog { servers(ordering: ProductListOrder): ProductListCollection! colocation(ordering: ProductListOrder): ProductListCollection! all(ordering: ProductListOrder): ProductListCollection! } "unique product identifier" scalar ProductId type ProductInformation { "productId" id: ProductId! "Product name" name: String! "Product description" description: String "Long description in HTML" descriptionLong: String recurringInvoice: Boolean! "Price" price: Float! "Currency" currency: String! "JPEG image base64 encoded" image: String line: [ProductLine!]! barebone: [ProductLine!]! hdd: [ProductLine!]! ssd: [ProductLine!]! memory: [ProductLine!]! network: [ProductLine!]! processor: [ProductLine!]! imageUrl: String } "Information about product" type ProductLine { type: String! count: Int! label: String! description: String image: String } "Object identified by parent object ID." type ProductListCollection { nodes: [ProductInformation!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: ProductListOrder } "ProductList field to sort collection by" enum ProductListOrder { NAME PRICE } "\n### Queries in GraphQL\nQueries in GraphQL are analogous to REST\u2019s GET and they allow to ask the server for the data we need.\nContrary to REST however, we get full power to ask for exactly what we need and in the shape we need it.\n\nSee details on how graphql works at: [https://graphql.org/learn/](https://graphql.org/learn/)\n\nIn GraphQl all fields/arguments are optional and only required fields/arguments have a `!` after the type definition.\n\n### Error handling\nIn addition to the errors -> message in the graphql specification we also include two optional fields in out errors:\n* __user_message__ holds an error message suitable to be shown to end user\n* __error_id__ hold an unique id for the current error\n* __type__ indicates the error cause: input, query or server\n\n### Start exploring the api\nFor an easy start you can start exploring our API via [GraphiQL](./gr) where this docs are included\n" type Query { """ Viewer represents the current viewer, to access this scope a valid user token should be provided. To create a token from your login credential use the mutation function createToken Token can be provided as: * argument * http header named 'X-Auth-Token' """ viewer( "UserToken, can be created from the mutation createToken" token: WebToken): Viewer! inviteDetails( "Invitation token, normally emailed to you" input: String!): UserInviteSummery! productCatalog: ProductCatalog! orderStatus( "Order name" name: String!): SalesOrder! } type RaidController implements Part { "Part id" id: ID! "Parts logical name" logicalName: String vendor: String serialNumber: String productNumber: String inventorySlot: String index: Index server: Server firmware: String partType: String! } "Server has rebooted" type RebootEvent implements ServerEvent { message: String! } "Contains information about a remembered browser" type RememberedDevice { deviceId: DeviceId! deviceDescription: String! expiration( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! "Return true if current device matches this device" currentDevice: Boolean! } "Subscription details" type SaleSubscription { id: SubscriptionId! name: String! reference: String startDate( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! nextInvoiceDate( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String stage: String! isActive: Boolean! } "Details about an sales order" type SalesOrder { creation: Timestamp! "Order name" name: String! "Order status: sent, sale, done, cancel, ..." status: String! lines: [SalesOrderLine!]! "Tax value" priceTax: Float! "Price including TAX" priceTotal: Float! "Price ex. TAX" priceSubtotal: Float! currency: String! total: Money! tax: Money! subtotal: Money! validityDate( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String } "Details about an order line" type SalesOrderLine { "Product name and variant selection" name: String! "Ordered quantity" count: Int! unitOfMeasure: String priceUnit: Float! @deprecated(reason: "Replaced by unitPrice") priceSubtotal: Float! priceTax: Float! @deprecated(reason: "Replaced by tax") priceTotal: Float! @deprecated(reason: "Replaced by total") currency: String! "tax type name" taxName: String! discount: Float! tax: Money! subtotal: Money! total: Money! unitPrice: Money! description: String! @deprecated(reason: "Not supported by odoo") } "OIDC Scope types that define what resources and claims the scope will give access to" enum ScopeType { "Provide access to claims: sub, auth_time, acr, nonce" openid "Provide access to claims: roles, permissions, grafana_role, docker_repository_role" roles "Provide access to claims: name, preferred_username" profile "Provide access to claims: email, email_verified" email "Provide access to claims: kubectl-id, kubectl-roles, k8s-api" k8s "Provide access to claims: company, company-name" company "Provide access to claims: name, email" apifull } "Full description of an server" type Server { id: HardwareId! "Server label, customer editable server label" label: String! "Unique server name, can't be changed by customer" name: String "Short custom description for the server" description: String! maintenance: Boolean! "current power state" powerState: PowerState! "Current server status including timestamp for last update" currentStatus: HardwareCurrentStatus powerStateChanged( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String """ Server owner Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ assignedTo: Company """ Server owner Access for users with role : Administrator || Accounting Required permissions: Accounting: read """ subscription: SaleSubscription """ Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ nics: InterfacesCollection! } "Request KVM access to be opened. Start a VNC server with a temporary password" input ServerAutoKvmInput { "Server ID" id: HardwareId! "Maximum uptime for the KVM, 1 - 24 hours" maxUptimeHours: Int "This field is restricted to Asergo employees only. If specified by non-Asergo personnel, access will be denied." image: String } "KVM access result" type ServerAutoKvmPayload { connectionName: String! success: Boolean! "Description of the problem in case there is a problem with the invocation" error: String "Host to connect to" host: String "Port to connect to" port: Int path: String "One time password to connect to kvm" password: String } "Request booting server with a specific device" input ServerBootRequestInput { "hardware ID" id: HardwareId! "Boot device" req: BootDevice! } "Server boot to device invocation result" type ServerBootRequestPayload { "Description of the problem in case there is a problem with the invocation" error: String status: Boolean! } "Event related to the server" interface ServerEvent { message: String! } type ServerMutation { """ Access for users with role : Administrator || Technical Required permissions: Server: write """ updateIp(input: IpUpdateInput!): ActionPayload! """ Access for users with role : Administrator || Technical Required permissions: Server: write """ updateServer(input: ServerUpdateInput!): ServerUpdatePayload! """ Access for users with role : Administrator || Technical Required permissions: Server: write """ powerRequest(input: ServerPowerRequestInput!): ServerPowerRequestPayload! """ Access for users with role : Administrator || Technical Required permissions: Server: write """ bootRequest(input: ServerBootRequestInput!): ServerBootRequestPayload! """ Start VNC server with access to the servers KVM Access for users with role : Administrator || Technical Required permissions: Server: write """ kvmStart(input: ServerAutoKvmInput!): ServerAutoKvmPayload! } "Request a power action on a server" input ServerPowerRequestInput { "hardware ID" id: HardwareId! "Power request" req: PowerRequest! } "Server power invocation result" type ServerPowerRequestPayload { "Description of the problem in case there is a problem with the invocation" error: String status: Boolean! } "Updates for a server" input ServerUpdateInput { "HardwareId" id: HardwareId! "Server Label" label: String "Short description of your server" description: String } "Server update result" type ServerUpdatePayload { server: Server } "Object identified by parent object ID." type ServersCollection { nodes: [Server!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! serversOnCount: Int! serversOffCount: Int! } type ServiceAccountCreatePayload { success: Boolean! error: String data: ServiceAccountData } type ServiceAccountData { data: User! "Kube config file content" config: String username: String! password: String! } "Updates for a Service account" input ServiceAccountInput { "UserId" id: UserId! "name og service account" name: String note: String } "Status of the service" enum ServiceState { Ok ReadOnly Down } "Details about an service state" type ServiceStatus { code: Int! status: ServiceState! message: String! systemName: String! } "Dashboard service type" enum ServiceVariantType { "Service variant argocd" argocd "Service variant kubedashboard" kubedashboard "Service variant metrics" metrics "Service variant grafana" grafana "Service variant grafanasubpath" grafanasubpath "Service variant prometheus" prometheus "Service variant kibana" kibana "Service variant nexus" nexus "Service variant harbor" harbor "Service variant maintenance" maintenance "Service variant seaweedfsmanagement" seaweedfsmanagement "Service variant seaweedfsbrowser" seaweedfsbrowser "Service variant otherproxy" otherproxy "Service variant other" other } "Servers status has changed" type StatusChangedEvent implements ServerEvent { message: String! } scalar StorageId type StorageMutation { """ Create object storage bucket Access for users with role : Administrator Required permissions: Object storage: Editor """ create( "Object storage creation input" input: CreateObjectStorageInput!): CreateObjectStoragePayload! """ Update object storage bucket Access for users with role : Administrator Required permissions: Object storage: Editor """ update( "Object storage update input" input: UpdateObjectStorageInput!): CreateObjectStoragePayload! """ Create object storage bucket Access for users with role : Administrator Required permissions: Object storage: Editor """ delete( "Object storage id" id: StorageId!, "Object storage owner" company: CompanyId): ActionPayload! } "Object identified by parent object ID." type SubSystemStatusesCollection { nodes: [ServiceStatus!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: SubSystemStatusesOrder } "SubSystemStatuses field to sort collection by" enum SubSystemStatusesOrder { SYSTEM_NAME STATUS } """ We support subscriptions with Server Sent Event (SSE). The subscriptions take following http headers: * Graphql-Query: variables and query in json format (alternatively the variables and query can be URI encoded in the 'query' GET parameter) * X-Auth-Token: request token """ type Subscription { "Event stream for user, log, etc." userEvents( "UserToken, can be created from the mutation createToken" token: WebToken, id: UserId): UserEvent! "Event stream for all users from the current company" companyUserEvents( "UserToken, can be created from the mutation createToken" token: WebToken): UserChangeEvent! "Event stream for company updates" companyEvents( "UserToken, can be created from the mutation createToken" token: WebToken): CompanyChangeEvent! "Event stream for company related updates" sharedEvents( "UserToken, can be created from the mutation createToken" token: WebToken, tickets: Boolean, company: Boolean, users: Boolean): CompanyUpdateEvent! "Event stream from server" serverEvents( "UserToken, can be created from the mutation createToken" token: WebToken, id: HardwareId!): ServerEvent! "Event stream with server updates" onServerUpdate( "UserToken, can be created from the mutation createToken" token: WebToken, id: HardwareId!): Server! "Event support issues" supportEvents( "UserToken, can be created from the mutation createToken" token: WebToken, id: TicketId): TicketChangeEvent! "Event stream from invites" invites( "UserToken, can be created from the mutation createToken" token: WebToken): InviteEvent! "Event stream for a cluster" k8sClusterEvents( "UserToken, can be created from the mutation createToken" token: WebToken, id: K8sClusterId!): KubernetesEvent! """ Event stream from dns domains Access for users with role : Administrator || Technical Required permissions: DNS domain: read """ dnsUpdates( "UserToken, can be created from the mutation createToken" token: WebToken): DnsUpdateEvent! } scalar SubscriptionId "Object identified by parent object ID." type SubscriptionsCollection { nodes: [SaleSubscription!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: SubscriptionsOrder } "Subscriptions field to sort collection by" enum SubscriptionsOrder { REFERENCE STARTDATE } "All tickets related to your services" type Support { tickets(ordering: TicketsOrder): TicketsCollection! "List off all open tickets" ticketsOpen(ordering: TicketsOrder): TicketsCollection! teams(ordering: TicketTeamsOrder): TicketTeamsCollection! "Details about a single ticket, messages, creation, support team, etc." ticket(id: TicketId!): Ticket! team(id: TicketTeamId!): TicketTeam! "Single ticket message" entry(id: TicketMessageId!): TicketEntry! "Search for tickets" searchTicket(search: String!, ordering: TicketsOrder): TicketsCollection! } "New ticket details" input SupportCreateTicketInput { "TicketTeamId the message will be posted to" id: TicketTeamId! "Message subject" subject: String! "body in HTML format" body: String! "Additional description in plain text" description: String "Message attachments" attachment: [AttachmentCreate!] "List of other users there have access to the message" addFollowers: [UserId!] } "create ticket result" type SupportCreateTicketPayload { ticket: Ticket } "Update support items" type SupportMutation { """ Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ addTicketResponse( "Response" input: AddTicketResponseInput!): AddTicketResponsePayload! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ markAsSolved(id: TicketId!): SupportTicketPayload! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ createTicket(input: SupportCreateTicketInput!): SupportCreateTicketPayload! """ Mark the ticket thread and all messages as read Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ markAsRead(id: TicketId!): ActionPayload! """ Add a follower to the ticket. Followers can see and reply to the ticket and add other followers Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ followerAdd(input: FollowerAddInput!): ActionPayload! """ Stop following the ticket, you will no longer have access to the ticket Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ stopFollowing(id: TicketId!): ActionPayload! """ Remove a follower from the ticket. Only followers can see and reply to the ticket Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ followerRemove(input: FollowerRemoveInput!): ActionPayload! """ All notifications on this message thread will only contain a email notification about new message Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ ticketNotificationsContentRemove(id: TicketId!): ActionPayload! """ All notifications on this message thread will have full content sent by email Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ ticketNotificationsContentInclude(id: TicketId!): ActionPayload! } "SupportTicket result" type SupportTicketPayload { data: Ticket error: String warning: String success: Boolean! } "Full ticket details" type Ticket { id: TicketId! "True if the thread contains unread messages" unread: Boolean! subject: String! "Summery of the ticket" description: String! "Content of messages is not included in email notifications" confidential: Boolean! stage: String! isOpen: Boolean! isClosed: Boolean! "Created time" created( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! team: TicketTeam! author: Identity "The date the ticket was closed" closed( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String "Users following the ticket has access to the ticket and can reply to it" followers(ordering: IdentityOrder): IdentityCollection! entries(ordering: EntriesOrder): EntriesCollection! "Indicates i current user is following this ticket" isFollower: Boolean! first: TicketEntry last: TicketEntry } "TicketChangeEvent deliver updates for support tickets" type TicketChangeEvent { id: TicketId! type: EventChangeType! data: Ticket } "Ticket entry contains a single message under a support ticket" type TicketEntry { id: TicketMessageId! ticketId: TicketId! bodySummery: String! createdBy: Identity! attachments: [Attachment!]! created( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! author_name: String! body: String! author_type: IdentityType! } scalar TicketId scalar TicketMessageId "Ticket team details" type TicketTeam { id: TicketTeamId! name: String! } scalar TicketTeamId "Object identified by parent object ID." type TicketTeamsCollection { nodes: [TicketTeam!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: TicketTeamsOrder } "TicketTeams field to sort collection by" enum TicketTeamsOrder { ID NAME } "Object identified by parent object ID." type TicketsCollection { nodes: [Ticket!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! totalOpenCount: Int! totalClosedCount: Int! orderedBy: TicketsOrder } "Tickets field to sort collection by" enum TicketsOrder { CREATED UPDATED OPEN CLOSED ID NAME TEAM } scalar TimeZone scalar Timestamp type TokenDetails { token: WebToken! user: UserId! apiVersion: String renewalAllowed: Boolean! needOtp: Boolean target: String source: String sid: String! clientId: String scope: [String!] auth_time: Timestamp acr: String "Token issued at" issuedAt( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String "Token expiration date" expiration( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String expireInSeconds: Int "Renew token to expire in 1 hour, some tokens are nt allowed to be renewed" renewToken: LoginPayload! @deprecated(reason: "Renew token is mode to mutation") } "Update a object storage" input UpdateObjectStorageInput { id: StorageId! company: CompanyId """ "Control internet access. If no whitelist is supplied access from anywhere is granted. If an empty list is supplied, only access from within ASERGO networks If a access list is supplied access from access list and ASERGO networks" """ accessList: [String!] description: String! } input UpgradeTokenInput { "Token to upgrade" token: WebToken! "One time password, generated with OTP app" oneTimePassword: String! "Remember this device to bypass one time password in the future" rememberMe: Boolean } enum Usage { primary secondary private management backup virtual other } "User details" type User { id: UserId! "If false the user is archived and will not have access to dashboard or email communication, for dashboard access see 'dashboardAccess'" active: Boolean! dashboardAccess: Boolean! name: String! userType: UserType! email: String emailVerified: Boolean! note: String """ When the Privacy Policy was accepted Access for users with role : Personal data Required permissions: Personal data """ privacyPolicyAccepted( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String """ You will only have access to your own credentials and login name for service accounts Access for users with role : Personal data || Administrator Required permissions: Personal data or User management: read """ credentials: CredentialsCollection! """ roles granted to the user Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ roles: UserAccessRights @deprecated(reason: "Moved to accessRights") """ roles/permissions granted to the user Access for users with role : Administrator || Technical || Accounting || Administrator || Personal data Required permissions: Company data: read or User management: read or Personal data """ accessRights: UserAccessRights """ List of trusted (remembered) devices where the one time password is not needed Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ rememberedDevices: [RememberedDevice!]! """ List of Ip and IP ranges that are allowed to access without One Time password when enabled Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ secondFactorIpWhitelist: [String!]! """ is two factor authentication enabled, (OTP) Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ secondFactorAuthEnabled: Boolean """ Latest Authentication information Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ lastAuthentication: UserAuthenticationInfo """ List of latest Authentications Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ authentications( "Count of authentications to return" count: Int): [UserAuthenticationInfo!]! """ active invite to dashboard Access for users with role : Administrator Required permissions: User management: read """ invite: UserInviteDetails } "Roles/permissions granted to the user." type UserAccessRights { id: UserId! "Legal Authority rights give access to everything. Accounting, Servers, etc. Only users with Legal Authority can manage users" legalAuthority: Boolean! "User have access to all server, network etc." technical: Boolean! "User have access to invoices and billing information" accounting: Boolean! """ Internal access level Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ internalLevel: Int! """ Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ customRoles: [String!]! """ Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ customPermissions: [String!]! "Legal Authority rights give access to everything. Accounting, Servers, etc. Only users with Legal Authority can manage users" owner: Boolean! @deprecated(reason: "Replaced with Legal Authority") """ all available permissions, see granted field to test if user has individual permissions granted Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ permissions: [UserPermission!]! """ permissions granted to the user Access for users with role : Administrator || Personal data Required permissions: User management: read or Personal data """ permissionsGranted: [UserPermission!]! } "User authentication information" type UserAuthenticationInfo { "The remote IP used during authentication" ip: String "Indicated if second factor authentication was enabled during authentication" secondFactorUsed: Boolean! rememberedOnDevice: Boolean! "True if the authentication passed due to IP whitelist, empty when second factor is not enabled for login" ipWhitelistPass: Boolean timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } "UserChangeEvent indicates updates for a user" type UserChangeEvent { user: UserId! type: EventChangeType! data: User } "Event invoked by the user" interface UserEvent { message: String! } "String with unique user identifier" scalar UserId "User invite details" type UserInviteDetails { id: UserInviteId! inviteType: InviteType! message: String! "waiting, completed, expired" status: String! "Invite expiration time" expire( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! "When the invite vas completed" completed( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String newUser: User! invitedByUser: User! } scalar UserInviteId "Result of mutation and new invite status" type UserInviteMutatePayload { success: Boolean! error: String invite: UserInviteDetails @deprecated(reason: "Replaced by data field") data: UserInviteDetails } "Manage user invites" type UserInviteMutation { """ Invite a new user to the company dashboard Access for users with role : Administrator Required permissions: User management: write """ inviteNew(input: CreateUserInviteInput!): UserInviteMutatePayload! """ Invite existing contact to the company dashboard Access for users with role : Administrator Required permissions: User management: write """ inviteContact(input: CreateContactInviteInput!): UserInviteMutatePayload! """ Access for users with role : Administrator Required permissions: User management: write """ inviteExtend(input: UserInviteId!): UserInviteMutatePayload! """ Access for users with role : Administrator Required permissions: User management: write """ inviteDelete(id: UserInviteId!): Boolean! """ Access for users with role : Administrator Required permissions: User management: write """ inviteResend(id: UserInviteId!): UserInviteMutatePayload! } "User invite details" type UserInviteSummery { id: UserInviteId! inviteType: InviteType! message: String! status: String! "Invite expire time" expire( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! userName: String! userEmail: String! invitedByCompany: String! invitedByUser: String! } "User log message for actions invoked by the user" type UserLogMessage implements UserEvent { level: String! user: String! server: String! message: String! timestamp( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String! } type UserMutation { """ Delete user Access for users with role : (Administrator) && (!Personal data) Required permissions: User management: write or Internal level 1 and !Personal data """ delete(id: UserId!): ActionPayload! """ Removed all credential details for the user, including two factor authentication if enabled. Send a mail to the user with a password reset link to create a new login. (link will expire within 4 hours) Access for users with role : Administrator Required permissions: User management: write """ resetUserCredential(id: UserId!): ActionPayload! """ Disable One Time Password without code for other users Access for users with role : (Administrator) && (!Personal data) Required permissions: User management: write or Internal level 2 or Internal level 3 and !Personal data """ otpDisableForUser(id: UserId!): ActionPayload! """ Disable One Time Password Access for users with role : Personal data Required permissions: Personal data """ otpDisable( "One time password, generated with OTP app" otpCode: String!): ActionPayload! """ Remove access from a remembered device Access for users with role : Personal data Required permissions: Personal data """ removeRememberedDevice( "Device id" id: DeviceId!): ActionPayload! """ Accept out privacy policy Access for users with role : Personal data Required permissions: Personal data """ privacyPolicyAccept: ActionPayload! """ Confirm a action with the specified confirmation token provided Access for users with role : Personal data Required permissions: Personal data """ actionConfirmed( "Token confirming the action, normally received by email" confirmToken: String!): ActionPayload! """ Generate new One Time Password secret Access for users with role : Personal data Required permissions: Personal data """ otpGenerate: OneTimePasswordPayload! """ Generate new One Time Password secret Access for users with role : Personal data Required permissions: Personal data """ otpConfirmNew(otpSecret: String!, "One time password" otpCode: String!): ActionPayload! """ Remove dashboard access Access for users with role : (Administrator) && (!Personal data) Required permissions: User management: write or Internal level 1 and !Personal data """ removeDashboardAccess(id: UserId!): UserUpdatePayload! """ Update name and address Access for users with role : Administrator Required permissions: Company data: write """ updateCompany( "Company updates" input: CompanyUpdateInput!): CompanyUpdatePayload! """ Update company note Access for users with role : Administrator || Technical || Accounting Required permissions: Company note: write or Company data: write """ updateCompanyNote( "Company note" note: String!): CompanyUpdatePayload! """ Add/remove a custom permission to the user Access for users with role : Administrator Required permissions: User management: write """ permissionsUpdate(id: UserId!, add: [String!]!, remove: [String!]!): UserRoleActionPayload! """ Update name and address Access for users with role : Administrator Required permissions: Company data: write """ updateCompanyLogo( "New company logo Base64 encoded" dataBase64: String!): CompanyUpdatePayload! """ Access for users with role : Administrator Required permissions: User management: write """ serviceAccountCreate(input: CreateServiceAccountInput!): ServiceAccountCreatePayload! """ Access for users with role : Administrator || Personal data Required permissions: User management: write or Personal data """ serviceAccountUpdate(input: ServiceAccountInput!): UserUpdatePayload! """ Access for users with role : Administrator || Personal data Required permissions: User management: write or Personal data """ updateUser(input: UserUpdateInput!): UserUpdatePayload! """ Update users roles Access for users with role : Administrator Required permissions: User management: write """ updateUserRoles(input: UserRolesUpdateInput!): UserRolesUpdatePayload! """ Test result of changed users roles Access for users with role : Administrator Required permissions: User management: write """ updateUserRolesTest(input: UserRolesUpdateInput!): [UserPermission!]! """ Update username and password Access for users with role : Personal data Required permissions: Personal data """ passwordUpdate(input: PasswordUpdateInput!): PasswordUpdatePayload! """ Add range to IP whitelist Access for users with role : Personal data Required permissions: Personal data """ ipWhitelistAdd(input: IpWhitelistInput!): IpWhitelistPayload! """ Remove range from IP whitelist Access for users with role : Personal data Required permissions: Personal data """ ipWhitelistRemove(input: IpWhitelistInput!): IpWhitelistPayload! } """ Permission Object identified by parent object ID. """ type UserPermission { "Human readable permission name" name: String! "Plain name, representative for permission group, (without read,write etc. modifiers)" baseName: String! "Permission group key" group: String! "Permission typed. " type: PermissionType! "Unique permission key" key: String! description: String isWrite: Boolean! "Determines if this specific permission is granted to the user" granted: Boolean! "Whatever this permission level can be modified" fixed: Boolean! inRoles: [String!]! } "User permission / role update result" type UserRoleActionPayload { data: UserAccessRights error: String warning: String success: Boolean! } """ Updates roles for a user and , the roles will manage the users rights. Only fields supplied are updated """ input UserRolesUpdateInput { "UserId" id: UserId! "Legal Authority rights give access to everything. Accounting, Servers, etc. Only users with Legal Authority can manage users" legalAuthority: Boolean "User have access to all server, network etc." technical: Boolean "User have access to invoices and billing information" accounting: Boolean "List of custom permissions" customPermissions: [String!] } type UserRolesUpdatePayload { success: Boolean! error: String roles: UserAccessRights } "user type" enum UserType { Personal ServiceAccount InvoiceAddress } "Updates for a user" input UserUpdateInput { "UserId" id: UserId! "Users full name" name: String note: String "Users email address" email: String } "User update result" type UserUpdatePayload { user: User @deprecated(reason: "Replaced by data field") data: User error: String warning: String success: Boolean! } "Company users" type Users { "Details about authenticated user" current: User! "Legal Owner can see all contacts, other users can only see users with dashboard access" users(ordering: UsersOrder): UsersCollection! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Users: read """ invites(ordering: InvitesOrder): InvitesCollection! "user details" user(id: UserId!): User! } "Object identified by parent object ID." type UsersCollection { nodes: [User!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! orderedBy: UsersOrder } "Users field to sort collection by" enum UsersOrder { NAME EMAIL } "Information about a specific release" type VersionDescription { version: String! additionalInfo: String link: String! installable: Boolean! description: String! components: [String!]! release( "Timezone eg. Europe/Copenhagen, America/Toronto, Etc/GMT+1, +01:00" timezone: TimeZone, "\n Time pattern in java format\n see [Patterns for Formatting and Parsing](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)\n Default pattern is: `yyyy-MM-dd'T'HH:mm:ssZ`\n\n ### Reserved formatting words:\n | Format name | Example |\n |---------|---------|\n | ISO_DATE | 2017-06-20+02:00 |\n | ISO_DATE_TIME | 2017-06-15T22:35:50.247+02:00[Europe/Copenhagen] |\n | ISO_TIME | 22:35:50.247+02:00|\n | ISO_LOCAL_DATE | 2017-06-18|\n | ISO_LOCAL_DATE_TIME | 2011-12-03T10:15:30|\n | BASIC_ISO_DATE | 20170620+0200|\n | RFC_1123_DATE_TIME | Tue, 20 Jun 2017 01:17:50 +0200|\n | LOCALIZED-DATE-TIME-SHORT | 13/06/17 17:43|\n | LOCALIZED-DATE-TIME-MEDIUM | 13-Jun-2017 17:43:33|\n | LOCALIZED-DATE-TIME-LONG | 13 June 2017 17:43:33 CEST|\n | LOCALIZED-DATE-TIME-FULL | Tuesday, 13 June 2017 04:53:33 o'clock CEST|\n | EPOCH-MILLI | 1499347299|\n\n\n " pattern: String): String } "Current users scope" type Viewer { id: String! "User access" users: Users! """ Public Authoritative name server Access for users with role : Administrator || Technical Required permissions: DNS domain: read """ domainNameServer(ordering: DnsDomainsOrder): DnsDomainsCollection! """ OpenID connect clients Access for users with role : Administrator Required permissions: OpenID Connect: read """ oidcClients(ordering: OidcClientOrder): OidcClientCollection! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Company data: read """ company: Company profile: User! "Information about current authentication" token: TokenDetails! """ Support area Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: read """ support: Support! "Customer notification list in html format" dashboardNotifications: [DashboardNotification!]! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ servers: ServersCollection! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Server: read """ server(id: HardwareId!): Server "List of dashboard areas" dashboards: [Dashboard!]! "Kubernetes views" kubernetes: KubernetesView! subSystemStatuses(ordering: SubSystemStatusesOrder): SubSystemStatusesCollection! } "mutations for authenticated user. Can be authenticated with a token on the viewer property or a HTTP header" type ViewerMutation { "Updates for users, company, address" user: UserMutation! "Renew token to expire in 1 hour, some tokens are nt allowed to be renewed" renewToken: LoginPayload! """ Access for users with role : Administrator || Technical Required permissions: Server: write """ server: ServerMutation! """ Access for users with role : Administrator || Technical || Accounting Required permissions: Helpdesk: write """ support: SupportMutation! """ Manage user invites Access for users with role : Administrator Required permissions: User management: write """ userInvites: UserInviteMutation! "Prepare dashboard area for client" dashboardLoad( "Dashboard id" input: String!): DashboardLoadPayload! """ Access for users with role : Administrator Required permissions: Kubernetes management: write """ kubernetes: KubernetesMutation! """ Access for users with role : Administrator Required permissions: Object storage: Editor """ storage: StorageMutation! """ Create new dns domain Access for users with role : Administrator || Technical Required permissions: DNS domain: write """ dnsDomainCreate( "Domain create input" input: DomainCreateInput!): DnsDomainPayload! """ Delete dns domain Access for users with role : Administrator || Technical Required permissions: DNS domain: write """ dnsDomainDelete( "Domain id to delete" id: DnsDomainId!): ActionPayload! """ Update dns domain Access for users with role : Administrator || Technical Required permissions: DNS domain: write """ dnsDomainUpdate( "Domain update input" input: DomainUpdateInput!): DnsDomainPayload! """ Access for users with role : Administrator Required permissions: OpenID Connect: write """ oidc: openIdConnect! } scalar WebToken "Object identified by parent object ID." type WorkloadCollection { nodes: [K8sWorkload!]! "total count, in case of missing permission to read -1 is returned" totalCount: Int! } "Manage OpenID Connect clients" type openIdConnect { createClient(input: OidcClientCreateInput!): OidcClientPayload! deleteClient(input: OidcClientId!): ActionPayload! updateClient(input: OidcClientUpdateInput!): OidcClientPayload! generateNewSecret(input: OidcClientId!): ActionPayload! markAsPublicClient(input: OidcClientId!): ActionPayload! "Rotate JWT Keystore, old keys are invalid after 5 days" rotateJwkKeys: ActionPayload! }