Milesoft Contacts SDK (contacts-sdk)

1. Overview

The Contacts SDK (contacts-sdk) provides a strongly-typed programmatic client for managing contact entities ("nodes"), relationship links ("edges"), template questionnaires, customer submissions, user tasks, and secure shortened redirect URLs. It exposes a programmatic interface to interact with the directory graph of the Milesoft ecosystem.


2. Initialization

2.1 Dependency Installation

The contacts-sdk package is hosted in our secure Google Cloud Artifact Registry repository.

To consume contacts-sdk in your Spring Boot application, apply the Google Cloud Artifact Registry plugin and declare our secure repository in your build.gradle:

plugins {
    id "com.google.cloud.artifactregistry.gradle-plugin" version "2.2.5"
}

repositories {
    mavenCentral()
    maven { url "artifactregistry://us-west2-maven.pkg.dev/milesoft-repo/repo-maven" }
}

dependencies {
    // Declaring the standard contacts-sdk library dependency
    implementation "io.milesoft:contacts-sdk:2.0.1"
}

2.2 Central Spring Boot Configuration

The SDK components require an active PlatformClient and PlatformTokenProvider to manage authentication handshakes.

import io.milesoft.clients.PlatformClient;
import io.milesoft.clients.strategy.PlatformTokenProvider;
import io.milesoft.contacts.client.v2.AnswerClient;
import io.milesoft.contacts.client.v2.EdgeClient;
import io.milesoft.contacts.client.v2.FormClient;
import io.milesoft.contacts.client.v2.MySubmissionClient;
import io.milesoft.contacts.client.v2.MyTaskClient;
import io.milesoft.contacts.client.v2.NodeClient;
import io.milesoft.contacts.client.v2.PublicClient;
import io.milesoft.contacts.client.v2.QuestionClient;
import io.milesoft.contacts.client.v2.QuestionnaireClient;
import io.milesoft.contacts.client.v2.SubmissionClient;
import io.milesoft.contacts.client.v2.TaskClient;
import io.milesoft.contacts.client.v2.UrlClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ContactsSdkConfig {

    private final FormClient formClient;
    private final PublicClient publicClient;
    private final QuestionnaireClient questionnaireClient;
    private final QuestionClient questionClient;
    private final AnswerClient answerClient;
    private final SubmissionClient submissionClient;
    private final MySubmissionClient mySubmissionClient;
    private final TaskClient taskClient;
    private final MyTaskClient myTaskClient;
    private final NodeClient nodeClient;
    private final EdgeClient edgeClient;
    private final UrlClient urlClient;

    @Autowired
    public ContactsSdkConfig(PlatformClient platformClient,
                             @Value("${milesoft.contacts.baseUrl}") String baseUrl) {
  
        PlatformTokenProvider tokenProvider = new PlatformTokenProvider(platformClient);
    
        this.formClient = new FormClient(baseUrl, tokenProvider);
        this.publicClient = new PublicClient(baseUrl, tokenProvider);
        this.questionnaireClient = new QuestionnaireClient(baseUrl, tokenProvider);
        this.questionClient = new QuestionClient(baseUrl, tokenProvider);
        this.answerClient = new AnswerClient(baseUrl, tokenProvider);
        this.submissionClient = new SubmissionClient(baseUrl, tokenProvider);
        this.mySubmissionClient = new MySubmissionClient(baseUrl, tokenProvider);
        this.taskClient = new TaskClient(baseUrl, tokenProvider);
        this.myTaskClient = new MyTaskClient(baseUrl, tokenProvider);
        this.nodeClient = new NodeClient(baseUrl, tokenProvider);
        this.edgeClient = new EdgeClient(baseUrl, tokenProvider);
        this.urlClient = new UrlClient(baseUrl, tokenProvider);
    }
  
    @Bean
    public FormClient formClient() { return formClient; }
  
    @Bean
    public PublicClient publicClient() { return publicClient; }
  
    @Bean
    public QuestionnaireClient questionnaireClient() { return questionnaireClient; }
  
    @Bean
    public QuestionClient questionClient() { return questionClient; }
  
    @Bean
    public AnswerClient answerClient() { return answerClient; }
  
    @Bean
    public SubmissionClient submissionClient() { return submissionClient; }
  
    @Bean
    public MySubmissionClient mySubmissionClient() { return mySubmissionClient; }
  
    @Bean
    public TaskClient taskClient() { return taskClient; }
  
    @Bean
    public MyTaskClient myTaskClient() { return myTaskClient; }
  
    @Bean
    public NodeClient nodeClient() { return nodeClient; }
  
    @Bean
    public EdgeClient edgeClient() { return edgeClient; }
  
    @Bean
    public UrlClient urlClient() { return urlClient; }
}

