TransUnion TruContact Trusted Call Solutions (STI-AS / STI-VS)

The STIR/SHAKEN call Authentication Service and Verification Service behind TransUnion TruContact Branded Communications. Nine POST operations sign SIP Identity headers (PASSporTs) and verify them, with a Call Validation Treatment variant that returns calling name and robocall analytics alongside the verdict. The only TransUnion API with a public machine-readable contract: the OpenAPI 3.1.0 is published on GitHub under an MIT licence with an open proposal process.

OpenAPI Specification

transunion-trucontact-tcs-shaken-openapi.yml Raw ↑
openapi: 3.1.0
servers:
  - url: https://{hostname}:{port}/{optionalRoutingPath} 
    description: https
info:
  x-logo:
    url: 'https://raw.githubusercontent.com/neustar/tcs-apis/main/docs/newNeustarLogo.jpeg'
    altText: STIR/SHAKEN Authentication & Verification Service APIs
  version: 1.0.0
  title: STIR/SHAKEN Authentication & Verification Service APIs
  summary: 
  description: |
    # Overview
      Secure Telephone Identity Revisited (STIR) and the Signature-based Handling of Asserted information using toKENs (SHAKEN) framework have already become regulatory mandates in both the United States and Canada for caller identity authentication.  These IETF and ATIS standards define how to securely compute, transit and verify SIP Identity headers through an Authentication Service (AS) and Verification Service (VS).

      Since their initial implementation, STIR and SHAKEN standards have been (and continue to be) extended in multiple ways.  Additionally, the AS and VS can support supplemental features including, but not limited to telephone number ownership validation, subscriber-based policy management and robocall analytics.
      
      The AS and VS implement call authentication and related functions ideally through flexible, extensible, robust and standardized Application Program Interfaces (APIs).  Many initial implementations of the SHAKEN framework employ RESTful API clients, but these are constrained to only supporting base functionality.  The STIR/SHAKEN API project promotes collaboration to expand functionality, while hopefully also achieving industry alignment amongst various RESTful API implementations and/or applicable standards, where possible.

      There are generally two ways to authenticate a RESTful API client - 'apiKey' or 'coming from a whitelisted client IP'.  Both are initially supported in the STIR/SHAKEN API project.  If a RESTful API client chooses to use 'apiKey' for authentication, an 'apiKey' query parameter, with a pre-provisioned value, is validated to access API calls that are restricted. If the 'apiKey' parameter is not specified, a pre-provisioned client IP address may be used as the backup authentication mechanism.  The server first checks for availability of an 'apiKey' in the query parameter and if it doesn't find one, it tries to authenticate via the client IP address.

      The primary objective of the STIR/SHAKEN API project is to foster broad and open industry collaboration amongst developers and implementers of (or those desiring to implement) RESTful APIs for timely and extensible support of evolving caller identity authentication standards, including supplemental feature support as required.  The core set of ATIS SHAKEN standards supported in this project, including their underlying and/or referenced IETF and 3GPP standards, are:
      * ATIS-1000074, “SHAKEN”
      * ATIS-1000078, “National Security / Emergency Preparedness Priority Service SIP RPH Signing and Verification using PASSporTs”
      * ATIS-1000080, “SHAKEN: Governance Model and Certificate Management”
      * ATIS-1000084, “Operational and Management Considerations for SHAKEN STI Certification Authorities and Policy Administrators”
      * ATIS-1000085, “SHAKEN: SHAKEN Support of “div” PASSporT”
      * ATIS-1000092, “SHAKEN: Delegate Certificates
      * ATIS-1000093, “Toll-Free Numbers in the SHAKEN Framework”
      * ATIS-1000094, “SHAKEN: Calling Name and Rich Call Data Handling Procedures”
      * ATIS-1000098, “SIP Resource-Priority Header and Priority Header Signing in Support of Emergency Calling”

    Looking forward to your support, feedback and contributions.

tags:
- name: Authentication Service
  description: |
    This API endpoint uses the following data elements ('required' elements identified) in the REQUEST to create a SIP Identity header. Based on the HTTP header of 'Content-Type' (e.g. json, text/plain), the request body (data) can include various data elements. Please refer to the examples for more details.
    
    Three different API entry points are defined for SIP Identity header creation:
      * Accepts requests in JSON format and produces responses in JSON format
      * Accepts text messages in text/plain and produces responses in JSON format
      * Accepts text messages in text/plain and produces responses in text/plain format
