VCON - Voice Conversation format

Added on Nov. 26, 2025 • Managed by admin

VCON - Voice Conversation format

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://ietf.org/vcon/schemas/unsigned-vcon.json",
  "title": "vCon - Unsigned Form",
  "description": "JSON schema for the unsigned form of vCon (Conversational Data Container) as defined in RFCXXXX",
  "type": "object",
  "required": [
    "uuid",
    "created_at"
  ],
  "properties": {
    "vcon": {
      "type": "string",
      "description": "DEPRECATED: Syntactic version of the JSON format. This was used to indicate schema changes in the Internet-Draft versions",
      "const": "0.4.0"
    },
    "uuid": {
      "type": "string",
      "description": "Globally unique identifier for the vCon. SHOULD be a version 8 UUID",
      "format": "uuid"
    },
    "extensions": {
      "type": "array",
      "description": "List of names of all vCon extensions used by this vCon",
      "items": {
        "type": "string"
      }
    },
    "critical": {
      "type": "array",
      "description": "List of extension names that a consumer MUST support to safely process this vCon",
      "items": {
        "type": "string"
      }
    },
    "created_at": {
      "type": "string",
      "description": "Creation time of this vCon in RFC3339 format",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "description": "Last modified time of this vCon in RFC3339 format",
      "format": "date-time"
    },
    "subject": {
      "type": "string",
      "description": "Subject or topic of the conversation"
    },
    "redacted": {
      "type": "object",
      "description": "Reference to the unredacted or less redacted vCon prior instance",
      "required": [
        "type"
      ],
      "properties": {
        "uuid": {
          "type": "string",
          "description": "UUID of the unredacted or less redacted vCon prior instance",
          "format": "uuid"
        },
        "type": {
          "type": "string",
          "description": "Type of redaction performed"
        },
        "url": {
          "type": "string",
          "description": "HTTPS URL where the referenced vCon is stored",
          "format": "uri"
        },
        "content_hash": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Hash(es) of the external content using format: algorithm-base64url_encoded_hash"
        }
      },
      "dependencies": {
        "url": [
          "content_hash"
        ]
      }
    },
    "amended": {
      "type": "object",
      "description": "Reference to the prior vCon instance version that this vCon amends",
      "properties": {
        "uuid": {
          "type": "string",
          "description": "UUID of the prior vCon instance version",
          "format": "uuid"
        },
        "url": {
          "type": "string",
          "description": "HTTPS URL where the referenced vCon is stored",
          "format": "uri"
        },
        "content_hash": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Hash(es) of the external content (required if url is provided)"
        }
      },
      "dependencies": {
        "url": [
          "content_hash"
        ]
      },
      "if": {
        "not": {
          "required": [
            "url"
          ]
        }
      },
      "then": {
        "required": [
          "uuid"
        ],
        "$comment": "uuid is optional only if an external reference is provided"
      }
    },
    "parties": {
      "type": "array",
      "description": "Array of Party Objects representing all parties involved in the conversation",
      "items": {
        "$ref": "#/definitions/Party"
      }
    },
    "dialog": {
      "type": "array",
      "description": "Array of Dialog Objects containing the captured conversation content",
      "items": {
        "$ref": "#/definitions/Dialog"
      }
    },
    "analysis": {
      "type": "array",
      "description": "Array of Analysis Objects containing analysis performed on the conversational data",
      "items": {
        "$ref": "#/definitions/Analysis"
      }
    },
    "attachments": {
      "type": "array",
      "description": "Array of Attachment Objects for ancillary documents related to the conversation",
      "items": {
        "$ref": "#/definitions/Attachment"
      }
    }
  },
  "definitions": {
    "Party": {
      "type": "object",
      "description": "Represents a party involved in the conversation",
      "properties": {
        "tel": {
          "type": "string",
          "description": "TEL URL (RFC3966) for the party"
        },
        "sip": {
          "type": "string",
          "description": "SIP URL for the party"
        },
        "stir": {
          "type": "string",
          "description": "STIR PASSporT in JWS Compact Serialization form"
        },
        "mailto": {
          "type": "string",
          "description": "Email address for the party in any common form, including a bare address or a MAILTO URL"
        },
        "name": {
          "type": "string",
          "description": "Name of the party"
        },
        "did": {
          "type": "string",
          "description": "Decentralized Identifier (DID) URI for the party"
        },
        "validation": {
          "type": "string",
          "description": "Label or token identifying the method of identity validation used"
        },
        "gmlpos": {
          "type": "string",
          "description": "Geographic location in GML pos format (latitude longitude)"
        },
        "civicaddress": {
          "$ref": "#/definitions/Civicaddress"
        },
        "uuid": {
          "type": "string",
          "description": "Free form unique identifier for the participant; not constrained to UUID syntax"
        },
        "type": {
          "type": "string",
          "description": "Participant type"
        },
        "org": {
          "type": "string",
          "description": "Organization to which the party belongs"
        },
        "dept": {
          "type": "string",
          "description": "Department to which the party belongs"
        }
      }
    },
    "Civicaddress": {
      "type": "object",
      "description": "Civic address information for a party's location",
      "properties": {
        "country": {
          "type": "string"
        },
        "a1": {
          "type": "string",
          "description": "National subdivision (state/province)"
        },
        "a2": {
          "type": "string",
          "description": "County/parish/district"
        },
        "a3": {
          "type": "string",
          "description": "City/township"
        },
        "a4": {
          "type": "string",
          "description": "City division/borough"
        },
        "a5": {
          "type": "string",
          "description": "Neighborhood/block"
        },
        "a6": {
          "type": "string",
          "description": "Street"
        },
        "prd": {
          "type": "string",
          "description": "Leading street direction"
        },
        "pod": {
          "type": "string",
          "description": "Trailing street suffix"
        },
        "sts": {
          "type": "string",
          "description": "Street suffix"
        },
        "hno": {
          "type": "string",
          "description": "House number"
        },
        "hns": {
          "type": "string",
          "description": "House number suffix"
        },
        "lmk": {
          "type": "string",
          "description": "Landmark"
        },
        "loc": {
          "type": "string",
          "description": "Additional location info"
        },
        "flr": {
          "type": "string",
          "description": "Floor"
        },
        "nam": {
          "type": "string",
          "description": "Name/occupant"
        },
        "pc": {
          "type": "string",
          "description": "Postal code"
        }
      }
    },
    "Dialog": {
      "type": "object",
      "description": "Represents a segment of captured conversation",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "recording",
            "text",
            "transfer",
            "incomplete",
            "recording-set"
          ],
          "description": "Type of dialog"
        },
        "start": {
          "type": "string",
          "format": "date-time",
          "description": "Start time of the dialog in RFC3339 format; SHOULD be present unless not known; optional for transfer type"
        },
        "duration": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "number",
              "minimum": 0
            }
          ],
          "description": "Duration in seconds"
        },
        "parties": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "array",
              "items": {
                "type": "integer",
                "minimum": 0
              }
            },
            {
              "type": "array",
              "items": {
                "anyOf": [
                  {
                    "type": "integer",
                    "minimum": 0
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "minimum": 0
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            }
          ],
          "description": "Index/indices of parties in the parties array; SHOULD be present for recording, recording-set and text types; MUST NOT be present for transfer type"
        },
        "originator": {
          "type": "integer",
          "minimum": 0,
          "description": "Index of the originating party if first party is not the originator"
        },
        "recordings": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0
          },
          "description": "recording-set reference to list of indices to recording Dialog Objects"
        },
        "recording_set": {
          "type": "integer",
          "minimum": 0,
          "description": "Index of the recording-set Dialog Object that this recording is a part of"
        },
        "mediatype": {
          "type": "string",
          "description": "Media type of the dialog content; MUST be present for inline content; not required when Dialog Content is absent"
        },
        "filename": {
          "type": "string",
          "description": "Original filename of the dialog content"
        },
        "body": {
          "description": "Inline content of the dialog (for inline files).  Any type for encoding=json, otherwise it must be a string."
        },
        "encoding": {
          "type": "string",
          "enum": [
            "base64url",
            "json",
            "none"
          ],
          "description": "Encoding type for inline content"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "HTTPS URL for externally referenced content"
        },
        "content_hash": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Hash(es) of external content"
        },
        "disposition": {
          "type": "string",
          "enum": [
            "no-answer",
            "congestion",
            "failed",
            "busy",
            "hung-up",
            "voicemail-no-message"
          ],
          "description": "Reason the call or conversation failed (required for incomplete type); \"failed\" SHOULD be used when the reason is not known"
        },
        "session_id": {
          "anyOf": [
            {
              "$ref": "#/definitions/SessionId"
            },
            {
              "type": "array",
              "items": {
                "$ref": "#/definitions/SessionId"
              }
            },
            {
              "type": "array",
              "items": {
                "oneOf": [
                  {
                    "$ref": "#/definitions/SessionId"
                  },
                  {
                    "type": "array",
                    "items": {
                      "$ref": "#/definitions/SessionId"
                    }
                  }
                ]
              }
            }
          ],
          "description": "Session ID(s) for the dialog"
        },
        "party_history": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/PartyHistory"
          },
          "description": "History of party join/drop/hold/mute events"
        },
        "transferee": {
          "type": "integer",
          "minimum": 0,
          "description": "Party index of the transferee (for transfer type)"
        },
        "transferor": {
          "type": "integer",
          "minimum": 0,
          "description": "Party index of the transferor (for transfer type)"
        },
        "transfer_target": {
          "type": "integer",
          "minimum": 0,
          "description": "Party index of the transfer target (for transfer type)"
        },
        "original": {
          "type": "integer",
          "minimum": 0,
          "description": "Dialog index of the original call (for transfer type); may reference a recording, recording-set or text type Dialog Object"
        },
        "consultation": {
          "type": "integer",
          "minimum": 0,
          "description": "Dialog index of the consultation call (for transfer type); may reference a recording, recording-set, text or incomplete type Dialog Object"
        },
        "target_dialog": {
          "type": "integer",
          "minimum": 0,
          "description": "Dialog index of the target call (for transfer type); may reference a recording, recording-set, text or incomplete type Dialog Object"
        },
        "application": {
          "type": "string",
          "description": "Application, communication channel or context of the conversation"
        },
        "message_id": {
          "type": "string",
          "description": "Unique message identifier from the messaging system"
        }
      },
      "dependencies": {
        "url": [
          "content_hash"
        ]
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "incomplete"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "required": [
              "disposition"
            ]
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "recording-set"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "required": [
              "recordings"
            ]
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "transfer"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "parties"
                  ]
                },
                {
                  "required": [
                    "originator"
                  ]
                },
                {
                  "required": [
                    "session_id"
                  ]
                },
                {
                  "required": [
                    "party_history"
                  ]
                },
                {
                  "required": [
                    "message_id"
                  ]
                },
                {
                  "required": [
                    "recordings"
                  ]
                },
                {
                  "required": [
                    "recording_set"
                  ]
                },
                {
                  "required": [
                    "mediatype"
                  ]
                },
                {
                  "required": [
                    "filename"
                  ]
                },
                {
                  "required": [
                    "body"
                  ]
                },
                {
                  "required": [
                    "encoding"
                  ]
                },
                {
                  "required": [
                    "url"
                  ]
                },
                {
                  "required": [
                    "content_hash"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "recording-set"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "message_id"
                  ]
                },
                {
                  "required": [
                    "recording_set"
                  ]
                },
                {
                  "required": [
                    "mediatype"
                  ]
                },
                {
                  "required": [
                    "filename"
                  ]
                },
                {
                  "required": [
                    "body"
                  ]
                },
                {
                  "required": [
                    "encoding"
                  ]
                },
                {
                  "required": [
                    "url"
                  ]
                },
                {
                  "required": [
                    "content_hash"
                  ]
                },
                {
                  "required": [
                    "transferee"
                  ]
                },
                {
                  "required": [
                    "transferor"
                  ]
                },
                {
                  "required": [
                    "transfer_target"
                  ]
                },
                {
                  "required": [
                    "original"
                  ]
                },
                {
                  "required": [
                    "consultation"
                  ]
                },
                {
                  "required": [
                    "target_dialog"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "incomplete"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "message_id"
                  ]
                },
                {
                  "required": [
                    "recordings"
                  ]
                },
                {
                  "required": [
                    "recording_set"
                  ]
                },
                {
                  "required": [
                    "mediatype"
                  ]
                },
                {
                  "required": [
                    "filename"
                  ]
                },
                {
                  "required": [
                    "body"
                  ]
                },
                {
                  "required": [
                    "encoding"
                  ]
                },
                {
                  "required": [
                    "url"
                  ]
                },
                {
                  "required": [
                    "content_hash"
                  ]
                },
                {
                  "required": [
                    "transferee"
                  ]
                },
                {
                  "required": [
                    "transferor"
                  ]
                },
                {
                  "required": [
                    "transfer_target"
                  ]
                },
                {
                  "required": [
                    "original"
                  ]
                },
                {
                  "required": [
                    "consultation"
                  ]
                },
                {
                  "required": [
                    "target_dialog"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "recording"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "recordings"
                  ]
                },
                {
                  "required": [
                    "transferee"
                  ]
                },
                {
                  "required": [
                    "transferor"
                  ]
                },
                {
                  "required": [
                    "transfer_target"
                  ]
                },
                {
                  "required": [
                    "original"
                  ]
                },
                {
                  "required": [
                    "consultation"
                  ]
                },
                {
                  "required": [
                    "target_dialog"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "text"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "recordings"
                  ]
                },
                {
                  "required": [
                    "recording_set"
                  ]
                },
                {
                  "required": [
                    "transferee"
                  ]
                },
                {
                  "required": [
                    "transferor"
                  ]
                },
                {
                  "required": [
                    "transfer_target"
                  ]
                },
              {
                  "required": [
                    "original"
                  ]
                },
                {
                  "required": [
                    "consultation"
                  ]
                },
                {
                  "required": [
                    "target_dialog"
                  ]
                }
              ]
            }
          }
        },
        {
          "if": {
            "required": [
              "body"
            ],
            "properties": {
              "body": {
                "not": {
                  "const": ""
                }
              }
            }
          },
          "then": {
            "required": [
              "encoding"
            ]
          }
        },
        {
          "if": {
            "required": [
              "body"
            ],
            "properties": {
              "body": {
                "not": {
                  "const": ""
                }
              }
            }
          },
          "then": {
            "required": [
              "mediatype"
            ]
          }
        }
      ]
    },
    "SessionId": {
      "type": "object",
      "description": "Session identifier with local and remote UUIDs",
      "properties": {
        "local": {
          "type": "string",
          "description": "Local UUID for the session"
        },
        "remote": {
          "type": "string",
          "description": "Remote UUID for the session"
        }
      }
    },
    "PartyHistory": {
      "type": "object",
      "description": "Records party events during the dialog",
      "required": [
        "party",
        "time",
        "event"
      ],
      "properties": {
        "party": {
          "type": "integer",
          "minimum": 0,
          "description": "Index of the party"
        },
        "time": {
          "type": "string",
          "format": "date-time",
          "description": "Time of the event in RFC3339 format"
        },
        "event": {
          "type": "string",
          "enum": [
            "join",
            "drop",
            "hold",
            "unhold",
            "mute",
            "unmute",
            "keydown",
            "keyup"
          ],
          "description": "Type of event"
        },
        "button": {
          "type": "string",
          "description": "DTMF digit, character or string (required for keydown/keyup events)"
        }
      },
      "if": {
        "properties": {
          "event": {
            "enum": [
              "keydown",
              "keyup"
            ]
          }
        },
        "required": [
          "event"
        ]
      },
      "then": {
        "required": [
          "button"
        ]
      }
    },
    "Attachment": {
      "type": "object",
      "description": "Represents an ancillary document related to the conversation",
      "required": [
        "start",
        "party",
        "dialog"
      ],
      "properties": {
        "purpose": {
          "type": "string",
          "description": "text description of what the attachment is for"
        },
        "start": {
          "type": "string",
          "format": "date-time",
          "description": "Time the attachment was sent/exchanged in RFC3339 format"
        },
        "party": {
          "type": "integer",
          "minimum": 0,
          "description": "Index of the party that contributed the attachment"
        },
        "dialog": {
          "type": "integer",
          "minimum": 0,
          "description": "Index of the dialog this attachment is part of"
        },
        "mediatype": {
          "type": "string",
          "description": "Media type of the attachment content; MUST be present for inline content; not required when Attachment Content is absent"
        },
        "filename": {
          "type": "string",
          "description": "Original filename of the attachment"
        },
        "body": {
          "description": "Inline content of the attachment (for inline files).  Any type for encoding=json, otherwise it must be a string."
        },
        "encoding": {
          "type": "string",
          "enum": [
            "base64url",
            "json",
            "none"
          ],
          "description": "Encoding type for inline content"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "HTTPS URL for externally referenced attachment"
        },
        "content_hash": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Hash(es) of external content"
        }
      },
      "dependencies": {
        "url": [
          "content_hash"
        ]
      },
      "allOf": [
        {
          "if": {
            "required": [
              "body"
            ],
            "properties": {
              "body": {
                "not": {
                  "const": ""
                }
              }
            }
          },
          "then": {
            "required": [
              "encoding"
            ]
          }
        },
        {
          "if": {
            "required": [
              "body"
            ],
            "properties": {
              "body": {
                "not": {
                  "const": ""
                }
              }
            }
          },
          "then": {
            "required": [
              "mediatype"
            ]
          }
        }
      ]
    },
    "Analysis": {
      "type": "object",
      "description": "Represents analysis performed on the conversational data",
      "required": [
        "type",
        "vendor"
      ],
      "properties": {
        "type": {
          "type": "string",
          "description": "Semantic type of analysis (e.g., report, sentiment, summary, transcript, translation, tts)"
        },
        "dialog": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "array",
              "items": {
                "type": "integer",
                "minimum": 0
              }
            }
          ],
          "description": "Index/indices of dialog objects this analysis is based on"
        },
        "attachment": {
          "oneOf": [
            {
              "type": "integer",
              "minimum": 0
            },
            {
              "type": "array",
              "items": {
                "type": "integer",
                "minimum": 0
              }
            }
          ],
          "description": "Index/indices of attachment objects this analysis is based on"
        },
        "mediatype": {
          "type": "string",
          "description": "Media type of the analysis content; SHOULD be provided for inline content and for external content without an HTTPS Content-Type header; when no media type is defined for the data format, the vendor, product and schema parameters SHOULD identify the format instead"
        },
        "filename": {
          "type": "string",
          "description": "Original filename of the analysis data"
        },
        "vendor": {
          "type": "string",
          "description": "Vendor or product name that generated the analysis"
        },
        "product": {
          "type": "string",
          "description": "Product name to differentiate from other vendor products"
        },
        "schema": {
          "type": "string",
          "description": "Token or label for the data format/schema of the analysis"
        },
        "body": {
          "description": "Inline content of the analysis (for inline files).  Any type for encoding=json, otherwise it must be a string."
        },
        "encoding": {
          "type": "string",
          "enum": [
            "base64url",
            "json",
            "none"
          ],
          "description": "Encoding type for inline content"
        },
        "url": {
          "type": "string",
          "format": "uri",
          "description": "HTTPS URL for externally referenced analysis"
        },
        "content_hash": {
          "oneOf": [
            {
              "type": "string"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          ],
          "description": "Hash(es) of external content"
        }
      },
      "dependencies": {
        "url": [
          "content_hash"
        ]
      },
      "allOf": [
        {
          "if": {
            "required": [
              "body"
            ],
            "properties": {
              "body": {
                "not": {
                  "const": ""
                }
              }
            }
          },
          "then": {
            "required": [
              "encoding"
            ]
          }
        }
      ]
    }
  },
  "not": {
    "required": [
      "redacted",
      "amended"
    ],
    "$comment": "The redacted and amended parameters are mutually exclusive"
  },
  "$comment": "At least one of the parties, dialog, analysis or attachments parameters SHOULD be present (RFCXXXX Section 4). SHOULD-level statements are not enforced by this schema."
}


View source