---
title: "Update a portal link"
method: PUT
path: "/v1/projects/{projectID}/portal-links/{portalLinkID}"
tags: ["Portal Links"]
---

# Update a portal link

`PUT /v1/projects/{projectID}/portal-links/{portalLinkID}`

## Request

- Base URL: `https://us.getconvoy.cloud/api`
- URL: `https://us.getconvoy.cloud/api/v1/projects/{projectID}/portal-links/{portalLinkID}`
- Auth: HTTP bearer

This endpoint updates a portal link

## Path parameters

- `projectID` string, required
- `portalLinkID` string, required

## Request body

- DatastoreUpdatePortalLinkRequest
  - `auth_type` string
  - `can_manage_endpoint` boolean: Specify whether endpoint management can be done through the Portal Link UI
  - `endpoints` string[]: Deprecated IDs of endpoints in this portal link
  - `name` string: Portal Link Name
  - `owner_id` string: OwnerID, the portal link will inherit all the endpoints with this owner ID

## Response `202`

Accepted

- object
  - `message` string
  - `status` boolean
  - `data` DatastorePortalLinkResponse
    - `auth_key` string
    - `auth_type` 'refresh_token' | 'static_token' | ''
    - `can_manage_endpoint` boolean
    - `created_at` string
    - `deleted_at` string, nullable
    - `endpoint_count` integer
    - `endpoints` string[]
    - `endpoints_metadata` DatastoreEndpoint[]
      - `advanced_signatures` boolean
      - `authentication` DatastoreEndpointAuthentication
        - `api_key` DatastoreApiKey
          - `header_name` string
          - `header_value` string
        - `basic_auth` DatastoreBasicAuth
          - `password` string
          - `username` string
        - `oauth2` DatastoreOAuth2
          - `audience` string
          - `authentication_type` 'shared_secret' | 'client_assertion' | ''
          - `client_id` string
          - `client_secret` string: Encrypted at rest
          - `expiry_time_unit` 'seconds' | 'milliseconds' | 'minutes' | 'hours' | ''
          - `field_mapping` DatastoreOAuth2FieldMapping
            - `access_token` string: Field name for access token (e.g., "accessToken", "access_token", "token")
            - `expires_in` string: Field name for expiry time (e.g., "expiresIn", "expires_in", "expiresAt")
            - `token_type` string: Field name for token type (e.g., "tokenType", "token_type")
          - `grant_type` string
          - `issuer` string
          - `scope` string
          - `signing_algorithm` string
          - `signing_key` DatastoreOAuth2SigningKey
            - `crv` string: EC (Elliptic Curve) key fields
            - `d` string: Private key (EC only)
            - `dp` string: RSA first factor CRT exponent (RSA private key only)
            - `dq` string: RSA second factor CRT exponent (RSA private key only)
            - `e` string: RSA public exponent (RSA only)
            - `kid` string: Key ID
            - `kty` string: Key type: "EC" or "RSA"
            - `n` string: RSA key fields
            - `p` string: RSA first prime factor (RSA private key only)
            - `q` string: RSA second prime factor (RSA private key only)
            - `qi` string: RSA first CRT coefficient (RSA private key only)
            - `x` string: X coordinate (EC only)
            - `y` string: Y coordinate (EC only)
          - `subject` string
          - `url` string
        - `type` 'api_key' | 'oauth2' | 'basic_auth' | ''
      - `cb_state` string, nullable: CBState is the circuit breaker state ("open", "half-open", "closed") so the UI can reflect a tripped breaker on the endpoint status. Nil when CB is off/unlicensed or has no sample for this endpoint.
      - `content_type` string
      - `created_at` string
      - `deleted_at` string, nullable
      - `description` string
      - `events` integer
      - `failure_count` integer, nullable
      - `failure_rate` number, nullable: FailureRate is the circuit breaker's rolling failure rate for this endpoint. It is a pointer so the API can return null when no rate was computed (circuit breaker feature off, or sampler not running), distinct from a genuine 0%.
      - `http_timeout` integer
      - `mtls_client_cert` DatastoreMtlsClientCert
        - `client_cert` string: ClientCert is the client certificate PEM string
        - `client_key` string: ClientKey is the client private key PEM string
      - `name` string
      - `owner_id` string
      - `period_failure_rate` number, nullable: PeriodFailureRate is the period failure rate from event_deliveries, (Failure+Retry)/(Success+Failure+Retry). Retry counts as failed-so-far. Nil when the range has no counted deliveries; sibling counts are transient.
      - `project_id` string
      - `rate_limit` integer
      - `rate_limit_duration` integer
      - `retry_count` integer, nullable
      - `secrets` DatastoreSecret[]
        - `created_at` string
        - `deleted_at` string, nullable
        - `expires_at` string, nullable
        - `uid` string
        - `updated_at` string
        - `value` string
      - `slack_webhook_url` string
      - `status` 'active' | 'inactive' | 'paused' | ''
      - `success_count` integer, nullable
      - `support_email` string
      - `teams_webhook_url` string
      - `uid` string
      - `updated_at` string
      - `url` string
    - `name` string
    - `owner_id` string
    - `project_id` string
    - `token` string
    - `uid` string
    - `updated_at` string
    - `url` string

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

## Changes

- **2026-08-20** (v3) `c6c04abdfb6f`: 1 info
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/allOf[#/components/schemas/datastore.Endpoint]/teams_webhook_url` to the response with the `202` status
- **2026-07-20** (v3) `bae289777c91`: 9 breaking, 28 warning, 4 info
  - the response property `allOf[subschema #2]/data` became nullable for the status `400`
  - the response property `allOf[subschema #2]/data` became nullable for the status `401`
  - the response property `allOf[subschema #2]/data` became nullable for the status `404`
  - the response property `allOf[subschema #2]/data/deleted_at` became nullable for the status `202`
  - …37 more
- **2026-07-06** (v3) `2e8ab34176ea`: 2 info
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/cb_state` to the response with the `202` status
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/retry_count` to the response with the `202` status
- **2026-06-30** (v3) `21fa7ff1d01a`: 3 info
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/failure_count` to the response with the `202` status
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/period_failure_rate` to the response with the `202` status
  - added the optional property `allOf[subschema #2]/data/endpoints_metadata/items/success_count` to the response with the `202` status
- …earlier changes not shown

[Operation history](https://skmtc.dev/getconvoy/apis/convoy-api-reference/changes/v1/projects/:projectID/portal-links/:portalLinkID/put.md)

---

[API](https://skmtc.dev/getconvoy/apis/convoy-api-reference.md) - [All operations](https://skmtc.dev/getconvoy/apis/convoy-api-reference/llms.txt) - [OpenAPI document](https://skmtc.dev/getconvoy/apis/convoy-api-reference/revisions/d97533451ebd?raw)