- name: Verification Service
  description: |
    Currently, a RESTful API client is required to provide an 'apiKey' query parameter with a pre-provisioned value to access API calls that are restricted. If the 'apiKey' parameter is not specified, the client IP address may be used as the backup authentication mechanism if pre-provisioned.

    Three different API entry points are defined for SIP Identity header verification:
      * Accepts requests in JSON format and produces responses in JSON format
      * Accepts text messages and produces responses in JSON format
      * Accepts text messages and produces responses in SIP format
- name: Verification Service with Call Validation Treatment (CVT)

paths:
  /authn/v2/identityj-j:
    post:
      tags:
      - Authentication Service
      description: |
        This API entry point accepts requests and produces responses in JSON Format.
      summary: Request & Response in JSON Format
      operationId: authn/identityj-j
      parameters:
        - name: apiKey 
          in: query 
          schema:
            type: string
          description: Required, if client chooses to authenticate via apiKey. Not required, if client chooses to authenticate via pre-provisioned client IP
        - name: ppt
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. PASSporT type value. If specified, must be 'shaken', 'div', 'rcd' or 'rph'. If not specified, default ppt=shaken by authentication server
          required: false
          style: form
          schema:
            type: string
        - name: attest
          in: query
          required: false
          description: Only applicable when SIP INVITE message is included in the request body. Attestation indicator claim value.'attest' value specified by ATIS-1000074.v002. If specified, must be a either "A", "B" or "C". If not specified, default attest=A by authentication server
          schema:
            type: string
        - name: origid
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Origination identifier claim value. 'origid' value specified by ATIS-1000074.v002. If specified, should be a unique string corresponding to a UUID (RFC 4122). If not specified, authentication server would add a UUID.
          required: false
          style: form
          schema:
            type: string
        - name: compact
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Flag for compact SIP Identity header, ignored for 'shaken' PASSporT type. If specified, must be true or false
          required: false
          style: form
          schema:
            type: boolean
        - name: origcc
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Default country code for the originator telephone number. If specified, must be a valid country code
          required: false
          style: form
          schema:
            type: string
        - name: destcc
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Default country code for the destination telephone number. If specified, must be a valid country code
          required: false
          style: form
          schema:
            type: string  
        - name: verstat
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Verstat value as defined in ETSI TS 124 299, for performing tagging and the SIP Identity header optionally removed
          required: false
          style: form
          schema:
            type: string
        - name: identity
          in: query
          description: Only applicable when SIP INVITE message is included in the request body. Flag for including SIP Identity header when the "verstat" parameter is specified, with the default value as "true". If specified, must be true or false
          required: false
          style: form
          schema:
            type: boolean
      requestBody:
        description: ''
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Identity'
          text/plain:
            examples: 
              request: 
                value: |
                  INVITE sip:7035550021@proxy.example.com;transport=UDP SIP/2.0
                  v: SIP/2.0/UDP proxy.example.com:39089;branch=z9hG4bK
                  Max-Forwards: 70
                  m: "Alice" <sip:5715550001@proxy.example.com:39089;transport=UDP>
                  t: "Bob" <sip:+17035550002@example.com>
                  f: "Alice" <sip:+15715550001@example.com>;tag=1f4e4f40
                  i: YzRlZDFlYzYyM2IwOTdlMzk0MDA3MTRmZmY3OGIzODM.
                  P-Asserted-Identity: Alice <sip:+15715550001@example.com>
                  CSeq: 2 INVITE
                  Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
                  c: application/sdp
                  Date: Fri, 14 May 2021 16:57:04 GMT
                  k: replaces, norefersub, extended-refer, timer, X-cisco-serviceuri
                  User-Agent: Z 3.3.25608 r25552
                  Allow-Events: presence, kpml
                  l: 425

                  v=0
                  o=Z 0 0 IN IP4 10.31.32.251
                  s=Z
                  c=IN IP4 10.31.32.251
                  t=0 0
                  m=audio 8000 RTP/AVP 8 0 3 110 98 101
                  a=fingerprint:md5 14:75:8F:1A:FD:44:C0:9B:79:92:07:3C:CF:00:B4:3D
                  a=fingerprint:sha-256 AE:C0:70:64:5F:E5:3E:E3:B3:76:30:59:37:61:34:F0:58:CC:33:72:47:C9:78:AD:D1:78:B6:CC:DF:B0:01:9F
                  a=rtpmap:110 speex/8000
                  a=rtpmap:98 iLBC/8000
                  a=fmtp:98 mode=20
                  a=rtpmap:101 telephone-event/8000
                  a=fmtp:101 0-15
                  a=sendrecv
      x-summary: 
      x-code-samples:
        - lang: curl
          label: STIR 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>"
                    }'

            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJkZXN0Ijp7InRuIjpbIjE1NzE1NTUwMDAwIl19LCJpYXQiOjE2MzQyNDIwMTcsIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9fQ.q2JsLmI-ApIqPpPVnsoQNrD4tpdFv5lLD-80PrJ6WB8YDVF_70CEUetBjxI8-4-5gH91Hu3xLkDqmTeNUUatIw;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256",
              "date" : "Thu, 14 Oct 2021 20:06:57 GMT"
            }
        - lang: curl
          label: SHAKEN
          source: | 
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "passport_type" : "shaken",
                      "date" : "Thu, 14 Oct 2021 20:09:58 GMT",
                      "attest" : "A",
                      "origid" : "3F9C2836-7E40-11E7-BA58-7831C1B8DEBA"
                    }'
                    
            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJhdHRlc3QiOiJBIiwiZGVzdCI6eyJ0biI6WyIxNTcxNTU1MDAwMCJdfSwiaWF0IjoxNjM0MjQyMTk4LCJvcmlnIjp7InRuIjoiMTcwMzU1NTAwMDEifSwib3JpZ2lkIjoiM0Y5QzI4MzYtN0U0MC0xMUU3LUJBNTgtNzgzMUMxQjhERUJBIn0.j3N_z0Eu7I_dcNQ9BTdoZ7AoBFRCetBX4RzOfj2vNSENJ4EdKUpehijGa8xy-5kZgV3I_alJsKxI8XoV2aTm5w;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"shaken\""
            }
        - lang: curl
          label: STIR Compact  
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "compact" : true
                    }'

            Response: 
            {
              "identity" : "..owRURoDJ-Z-Dz2sWcpAe7cM5hgWcNtPlqixaTdXdKrEe0R2GmB2mbXruVyJDTj2yXu1fH9jsaX2qtBWh43uskA;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256",
              "date" : "Thu, 14 Oct 2021 22:00:10 GMT"
            }
        - lang: curl
          label: SHAKEN All Data 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "date" : "Thu, 14 Oct 2021 22:11:08 GMT",
                      "pai" : [ "\"Alice\" <tel:+17035550001>", "\"Alice\" <sip:+17035550001@example.com>" ],
                      "finger_print" : [ {
                                          "algorithm" : "SHA-1",
                                          "digest" : "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB"
                                          }, {
                                          "algorithm" : "SHA-256",
                                          "digest" : "36:3B:AE:12:95:95:F5:97:2D:F7:E0:84:FE:CD:F1:BC:AD:7A:70:64:F7:E7:4F:7E:A6:02:06:0E:37:54:CF:F7"
                                          } ],
                      "dest_cc" : "1",
                      "orig_cc" : "1",
                      "compact" : false,
                      "passport_type" : "shaken",
                      "attest" : "A",
                      "origid" : "3F9C2836-7E40-11E7-BA58-7831C1B8DEBA",
                      "request_id" : "X-REQUEST-ID-12345"
                    }'

            Response: 
            {
              "request_id" : "X-REQUEST-ID-12345",
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJhdHRlc3QiOiJBIiwiZGVzdCI6eyJ0biI6WyIxNTcxNTU1MDAwMCJdfSwiaWF0IjoxNjM0MjQ5NDY4LCJta3kiOlt7ImFsZyI6IlNIQS0xIiwiZGlnIjoiNEFBREI5QjEzRjgyMTgzQjU0MDIxMkRGM0U1RDQ5NkIxOUU1N0NBQiJ9LHsiYWxnIjoiU0hBLTI1NiIsImRpZyI6IjM2M0JBRTEyOTU5NUY1OTcyREY3RTA4NEZFQ0RGMUJDQUQ3QTcwNjRGN0U3NEY3RUE2MDIwNjBFMzc1NENGRjcifV0sIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJvcmlnaWQiOiIzRjlDMjgzNi03RTQwLTExRTctQkE1OC03ODMxQzFCOERFQkEifQ.XQ28K2sQr9v4MKZLY-s4zwNr1sFwWGNdrBY4f2xudrgMo1uRHklZXyzTfNvIDV23ZVkmCcxJE_SbaHX0Dl-eQA;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"shaken\""
            }
        - lang: curl
          label: SHAKEN w/RCD 
          source: |
            <<<<<<<<<<<<<< RCD Service Needs to be enabled on the AS profile >>>>>>>>>>>>>
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "date" : "Thu, 14 Oct 2021 22:14:48 GMT",
                      "pai" : [ "\"Alice\" <tel:+17035550001>", "\"Alice\" <sip:+17035550001@example.com>" ],
                      "finger_print" : [ {
                      "algorithm" : "SHA-1",
                      "digest" : "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB"
                      }, {
                      "algorithm" : "SHA-256",
                      "digest" : "36:3B:AE:12:95:95:F5:97:2D:F7:E0:84:FE:CD:F1:BC:AD:7A:70:64:F7:E7:4F:7E:A6:02:06:0E:37:54:CF:F7"
                      } ],
                      "dest_cc" : "1",
                      "orig_cc" : "1",
                      "compact" : false,
                      "passport_type" : "shaken",
                      "call_info" : "<cid:example.com/alice.json>;purpose=jcard;call-reason=Travel.",
                      "caller_reason": "Travel.",
                      "caller_name" : "Alice Liddell",
                      "jcard" : "[\"vcard\",[[\"version\",{},\"text\",\"4.0\"],[\"fn\",{},\"text\",\"Alice Liddell\"],[ \"email\",{},\"text\",\"alice@example.com\"]]]",
                      "attest" : "A",
                      "origid" : "3F9C2836-7E40-11E7-BA58-7831C1B8DEBA",
                      "request_id" : "X-REQUEST-ID-12345"
                    }'

            Response: 
            {
              "request_id" : "X-REQUEST-ID-12345",
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJhdHRlc3QiOiJBIiwiZGVzdCI6eyJ0biI6WyIxNTcxNTU1MDAwMCJdfSwiaWF0IjoxNjM0MjQ5Njg4LCJta3kiOlt7ImFsZyI6IlNIQS0xIiwiZGlnIjoiNEFBREI5QjEzRjgyMTgzQjU0MDIxMkRGM0U1RDQ5NkIxOUU1N0NBQiJ9LHsiYWxnIjoiU0hBLTI1NiIsImRpZyI6IjM2M0JBRTEyOTU5NUY1OTcyREY3RTA4NEZFQ0RGMUJDQUQ3QTcwNjRGN0U3NEY3RUE2MDIwNjBFMzc1NENGRjcifV0sIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJvcmlnaWQiOiIzRjlDMjgzNi03RTQwLTExRTctQkE1OC03ODMxQzFCOERFQkEifQ.Oyz1HateQwUcuFGHoTI1iHiUsQ-b60AoH6BjsSSb__b4Dzw0sNf7yhdl_iE5nHqPPJOY2zShHYfw0XWERIj6SA;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"shaken\""
            }

        - lang: curl
          label: DIV 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "passport_type" : "div",
                      "diversion" : "\"John\" <sip:+17035550001@example.com>;reason=away"
                    }'

            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6ImRpdiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJkZXN0Ijp7InRuIjpbIjE1NzE1NTUwMDAwIl19LCJkaXYiOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJpYXQiOjE2MzQzMzk2MTksIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9fQ.0w3Kx99RO3DHx1YHYyiNxeMxsAeB0y-edoAEw482hRzgSPsrrY4i1s6QbtDZCNEkVexSF-84kM3oturUBkmgbQ;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"div\"",
              "date" : "Fri, 15 Oct 2021 23:13:39 GMT"
            }
        - lang: curl
          label: RPH 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" :  "<sip:+15715550000@example.com>",
                      "passport_type" : "rph",
                      "resource_priority" : [ "ets.0, wps.1", "q735.1" ]
                    }'

            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InJwaCIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJkZXN0Ijp7InRuIjpbIjE1NzE1NTUwMDAwIl19LCJpYXQiOjE2MzQzNDAxMzIsIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJycGgiOnsiYXV0aCI6WyJldHMuMCIsInE3MzUuMSIsIndwcy4xIl19fQ.WKLGgISGUxxxWAXZqlcodjTINjr4mZhuk5dFk8lL1voIV0Aycg5GbJFVnstbA4wMzlR_q2rbj3O9Oo4wUDrsgg;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"rph\"",
              "date" : "Fri, 15 Oct 2021 23:22:12 GMT"
            }
        - lang: curl
          label: RCD w/nam 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=c07939ca0d0847038866f953' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"Bob\" <sip:+15715550000@example.com>",
                      "passport_type" : "rcd"
                    }'

            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InJjZCIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci11YXQuY2NpZC5uZXVzdGFyLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzExNDc1LjEwMDAxIn0.eyJkZXN0Ijp7InRuIjpbIjE1NzE1NTUwMDAwIl19LCJpYXQiOjE2MzQzNDAyNDcsIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJyY2QiOnsibmFtIjoiQWxpY2UifX0.j22TEsFNP0uNtS4Yfyoi8oy1pfOa3QKGUDu8jMs21FbglrVaJcuRWYr4CT220uDdSTYL985TjGtygZZWs-MRUg;info=<https://cr-uat.ccid.neustar.biz/ccid/authn/v2/certs/11475.10001>;alg=ES256;ppt=\"rcd\"",
              "date" : "Fri, 15 Oct 2021 23:24:07 GMT"
            }
        - lang: curl
          label: RCD All Data 
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=a8b931787fe04e62af92dcf1' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                      "from" : "\"Alice\" <sip:+17035550001@example.com>",
                      "to" : "\"John\" <sip:+15715550002@example.com>",
                      "passport_type" : "rcd",
                      "caller_reason" : "Travel",
                      "caller_name" : "Alice Liddell",
                      "alt_present_number" : "<sip:+18005550000@example.com>",
                      "jcard" : "[\"vcard\",[[\"version\",{},\"text\",\"4.0\"],[\"fn\",{},\"text\",\"Alice Liddell\"],[ \"email\",{},\"text\",\"alice@example.com\"]]]",
                      "jcard_uri" : "cid:123456",
                      "rcd_issuer" : "Disney, Inc.",
                      "rcd_integrity" : true,
                      "rcd_hash_algorithm" : "sha384",
                      "caller_reason": "Travel.",
                      "rcd_signature": "sha512-oODCNbWggTlXfGx1wMpFhdA6Kt2vLjNsRnwks+ffezUUTubjGLSUhqLkSjsE3SZKPWG+gywfYmKjcPtz6uMyog=="
                    }'

            Response: 
            {
              "identity" : "eyJhbGciOiJFUzI1NiIsInBwdCI6InJjZCIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cDovLzEwLjc1LjMyLjE2OTo4MDgxL2NjaWQvYXV0aG4vdjIvY2VydHMvMTAxODgyLjEwMDQyNiJ9.eyJjcm4iOiJUcmF2ZWwiLCJkZXN0Ijp7InRuIjpbIjE1NzE1NTUwMDAyIl19LCJpYXQiOjE2NDQ1MjcwMDcsImlzcyI6IkRpc25leSwgSW5jLiIsIm9yaWciOnsidG4iOiIxNzAzNTU1MDAwMSJ9LCJyY2QiOnsiYXBuIjoiMTgwMDU1NTAwMDAiLCJqY2wiOiJjaWQ6MTIzNDU2IiwibmFtIjoiQWxpY2UgTGlkZGVsbCJ9LCJyY2RpIjp7Ii9hcG4iOiJzaGEzODQtRjQyd2htbEhLZnNtNmNzRUU4aXdBZzlsejkxL1JiUnQxUGJTQzFHSXJZMG4va1UzZHlOSFJ6WDdxV2s5R0l0WSIsIi9qY2wiOiJzaGEzODQtcVA1NEo0aUM2Y1B0L0ZmdXNLcEMwVlhoNjVvaFRZY2NQekRJUFdXZzRZc3F0ZFU3a2xiOVlIWFA2elp5dWlzayIsIi9uYW0iOiJzaGEzODQtbWtFV3lVdTA1b1UyMGYxNFVwN2xibnk3WDhDSndzT09zeVlQUllCWmYydExvQ2JoaEpLMkd4aGsyWFF5NUIzZyJ9fQ.VaFqs3J98BCW55dKljNHkeN6F7M0KW10dH0IhbdQfXHDUHDCbfNALIIwqKFhUXTJ55lX-y4u5_lZ-VSlXMLyHw;info=<http://10.75.32.169:8081/ccid/authn/v2/certs/101882.100426>;alg=ES256;ppt=\"rcd\"",
              "date" : "Thu, 10 Feb 2022 21:03:27 GMT"
            }
        - lang: curl
          label: RPH w/SPH
          source: |
            Request: 
            curl 'https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/identity?apiKey=a8b931787fe04e62af92dcf1' -i -X POST \
                -H 'Content-Type: application/json' \
                -H 'Accept: application/json' \
                -d '{
                    "from": "\"Alice\" <sip:alice@example.com>",
                    "to": "\"Bob\" <sip:5715550000@example.com>",
                    "passport_type": "rph",
                    "resource_priority": [
                        "ets.0, wps.1, esnet.1",
                        "q735.1"
                    ],
                    "priority": "psap-callback"
                }'

            Response: 
            {
                "identity": "eyJhbGciOiJFUzI1NiIsInBwdCI6InJwaCIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cDovLzEwLjc1LjMyLjE2OTo4MDgxL2NjaWQvYXV0aG4vdjIvY2VydHMvMTAxODgyLjEwMDQyNiJ9.eyJkZXN0Ijp7InRuIjpbIjU3MTU1NTAwMDAiXX0sImlhdCI6MTY0MzM5NDkxMiwib3JpZyI6eyJ1cmkiOiJzaXA6YWxpY2VAZXhhbXBsZS5jb20ifSwicnBoIjp7ImF1dGgiOlsiZXNuZXQuMSIsImV0cy4wIiwicTczNS4xIiwid3BzLjEiXX0sInNwaCI6InBzYXAtY2FsbGJhY2sifQ.wnFWAAHhBc9ON99oA8MHs9j-E_xoGmuxl4eCCBosHCpr3No3ysUEEj1oEqjB4xiW4Kb3PgbsDIcTPRikQuUKcA;info=<https://{hostname}:{port}/{optionalRoutingPath}/authn/v2/certs/101882.100426>;alg=ES256;ppt=\"rph\"",
                "date": "Fri, 28 Jan 2022 18:35:12 GMT"
            }
      responses:
        200:
          description: successful operation
          content:
            application/json: 
              schema: 
                $ref: '#/components/schemas/SuccessResponse'
            text/plain:
              examples: 
                response: 
                  value: |
                    HTTP/1.1 200 OK
                    Content-Type: text/plain;charset=UTF-8
                    Content-Length: 1981

                    INVITE sip:7035550021@proxy.example.com;transport=UDP SIP/2.0
                    v: SIP/2.0/UDP proxy.example.com:39089;branch=z9hG4bK
                    Max-Forwards: 70
                    m: "Alice" <sip:5715550001@proxy.example.com:39089;transport=UDP>
                    t: "Bob" <sip:+17035550002@example.com>
                    f: "Alice" <sip:+15715550001;verstat=TN-Validation-Passed@example.com>;tag=1f4e4f40
                    y: eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jYS1hdXRobi5uZXVzdGFybGFiLmJpei9jY2lkL2F1dGhuL3YyL2NlcnRzLzIwMDAxLjEwMDAxIn0.eyJhdHRlc3QiOiJDIiwiZGVzdCI6eyJ0biI6WyIxNzAzNTU1MDAwMiJdfSwiaWF0IjoxNjIxMDExNDIyLCJta3kiOlt7ImFsZyI6Im1kNSIsImRpZyI6IjE0NzU4RjFBRkQ0NEMwOUI3OTkyMDczQ0NGMDBCNDNEIn0seyJhbGciOiJzaGEtMjU2IiwiZGlnIjoiQUVDMDcwNjQ1RkU1M0VFM0IzNzYzMDU5Mzc2MTM0RjA1OENDMzM3MjQ3Qzk3OEFERDE3OEI2Q0NERkIwMDE5RiJ9XSwib3JpZyI6eyJ0biI6IjE1NzE1NTUwMDAxIn0sIm9yaWdpZCI6ImZkYTYyM2EyLWE4OWQtMTFlOS1hZjgzLTAwNTA1NjlhYmIzNCJ9.pV58sy9KSKUCsM9VT_MzJ5srxib53d5xyoKcGBV9o-SJiAdaTB7t3vuxAh8WX8b6BMc_1P8mAk8WfKD3uSXGaA;info=<https://ca-authn.lab.biz/ccid/authn/v2/certs/20001.10001>;alg=ES256;ppt="shaken"
                    P-Attestation-Indicator: A
                    P-Origination-Id: AAA-BBB-CCCC
                    i: YzRlZDFlYzYyM2IwOTdlMzk0MDA3MTRmZmY3OGIzODM.
                    P-Asserted-Identity: Alice <sip:+15715550001;verstat=TN-Validation-Passed@example.com>
                    CSeq: 2 INVITE
                    Allow: INVITE, ACK, CANCEL, BYE, NOTIFY, REFER, MESSAGE, OPTIONS, INFO, SUBSCRIBE
                    c: application/sdp
                    Date: Fri, 14 May 2021 16:57:02 GMT
                    k: replaces, norefersub, extended-refer, timer, X-cisco-serviceuri
                    User-Agent: Z 3.3.25608 r25552
                    Allow-Events: presence, kpml
                    l: 425

                    v=0
                    o=Z 0 0 IN IP4 10.31.32.251
                    s=Z
                    c=IN IP4 10.31.32.251
                    t=0 0
                    m=audio 8000 RTP/AVP 8 0 3 110 98 101
                    a=fingerprint:md5 14:75:8F:1A:FD:44:C0:9B:79:92:07:3C:CF:00:B4:3D
                    a=fingerprint:sha-256 AE:C0:70:64:5F:E5:3E:E3:B3:76:30:59:37:61:34:F0:58:CC:33:72:47:C9:78:AD:D1:78:B6:CC:DF:B0:01:9F
                    a=rtpmap:110 speex/8000
                    a=rtpmap:98 iLBC/8000
                    a=fmtp:98 mode=20
                    a=rtpmap:101 telephone-event/8000
                    a=fmtp:101 0-15
                    a=sendrecv
        4xx:
          description: Error Response
          content: 
            application/json: 
              schema: 
                $ref: '#/components/schemas/ErrorResponse400'
              examples: 
                ApiKeyRequired:
                  value: 
                    error_id: ApiKeyRequired
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: API key is required
                    developer_message: API key is required
                    attributes: 
                      key: value
                ApiKeyInvalid:
                  value: 
                    error_id: ApiKeyInvalid
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: API key is invalid
                    developer_message: API key is invalid
                    attributes: 
                      key: value 
                CertificateIdRequired:
                  value: 
                    error_id: CertificateIdRequired
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: Certificate id is required
                    developer_message: Certificate id is required
                    attributes: 
                      key: value 
                CertificateIdInvalid:
                  value: 
                    error_id: CertificateIdInvalid
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: Certificate is invalid
                    developer_message: Certificate is invalid
                    attributes: 
                      key: value 
                DateParseException:
                  value: 
                    error_id: DateParseException
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: Date is expected to be in RFC 1123 format
                    developer_message: Date is expected to be in RFC 1123 format
                    attributes: 
                      key: value 
                MediaTypeException:
                  value: 
                    error_id: MediaTypeException
                    http_status_code: 400
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: Content  Type is invalid or not supported
                    developer_message: Content  Type is invalid or not supported
                    attributes: 
                      key: value 
                MediaTypeNotAcceptableException:
                  value: 
                    error_id: MediaTypeNotAcceptableException
                    http_status_code: 406
                    sip_code: 400
                    timestamp : Fri, 14 May 2021 16:57:02 GMT
                    reason: Content  Type is not acceptable
                    developer_message: Content  Ty

# --- truncated at 32 KB (896 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/transunion/refs/heads/main/openapi/transunion-trucontact-tcs-shaken-openapi.yml