3. Core SDK Clients & Method Specifications

Programmatic execution is split across logical clients designed to completely abstract raw REST endpoints.

3.1 NodeClient

Manages directory contact graph entities ("nodes").

  • Nodes list(String cursor, Integer limit, Actor actor): Paged lookup of directory contacts.
  • List<Node> loadBulk(Ids payload, Actor actor): Efficient batch loader of contacts via ID whitelist.
  • Node create(SaveNode payload, Actor actor): Spawns a new contact node.
  • Node update(String nodeId, SaveNode payload, Actor actor): Modifies fields, addresses, or metadata of an existing contact.
  • void delete(String nodeId, Actor actor): Removes a contact record from the active directory.

3.2 EdgeClient

Maintains relational links and hierarchies between contact nodes ("edges").

  • Edges list(String cursor, Integer limit, Actor actor): Paged lookup of relationship link edges.
  • List<Edge> loadBulk(Ids payload, Actor actor): Batch resolves edges by ID arrays.
  • Edge create(SaveEdge payload, Actor actor): Spawns a relationship edge link.
  • Edge update(String edgeId, SaveEdge payload, Actor actor): Modifies relationship metadata.
  • void delete(String edgeId, Actor actor): Deletes an edge link.

3.3 QuestionnaireClient

Handles template registration for customized structured documents.

  • Questionnaires list(String cursor, Integer limit, Actor actor): Lists questionnaire templates.
  • List<Questionnaire> loadBulk(Ids payload, Actor actor): Batch loads templates by ID lists.
  • Questionnaire create(SaveQuestionnaire payload, Actor actor): Registers a template.
  • Questionnaire update(String id, SaveQuestionnaire payload, Actor actor): Modifies template metadata.
  • Questionnaire clone(String id, Actor actor): Clones a template alongside nested questions and answers.
  • void delete(String id, Actor actor): Purges a template config.

3.4 QuestionClient

Appends individual question inputs onto a target template.

  • Questions list(String cursor, Integer limit, Actor actor): Lists system-wide questions.
  • List<Question> findByQuestionnaire(String questionnaireId, Actor actor): Filters questions linked to a parent template.
  • Question create(SaveQuestion payload, Actor actor): Appends an input step.
  • Question update(String id, SaveQuestion payload, Actor actor): Modifies questions.
  • Question clone(String id, Actor actor): Clones an individual question.
  • void delete(String id, Actor actor): Purges a question template.

3.5 AnswerClient

Configures predefined choices linked to a template question.

  • Answers list(String cursor, Integer limit, Actor actor): Lists active answers.
  • List<Answer> findByQuestionnaire(String questionnaireId, Actor actor): Finds preset choices linked to templates.
  • Answer create(SaveAnswer payload, Actor actor): Appends a choice selection.
  • Answer update(String id, SaveAnswer payload, Actor actor): Updates preset choice values.
  • void delete(String id, Actor actor): Deletes preset answer choices.

3.6 SubmissionClient

Manages system-level administration of completed questionnaires.

  • Submissions list(String cursor, Integer limit, Actor actor): Lists directory submissions.
  • List<Submission> loadBulk(Ids payload, Actor actor): Batch loads submissions.
  • Submission create(SaveSubmission payload, Actor actor): Submits a completed response under administrator credentials.
  • void delete(String id, Actor actor): Deletes submission profile records.

3.7 MySubmissionClient

