> ## Documentation Index
> Fetch the complete documentation index at: https://turnkey-0e7c1f5b-traian-remove-eip-712-note.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a TVC App

> Create a new TVC application

export const EndpointPath = ({type, path}) => {
  return <div class="flex w-full flex-col bg-background-light dark:bg-background-dark border-standard rounded-2xl p-1.5">
      <div class="flex items-center space-x-1.5">
        <div class="relative flex-1 flex gap-2 min-w-0 rounded-xl items-center cursor-pointer p-1.5 border-standard">
          <div class="rounded-lg font-bold px-1.5 py-0.5 text-sm leading-5 bg-blue-400/20 dark:bg-blue-400/20 text-blue-700 dark:text-blue-400">
            POST
          </div>
          <div class="flex items-center space-x-2 overflow-x-auto flex-1 no-scrollbar">
            <div class="group flex items-center flex-1 gap-0.5 font-mono">
              <div class="absolute right-0 p-2 bg-background-light dark:bg-background-dark rounded-lg hidden group-hover:block">
                <svg class="w-4 h-4 bg-gray-400 dark:bg-white/30"></svg>
              </div>
              <div class="text-sm text-gray-400">/</div>
              <div class="text-sm font-medium text-gray-800 dark:text-white min-w-max">
                public
              </div>
              <div class="text-sm text-gray-400">/</div>
              <div class="text-sm font-medium text-gray-800 dark:text-white min-w-max">
                v1
              </div>
              <div class="text-sm text-gray-400">/</div>
              <div class="text-sm font-medium text-gray-800 dark:text-white min-w-max">
                {type}
              </div>
              <div class="text-sm text-gray-400">/</div>
              <div class="text-sm font-medium text-gray-800 dark:text-white min-w-max">
                {path}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>;
};

export const NestedParam = ({parentKey, childKey, type, required, description, children}) => {
  const fullKey = `${parentKey}.${childKey}`;
  const anchorId = `body-${fullKey.replace(/\./g, '-')}`;
  return <div className="py-6 border-gray-100 dark:border-gray-800 border-b last:border-b-0">
  <div className="flex font-mono text-sm group/param-head param-head break-all relative" id={anchorId}>
    <div className="flex-1 flex content-start py-0.5 mr-5">
      <div className="flex items-center flex-wrap gap-2">
        <div className="absolute -top-1.5">
          <a href={`#${anchorId}`} className="-ml-[2.1rem] flex items-center opacity-0 border-0 group-hover/param-head:opacity-100 py-2 [.expandable-content_&]:-ml-[2.1rem]" aria-label="Navigate to header">
            <div className="w-6 h-6 text-gray-400 rounded-md flex items-center justify-center zinc-box bg-white ring-1 ring-gray-400/30 dark:ring-gray-700/25 hover:ring-gray-400/60 dark:hover:ring-white/20">
              <svg xmlns="http://www.w3.org/2000/svg" fill="gray" height="12px" viewBox="0 0 576 512">
                <path d="M0 256C0 167.6 71.6 96 160 96h72c13.3 0 24 10.7 24 24s-10.7 24-24 24H160C98.1 144 48 194.1 48 256s50.1 112 112 112h72c13.3 0 24 10.7 24 24s-10.7 24-24 24H160C71.6 416 0 344.4 0 256zm576 0c0 88.4-71.6 160-160 160H344c-13.3 0-24-10.7-24-24s10.7-24 24-24h72c61.9 0 112-50.1 112-112s-50.1-112-112-112H344c-13.3 0-24-10.7-24-24s10.7-24 24-24h72c88.4 0 160 71.6 160 160zM184 232H392c13.3 0 24 10.7 24 24s-10.7 24-24 24H184c-13.3 0-24-10.7-24-24s10.7-24 24-24z"></path>
              </svg>
            </div>
          </a>
        </div>
        <div className="font-semibold text-primary dark:text-primary-light cursor-pointer overflow-wrap-anywhere">
          <span className="text-gray-500 dark:text-gray-400">{parentKey}.</span>
          {childKey}
        </div>
        <div className="inline items-center gap-2 text-xs font-medium [&_div]:inline [&_div]:mr-2 [&_div]:leading-5">
          <div className="flex items-center px-2 py-0.5 rounded-md bg-gray-100/50 dark:bg-white/5 text-gray-600 dark:text-gray-200 font-medium break-all">
            <span>{type}</span>
          </div>
          {required && <span className="px-2 py-0.5 rounded-md bg-red-100/50 dark:bg-red-400/10 text-red-600 dark:text-red-300 font-medium whitespace-nowrap">
              required
            </span>}
        </div>
      </div>
    </div>
  </div>
  {children && <div className="mt-4">
      <div className="prose prose-sm prose-gray dark:prose-invert">
        {children}
      </div>
    </div>}
</div>;
};

