{"type":"api","title":"Update custom application","meta":{"id":"/apps/pubhub/media/000-v7-apis/2b357191d5bd100f3423daa842df6138a6f051e5/fbf6bbc4-89c6-3f81-a0ca-14ed82c3962b","info":{"title":"Custom Applications API","version":"7.0.112","description":"Traffic Insights custom applications classify proprietary or unrecognized\ntraffic based on CIDR blocks, transport protocols, and port ranges.\n"},"security":[{"BearerAuth":[]}],"tags":[{"name":"Custom Applications"}],"openapi":"3.0.1","servers":[{"description":"ThousandEyes API production URL","url":"https://api.thousandeyes.com/v7"}],"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Bearer authentication token"}}},"spec":{"tags":["Custom Applications"],"summary":"Update custom application","description":"Replace a custom application definition, including its rules.","operationId":"updateCustomApplication","parameters":[{"name":"aid","in":"query","description":"A unique identifier associated with your account group. You can retrieve your `AccountGroupId` from the `/account-groups` endpoint. Note that you must be assigned to the target account group. Specifying this parameter without being assigned to the target account group will result in an error response.","required":false,"schema":{"type":"string","example":"1234"},"$$ref":"#/components/parameters/AccountGroupId"},{"name":"id","in":"path","required":true,"description":"Public identifier of the custom application.","schema":{"type":"string","format":"uuid","example":"7cb776c5-8c12-4b1a-84aa-9941b815d873"},"$$ref":"#/components/parameters/Id"}],"requestBody":{"description":"Replacement custom application definition.","required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request payload for creating or updating a custom application.","required":["applicationName","rules"],"properties":{"applicationName":{"type":"string","description":"User-defined name (max 79 characters).","maxLength":79,"pattern":"^[A-Za-z0-9\\.\\:\\/\\=\\+\\-@_]+$","example":"Internal-Web-Services","$$ref":"#/components/schemas/CustomApplicationName"},"description":{"type":"string","description":"Optional short description of the custom application (max 256 characters).","maxLength":256,"pattern":"^[A-Za-z0-9\\.\\:\\/\\=\\+\\-@_ ]+$","example":"Classifies traffic for internal web services.","$$ref":"#/components/schemas/CustomApplicationDescription"},"rules":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","description":"Traffic matching rule. If `protocol` is specified, `portRanges` must also be specified, and vice versa. If both are omitted, the rule applies to all protocols and ports for the given `cidrs`.\n","properties":{"cidrs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","format":"cidr","description":"Supports IPv4 and IPv6 CIDRs; you can mix both in the same list.","example":"2001:db8::/32"},"$$ref":"#/components/schemas/RuleCidrs"},"protocol":{"type":"string","enum":["tcp","udp","tcp-udp"],"description":"Transport protocol selection. Required when `portRanges` is set.","example":"tcp","$$ref":"#/components/schemas/Protocol"},"portRanges":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","properties":{"start":{"type":"integer","minimum":1,"maximum":65535,"description":"Port number (1–65535).","example":443,"$$ref":"#/components/schemas/PortRangeBound"},"end":{"type":"integer","minimum":1,"maximum":65535,"description":"Port number (1–65535).","example":443,"$$ref":"#/components/schemas/PortRangeBound"}},"required":["start","end"],"description":"Inclusive range; `end` must be ≥ `start`.","$$ref":"#/components/schemas/PortRange"},"description":"Non-overlapping port ranges. Required when `protocol` is set.","example":[{"start":8080,"end":8082},{"start":443,"end":443}],"$$ref":"#/components/schemas/RulePortRanges"}},"required":["cidrs"],"oneOf":[{"required":["protocol","portRanges"]},{"not":{"anyOf":[{"required":["protocol"]},{"required":["portRanges"]}]}}],"$$ref":"#/components/schemas/CustomApplicationRule"},"$$ref":"#/components/schemas/CustomApplicationRules"}},"$$ref":"#/components/schemas/CustomApplicationRequest"}}}},"responses":{"200":{"description":"The updated custom application.","content":{"application/hal+json":{"schema":{"type":"object","properties":{"id":{"type":"string","readOnly":true,"description":"Public identifier of the custom application.","format":"uuid","example":"7cb776c5-8c12-4b1a-84aa-9941b815d873","$$ref":"#/components/schemas/CustomApplicationId"},"applicationName":{"type":"string","description":"User-defined name (max 79 characters).","maxLength":79,"pattern":"^[A-Za-z0-9\\.\\:\\/\\=\\+\\-@_]+$","example":"Internal-Web-Services","$$ref":"#/components/schemas/CustomApplicationName"},"description":{"type":"string","description":"Optional short description of the custom application (max 256 characters).","maxLength":256,"pattern":"^[A-Za-z0-9\\.\\:\\/\\=\\+\\-@_ ]+$","example":"Classifies traffic for internal web services.","$$ref":"#/components/schemas/CustomApplicationDescription"},"rules":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","description":"Traffic matching rule. If `protocol` is specified, `portRanges` must also be specified, and vice versa. If both are omitted, the rule applies to all protocols and ports for the given `cidrs`.\n","properties":{"cidrs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","format":"cidr","description":"Supports IPv4 and IPv6 CIDRs; you can mix both in the same list.","example":"2001:db8::/32"},"$$ref":"#/components/schemas/RuleCidrs"},"protocol":{"type":"string","enum":["tcp","udp","tcp-udp"],"description":"Transport protocol selection. Required when `portRanges` is set.","example":"tcp","$$ref":"#/components/schemas/Protocol"},"portRanges":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","properties":{"start":{"type":"integer","minimum":1,"maximum":65535,"description":"Port number (1–65535).","example":443,"$$ref":"#/components/schemas/PortRangeBound"},"end":{"type":"integer","minimum":1,"maximum":65535,"description":"Port number (1–65535).","example":443,"$$ref":"#/components/schemas/PortRangeBound"}},"required":["start","end"],"description":"Inclusive range; `end` must be ≥ `start`.","$$ref":"#/components/schemas/PortRange"},"description":"Non-overlapping port ranges. Required when `protocol` is set.","example":[{"start":8080,"end":8082},{"start":443,"end":443}],"$$ref":"#/components/schemas/RulePortRanges"}},"required":["cidrs"],"oneOf":[{"required":["protocol","portRanges"]},{"not":{"anyOf":[{"required":["protocol"]},{"required":["portRanges"]}]}}],"$$ref":"#/components/schemas/CustomApplicationRule"},"$$ref":"#/components/schemas/CustomApplicationRules"},"createdAt":{"type":"string","format":"date-time","readOnly":true,"description":"The date and time the custom application was first created. ISO 8601 UTC timestamp in the format yyyy-MM-dd'T'HH:mm:ss'Z'.","example":"2025-01-31T14:27:59Z","$$ref":"#/components/schemas/CustomApplicationCreatedAt"},"updatedAt":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"The most recent date and time the custom application was modified. ISO 8601 UTC timestamp in the format yyyy-MM-dd'T'HH:mm:ss'Z'.","example":"2025-02-15T09:45:30Z","$$ref":"#/components/schemas/CustomApplicationUpdatedAt"},"createdBy":{"type":"string","readOnly":true,"description":"Username of the user who created the custom application.","example":"john.doe","$$ref":"#/components/schemas/CustomApplicationCreatedBy"},"modifiedBy":{"type":"string","readOnly":true,"nullable":true,"description":"Username of the user who most recently modified the custom application.","example":"jane.smith","$$ref":"#/components/schemas/CustomApplicationModifiedBy"},"_links":{"type":"object","description":"A links object containing the self link.","readOnly":true,"properties":{"self":{"type":"object","description":"A hyperlink from the containing resource to a URI.","required":["href"],"properties":{"href":{"type":"string","description":"Its value is either a URI [RFC3986] or a URI template [RFC6570].","example":"https://api.thousandeyes.com/v7/link/to/resource/id"},"templated":{"type":"boolean","description":"Should be true when the link object's \"href\" property is a URI template."},"type":{"type":"string","description":"Used as a hint to indicate the media type expected when dereferencing the target resource."},"deprecation":{"type":"string","description":"Its presence indicates that the link is to be deprecated at a future date. Its value is a URL that should provide further information about the deprecation."},"name":{"type":"string","description":"Its value may be used as a secondary key for selecting link objects that share the same relation type."},"profile":{"type":"string","description":"A URI that hints about the profile of the target resource."},"title":{"type":"string","description":"Intended for labelling the link with a human-readable identifier"},"hreflang":{"type":"string","description":"Indicates the language of the target resource"}},"$$ref":"#/components/schemas/Link"}},"$$ref":"#/components/schemas/SelfLinks"}},"required":["applicationName","rules"],"$$ref":"#/components/schemas/CustomApplication"}}}},"400":{"description":"Bad Request","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type. When this member is not present, its value is assumed to be \"about:blank\"."},"title":{"type":"string","description":"A short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code generated by the origin server for this occurrence of the problem."},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"A URI reference that identifies the specific occurrence of the problem."},"errors":{"nullable":true,"type":"array","description":"(Optional) When multiple errors occur, the details for each error are listed.","items":{"type":"object","properties":{"code":{"type":"string","description":"(Optional) A unique error type/code that can be referenced in the documentation for further details."},"field":{"type":"string","description":"Identifies the field that triggered this particular error."},"message":{"type":"string","description":"A short, human-readable summary of the error."}},"$$ref":"#/components/schemas/ValidationErrorItem"}}},"$$ref":"#/components/schemas/ValidationError"},"example":{"type":"about:blank","title":"Request validation failed. There are invalid or missing fields","status":400,"detail":"Your request object contains invalid fields.","instance":"/v7","errors":[{"code":"AM-5432","field":"firstName","message":"firstName cannot have fancy characters"},{"code":"DASH-5622","field":"password","message":"Password cannot be blank"}]}}},"$$ref":"#/components/responses/400"},"401":{"description":"Unauthorized","content":{"application/problem+json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid_token"},"error_description":{"type":"string","example":"Invalid access token"}},"$$ref":"#/components/schemas/UnauthorizedError"}}},"$$ref":"#/components/responses/401"},"403":{"description":"Insufficient permissions to query endpoint","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type. When this member is not present, its value is assumed to be \"about:blank\"."},"title":{"type":"string","description":"A short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code generated by the origin server for this occurrence of the problem."},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"A URI reference that identifies the specific occurrence of the problem."}},"$$ref":"#/components/schemas/Error"}}},"$$ref":"#/components/responses/403"},"404":{"description":"Not found","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type. When this member is not present, its value is assumed to be \"about:blank\"."},"title":{"type":"string","description":"A short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code generated by the origin server for this occurrence of the problem."},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"A URI reference that identifies the specific occurrence of the problem."}},"$$ref":"#/components/schemas/Error"},"example":{"type":"about:blank","title":"URI Resource Not Found","status":404,"detail":"Details explaining if the 404 error is related to an invalid URI or a wrong ID","instance":"/v7"}}},"$$ref":"#/components/responses/404"},"429":{"description":"Exhausted rate limit for the organization","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type. When this member is not present, its value is assumed to be \"about:blank\"."},"title":{"type":"string","description":"A short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code generated by the origin server for this occurrence of the problem."},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"A URI reference that identifies the specific occurrence of the problem."}},"$$ref":"#/components/schemas/Error"}}},"$$ref":"#/components/responses/429"},"500":{"description":"Internal server error","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"A URI reference that identifies the problem type. When this member is not present, its value is assumed to be \"about:blank\"."},"title":{"type":"string","description":"A short, human-readable summary of the problem type."},"status":{"type":"integer","description":"The HTTP status code generated by the origin server for this occurrence of the problem."},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence of the problem."},"instance":{"type":"string","description":"A URI reference that identifies the specific occurrence of the problem."}},"$$ref":"#/components/schemas/Error"},"example":{"type":"about:blank","title":"Internal server error","status":500,"detail":"Optional detail about the internal error message.","instance":"/v7"}}},"$$ref":"#/components/responses/500"}},"__originalOperationId":"updateCustomApplication","security":[{"BearerAuth":[]}],"method":"put","path":"/traffic-insights/custom-applications/{id}"}}