Enables logged-in users to manage their own questionnaire responses.

  • Submissions listMy(String cursor, Integer limit, Actor actor): Lists caller's completed submissions.
  • List<Submission> loadBulkMy(Ids payload, Actor actor): Batch resolves caller's records.
  • Submission createMy(SaveMySubmission payload, Actor actor): Submits completed answers, automatically injecting caller ID contexts.
  • void deleteMy(String id, Actor actor): Purges caller-owned submissions.

3.8 TaskClient

Registers operational todo allocations acting across profiles and contact contexts.

  • Tasks list(String cursor, Integer limit, Actor actor): Lists active follow-up tasks.
  • List<Task> loadBulk(Ids payload, Actor actor): Batch loads system tasks.
  • Task create(SaveTask payload, Actor actor): Registers task. Supports Liquid dynamic context parameters inside data maps.
  • Task update(String id, SaveTask payload, Actor actor): Modifies task parameters.
  • void delete(String id, Actor actor): Deletes follow-up tasks.

3.9 MyTaskClient

Configures assigned tasks belonging to the active caller profile.

  • MyTasks listMy(String cursor, Integer limit, Actor actor): Lists assigned tasks.
  • List<MyTask> loadBulkMy(Ids payload, Actor actor): Batch resolves assigned items.
  • MyTask createMy(SaveMyTask payload, Actor actor): Creates personal tasks.
  • MyTask updateMy(String id, SaveMyTask payload, Actor actor): Updates personal tasks.
  • void deleteMy(String id, Actor actor): Removes personal tasks.

3.10 UrlClient

Generates cryptographically random shortened links for platform engagement redirecting.

  • Urls list(String cursor, Integer limit, Actor actor): Lists active secured redirects.
  • List<Url> loadBulk(Ids payload, Actor actor): Batch resolves redirects.
  • Url create(SaveUrl payload, Actor actor): Spawns secure temporary URL structures.
  • Url update(String id, SaveUrl payload, Actor actor): Modifies redirect configurations.
  • void delete(String id, Actor actor): Revokes temporary redirect keys.

3.11 FormClient & PublicClient

Unsecured gateways supporting public-facing web widgets and registration inputs. These methods do not require authorization actor context.

  • void submitWebForm(SaveNode payload): Registers contact registration data from standard web intake widgets.
  • PublicQuestionnaires listPublic(String cursor, Integer limit): Lists intake templates registered for public access.
  • PublicQuestionnaire loadPublic(Ids payload): Loads public template details.
  • Submission submitPublic(SaveContactSubmission payload): Submits answers provided by external contacts.

4. Built-In SDK Capabilities

  • Polymorphic Model Validators: Models like LabeledAddress incorporate custom structural constraints, ensuring physical location attributes conform to postal conventions before requests execute over HTTPS.
  • Context Template Merging: Task clients support dynamic MergeData payload structures. If a task description incorporates Shopify Liquid syntax (e.g. {{ contact.first_name }}), the core engine compiles and populates attributes automatically during resolution.

5. Code Examples

5.1 Programmatic Contact Registration & Graph Linking