export const H3Bordered = ({text}) => <h3 id={text.toLowerCase()} className="border-b pb-2.5 border-gray-100 dark:border-gray-800">
    {text}
  </h3>;

export const Authorizations = () => {
  return <div>
      <H3Bordered text="Authorizations" />

      <Tabs>
        <Tab title="API Key">
          <div className="flex text-sm group/param-head param-head break-all relative" id="authorization-x-stamp">
            <ParamField header="X-Stamp" type="string" required={true}>
              Cryptographically signed (stamped) request to be passed in as a header. For more info, see <a href="https://docs.turnkey.com/developer-reference/api-overview/stamps">here</a>.
            </ParamField>
          </div>
        </Tab>

        <Tab title="WebAuthn (Passkey)">
         <div className="flex text-sm group/param-head param-head break-all relative" id="authorization-x-stamp-webauthn">
            <ParamField body="X-Stamp-WebAuthn" type="string" required={true}>
              Cryptographically signed (stamped) request to be passed in as a header. For more info, see <a href="https://docs.turnkey.com/developer-reference/api-overview/stamps">here</a>.
            </ParamField>
          </div>
        </Tab>
      </Tabs>
    </div>;
};

<EndpointPath type="submit" path="create_tvc_app" />

<Authorizations />

<H3Bordered text="Body" />

<ParamField body="type" type="enum<string>" required={true}>
  Enum options: `ACTIVITY_TYPE_CREATE_TVC_APP`
</ParamField>

<ParamField body="timestampMs" type="string" required={true}>
  Timestamp (in milliseconds) of the request, used to verify liveness of user requests.
</ParamField>

<ParamField body="organizationId" type="string" required={true}>
  Unique identifier for a given Organization.
</ParamField>

<ParamField body="parameters" type="object" required={true} path="parameters">
  <p>The parameters object containing the specific intent data for this activity.</p>

  <Expandable title="details">
    <NestedParam parentKey="parameters" childKey="name" type="string" required={true} default="">
      The name of the new TVC application
    </NestedParam>

    <NestedParam parentKey="parameters" childKey="quorumPublicKey" type="string" required={true} default="">
      Quorum public key to use for this application
    </NestedParam>

    <NestedParam parentKey="parameters" childKey="manifestSetId" type="string" required={false} default="">
      Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required
    </NestedParam>

    <ParamField body="manifestSetParams" type="object" required={false} path="parameters.manifestSetParams">
      <p>manifestSetParams field</p>

      <Expandable title="details">
        <NestedParam parentKey="parameters.manifestSetParams" childKey="name" type="string" required={true} default="">
          Short description for this new operator set
        </NestedParam>

        <ParamField body="newOperators" type="array" required={false} path="parameters.manifestSetParams.newOperators">
          <p>Operators to create as part of this new operator set</p>

          <Expandable title="item details">
            <NestedParam parentKey="parameters.manifestSetParams.newOperators" childKey="name" type="string" required={true} default="">
              The name for this new operator
            </NestedParam>

            <NestedParam parentKey="parameters.manifestSetParams.newOperators" childKey="publicKey" type="string" required={true} default="">
              Public key for this operator
            </NestedParam>
          </Expandable>
        </ParamField>

        <ParamField body="existingOperatorIds" type="array" required={false} path="parameters.manifestSetParams.existingOperatorIds">
          <p>Existing operators to use as part of this new operator set</p>

          <Expandable title="item details">
            <p>Array item type: <code>string</code></p>
            <p>item field</p>
          </Expandable>
        </ParamField>

        <NestedParam parentKey="parameters.manifestSetParams" childKey="threshold" type="number" required={true} default="">
          The threshold of operators needed to reach consensus in this new Operator Set
        </NestedParam>
      </Expandable>
    </ParamField>

    <NestedParam parentKey="parameters" childKey="shareSetId" type="string" required={false} default="">
      Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required
    </NestedParam>

    <ParamField body="shareSetParams" type="object" required={false} path="parameters.shareSetParams">
      <p>shareSetParams field</p>

      <Expandable title="details">
        <NestedParam parentKey="parameters.shareSetParams" childKey="name" type="string" required={true} default="">
          Short description for this new operator set
        </NestedParam>

        <ParamField body="newOperators" type="array" required={false} path="parameters.shareSetParams.newOperators">
          <p>Operators to create as part of this new operator set</p>

          <Expandable title="item details">
            <NestedParam parentKey="parameters.shareSetParams.newOperators" childKey="name" type="string" required={true} default="">
              The name for this new operator
            </NestedParam>

            <NestedParam parentKey="parameters.shareSetParams.newOperators" childKey="publicKey" type="string" required={true} default="">
              Public key for this operator
            </NestedParam>
          </Expandable>
        </ParamField>

        <ParamField body="existingOperatorIds" type="array" required={false} path="parameters.shareSetParams.existingOperatorIds">
          <p>Existing operators to use as part of this new operator set</p>

          <Expandable title="item details">
            <p>Array item type: <code>string</code></p>
            <p>item field</p>
          </Expandable>
        </ParamField>

        <NestedParam parentKey="parameters.shareSetParams" childKey="threshold" type="number" required={true} default="">
          The threshold of operators needed to reach consensus in this new Operator Set
        </NestedParam>
      </Expandable>
    </ParamField>

    <NestedParam parentKey="parameters" childKey="enableEgress" type="boolean" required={false} default="">
      Enables network egress for this TVC app. Default if not provided: false.
    </NestedParam>

    <NestedParam parentKey="parameters" childKey="enableDebugModeDeployments" type="boolean" required={false} default="">
      When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false.
    </NestedParam>
  </Expandable>
