> For the complete documentation index, see [llms.txt](https://docs.usepylon.com/pylon-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.usepylon.com/pylon-docs/developer/api/api-reference/feature-requests.md).

# Feature Requests

## Search or list feature requests

> Returns feature requests matching the given criteria. Supports semantic search, status filtering, and pagination.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"SearchFeatureRequestsRequest":{"properties":{"account_ids":{"description":"Filter by one or more account IDs. Returns only feature requests with evidence linked to any of the given accounts.","items":{"type":"string"},"type":"array"},"limit":{"description":"The maximum number of feature requests to return. Defaults to 100, max 1000.","format":"int64","type":"integer"},"query":{"description":"A search query string for semantic and keyword matching. If omitted, all feature requests are returned (subject to other filters and limit).","type":"string"},"request_statuses":{"description":"Filter by one or more request statuses. Each value can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","items":{"type":"string"},"type":"array"}},"type":"object"},"SearchFeatureRequestsResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/FeatureRequestSearchResult"},"type":"array"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequestSearchResult":{"properties":{"account_ids":{"description":"IDs of customer accounts that have requested this feature, resolved via the evidence chain.","items":{"type":"string"},"nullable":true,"type":"array"},"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"SearchFeatureRequestsResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFeatureRequestsResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/search":{"post":{"description":"Returns feature requests matching the given criteria. Supports semantic search, status filtering, and pagination.\n\n**Rate limit:** 120 requests per minute","operationId":"SearchFeatureRequests","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchFeatureRequestsRequest"}}}},"responses":{"200":{"$ref":"#/components/responses/SearchFeatureRequestsResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Search or list feature requests","tags":["feature-requests"]}}}}
```

## Update a feature request

> Updates an existing feature request. Only provided fields are modified.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"UpdateFeatureRequestRequestBody":{"properties":{"custom_fields":{"description":"An array of custom fields to set. Only passed-in fields will be modified.","items":{"$ref":"#/components/schemas/CustomFieldValue"},"type":"array"},"request_status":{"description":"The new request status. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"}},"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"UpdateFeatureRequestResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"UpdateFeatureRequestResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeatureRequestResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/{id}":{"patch":{"description":"Updates an existing feature request. Only provided fields are modified.\n\n**Rate limit:** 120 requests per minute","operationId":"UpdateFeatureRequest","parameters":[{"description":"The ID of the feature request to update.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFeatureRequestRequestBody"}}}},"responses":{"200":{"$ref":"#/components/responses/UpdateFeatureRequestResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Update a feature request","tags":["feature-requests"]}}}}
```

## Link a customer account to a feature request

> Creates a manual evidence record linking a customer account to a feature request. Repeated requests create separate evidence records.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"CreateFeatureRequestEvidenceRequestBody":{"properties":{"account_id":{"description":"The ID of the customer account to link to the feature request.","type":"string"},"summary":{"default":"Account manually linked via API.","description":"A summary explaining why this account is linked. Defaults to \"Account manually linked via API.\"","type":"string"}},"required":["account_id"],"type":"object"},"CreateFeatureRequestEvidenceResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"CreateFeatureRequestEvidenceResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestEvidenceResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/{id}/evidence":{"post":{"description":"Creates a manual evidence record linking a customer account to a feature request. Repeated requests create separate evidence records.\n\n**Rate limit:** 120 requests per minute","operationId":"CreateFeatureRequestEvidence","parameters":[{"description":"The ID of the feature request.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestEvidenceRequestBody"}}},"required":true},"responses":{"200":{"$ref":"#/components/responses/CreateFeatureRequestEvidenceResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Link a customer account to a feature request","tags":["feature-requests"]}}}}
```

## Delete a feature request

> Permanently deletes a feature request and its associated evidence.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"responses":{"DeleteFeatureRequestResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteFeatureRequestResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}},"schemas":{"DeleteFeatureRequestResponseBody":{"properties":{"request_id":{"type":"string"}},"required":["request_id"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}}},"paths":{"/feature-requests/{id}":{"delete":{"description":"Permanently deletes a feature request and its associated evidence.\n\n**Rate limit:** 120 requests per minute","operationId":"DeleteFeatureRequest","parameters":[{"description":"The ID of the feature request to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"$ref":"#/components/responses/DeleteFeatureRequestResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Delete a feature request","tags":["feature-requests"]}}}}
```

## Get a feature request by ID