import io.milesoft.contacts.client.v2.NodeClient;
import io.milesoft.contacts.client.v2.EdgeClient;
import io.milesoft.contacts.client.v2.dto.SaveNode;
import io.milesoft.contacts.client.v2.dto.Node;
import io.milesoft.contacts.client.v2.dto.SaveEdge;
import io.milesoft.contacts.client.v2.dto.Edge;
import io.milesoft.contacts.client.v2.dto.LabeledString;
import io.milesoft.primitives.actor.Actor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class DirectoryGraphService {

    private final NodeClient nodeClient;
    private final EdgeClient edgeClient;

    @Autowired
    public DirectoryGraphService(NodeClient nodeClient, EdgeClient edgeClient) {
        this.nodeClient = nodeClient;
        this.edgeClient = edgeClient;
    }

    public void registerFamilyRelationship(Actor actor, String p1First, String p1Last, String p1Email,
                                           String p2First, String p2Last, String p2Email) {
        
        // 1. Create Parent Node
        SaveNode parentPayload = new SaveNode();
        parentPayload.setFirstName(p1First);
        parentPayload.setLastName(p1Last);
        LabeledString parentEmail = new LabeledString();
        parentEmail.setLabel("Primary");
        parentEmail.setValue(p1Email);
        parentPayload.setEmails(List.of(parentEmail));
        
        Node parentNode = nodeClient.create(parentPayload, actor);

        // 2. Create Child Node
        SaveNode childPayload = new SaveNode();
        childPayload.setFirstName(p2First);
        childPayload.setLastName(p2Last);
        LabeledString childEmail = new LabeledString();
        childEmail.setLabel("Primary");
        childEmail.setValue(p2Email);
        childPayload.setEmails(List.of(childEmail));
        
        Node childNode = nodeClient.create(childPayload, actor);

        // 3. Create Edge Link between Nodes
        SaveEdge relation = new SaveEdge();
        relation.setSourceNodeId(parentNode.getId());
        relation.setTargetNodeId(childNode.getId());
        relation.setCategory("Family");
        relation.setLabel("Child");

        Edge edge = edgeClient.create(relation, actor);
        System.out.println("Relational Edge created in directory: " + edge.getId());
    }
}

6. SDK Data Transfer Objects (DTOs)

Node

Represents a contact entity in the directory graph.

Field Type Description / Constraints
id String Required. Unique identifier for the contact node.
imageUrl String Profile picture or image URL associated with the contact.
firstName String First name of the contact.
lastName String Last name of the contact.
phones List<LabeledString> List of labeled phone numbers (e.g. Mobile, Work).
emails List<LabeledString> List of labeled email addresses (e.g. Personal, Work).
urls List<LabeledString> List of website links.
addresses List<LabeledAddress> Structured postal addresses.
dates List<LabeledDate> Significant dates (e.g. Birthday, Anniversary).
others List<LabeledString> Customized fields and unstructured key-value attributes.
tags Set<String> Labels or tags assigned to the contact.
metadata Map<String, Object> Custom operational metadata payload.
created ZonedDateTime Required. Timestamp when the contact record was created.
updated ZonedDateTime Required. Timestamp when the contact record was last modified.

SaveNode

The request payload used to create or modify a contact node.

Field Type Description / Constraints
imageUrl String Contact profile image URL.
firstName String Contact first name.
lastName String Contact last name.
phones List<LabeledString> Phone number collection.
emails List<LabeledString> Email address collection.
urls List<LabeledString> Website link collection.
addresses List<LabeledAddress> Physical addresses.
dates List<LabeledDate> Key dates.
others List<LabeledString> Customized additional fields.
tags Set<String> Contact categorization tags.
metadata Map<String, Object> Custom metadata mapping.

Edge

Represents a relationship link between two contact nodes.

Field Type Description / Constraints
id String Required. Unique identifier of the edge.
sourceNodeId String Required. Unique identifier of the origin node.
targetNodeId String Required. Unique identifier of the destination node.
category String Required. General category of the relationship (e.g. Family, Employment).
label String Required. Exact label representing the relationship (e.g. Spouse, Manager).
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Last modification timestamp.

SaveEdge

The request payload used to create or update a relationship edge.

Field Type Description / Constraints
sourceNodeId String Required. Origin node ID.
targetNodeId String Required. Destination node ID.
category String Required. General group.
label String Required. Relationship description label.
metadata Map<String, Object> Custom metadata map.

Questionnaire

Template definition containing custom question sequences.

Field Type Description / Constraints
id String Required. Unique identifier.
title String Required. Questionnaire title.
description String Extended description of purpose or instructions.
status QuestionnaireStatus Required. Template state (Draft, Active).
order Integer Required. Precedence. Minimum constraint: 0.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Last modification timestamp.

SaveQuestionnaire

Payload used to create or modify a questionnaire template.

Field Type Description / Constraints
title String Required. Questionnaire title.
description String Description or instructions.
status QuestionnaireStatus Required. Current operational state.
order Integer Required. Sorting order integer. Must be >= 0.
metadata Map<String, Object> Custom metadata map.