</ParamField>

<H3Bordered text="Response" />

A successful response returns the following fields:

<ResponseField name="activity" type="object" required={true}>
  The activity object containing type, intent, and result

  <Expandable title="activity details">
    <NestedParam parentKey="activity" childKey="id" type="string" required={true}>
      Unique identifier for a given Activity object.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="organizationId" type="string" required={true}>
      Unique identifier for a given Organization.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="status" type="string" required={true}>
      The activity status
    </NestedParam>

    <NestedParam parentKey="activity" childKey="type" type="string" required={true}>
      The activity type
    </NestedParam>

    <NestedParam parentKey="activity" childKey="intent" type="object" required={true}>
      The intent of the activity

      <Expandable title="intent details">
        <NestedParam parentKey="activity.intent" childKey="createTvcAppIntent" type="object" required={true}>
          The createTvcAppIntent object

          <Expandable title="createTvcAppIntent details">
            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="name" type="string" required={true}>
              The name of the new TVC application
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="quorumPublicKey" type="string" required={true}>
              Quorum public key to use for this application
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="manifestSetId" type="string" required={false}>
              Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="manifestSetParams" type="object" required={false}>
              manifestSetParams field

              <Expandable title="manifestSetParams details">
                <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams" childKey="name" type="string" required={true}>
                  Short description for this new operator set
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams" childKey="newOperators" type="array" required={false}>
                  Operators to create as part of this new operator set

                  <Expandable title="newOperators details">
                    <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams.newOperators" childKey="name" type="string" required={true}>
                      The name for this new operator
                    </NestedParam>

                    <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams.newOperators" childKey="publicKey" type="string" required={true}>
                      Public key for this operator
                    </NestedParam>
                  </Expandable>
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams" childKey="existingOperatorIds" type="array" required={false}>
                  Existing operators to use as part of this new operator set

                  <Expandable title="existingOperatorIds details">
                    <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams.existingOperatorIds" childKey="item" type="string" required={true}>
                      item field
                    </NestedParam>
                  </Expandable>
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.manifestSetParams" childKey="threshold" type="number" required={true}>
                  The threshold of operators needed to reach consensus in this new Operator Set
                </NestedParam>
              </Expandable>
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="shareSetId" type="string" required={false}>
              Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="shareSetParams" type="object" required={false}>
              shareSetParams field

              <Expandable title="shareSetParams details">
                <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams" childKey="name" type="string" required={true}>
                  Short description for this new operator set
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams" childKey="newOperators" type="array" required={false}>
                  Operators to create as part of this new operator set

                  <Expandable title="newOperators details">
                    <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams.newOperators" childKey="name" type="string" required={true}>
                      The name for this new operator
                    </NestedParam>

                    <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams.newOperators" childKey="publicKey" type="string" required={true}>
                      Public key for this operator
                    </NestedParam>
                  </Expandable>
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams" childKey="existingOperatorIds" type="array" required={false}>
                  Existing operators to use as part of this new operator set

                  <Expandable title="existingOperatorIds details">
                    <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams.existingOperatorIds" childKey="item" type="string" required={true}>
                      item field
                    </NestedParam>
                  </Expandable>
                </NestedParam>

                <NestedParam parentKey="activity.intent.createTvcAppIntent.shareSetParams" childKey="threshold" type="number" required={true}>
                  The threshold of operators needed to reach consensus in this new Operator Set
                </NestedParam>
              </Expandable>
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="enableEgress" type="boolean" required={false}>
              Enables network egress for this TVC app. Default if not provided: false.
            </NestedParam>

            <NestedParam parentKey="activity.intent.createTvcAppIntent" childKey="enableDebugModeDeployments" type="boolean" required={false}>
              When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false.
            </NestedParam>
          </Expandable>
        </NestedParam>
      </Expandable>
    </NestedParam>

    <NestedParam parentKey="activity" childKey="result" type="object" required={true}>
      The result of the activity

      <Expandable title="result details">
        <NestedParam parentKey="activity.result" childKey="createTvcAppResult" type="object" required={true}>
          The createTvcAppResult object

          <Expandable title="createTvcAppResult details">
            <NestedParam parentKey="activity.result.createTvcAppResult" childKey="appId" type="string" required={true}>
              The unique identifier for the TVC application
            </NestedParam>

            <NestedParam parentKey="activity.result.createTvcAppResult" childKey="manifestSetId" type="string" required={true}>
              The unique identifier for the TVC manifest set
            </NestedParam>

            <NestedParam parentKey="activity.result.createTvcAppResult" childKey="manifestSetOperatorIds" type="array" required={true}>
              The unique identifier(s) of the manifest set operators

              <Expandable title="manifestSetOperatorIds details">
                <NestedParam parentKey="activity.result.createTvcAppResult.manifestSetOperatorIds" childKey="item" type="string" required={true}>
                  item field
                </NestedParam>
              </Expandable>
            </NestedParam>

            <NestedParam parentKey="activity.result.createTvcAppResult" childKey="manifestSetThreshold" type="number" required={true}>
              The required number of approvals for the manifest set
            </NestedParam>
          </Expandable>
        </NestedParam>
      </Expandable>
    </NestedParam>

    <NestedParam parentKey="activity" childKey="votes" type="array" required={true}>
      A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="fingerprint" type="string" required={true}>
      An artifact verifying a User's action.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="canApprove" type="boolean" required={true}>
      Whether the activity can be approved.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="canReject" type="boolean" required={true}>
      Whether the activity can be rejected.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="createdAt" type="string" required={true}>
      The creation timestamp.
    </NestedParam>

    <NestedParam parentKey="activity" childKey="updatedAt" type="string" required={true}>
      The last update timestamp.
    </NestedParam>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash title="cURL" theme={null}
  curl --request POST \
    --url https://api.turnkey.com/public/v1/submit/create_tvc_app \
    --header 'Accept: application/json' \
    --header 'Content-Type: application/json' \
    --header "X-Stamp: <string> (see Authorizations)" \
    --data '{
      "type": "ACTIVITY_TYPE_CREATE_TVC_APP",
      "timestampMs": "<string> (e.g. 1746736509954)",
      "organizationId": "<string> (Your Organization ID)",
      "parameters": {
          "name": "<string>",
          "quorumPublicKey": "<string>",
          "manifestSetId": "<string>",
          "manifestSetParams": {
              "name": "<string>",
              "newOperators": [
                  {
                      "name": "<string>",
                      "publicKey": "<string>"
                  }
              ],
              "existingOperatorIds": [
                  "<string>"
              ],
              "threshold": "<number>"
          },
          "shareSetId": "<string>",
          "shareSetParams": {
              "name": "<string>",
              "newOperators": [
                  {
                      "name": "<string>",
                      "publicKey": "<string>"
                  }
              ],
              "existingOperatorIds": [
                  "<string>"
              ],
              "threshold": "<number>"
          },
          "enableEgress": "<boolean>",
          "enableDebugModeDeployments": "<boolean>"
      }
  }'
  ```

  ```javascript title="JavaScript" theme={null}
  import { Turnkey } from "@turnkey/sdk-server";

  const turnkeyClient = new Turnkey({
    apiBaseUrl: "https://api.turnkey.com",
    apiPublicKey: process.env.API_PUBLIC_KEY!,
    apiPrivateKey: process.env.API_PRIVATE_KEY!,
    defaultOrganizationId: process.env.ORGANIZATION_ID!,
  });

  const response = await turnkeyClient.apiClient().createTvcApp({
    name: "<string> (The name of the new TVC application)",
    quorumPublicKey: "<string> (Quorum public key to use for this application)",
    manifestSetId: "<string> (Unique identifier for an existing TVC operator set to use as the Manifest Set for this TVC application. If left empty, a new Manifest Set configuration is required)",
    manifestSetParams: { // manifestSetParams field,
      name: "<string> (Short description for this new operator set)",
      newOperators: [{ // Operators to create as part of this new operator set,
        name: "<string> (The name for this new operator)",
        publicKey: "<string> (Public key for this operator)",
      }],
      existingOperatorIds: ["<string>"] // Existing operators to use as part of this new operator set,
      threshold: 0 // The threshold of operators needed to reach consensus in this new Operator Set,
    },
    shareSetId: "<string> (Unique identifier for an existing TVC operator set to use as the Share Set for this TVC application. If left empty, a new Share Set configuration is required)",
    shareSetParams: { // shareSetParams field,
      name: "<string> (Short description for this new operator set)",
      newOperators: [{ // Operators to create as part of this new operator set,
        name: "<string> (The name for this new operator)",
        publicKey: "<string> (Public key for this operator)",
      }],
      existingOperatorIds: ["<string>"] // Existing operators to use as part of this new operator set,
      threshold: 0 // The threshold of operators needed to reach consensus in this new Operator Set,
    },
    enableEgress: true // Enables network egress for this TVC app. Default if not provided: false.,
    enableDebugModeDeployments: true // When true, this app may create deployments in debug-mode. Debug-mode deployments expose logs and emit zero'd attestation PCRs, so remote attestation cannot succeed. Cannot be changed after app creation. Setting this true means the app's quorum key is considered permanently insecure, and a new app with a fresh quorum key must be created. Default if not provided: false.
  });
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "activity": {
      "id": "<activity-id>",
      "status": "ACTIVITY_STATUS_COMPLETED",
      "type": "ACTIVITY_TYPE_CREATE_TVC_APP",
      "organizationId": "<organization-id>",
      "timestampMs": "<timestamp> (e.g. 1746736509954)",
      "result": {
        "activity": {
          "id": "<string>",
          "organizationId": "<string>",
          "status": "<string>",
          "type": "<string>",
          "intent": {
            "createTvcAppIntent": {
              "name": "<string>",
              "quorumPublicKey": "<string>",
              "manifestSetId": "<string>",
              "manifestSetParams": {
                "name": "<string>",
                "newOperators": [
                  {
                    "name": "<string>",
                    "publicKey": "<string>"
                  }
                ],
                "existingOperatorIds": [
                  "<string>"
                ],
                "threshold": "<number>"
              },
              "shareSetId": "<string>",
              "shareSetParams": {
                "name": "<string>",
                "newOperators": [
                  {
                    "name": "<string>",
                    "publicKey": "<string>"
                  }
                ],
                "existingOperatorIds": [
                  "<string>"
                ],
                "threshold": "<number>"
              },
              "enableEgress": "<boolean>",
              "enableDebugModeDeployments": "<boolean>"
            }
          },
          "result": {
            "createTvcAppResult": {
              "appId": "<string>",
              "manifestSetId": "<string>",
              "manifestSetOperatorIds": [
                "<string>"
              ],
              "manifestSetThreshold": "<number>"
            }
          },
          "votes": "<array>",
          "fingerprint": "<string>",
          "canApprove": "<boolean>",
          "canReject": "<boolean>",
          "createdAt": "<string>",
          "updatedAt": "<string>"
        }
      }
    }
  }
  ```
</ResponseExample>