> Returns a single feature request by ID. Optionally includes evidence items when fetch\_evidence is true.\
> \
> \*\*Rate limit:\*\* 300 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"responses":{"GetFeatureRequestResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFeatureRequestResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}},"schemas":{"GetFeatureRequestResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}}},"paths":{"/feature-requests/{id}":{"get":{"description":"Returns a single feature request by ID. Optionally includes evidence items when fetch_evidence is true.\n\n**Rate limit:** 300 requests per minute","operationId":"GetFeatureRequest","parameters":[{"description":"The ID of the feature request to fetch.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Whether to include evidence items in the response. Defaults to false.","in":"query","name":"fetch_evidence","schema":{"type":"boolean"}}],"responses":{"200":{"$ref":"#/components/responses/GetFeatureRequestResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Get a feature request by ID","tags":["feature-requests"]}}}}
```

## Create a feature request

> Creates a new feature request. When should\_auto\_fetch\_evidence is true, supporting evidence is automatically gathered and used to generate the description.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"CreateFeatureRequestRequest":{"properties":{"description":{"description":"The description of the feature request. Ignored when should_auto_fetch_evidence is true, since the description is then generated from gathered evidence.","type":"string"},"should_auto_fetch_evidence":{"description":"When true, asynchronously gathers supporting evidence and generates a description, mirroring the in-app experience. Defaults to false, which creates the feature request as-is.","type":"boolean"},"title":{"description":"The title of the feature request.","type":"string"}},"required":["title"],"type":"object"},"CreateFeatureRequestResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"CreateFeatureRequestResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests":{"post":{"description":"Creates a new feature request. When should_auto_fetch_evidence is true, supporting evidence is automatically gathered and used to generate the description.\n\n**Rate limit:** 120 requests per minute","operationId":"CreateFeatureRequest","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestRequest"}}}},"responses":{"200":{"$ref":"#/components/responses/CreateFeatureRequestResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Create a feature request","tags":["feature-requests"]}}}}
```

## Set portal visibility for a feature request

> Toggles portal visibility for a set of accounts on a feature request. Idempotent — adding already-visible accounts or removing already-hidden accounts is a no-op. Note: visibility only takes effect when the Feature Requests tab is enabled in portal settings.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"SetFeatureRequestPortalVisibilityRequestBody":{"properties":{"account_ids":{"description":"The account IDs to add or remove portal visibility for.","items":{"type":"string"},"type":"array"},"visible":{"description":"Whether the specified accounts should be able to see this feature request in the portal. True to add visibility, false to remove.","type":"boolean"}},"required":["account_ids","visible"],"type":"object"},"SetFeatureRequestPortalVisibilityResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"SetFeatureRequestPortalVisibilityResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFeatureRequestPortalVisibilityResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/{id}/set-portal-visibility":{"post":{"description":"Toggles portal visibility for a set of accounts on a feature request. Idempotent — adding already-visible accounts or removing already-hidden accounts is a no-op. Note: visibility only takes effect when the Feature Requests tab is enabled in portal settings.\n\n**Rate limit:** 120 requests per minute","operationId":"SetFeatureRequestPortalVisibility","parameters":[{"description":"The ID of the feature request.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFeatureRequestPortalVisibilityRequestBody"}}}},"responses":{"200":{"$ref":"#/components/responses/SetFeatureRequestPortalVisibilityResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Set portal visibility for a feature request","tags":["feature-requests"]}}}}
```

## Merge feature requests

> Merges one or more feature requests into a surviving feature request. Evidence and linked external issues are consolidated, and merged feature requests are archived. Merge requests that share a target should be sent serially.\
> \
> \*\*Rate limit:\*\* 30 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"MergeFeatureRequestsRequest":{"properties":{"merge_feature_request_ids":{"description":"The IDs of the Feature Requests to merge into the surviving Feature Request. Must contain between 1 and 100 unique IDs.","items":{"type":"string"},"type":"array"},"merge_into_feature_request_id":{"description":"The ID of the Feature Request that will survive the merge.","type":"string"}},"required":["merge_into_feature_request_id","merge_feature_request_ids"],"type":"object"},"MergeFeatureRequestsResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"MergeFeatureRequestsResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeFeatureRequestsResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/merge":{"post":{"description":"Merges one or more feature requests into a surviving feature request. Evidence and linked external issues are consolidated, and merged feature requests are archived. Merge requests that share a target should be sent serially.\n\n**Rate limit:** 30 requests per minute","operationId":"MergeFeatureRequests","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeFeatureRequestsRequest"}}},"required":true},"responses":{"200":{"$ref":"#/components/responses/MergeFeatureRequestsResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Merge feature requests","tags":["feature-requests"]}}}}
```

## Link a customer account to a feature request

> Creates a manual evidence record linking a customer account to a feature request. Repeated requests create separate evidence records.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"CreateFeatureRequestEvidenceRequestBody":{"properties":{"account_id":{"description":"The ID of the customer account to link to the feature request.","type":"string"},"summary":{"default":"Account manually linked via API.","description":"A summary explaining why this account is linked. Defaults to \"Account manually linked via API.\"","type":"string"}},"required":["account_id"],"type":"object"},"CreateFeatureRequestEvidenceResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"request_id":{"type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"CreateFeatureRequestEvidenceResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestEvidenceResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/{id}/evidence":{"post":{"description":"Creates a manual evidence record linking a customer account to a feature request. Repeated requests create separate evidence records.\n\n**Rate limit:** 120 requests per minute","operationId":"CreateFeatureRequestEvidence","parameters":[{"description":"The ID of the feature request.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFeatureRequestEvidenceRequestBody"}}},"required":true},"responses":{"200":{"$ref":"#/components/responses/CreateFeatureRequestEvidenceResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Link a customer account to a feature request","tags":["feature-requests"]}}}}
```

## Link or unlink an external issue to/from a feature request

> By default, links the external issue and creates a backlink to the feature request in the source system. To unlink it, set the operation field to "unlink". Repeating the same link request is a successful no-op.\
> \
> \*\*Rate limit:\*\* 120 requests per minute

```json
{"openapi":"3.0.3","info":{"title":"Pylon API.","version":"1.0.0"},"tags":[],"servers":[{"description":"US region","url":"https://api.usepylon.com"},{"description":"EU region","url":"https://api.eu.usepylon.com"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"description":"Authorization: Bearer <token>","scheme":"bearer","type":"http"}},"schemas":{"LinkFeatureRequestExternalIssueRequestBody":{"properties":{"external_issue_id":{"description":"The ID or human-readable key of the external issue in the source system.","type":"string"},"operation":{"description":"Operation to perform. Use \"link\" to link the issue (default) or \"unlink\" to unlink it.","type":"string"},"source":{"description":"The source system of the external issue (e.g., \"linear\", \"asana\", \"jira\", \"github\", \"shortcut\").","type":"string"}},"required":["source","external_issue_id"],"type":"object"},"LinkFeatureRequestExternalIssueResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/FeatureRequest"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["data","request_id"],"type":"object"},"FeatureRequest":{"properties":{"created_at":{"description":"The time the feature request was created (RFC3339).","format":"date-time","type":"string"},"custom_fields":{"additionalProperties":{"$ref":"#/components/schemas/CustomFieldValue"},"description":"Custom field values associated with the feature request, keyed by custom field slug.","nullable":true,"type":"object"},"description":{"description":"The description of the feature request.","type":"string"},"evidence":{"description":"Evidence items linked to this feature request. Only populated when fetch_evidence=true.","items":{"$ref":"#/components/schemas/FeatureRequestEvidence"},"type":"array"},"evidence_count":{"description":"The number of evidence items (excluding irrelevant) linked to this feature request.","format":"int64","type":"integer"},"external_issues":{"description":"The external product issues associated with the feature request, if any.","items":{"$ref":"#/components/schemas/ExternalIssue"},"type":"array"},"id":{"description":"The ID of the feature request.","type":"string"},"portal_visible_to_account_ids":{"description":"Account IDs that can see this feature request in the customer portal. Empty means hidden from all accounts. Only takes effect when the Feature Requests tab is enabled in portal settings.","items":{"type":"string"},"nullable":true,"type":"array"},"request_status":{"description":"The status of the feature request. Can be a built-in status (new, in_progress, closed, archived) or a custom status slug.","type":"string"},"title":{"description":"The title of the feature request.","type":"string"},"updated_at":{"description":"The time the feature request was last updated (RFC3339).","format":"date-time","type":"string"}},"required":["created_at","description","evidence_count","id","title","updated_at"],"type":"object"},"CustomFieldValue":{"description":"A custom field value to set. Custom fields not listed in a write request are left unchanged.","properties":{"slug":{"description":"The slug of the custom field.","type":"string"},"value":{"description":"The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.","type":"string"},"values":{"description":"The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). Replaces the full selection; it does not add to or remove from the existing values. If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.","items":{"type":"string"},"type":"array"}},"title":"CustomFieldValue","type":"object"},"FeatureRequestEvidence":{"properties":{"account_id":{"description":"The ID of the customer account that submitted this evidence (e.g. the account whose issue or call recording is linked), if available.","type":"string"},"created_at":{"description":"The time when the evidence was created, in RFC 3339 format.","format":"date-time","type":"string"},"external_url":{"description":"The URL of the evidence in the external system (e.g. Fathom, Gong). Only included for call recording evidence when the value is known; omitted for other evidence sources.","type":"string"},"id":{"description":"The ID of the evidence record.","type":"string"},"source_id":{"description":"The ID of the linked issue. Only present for issue evidence.","type":"string"},"source_type":{"description":"The source type of the evidence (e.g. 'issue', 'call_recording', 'survey_response', 'manual').","type":"string"},"summary":{"description":"A summary of why this evidence supports the feature request.","type":"string"}},"required":["created_at","id","source_type"],"type":"object"},"ExternalIssue":{"properties":{"external_id":{"description":"The external ID of the external issue.\nJira: ID of the issue (autoincrementing number from 10000).\nGitHub: Owner/Repo/IssueID.\nLinear: ID of the issue (UUID).\nAsana: ID of the task (Long number).","type":"string"},"link":{"description":"Link to the product issue.","type":"string"},"source":{"description":"The source of the external issue.","type":"string"}},"required":["external_id","link","source"],"type":"object"},"ErrorApiResponseBody":{"properties":{"code":{"description":"A stable machine-readable identifier for this failure, safe to branch on\ninstead of the message text. Omitted when the failure has no assigned code.\n\nKnown values: `recipients_suppressed`, `email_bounced`, `internal_issue_reply_not_allowed`, `duplicate_object`, `invalid_authorization_header`, `invalid_api_token`, `invalid_oauth_token`, `wrong_region_token`, `organization_deactivated`, `organization_suspended`, `permission_denied`, `oauth_not_permitted`, `rate_limited`, `not_found`, `method_not_allowed`, `payload_too_large`, `invalid_request_body`, `internal_error`, `invalid_webhook_credentials`, `organization_inactive`. This list is not exhaustive.","type":"string"},"errors":{"description":"The list of errors.","items":{"type":"string"},"type":"array"},"exists_id":{"description":"The ID of the object that already exists if this is a duplicate object error.","type":"string"},"request_id":{"description":"The request ID for tracking.","type":"string"}},"required":["request_id"],"type":"object"}},"responses":{"LinkFeatureRequestExternalIssueResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkFeatureRequestExternalIssueResponseBody"}}},"description":""},"BadRequestApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request was invalid or could not be completed."},"UnauthorizedApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request could not be authenticated for this API."},"ForbiddenApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The authenticated caller or organization is not allowed to access this endpoint or operation."},"ErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":""},"TooManyRequestsApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"The request exceeded the applicable rate limit.","headers":{"Retry-After":{"description":"Seconds until the next request to this endpoint is permitted.","schema":{"format":"int64","type":"integer"}},"X-Retry-After":{"description":"Seconds until the full per-minute allowance is restored. Capacity returns gradually before then.","schema":{"format":"int64","type":"integer"}}}},"InternalServerErrorApiResponse":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorApiResponseBody"}}},"description":"An unexpected internal error occurred."}}},"paths":{"/feature-requests/{id}/external-issues":{"post":{"description":"By default, links the external issue and creates a backlink to the feature request in the source system. To unlink it, set the operation field to \"unlink\". Repeating the same link request is a successful no-op.\n\n**Rate limit:** 120 requests per minute","operationId":"LinkFeatureRequestExternalIssue","parameters":[{"description":"The ID of the feature request to link an external issue to.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkFeatureRequestExternalIssueRequestBody"}}}},"responses":{"200":{"$ref":"#/components/responses/LinkFeatureRequestExternalIssueResponse"},"400":{"$ref":"#/components/responses/BadRequestApiResponse"},"401":{"$ref":"#/components/responses/UnauthorizedApiResponse"},"403":{"$ref":"#/components/responses/ForbiddenApiResponse"},"404":{"$ref":"#/components/responses/ErrorApiResponse"},"429":{"$ref":"#/components/responses/TooManyRequestsApiResponse"},"500":{"$ref":"#/components/responses/InternalServerErrorApiResponse"}},"summary":"Link or unlink an external issue to/from a feature request","tags":["feature-requests"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.usepylon.com/pylon-docs/developer/api/api-reference/feature-requests.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