Question

An individual question within a questionnaire template.

Field Type Description / Constraints
id String Required. Unique identifier.
questionnaireId String Required. Linked questionnaire ID.
ask String Required. Question text prompt.
type AnswerType Required. Response type (String, Multiline, Integer, Double, Boolean, Date, DateTime, Strings, Signature).
order Integer Required. Nested sort index. Must be >= 0.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Last modification timestamp.

SaveQuestion

Payload used to append or edit a question template.

Field Type Description / Constraints
questionnaireId String Required. Linked questionnaire ID.
ask String Required. Question text.
type AnswerType Required. Choice format selector.
order Integer Required. Sorting position. Must be >= 0.
metadata Map<String, Object> Custom metadata map.

Answer

Defines preset choices or static reply answers.

Field Type Description / Constraints
id String Required. Unique identifier.
questionnaireId String Required. Linked questionnaire ID.
questionId String Required. Linked question ID.
reply String Required. Preset answer value or label choice.
order Integer Required. Sort position index. Must be >= 0.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Last modification timestamp.

SaveAnswer

Payload to create or edit preset choices.

Field Type Description / Constraints
questionnaireId String Required. Parent questionnaire ID.
questionId String Required. Target question ID.
reply String Required. Fixed choice value.
order Integer Required. Sorted position index. Must be >= 0.
metadata Map<String, Object> Custom metadata map.

Submission

Completed questionnaire response profile.

Field Type Description / Constraints
id String Required. Unique identifier.
questionnaireId String Required. Questionnaire template ID.
contactId String Reference contact node ID. Must supply either contactId or userId.
userId String Reference system user ID. Must supply either contactId or userId.
questions List<SubmissionQuestion> List of submitted question replies.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Submission creation timestamp.
updated ZonedDateTime Required. Submission update timestamp.

SaveSubmission

System-level payload used to submit a completed response document.

Field Type Description / Constraints
questionnaireId String Required. Questionnaire template ID.
contactId String Contact reference. Must supply either contactId or userId.
userId String User profile reference. Must supply either contactId or userId.
questions List<SubmissionQuestion> User answers.
metadata Map<String, Object> Custom metadata map.

SaveMySubmission

User self-service payload used to submit responses. The backend automatically injects the active security profile ID as the userId.

Field Type Description / Constraints
questionnaireId String Required. Questionnaire template ID.
questions List<SubmissionQuestion> User answers.
metadata Map<String, Object> Custom metadata map.

SaveContactSubmission

Public-facing payload used when a contact submits their questionnaire responses.

Field Type Description / Constraints
questionnaireId String Required. Questionnaire template ID.
contactId String Required. Contact node ID.
questions List<SubmissionQuestion> Contact replies.
metadata Map<String, Object> Custom metadata map.

SubmissionQuestion

Data structure mapping responses inside a submission.

Field Type Description / Constraints
questionId String Required. Question ID.
ask String Required. Prompt of the question.
reply String Provided text response.

Task

Operational action assignment related to contacts or users.

Field Type Description / Constraints
id String Required. Unique identifier.
userId String Assigned user.
onBehalfOfUserId String Linked target user reference.
onBehalfOfContactId String Linked target contact reference.
title String Required. Name/heading of the task.
description String Detailed operational instructions.
dueOn LocalDate Complete due calendar date.
dueAt ZonedDateTime Specific due timestamp.
completed ZonedDateTime Task completion timestamp.
type String Required. Task taxonomy or category identifier.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Last modification timestamp.

SaveTask

Payload used to schedule or edit a task, supporting Liquid template parameters.

Field Type Description / Constraints
userId String Assigned user ID.
onBehalfOfUserId String Target user ID.
onBehalfOfContactId String Target contact ID.
title String Required. Task title.
description String Task description.
dueOn LocalDate Calendar date.
dueAt ZonedDateTime Precise due timestamp.
completed ZonedDateTime Task completion timestamp.
type String Required. Task classification code.
metadata Map<String, Object> Custom metadata map.
data MergeData Dynamic liquid payload to populate values in templates.

MyTask

Task view specifically assigned to the current user context.

Field Type Description / Constraints
id String Required. Unique identifier.
onBehalfOfUserId String Linked user reference.
onBehalfOfContactId String Linked contact reference.
title String Required. Task title.
description String Extended instructions.
dueOn LocalDate Calendar due date.
dueAt ZonedDateTime Precise due timestamp.
completed ZonedDateTime Completion timestamp.
type String Required. Classification.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Modification timestamp.

SaveMyTask

Payload used to create personal tasks.

Field Type Description / Constraints
onBehalfOfUserId String Target user reference.
onBehalfOfContactId String Target contact reference.
title String Required. Task title.
description String Task description details.
dueOn LocalDate Calendar due date.
dueAt ZonedDateTime Precise due timestamp.
completed ZonedDateTime Task completion timestamp.
type String Required. Personal task classification.
metadata Map<String, Object> Custom metadata map.
data MergeData Dynamic liquid merge payload.

Url

Shortened/secured target URLs for platform engagement.

Field Type Description / Constraints
id String Required. Unique identifier (short URL path key).
userId String Related user context.
contactId String Related contact context.
url String Required. Full raw target URL redirect path.
metadata Map<String, Object> Custom metadata.
expires ZonedDateTime Required. Expiration time of the temporary URL.
created ZonedDateTime Required. Record creation.
updated ZonedDateTime Required. Record modification.

SaveUrl

Payload to generate secure, shortened temporary URLs.

Field Type Description / Constraints
userId String Associated user ID.
contactId String Associated contact ID.
url String Required. Complete redirect destination.
metadata Map<String, Object> Metadata map.
expires ZonedDateTime Required. URL expiration date-time.

LabeledString

Generic container for labeled text strings.

Field Type Description / Constraints
label String Required. Display tag (e.g. "Mobile", "Work").
value String Required. Actual string value.

LabeledAddress

Postal address container. Requires at least one address property field to be non-blank in addition to the label.

Field Type Description / Constraints
label String Required. Label name.
line1 String Primary address line.
line2 String Suite, unit, or floor number.
locality String City name.
region String State or provincial territory.
postalCode String Zip or postal code.
country String Country name.

LabeledDate

Calendar dates.

Field Type Description / Constraints
label String Required. Date milestone tag (e.g. "Birthday").
value LocalDate Required. Calendar date.

MergeData

Template parameters passed to Liquid for context generation.

Field Type Description / Constraints
userId String User ID context.
contactId String Contact ID context.
userQualifiers List<Qualifier> List of user qualifier key-pairs.
contactQualifiers List<Qualifier> List of contact qualifier key-pairs.
models List<Model> Embedded dataset models.

Qualifier

Qualifier key-pair context.

Field Type Description / Constraints
key String Required. Qualifier tag key.
id String Required. Unique target identifier.

Model

Structured data model definition passed to templating engines.

Field Type Description / Constraints
key String Required. Unique model mapping key.
data Map<String, Object> Required. Custom property dataset.

Ids

Batch loads resources lookup helper.

Field Type Description / Constraints
ids List<String> Required. List of unique identifiers.

PublicQuestionnaire

Public questionnaire intake view.

Field Type Description / Constraints
id String Required. Questionnaire template ID.
title String Required. Heading of the form.
description String Introduction summary.
questions List<PublicQuestion> Required. Public questions sequence.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Modification timestamp.

PublicQuestion

Public questions containing preset choices.

Field Type Description / Constraints
id String Required. Question ID.
ask String Required. Question text prompt.
type AnswerType Required. Response type.
answers List<PublicAnswer> Predefined optional choices.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Modification timestamp.

PublicAnswer

Predefined answer choice for public forms.

Field Type Description / Constraints
id String Required. Preset choice ID.
reply String Required. Choice value text description.
metadata Map<String, Object> Custom metadata map.
created ZonedDateTime Required. Creation timestamp.
updated ZonedDateTime Required. Modification timestamp.