diff --git a/openapi-raw.yaml b/openapi-raw.yaml index 132929285..7e06eae17 100644 --- a/openapi-raw.yaml +++ b/openapi-raw.yaml @@ -929,6 +929,47 @@ paths: seo: title: '_t__ApiAppList::SEO::TITLE' description: '_t__ApiAppList::SEO::DESCRIPTION' + /notification/retry: + post: + tags: + - 'Callbacks and Events' + summary: 'Resend an API notification asynchronously.' + description: 'Queues an API notification by event_type and id. A new notification event is generated from current object state.' + operationId: apiNotificationRetry + responses: + '202': + description: 'Resend queued' + 4XX: + description: failed_operation + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + examples: + 400_example: + $ref: '#/components/examples/Error400Response' + 401_example: + $ref: '#/components/examples/Error401Response' + 402_example: + $ref: '#/components/examples/Error402Response' + 403_example: + $ref: '#/components/examples/Error403Response' + 429_example: + $ref: '#/components/examples/Error429Response' + 404_example: + $ref: '#/components/examples/Error404Response' + 4XX_example: + $ref: '#/components/examples/Error4XXResponse' + security: + - + api_key: [] + - + oauth2: + - request_signature + - signature_request_access + x-hideOn: + - doc + - sdk '/bulk_send_job/{bulk_send_job_id}': get: tags: @@ -5026,6 +5067,8 @@ paths: $ref: '#/components/examples/Error429Response' 404_example: $ref: '#/components/examples/Error404Response' + 409_example: + $ref: '#/components/examples/Error409Response' 4XX_example: $ref: '#/components/examples/Error4XXResponse' security: @@ -13928,3 +13971,241 @@ x-webhooks: responses: '200': $ref: '#/components/responses/EventCallbackResponse' +x-error-codes: + bad_request: + http_status: 400 + summary: '_t__ErrorCatalog::bad_request::SUMMARY' + cause: '_t__ErrorCatalog::bad_request::CAUSE' + remediation: '_t__ErrorCatalog::bad_request::REMEDIATION' + retryable: 'no' + unauthorized: + http_status: 401 + summary: '_t__ErrorCatalog::unauthorized::SUMMARY' + cause: '_t__ErrorCatalog::unauthorized::CAUSE' + remediation: '_t__ErrorCatalog::unauthorized::REMEDIATION' + retryable: 'no' + payment_required: + http_status: 402 + summary: '_t__ErrorCatalog::payment_required::SUMMARY' + cause: '_t__ErrorCatalog::payment_required::CAUSE' + remediation: '_t__ErrorCatalog::payment_required::REMEDIATION' + retryable: 'no' + forbidden: + http_status: 403 + summary: '_t__ErrorCatalog::forbidden::SUMMARY' + cause: '_t__ErrorCatalog::forbidden::CAUSE' + remediation: '_t__ErrorCatalog::forbidden::REMEDIATION' + retryable: 'no' + not_found: + http_status: 404 + summary: '_t__ErrorCatalog::not_found::SUMMARY' + cause: '_t__ErrorCatalog::not_found::CAUSE' + remediation: '_t__ErrorCatalog::not_found::REMEDIATION' + retryable: 'no' + conflict: + http_status: 409 + summary: '_t__ErrorCatalog::conflict::SUMMARY' + cause: '_t__ErrorCatalog::conflict::CAUSE' + remediation: '_t__ErrorCatalog::conflict::REMEDIATION' + retryable: conditional + exceeded_rate: + http_status: 429 + summary: '_t__ErrorCatalog::exceeded_rate::SUMMARY' + cause: '_t__ErrorCatalog::exceeded_rate::CAUSE' + remediation: '_t__ErrorCatalog::exceeded_rate::REMEDIATION' + retryable: 'yes' + backoff: '_t__ErrorCatalog::exceeded_rate::BACKOFF' + unknown: + http_status: 500 + summary: '_t__ErrorCatalog::unknown::SUMMARY' + cause: '_t__ErrorCatalog::unknown::CAUSE' + remediation: '_t__ErrorCatalog::unknown::REMEDIATION' + retryable: conditional + backoff: '_t__ErrorCatalog::unknown::BACKOFF' + team_invite_failed: + http_status: 403 + summary: '_t__ErrorCatalog::team_invite_failed::SUMMARY' + cause: '_t__ErrorCatalog::team_invite_failed::CAUSE' + remediation: '_t__ErrorCatalog::team_invite_failed::REMEDIATION' + retryable: 'no' + max_faxes: + http_status: 429 + summary: '_t__ErrorCatalog::max_faxes::SUMMARY' + cause: '_t__ErrorCatalog::max_faxes::CAUSE' + remediation: '_t__ErrorCatalog::max_faxes::REMEDIATION' + retryable: 'yes' + backoff: '_t__ErrorCatalog::max_faxes::BACKOFF' + invalid_recipient: + http_status: 400 + summary: '_t__ErrorCatalog::invalid_recipient::SUMMARY' + cause: '_t__ErrorCatalog::invalid_recipient::CAUSE' + remediation: '_t__ErrorCatalog::invalid_recipient::REMEDIATION' + retryable: 'no' + signature_request_cancel_failed: + http_status: 400 + summary: '_t__ErrorCatalog::signature_request_cancel_failed::SUMMARY' + cause: '_t__ErrorCatalog::signature_request_cancel_failed::CAUSE' + remediation: '_t__ErrorCatalog::signature_request_cancel_failed::REMEDIATION' + retryable: 'no' + signature_request_remove_failed: + http_status: 400 + summary: '_t__ErrorCatalog::signature_request_remove_failed::SUMMARY' + cause: '_t__ErrorCatalog::signature_request_remove_failed::CAUSE' + remediation: '_t__ErrorCatalog::signature_request_remove_failed::REMEDIATION' + retryable: 'no' + maintenance: + http_status: 503 + summary: '_t__ErrorCatalog::maintenance::SUMMARY' + cause: '_t__ErrorCatalog::maintenance::CAUSE' + remediation: '_t__ErrorCatalog::maintenance::REMEDIATION' + retryable: 'yes' + backoff: '_t__ErrorCatalog::maintenance::BACKOFF' + method_not_supported: + http_status: 405 + summary: '_t__ErrorCatalog::method_not_supported::SUMMARY' + cause: '_t__ErrorCatalog::method_not_supported::CAUSE' + remediation: '_t__ErrorCatalog::method_not_supported::REMEDIATION' + retryable: 'no' + invalid_reminder: + http_status: 400 + summary: '_t__ErrorCatalog::invalid_reminder::SUMMARY' + cause: '_t__ErrorCatalog::invalid_reminder::CAUSE' + remediation: '_t__ErrorCatalog::invalid_reminder::REMEDIATION' + retryable: 'no' + unavailable: + http_status: 503 + summary: '_t__ErrorCatalog::unavailable::SUMMARY' + cause: '_t__ErrorCatalog::unavailable::CAUSE' + remediation: '_t__ErrorCatalog::unavailable::REMEDIATION' + retryable: 'yes' + backoff: '_t__ErrorCatalog::unavailable::BACKOFF' + unprocessable_entity: + http_status: 422 + summary: '_t__ErrorCatalog::unprocessable_entity::SUMMARY' + cause: '_t__ErrorCatalog::unprocessable_entity::CAUSE' + remediation: '_t__ErrorCatalog::unprocessable_entity::REMEDIATION' + retryable: conditional + backoff: '_t__ErrorCatalog::unprocessable_entity::BACKOFF' + signature_request_expired: + http_status: + - 400 + - 403 + summary: '_t__ErrorCatalog::signature_request_expired::SUMMARY' + cause: '_t__ErrorCatalog::signature_request_expired::CAUSE' + remediation: '_t__ErrorCatalog::signature_request_expired::REMEDIATION' + retryable: 'no' + deleted: + http_status: 410 + summary: '_t__ErrorCatalog::deleted::SUMMARY' + cause: '_t__ErrorCatalog::deleted::CAUSE' + remediation: '_t__ErrorCatalog::deleted::REMEDIATION' + retryable: 'no' +x-oauth-error-codes: + invalid_grant: + http_status: + - 400 + - 401 + summary: '_t__OAuthErrorCatalog::invalid_grant::SUMMARY' + cause: '_t__OAuthErrorCatalog::invalid_grant::CAUSE' + remediation: '_t__OAuthErrorCatalog::invalid_grant::REMEDIATION' + retryable: 'no' + invalid_client: + http_status: 400 + summary: '_t__OAuthErrorCatalog::invalid_client::SUMMARY' + cause: '_t__OAuthErrorCatalog::invalid_client::CAUSE' + remediation: '_t__OAuthErrorCatalog::invalid_client::REMEDIATION' + retryable: 'no' + invalid_request: + http_status: 400 + summary: '_t__OAuthErrorCatalog::invalid_request::SUMMARY' + cause: '_t__OAuthErrorCatalog::invalid_request::CAUSE' + remediation: '_t__OAuthErrorCatalog::invalid_request::REMEDIATION' + retryable: 'no' + unauthorized_client: + http_status: + - 401 + - 403 + summary: '_t__OAuthErrorCatalog::unauthorized_client::SUMMARY' + cause: '_t__OAuthErrorCatalog::unauthorized_client::CAUSE' + remediation: '_t__OAuthErrorCatalog::unauthorized_client::REMEDIATION' + retryable: 'no' + unsupported_grant_type: + http_status: 400 + summary: '_t__OAuthErrorCatalog::unsupported_grant_type::SUMMARY' + cause: '_t__OAuthErrorCatalog::unsupported_grant_type::CAUSE' + remediation: '_t__OAuthErrorCatalog::unsupported_grant_type::REMEDIATION' + retryable: 'no' + payment_required: + http_status: 402 + summary: '_t__OAuthErrorCatalog::payment_required::SUMMARY' + cause: '_t__OAuthErrorCatalog::payment_required::CAUSE' + remediation: '_t__OAuthErrorCatalog::payment_required::REMEDIATION' + retryable: 'no' + addon_required: + http_status: 402 + summary: '_t__OAuthErrorCatalog::addon_required::SUMMARY' + cause: '_t__OAuthErrorCatalog::addon_required::CAUSE' + remediation: '_t__OAuthErrorCatalog::addon_required::REMEDIATION' + retryable: 'no' + invalid_scope: + http_status: 400 + summary: '_t__OAuthErrorCatalog::invalid_scope::SUMMARY' + cause: '_t__OAuthErrorCatalog::invalid_scope::CAUSE' + remediation: '_t__OAuthErrorCatalog::invalid_scope::REMEDIATION' + retryable: 'no' + quota_reached: + http_status: 402 + summary: '_t__OAuthErrorCatalog::quota_reached::SUMMARY' + cause: '_t__OAuthErrorCatalog::quota_reached::CAUSE' + remediation: '_t__OAuthErrorCatalog::quota_reached::REMEDIATION' + retryable: 'no' + server_error: + http_status: 500 + summary: '_t__OAuthErrorCatalog::server_error::SUMMARY' + cause: '_t__OAuthErrorCatalog::server_error::CAUSE' + remediation: '_t__OAuthErrorCatalog::server_error::REMEDIATION' + retryable: 'yes' + backoff: '_t__OAuthErrorCatalog::server_error::BACKOFF' + temporary_unavailable: + http_status: 503 + summary: '_t__OAuthErrorCatalog::temporary_unavailable::SUMMARY' + cause: '_t__OAuthErrorCatalog::temporary_unavailable::CAUSE' + remediation: '_t__OAuthErrorCatalog::temporary_unavailable::REMEDIATION' + retryable: 'yes' + backoff: '_t__OAuthErrorCatalog::temporary_unavailable::BACKOFF' +x-error-events: + signature_request_invalid: + event_type: signature_request_invalid + delivery: webhook + summary: '_t__ErrorEventCatalog::signature_request_invalid::SUMMARY' + cause: '_t__ErrorEventCatalog::signature_request_invalid::CAUSE' + remediation: '_t__ErrorEventCatalog::signature_request_invalid::REMEDIATION' + retryable: conditional + unknown_error: + event_type: unknown_error + delivery: webhook + summary: '_t__ErrorEventCatalog::unknown_error::SUMMARY' + cause: '_t__ErrorEventCatalog::unknown_error::CAUSE' + remediation: '_t__ErrorEventCatalog::unknown_error::REMEDIATION' + retryable: conditional + file_error: + event_type: file_error + delivery: webhook + summary: '_t__ErrorEventCatalog::file_error::SUMMARY' + cause: '_t__ErrorEventCatalog::file_error::CAUSE' + remediation: '_t__ErrorEventCatalog::file_error::REMEDIATION' + retryable: conditional + template_error: + event_type: template_error + delivery: webhook + summary: '_t__ErrorEventCatalog::template_error::SUMMARY' + cause: '_t__ErrorEventCatalog::template_error::CAUSE' + remediation: '_t__ErrorEventCatalog::template_error::REMEDIATION' + retryable: conditional + sign_url_invalid: + event_type: sign_url_invalid + delivery: webhook + summary: '_t__ErrorEventCatalog::sign_url_invalid::SUMMARY' + cause: '_t__ErrorEventCatalog::sign_url_invalid::CAUSE' + remediation: '_t__ErrorEventCatalog::sign_url_invalid::REMEDIATION' + retryable: 'yes' diff --git a/openapi-sdk.yaml b/openapi-sdk.yaml index ed174d3ca..ca3f70444 100644 --- a/openapi-sdk.yaml +++ b/openapi-sdk.yaml @@ -5087,6 +5087,8 @@ paths: $ref: '#/components/examples/Error429Response' 404_example: $ref: '#/components/examples/Error404Response' + 409_example: + $ref: '#/components/examples/Error409Response' 4XX_example: $ref: '#/components/examples/Error4XXResponse' security: @@ -11943,7 +11945,7 @@ components: description: 'Path at which an error occurred.' type: string error_name: - description: 'Name of the error.' + description: 'Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance.' type: string type: object FaxResponse: @@ -14507,3 +14509,241 @@ x-webhooks: responses: 200: $ref: '#/components/responses/EventCallbackResponse' +x-error-codes: + bad_request: + http_status: 400 + summary: 'The request contained invalid or malformed parameters.' + cause: 'A parameter failed validation, or the request body was malformed.' + remediation: 'Inspect error_msg and error_path, correct the offending parameter, and resend.' + retryable: 'no' + unauthorized: + http_status: 401 + summary: 'The credentials supplied are missing or invalid.' + cause: 'Missing, malformed, or invalid API key or OAuth access token.' + remediation: 'Verify the API key or OAuth token and the Authorization header, then retry.' + retryable: 'no' + payment_required: + http_status: 402 + summary: 'The account must be credited or upgraded to perform this action.' + cause: 'The action requires a paid plan, additional quota, or API credits.' + remediation: 'Upgrade the plan or add the required credits/quota, then retry.' + retryable: 'no' + forbidden: + http_status: 403 + summary: 'The action is not allowed for these credentials or in the current context.' + cause: 'The authenticated account lacks access to the resource or operation.' + remediation: 'Confirm the account has access to the resource and the required permissions.' + retryable: 'no' + not_found: + http_status: 404 + summary: 'Nothing matches the requested resource.' + cause: 'The resource id does not exist or is not visible to this account.' + remediation: 'Verify the id and that the resource belongs to the authenticated account.' + retryable: 'no' + conflict: + http_status: 409 + summary: 'The request was well-formed but conflicts with the current state.' + cause: 'The target resource is in a state incompatible with the request (e.g. a signature request is still being set up).' + remediation: 'Wait briefly and retry, or listen for a callback event confirming the resource is ready.' + retryable: conditional + exceeded_rate: + http_status: 429 + summary: 'Your account''s API request rate limit has been exceeded.' + cause: 'Too many requests were sent within the rate-limit window for this request type.' + remediation: 'Pace requests using the X-RateLimit-* response headers and retry after the window resets.' + retryable: 'yes' + backoff: 'Honor X-Ratelimit-Reset (Unix epoch); otherwise exponential backoff with jitter. No Retry-After header is sent.' + unknown: + http_status: 500 + summary: 'An unexpected error occurred.' + cause: 'An unhandled server-side error, or a status code without a more specific error_name.' + remediation: 'Retry transient failures; if it persists, contact support with the request details.' + retryable: conditional + backoff: 'For transient 5xx, retry with exponential backoff; otherwise do not retry.' + team_invite_failed: + http_status: 403 + summary: 'The team invitation could not be completed.' + cause: 'The invitee already belongs to a team, or the invite is otherwise not permitted.' + remediation: 'Confirm the invitee is not already on a team before inviting.' + retryable: 'no' + max_faxes: + http_status: 429 + summary: 'Too many fax transmissions are currently pending or transmitting.' + cause: 'The account has reached the limit of concurrent in-flight fax transmissions.' + remediation: 'Wait for outstanding transmissions to complete, then retry.' + retryable: 'yes' + backoff: 'Retry with exponential backoff once pending transmissions clear.' + invalid_recipient: + http_status: 400 + summary: 'The recipient (fax number or email address) is invalid.' + cause: 'A recipient value did not pass validation.' + remediation: 'Correct the recipient value and resend.' + retryable: 'no' + signature_request_cancel_failed: + http_status: 400 + summary: 'The signature request could not be cancelled.' + cause: 'The caller is not the requester, or the request is already fully executed/closed.' + remediation: 'Only the requester can cancel, and only before the request is fully executed.' + retryable: 'no' + signature_request_remove_failed: + http_status: 400 + summary: 'Access to the signature request could not be removed.' + cause: 'The signature request has not yet been fully executed, so access cannot be revoked.' + remediation: 'Wait until all parties have signed, or call /signature_request/cancel to cancel incomplete requests instead.' + retryable: 'no' + maintenance: + http_status: 503 + summary: 'The request could not be completed because the site is under maintenance.' + cause: 'The API is in a scheduled maintenance window.' + remediation: 'Retry once the maintenance window ends.' + retryable: 'yes' + backoff: 'Retry later with exponential backoff.' + method_not_supported: + http_status: 405 + summary: 'The HTTP method is not supported for this endpoint.' + cause: 'The request used a verb the endpoint does not accept.' + remediation: 'Use the HTTP method documented for the endpoint.' + retryable: 'no' + invalid_reminder: + http_status: 400 + summary: 'The signature request reminder was invalid.' + cause: 'A reminder was attempted against an ineligible request (e.g. embedded, closed, or expired).' + remediation: 'Only send reminders for eligible (non-embedded, open) signature requests.' + retryable: 'no' + unavailable: + http_status: 503 + summary: 'The service is temporarily unavailable.' + cause: 'A downstream dependency or the service itself is temporarily unavailable.' + remediation: 'Retry later with exponential backoff.' + retryable: 'yes' + backoff: 'Retry later with exponential backoff and jitter.' + unprocessable_entity: + http_status: 422 + summary: 'The request was understood but the target entity cannot be processed.' + cause: 'The resource is still being processed, or it is in an error state.' + remediation: 'If the resource is still processing, wait and retry; if it is in an error state, recreate/resend it instead of retrying.' + retryable: conditional + backoff: 'If still processing, retry with exponential backoff; if in an error state, do not retry.' + signature_request_expired: + http_status: + - 400 + - 403 + summary: 'The signature request has expired.' + cause: 'The operation targets a request whose expiration has passed. Most endpoints return 400; final-copy/download endpoints return 403.' + remediation: 'The request can no longer be acted upon; create a new signature request.' + retryable: 'no' + deleted: + http_status: 410 + summary: 'The request was cancelled or deleted.' + cause: 'The resource has been cancelled or removed and is no longer available.' + remediation: 'Do not retry; the resource is permanently gone.' + retryable: 'no' +x-oauth-error-codes: + invalid_grant: + http_status: + - 400 + - 401 + summary: 'The OAuth grant (authorization code or refresh token) is invalid or expired.' + cause: 'The code/token was already used, expired, or does not match the client.' + remediation: 'Re-initiate the OAuth flow to obtain a fresh authorization code.' + retryable: 'no' + invalid_client: + http_status: 400 + summary: 'The OAuth client credentials are invalid.' + cause: 'The client_id or client_secret is unrecognized or incorrect.' + remediation: 'Verify the client_id and client_secret from the API app settings.' + retryable: 'no' + invalid_request: + http_status: 400 + summary: 'The OAuth request is malformed or missing required parameters.' + cause: 'A required parameter is missing, or the request format is invalid.' + remediation: 'Check the request against the OAuth token endpoint documentation.' + retryable: 'no' + unauthorized_client: + http_status: + - 401 + - 403 + summary: 'The OAuth client is not authorized to perform this action.' + cause: 'The app has not been approved, or the action is outside the granted scopes.' + remediation: 'Ensure the app is approved and the required scopes are granted.' + retryable: 'no' + unsupported_grant_type: + http_status: 400 + summary: 'The grant type is not supported.' + cause: 'The grant_type parameter value is not recognized.' + remediation: 'Use authorization_code or refresh_token as the grant_type.' + retryable: 'no' + payment_required: + http_status: 402 + summary: 'The account requires a paid plan to use this OAuth app.' + cause: 'The authorizing account does not have a plan that supports this integration.' + remediation: 'Upgrade the account to a plan that includes OAuth app access.' + retryable: 'no' + addon_required: + http_status: 402 + summary: 'An add-on is required to use this OAuth app.' + cause: 'The account plan does not include the add-on needed for this integration.' + remediation: 'Add the required add-on to the account subscription.' + retryable: 'no' + invalid_scope: + http_status: 400 + summary: 'The requested OAuth scope is invalid.' + cause: 'The scope parameter contains values not permitted for the app.' + remediation: 'Request only scopes that the app is configured to use.' + retryable: 'no' + quota_reached: + http_status: 402 + summary: 'The account has reached its usage quota for this OAuth app.' + cause: 'The authorizing account has exhausted its quota for the integration.' + remediation: 'Contact the app owner or upgrade the account quota.' + retryable: 'no' + server_error: + http_status: 500 + summary: 'An internal server error occurred during OAuth processing.' + cause: 'An unexpected error on the server side while handling the OAuth request.' + remediation: 'Retry the request; if it persists, contact support.' + retryable: 'yes' + backoff: 'Retry with exponential backoff.' + temporary_unavailable: + http_status: 503 + summary: 'The OAuth service is temporarily unavailable.' + cause: 'The service is under maintenance or experiencing temporary issues.' + remediation: 'Retry after a short delay.' + retryable: 'yes' + backoff: 'Retry with exponential backoff.' +x-error-events: + signature_request_invalid: + event_type: signature_request_invalid + delivery: webhook + summary: 'Asynchronous error while processing a signature request.' + cause: 'A signature request could not be processed (e.g. invalid tags, fields, or merge data).' + remediation: 'Inspect event.event_metadata.event_message in the callback, correct the request, and resend.' + retryable: conditional + unknown_error: + event_type: unknown_error + delivery: webhook + summary: 'An unspecified asynchronous processing error occurred.' + cause: 'An unexpected error occurred while processing the request asynchronously.' + remediation: 'Check the request status in the API dashboard; retry or contact support if it persists.' + retryable: conditional + file_error: + event_type: file_error + delivery: webhook + summary: 'Asynchronous error while processing an uploaded file.' + cause: 'A file attached to a request could not be processed.' + remediation: 'Resend the request with a supported, non-corrupt file.' + retryable: conditional + template_error: + event_type: template_error + delivery: webhook + summary: 'Asynchronous error while creating a template.' + cause: 'Template file processing failed (e.g. unsupported or corrupt file).' + remediation: 'Recreate the template with a valid file; check status in the API dashboard.' + retryable: conditional + sign_url_invalid: + event_type: sign_url_invalid + delivery: webhook + summary: 'An embedded signing URL has expired or become invalid.' + cause: 'The embedded sign_url is no longer valid (e.g. expired).' + remediation: 'Generate a fresh embedded sign_url via the embedded sign URL endpoint.' + retryable: 'yes' diff --git a/openapi.yaml b/openapi.yaml index 41e64091d..e94b17b87 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -5087,6 +5087,8 @@ paths: $ref: '#/components/examples/Error429Response' 404_example: $ref: '#/components/examples/Error404Response' + 409_example: + $ref: '#/components/examples/Error409Response' 4XX_example: $ref: '#/components/examples/Error4XXResponse' security: @@ -11923,7 +11925,7 @@ components: description: 'Path at which an error occurred.' type: string error_name: - description: 'Name of the error.' + description: 'Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance.' type: string type: object FaxResponse: @@ -14542,3 +14544,241 @@ x-webhooks: responses: 200: $ref: '#/components/responses/EventCallbackResponse' +x-error-codes: + bad_request: + http_status: 400 + summary: 'The request contained invalid or malformed parameters.' + cause: 'A parameter failed validation, or the request body was malformed.' + remediation: 'Inspect error_msg and error_path, correct the offending parameter, and resend.' + retryable: 'no' + unauthorized: + http_status: 401 + summary: 'The credentials supplied are missing or invalid.' + cause: 'Missing, malformed, or invalid API key or OAuth access token.' + remediation: 'Verify the API key or OAuth token and the Authorization header, then retry.' + retryable: 'no' + payment_required: + http_status: 402 + summary: 'The account must be credited or upgraded to perform this action.' + cause: 'The action requires a paid plan, additional quota, or API credits.' + remediation: 'Upgrade the plan or add the required credits/quota, then retry.' + retryable: 'no' + forbidden: + http_status: 403 + summary: 'The action is not allowed for these credentials or in the current context.' + cause: 'The authenticated account lacks access to the resource or operation.' + remediation: 'Confirm the account has access to the resource and the required permissions.' + retryable: 'no' + not_found: + http_status: 404 + summary: 'Nothing matches the requested resource.' + cause: 'The resource id does not exist or is not visible to this account.' + remediation: 'Verify the id and that the resource belongs to the authenticated account.' + retryable: 'no' + conflict: + http_status: 409 + summary: 'The request was well-formed but conflicts with the current state.' + cause: 'The target resource is in a state incompatible with the request (e.g. a signature request is still being set up).' + remediation: 'Wait briefly and retry, or listen for a callback event confirming the resource is ready.' + retryable: conditional + exceeded_rate: + http_status: 429 + summary: 'Your account''s API request rate limit has been exceeded.' + cause: 'Too many requests were sent within the rate-limit window for this request type.' + remediation: 'Pace requests using the X-RateLimit-* response headers and retry after the window resets.' + retryable: 'yes' + backoff: 'Honor X-Ratelimit-Reset (Unix epoch); otherwise exponential backoff with jitter. No Retry-After header is sent.' + unknown: + http_status: 500 + summary: 'An unexpected error occurred.' + cause: 'An unhandled server-side error, or a status code without a more specific error_name.' + remediation: 'Retry transient failures; if it persists, contact support with the request details.' + retryable: conditional + backoff: 'For transient 5xx, retry with exponential backoff; otherwise do not retry.' + team_invite_failed: + http_status: 403 + summary: 'The team invitation could not be completed.' + cause: 'The invitee already belongs to a team, or the invite is otherwise not permitted.' + remediation: 'Confirm the invitee is not already on a team before inviting.' + retryable: 'no' + max_faxes: + http_status: 429 + summary: 'Too many fax transmissions are currently pending or transmitting.' + cause: 'The account has reached the limit of concurrent in-flight fax transmissions.' + remediation: 'Wait for outstanding transmissions to complete, then retry.' + retryable: 'yes' + backoff: 'Retry with exponential backoff once pending transmissions clear.' + invalid_recipient: + http_status: 400 + summary: 'The recipient (fax number or email address) is invalid.' + cause: 'A recipient value did not pass validation.' + remediation: 'Correct the recipient value and resend.' + retryable: 'no' + signature_request_cancel_failed: + http_status: 400 + summary: 'The signature request could not be cancelled.' + cause: 'The caller is not the requester, or the request is already fully executed/closed.' + remediation: 'Only the requester can cancel, and only before the request is fully executed.' + retryable: 'no' + signature_request_remove_failed: + http_status: 400 + summary: 'Access to the signature request could not be removed.' + cause: 'The signature request has not yet been fully executed, so access cannot be revoked.' + remediation: 'Wait until all parties have signed, or call /signature_request/cancel to cancel incomplete requests instead.' + retryable: 'no' + maintenance: + http_status: 503 + summary: 'The request could not be completed because the site is under maintenance.' + cause: 'The API is in a scheduled maintenance window.' + remediation: 'Retry once the maintenance window ends.' + retryable: 'yes' + backoff: 'Retry later with exponential backoff.' + method_not_supported: + http_status: 405 + summary: 'The HTTP method is not supported for this endpoint.' + cause: 'The request used a verb the endpoint does not accept.' + remediation: 'Use the HTTP method documented for the endpoint.' + retryable: 'no' + invalid_reminder: + http_status: 400 + summary: 'The signature request reminder was invalid.' + cause: 'A reminder was attempted against an ineligible request (e.g. embedded, closed, or expired).' + remediation: 'Only send reminders for eligible (non-embedded, open) signature requests.' + retryable: 'no' + unavailable: + http_status: 503 + summary: 'The service is temporarily unavailable.' + cause: 'A downstream dependency or the service itself is temporarily unavailable.' + remediation: 'Retry later with exponential backoff.' + retryable: 'yes' + backoff: 'Retry later with exponential backoff and jitter.' + unprocessable_entity: + http_status: 422 + summary: 'The request was understood but the target entity cannot be processed.' + cause: 'The resource is still being processed, or it is in an error state.' + remediation: 'If the resource is still processing, wait and retry; if it is in an error state, recreate/resend it instead of retrying.' + retryable: conditional + backoff: 'If still processing, retry with exponential backoff; if in an error state, do not retry.' + signature_request_expired: + http_status: + - 400 + - 403 + summary: 'The signature request has expired.' + cause: 'The operation targets a request whose expiration has passed. Most endpoints return 400; final-copy/download endpoints return 403.' + remediation: 'The request can no longer be acted upon; create a new signature request.' + retryable: 'no' + deleted: + http_status: 410 + summary: 'The request was cancelled or deleted.' + cause: 'The resource has been cancelled or removed and is no longer available.' + remediation: 'Do not retry; the resource is permanently gone.' + retryable: 'no' +x-oauth-error-codes: + invalid_grant: + http_status: + - 400 + - 401 + summary: 'The OAuth grant (authorization code or refresh token) is invalid or expired.' + cause: 'The code/token was already used, expired, or does not match the client.' + remediation: 'Re-initiate the OAuth flow to obtain a fresh authorization code.' + retryable: 'no' + invalid_client: + http_status: 400 + summary: 'The OAuth client credentials are invalid.' + cause: 'The client_id or client_secret is unrecognized or incorrect.' + remediation: 'Verify the client_id and client_secret from the API app settings.' + retryable: 'no' + invalid_request: + http_status: 400 + summary: 'The OAuth request is malformed or missing required parameters.' + cause: 'A required parameter is missing, or the request format is invalid.' + remediation: 'Check the request against the OAuth token endpoint documentation.' + retryable: 'no' + unauthorized_client: + http_status: + - 401 + - 403 + summary: 'The OAuth client is not authorized to perform this action.' + cause: 'The app has not been approved, or the action is outside the granted scopes.' + remediation: 'Ensure the app is approved and the required scopes are granted.' + retryable: 'no' + unsupported_grant_type: + http_status: 400 + summary: 'The grant type is not supported.' + cause: 'The grant_type parameter value is not recognized.' + remediation: 'Use authorization_code or refresh_token as the grant_type.' + retryable: 'no' + payment_required: + http_status: 402 + summary: 'The account requires a paid plan to use this OAuth app.' + cause: 'The authorizing account does not have a plan that supports this integration.' + remediation: 'Upgrade the account to a plan that includes OAuth app access.' + retryable: 'no' + addon_required: + http_status: 402 + summary: 'An add-on is required to use this OAuth app.' + cause: 'The account plan does not include the add-on needed for this integration.' + remediation: 'Add the required add-on to the account subscription.' + retryable: 'no' + invalid_scope: + http_status: 400 + summary: 'The requested OAuth scope is invalid.' + cause: 'The scope parameter contains values not permitted for the app.' + remediation: 'Request only scopes that the app is configured to use.' + retryable: 'no' + quota_reached: + http_status: 402 + summary: 'The account has reached its usage quota for this OAuth app.' + cause: 'The authorizing account has exhausted its quota for the integration.' + remediation: 'Contact the app owner or upgrade the account quota.' + retryable: 'no' + server_error: + http_status: 500 + summary: 'An internal server error occurred during OAuth processing.' + cause: 'An unexpected error on the server side while handling the OAuth request.' + remediation: 'Retry the request; if it persists, contact support.' + retryable: 'yes' + backoff: 'Retry with exponential backoff.' + temporary_unavailable: + http_status: 503 + summary: 'The OAuth service is temporarily unavailable.' + cause: 'The service is under maintenance or experiencing temporary issues.' + remediation: 'Retry after a short delay.' + retryable: 'yes' + backoff: 'Retry with exponential backoff.' +x-error-events: + signature_request_invalid: + event_type: signature_request_invalid + delivery: webhook + summary: 'Asynchronous error while processing a signature request.' + cause: 'A signature request could not be processed (e.g. invalid tags, fields, or merge data).' + remediation: 'Inspect event.event_metadata.event_message in the callback, correct the request, and resend.' + retryable: conditional + unknown_error: + event_type: unknown_error + delivery: webhook + summary: 'An unspecified asynchronous processing error occurred.' + cause: 'An unexpected error occurred while processing the request asynchronously.' + remediation: 'Check the request status in the API dashboard; retry or contact support if it persists.' + retryable: conditional + file_error: + event_type: file_error + delivery: webhook + summary: 'Asynchronous error while processing an uploaded file.' + cause: 'A file attached to a request could not be processed.' + remediation: 'Resend the request with a supported, non-corrupt file.' + retryable: conditional + template_error: + event_type: template_error + delivery: webhook + summary: 'Asynchronous error while creating a template.' + cause: 'Template file processing failed (e.g. unsupported or corrupt file).' + remediation: 'Recreate the template with a valid file; check status in the API dashboard.' + retryable: conditional + sign_url_invalid: + event_type: sign_url_invalid + delivery: webhook + summary: 'An embedded signing URL has expired or become invalid.' + cause: 'The embedded sign_url is no longer valid (e.g. expired).' + remediation: 'Generate a fresh embedded sign_url via the embedded sign URL endpoint.' + retryable: 'yes' diff --git a/sdks/dotnet/docs/ErrorResponseError.md b/sdks/dotnet/docs/ErrorResponseError.md index 13dacc1bf..17a09526f 100644 --- a/sdks/dotnet/docs/ErrorResponseError.md +++ b/sdks/dotnet/docs/ErrorResponseError.md @@ -5,7 +5,7 @@ Contains information about an error that occurred. Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**ErrorMsg** | **string** | Message describing an error. | **ErrorName** | **string** | Name of the error. | **ErrorPath** | **string** | Path at which an error occurred. | [optional] +**ErrorMsg** | **string** | Message describing an error. | **ErrorName** | **string** | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | **ErrorPath** | **string** | Path at which an error occurred. | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs b/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs index f1b9ca907..aace1465b 100644 --- a/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs +++ b/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs @@ -43,7 +43,7 @@ protected ErrorResponseError() { } /// /// Message describing an error. (required). /// Path at which an error occurred.. - /// Name of the error. (required). + /// Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. (required). public ErrorResponseError(string errorMsg = default(string), string errorPath = default(string), string errorName = default(string)) { @@ -86,9 +86,9 @@ public static ErrorResponseError Init(string jsonData) public string ErrorMsg { get; set; } /// - /// Name of the error. + /// Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. /// - /// Name of the error. + /// Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. [DataMember(Name = "error_name", IsRequired = true, EmitDefaultValue = true)] public string ErrorName { get; set; } diff --git a/sdks/java-v1/docs/ErrorResponseError.md b/sdks/java-v1/docs/ErrorResponseError.md index 656aa5c7f..9db1a2dd3 100644 --- a/sdks/java-v1/docs/ErrorResponseError.md +++ b/sdks/java-v1/docs/ErrorResponseError.md @@ -9,7 +9,7 @@ Contains information about an error that occurred. | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| | `errorMsg`*_required_ | ```String``` | Message describing an error. | | -| `errorName`*_required_ | ```String``` | Name of the error. | | +| `errorName`*_required_ | ```String``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `errorPath` | ```String``` | Path at which an error occurred. | | diff --git a/sdks/java-v1/src/main/java/com/dropbox/sign/model/ErrorResponseError.java b/sdks/java-v1/src/main/java/com/dropbox/sign/model/ErrorResponseError.java index e9624c65f..dfe621edd 100644 --- a/sdks/java-v1/src/main/java/com/dropbox/sign/model/ErrorResponseError.java +++ b/sdks/java-v1/src/main/java/com/dropbox/sign/model/ErrorResponseError.java @@ -88,7 +88,9 @@ public ErrorResponseError errorName(@javax.annotation.Nonnull String errorName) } /** - * Name of the error. + * Name of the error. See the `x-error-codes` catalog in openapi file for a complete + * list of possible error codes with detailed information including HTTP status codes, causes, + * remediation steps, and retry guidance. * * @return errorName */ diff --git a/sdks/java-v2/docs/ErrorResponseError.md b/sdks/java-v2/docs/ErrorResponseError.md index 656aa5c7f..9db1a2dd3 100644 --- a/sdks/java-v2/docs/ErrorResponseError.md +++ b/sdks/java-v2/docs/ErrorResponseError.md @@ -9,7 +9,7 @@ Contains information about an error that occurred. | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| | `errorMsg`*_required_ | ```String``` | Message describing an error. | | -| `errorName`*_required_ | ```String``` | Name of the error. | | +| `errorName`*_required_ | ```String``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `errorPath` | ```String``` | Path at which an error occurred. | | diff --git a/sdks/java-v2/src/main/java/com/dropbox/sign/model/ErrorResponseError.java b/sdks/java-v2/src/main/java/com/dropbox/sign/model/ErrorResponseError.java index af87ec4aa..9398b0489 100644 --- a/sdks/java-v2/src/main/java/com/dropbox/sign/model/ErrorResponseError.java +++ b/sdks/java-v2/src/main/java/com/dropbox/sign/model/ErrorResponseError.java @@ -101,7 +101,7 @@ public ErrorResponseError errorName(@jakarta.annotation.Nonnull String errorName } /** - * Name of the error. + * Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. * @return errorName */ @jakarta.annotation.Nonnull diff --git a/sdks/node/docs/model/ErrorResponseError.md b/sdks/node/docs/model/ErrorResponseError.md index 38ca84b82..d6f63922f 100644 --- a/sdks/node/docs/model/ErrorResponseError.md +++ b/sdks/node/docs/model/ErrorResponseError.md @@ -7,7 +7,7 @@ Contains information about an error that occurred. Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- | `errorMsg`*_required_ | ```string``` | Message describing an error. | | -| `errorName`*_required_ | ```string``` | Name of the error. | | +| `errorName`*_required_ | ```string``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `errorPath` | ```string``` | Path at which an error occurred. | | [[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md) diff --git a/sdks/node/model/errorResponseError.ts b/sdks/node/model/errorResponseError.ts index 577bb5dd5..a039029d6 100644 --- a/sdks/node/model/errorResponseError.ts +++ b/sdks/node/model/errorResponseError.ts @@ -33,7 +33,7 @@ export class ErrorResponseError { */ "errorMsg": string; /** - * Name of the error. + * Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. */ "errorName": string; /** diff --git a/sdks/php/docs/Model/ErrorResponseError.md b/sdks/php/docs/Model/ErrorResponseError.md index b600e94c8..09b0a2ac8 100644 --- a/sdks/php/docs/Model/ErrorResponseError.md +++ b/sdks/php/docs/Model/ErrorResponseError.md @@ -7,7 +7,7 @@ Contains information about an error that occurred. Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- | `error_msg`*_required_ | ```string``` | Message describing an error. | | -| `error_name`*_required_ | ```string``` | Name of the error. | | +| `error_name`*_required_ | ```string``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `error_path` | ```string``` | Path at which an error occurred. | | [[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md) diff --git a/sdks/php/src/Model/ErrorResponseError.php b/sdks/php/src/Model/ErrorResponseError.php index 65c09c1dc..527d8c0dc 100644 --- a/sdks/php/src/Model/ErrorResponseError.php +++ b/sdks/php/src/Model/ErrorResponseError.php @@ -358,7 +358,7 @@ public function getErrorName() /** * Sets error_name * - * @param string $error_name name of the error + * @param string $error_name Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. * * @return self */ diff --git a/sdks/python/docs/ErrorResponseError.md b/sdks/python/docs/ErrorResponseError.md index f6052d69f..3ed2233f1 100644 --- a/sdks/python/docs/ErrorResponseError.md +++ b/sdks/python/docs/ErrorResponseError.md @@ -6,7 +6,7 @@ Contains information about an error that occurred. Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- | `error_msg`*_required_ | ```str``` | Message describing an error. | | -| `error_name`*_required_ | ```str``` | Name of the error. | | +| `error_name`*_required_ | ```str``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `error_path` | ```str``` | Path at which an error occurred. | | [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/sdks/python/dropbox_sign/models/error_response_error.py b/sdks/python/dropbox_sign/models/error_response_error.py index 4f17bb6ee..8939b3297 100644 --- a/sdks/python/dropbox_sign/models/error_response_error.py +++ b/sdks/python/dropbox_sign/models/error_response_error.py @@ -32,7 +32,9 @@ class ErrorResponseError(BaseModel): """ # noqa: E501 error_msg: StrictStr = Field(description="Message describing an error.") - error_name: StrictStr = Field(description="Name of the error.") + error_name: StrictStr = Field( + description="Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance." + ) error_path: Optional[StrictStr] = Field( default=None, description="Path at which an error occurred." ) diff --git a/sdks/ruby/docs/ErrorResponseError.md b/sdks/ruby/docs/ErrorResponseError.md index e18e4037e..21ef5eb0c 100644 --- a/sdks/ruby/docs/ErrorResponseError.md +++ b/sdks/ruby/docs/ErrorResponseError.md @@ -7,6 +7,6 @@ Contains information about an error that occurred. | Name | Type | Description | Notes | | ---- | ---- | ----------- | ----- | | `error_msg`*_required_ | ```String``` | Message describing an error. | | -| `error_name`*_required_ | ```String``` | Name of the error. | | +| `error_name`*_required_ | ```String``` | Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. | | | `error_path` | ```String``` | Path at which an error occurred. | | diff --git a/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb b/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb index b1b85ff45..baf8d72d1 100644 --- a/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb +++ b/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb @@ -23,7 +23,7 @@ class ErrorResponseError # @return [String] attr_accessor :error_msg - # Name of the error. + # Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. # @return [String] attr_accessor :error_name diff --git a/translations/en.yaml b/translations/en.yaml index f32507e4f..730b48fca 100644 --- a/translations/en.yaml +++ b/translations/en.yaml @@ -1727,7 +1727,7 @@ "ErrorResponseError::DESCRIPTION": Contains information about an error that occurred. "ErrorResponseError::ERROR_MSG": Message describing an error. "ErrorResponseError::ERROR_PATH": Path at which an error occurred. -"ErrorResponseError::ERROR_NAME": Name of the error. +"ErrorResponseError::ERROR_NAME": Name of the error. See the `x-error-codes` catalog in openapi file for a complete list of possible error codes with detailed information including HTTP status codes, causes, remediation steps, and retry guidance. "Error::400": Error 400 bad_request "Error::401": Error 401 unauthorized @@ -1887,3 +1887,167 @@ "accountUpdateEventCallback::SEO::DESCRIPTION": "The Dropbox Sign API allows you to build with a wide range of tools. To find out how to consume Dropbox Sign Events at the account level, click here." "appCreateEventCallback::SEO::TITLE": "App Callbacks | API Documentation | Dropbox Sign for Developers" "appCreateEventCallback::SEO::DESCRIPTION": "The Dropbox Sign API allows you to build with a wide range of tools. To find out how to consume Dropbox Sign Events at the App level, click here." + +################## +# Error Catalog # +################## + +"ErrorCatalog::bad_request::SUMMARY": "The request contained invalid or malformed parameters." +"ErrorCatalog::bad_request::CAUSE": "A parameter failed validation, or the request body was malformed." +"ErrorCatalog::bad_request::REMEDIATION": "Inspect error_msg and error_path, correct the offending parameter, and resend." + +"ErrorCatalog::unauthorized::SUMMARY": "The credentials supplied are missing or invalid." +"ErrorCatalog::unauthorized::CAUSE": "Missing, malformed, or invalid API key or OAuth access token." +"ErrorCatalog::unauthorized::REMEDIATION": "Verify the API key or OAuth token and the Authorization header, then retry." + +"ErrorCatalog::payment_required::SUMMARY": "The account must be credited or upgraded to perform this action." +"ErrorCatalog::payment_required::CAUSE": "The action requires a paid plan, additional quota, or API credits." +"ErrorCatalog::payment_required::REMEDIATION": "Upgrade the plan or add the required credits/quota, then retry." + +"ErrorCatalog::forbidden::SUMMARY": "The action is not allowed for these credentials or in the current context." +"ErrorCatalog::forbidden::CAUSE": "The authenticated account lacks access to the resource or operation." +"ErrorCatalog::forbidden::REMEDIATION": "Confirm the account has access to the resource and the required permissions." + +"ErrorCatalog::not_found::SUMMARY": "Nothing matches the requested resource." +"ErrorCatalog::not_found::CAUSE": "The resource id does not exist or is not visible to this account." +"ErrorCatalog::not_found::REMEDIATION": "Verify the id and that the resource belongs to the authenticated account." + +"ErrorCatalog::conflict::SUMMARY": "The request was well-formed but conflicts with the current state." +"ErrorCatalog::conflict::CAUSE": "The target resource is in a state incompatible with the request (e.g. a signature request is still being set up)." +"ErrorCatalog::conflict::REMEDIATION": "Wait briefly and retry, or listen for a callback event confirming the resource is ready." + +"ErrorCatalog::exceeded_rate::SUMMARY": "Your account's API request rate limit has been exceeded." +"ErrorCatalog::exceeded_rate::CAUSE": "Too many requests were sent within the rate-limit window for this request type." +"ErrorCatalog::exceeded_rate::REMEDIATION": "Pace requests using the X-RateLimit-* response headers and retry after the window resets." +"ErrorCatalog::exceeded_rate::BACKOFF": "Honor X-Ratelimit-Reset (Unix epoch); otherwise exponential backoff with jitter. No Retry-After header is sent." + +"ErrorCatalog::unknown::SUMMARY": "An unexpected error occurred." +"ErrorCatalog::unknown::CAUSE": "An unhandled server-side error, or a status code without a more specific error_name." +"ErrorCatalog::unknown::REMEDIATION": "Retry transient failures; if it persists, contact support with the request details." +"ErrorCatalog::unknown::BACKOFF": "For transient 5xx, retry with exponential backoff; otherwise do not retry." + +"ErrorCatalog::team_invite_failed::SUMMARY": "The team invitation could not be completed." +"ErrorCatalog::team_invite_failed::CAUSE": "The invitee already belongs to a team, or the invite is otherwise not permitted." +"ErrorCatalog::team_invite_failed::REMEDIATION": "Confirm the invitee is not already on a team before inviting." + +"ErrorCatalog::max_faxes::SUMMARY": "Too many fax transmissions are currently pending or transmitting." +"ErrorCatalog::max_faxes::CAUSE": "The account has reached the limit of concurrent in-flight fax transmissions." +"ErrorCatalog::max_faxes::REMEDIATION": "Wait for outstanding transmissions to complete, then retry." +"ErrorCatalog::max_faxes::BACKOFF": "Retry with exponential backoff once pending transmissions clear." + +"ErrorCatalog::invalid_recipient::SUMMARY": "The recipient (fax number or email address) is invalid." +"ErrorCatalog::invalid_recipient::CAUSE": "A recipient value did not pass validation." +"ErrorCatalog::invalid_recipient::REMEDIATION": "Correct the recipient value and resend." + +"ErrorCatalog::signature_request_cancel_failed::SUMMARY": "The signature request could not be cancelled." +"ErrorCatalog::signature_request_cancel_failed::CAUSE": "The caller is not the requester, or the request is already fully executed/closed." +"ErrorCatalog::signature_request_cancel_failed::REMEDIATION": "Only the requester can cancel, and only before the request is fully executed." + +"ErrorCatalog::signature_request_remove_failed::SUMMARY": "Access to the signature request could not be removed." +"ErrorCatalog::signature_request_remove_failed::CAUSE": "The signature request has not yet been fully executed, so access cannot be revoked." +"ErrorCatalog::signature_request_remove_failed::REMEDIATION": "Wait until all parties have signed, or call /signature_request/cancel to cancel incomplete requests instead." + +"ErrorCatalog::maintenance::SUMMARY": "The request could not be completed because the site is under maintenance." +"ErrorCatalog::maintenance::CAUSE": "The API is in a scheduled maintenance window." +"ErrorCatalog::maintenance::REMEDIATION": "Retry once the maintenance window ends." +"ErrorCatalog::maintenance::BACKOFF": "Retry later with exponential backoff." + +"ErrorCatalog::deleted::SUMMARY": "The request was cancelled or deleted." +"ErrorCatalog::deleted::CAUSE": "The resource has been cancelled or removed and is no longer available." +"ErrorCatalog::deleted::REMEDIATION": "Do not retry; the resource is permanently gone." + +"ErrorCatalog::method_not_supported::SUMMARY": "The HTTP method is not supported for this endpoint." +"ErrorCatalog::method_not_supported::CAUSE": "The request used a verb the endpoint does not accept." +"ErrorCatalog::method_not_supported::REMEDIATION": "Use the HTTP method documented for the endpoint." + +"ErrorCatalog::invalid_reminder::SUMMARY": "The signature request reminder was invalid." +"ErrorCatalog::invalid_reminder::CAUSE": "A reminder was attempted against an ineligible request (e.g. embedded, closed, or expired)." +"ErrorCatalog::invalid_reminder::REMEDIATION": "Only send reminders for eligible (non-embedded, open) signature requests." + +"ErrorCatalog::unavailable::SUMMARY": "The service is temporarily unavailable." +"ErrorCatalog::unavailable::CAUSE": "A downstream dependency or the service itself is temporarily unavailable." +"ErrorCatalog::unavailable::REMEDIATION": "Retry later with exponential backoff." +"ErrorCatalog::unavailable::BACKOFF": "Retry later with exponential backoff and jitter." + +"ErrorCatalog::unprocessable_entity::SUMMARY": "The request was understood but the target entity cannot be processed." +"ErrorCatalog::unprocessable_entity::CAUSE": "The resource is still being processed, or it is in an error state." +"ErrorCatalog::unprocessable_entity::REMEDIATION": "If the resource is still processing, wait and retry; if it is in an error state, recreate/resend it instead of retrying." +"ErrorCatalog::unprocessable_entity::BACKOFF": "If still processing, retry with exponential backoff; if in an error state, do not retry." + +"ErrorCatalog::signature_request_expired::SUMMARY": "The signature request has expired." +"ErrorCatalog::signature_request_expired::CAUSE": "The operation targets a request whose expiration has passed. Most endpoints return 400; final-copy/download endpoints return 403." +"ErrorCatalog::signature_request_expired::REMEDIATION": "The request can no longer be acted upon; create a new signature request." + +######################## +# OAuth Error Catalog # +######################## + +"OAuthErrorCatalog::invalid_grant::SUMMARY": "The OAuth grant (authorization code or refresh token) is invalid or expired." +"OAuthErrorCatalog::invalid_grant::CAUSE": "The code/token was already used, expired, or does not match the client." +"OAuthErrorCatalog::invalid_grant::REMEDIATION": "Re-initiate the OAuth flow to obtain a fresh authorization code." + +"OAuthErrorCatalog::invalid_client::SUMMARY": "The OAuth client credentials are invalid." +"OAuthErrorCatalog::invalid_client::CAUSE": "The client_id or client_secret is unrecognized or incorrect." +"OAuthErrorCatalog::invalid_client::REMEDIATION": "Verify the client_id and client_secret from the API app settings." + +"OAuthErrorCatalog::invalid_request::SUMMARY": "The OAuth request is malformed or missing required parameters." +"OAuthErrorCatalog::invalid_request::CAUSE": "A required parameter is missing, or the request format is invalid." +"OAuthErrorCatalog::invalid_request::REMEDIATION": "Check the request against the OAuth token endpoint documentation." + +"OAuthErrorCatalog::unauthorized_client::SUMMARY": "The OAuth client is not authorized to perform this action." +"OAuthErrorCatalog::unauthorized_client::CAUSE": "The app has not been approved, or the action is outside the granted scopes." +"OAuthErrorCatalog::unauthorized_client::REMEDIATION": "Ensure the app is approved and the required scopes are granted." + +"OAuthErrorCatalog::unsupported_grant_type::SUMMARY": "The grant type is not supported." +"OAuthErrorCatalog::unsupported_grant_type::CAUSE": "The grant_type parameter value is not recognized." +"OAuthErrorCatalog::unsupported_grant_type::REMEDIATION": "Use authorization_code or refresh_token as the grant_type." + +"OAuthErrorCatalog::payment_required::SUMMARY": "The account requires a paid plan to use this OAuth app." +"OAuthErrorCatalog::payment_required::CAUSE": "The authorizing account does not have a plan that supports this integration." +"OAuthErrorCatalog::payment_required::REMEDIATION": "Upgrade the account to a plan that includes OAuth app access." + +"OAuthErrorCatalog::addon_required::SUMMARY": "An add-on is required to use this OAuth app." +"OAuthErrorCatalog::addon_required::CAUSE": "The account plan does not include the add-on needed for this integration." +"OAuthErrorCatalog::addon_required::REMEDIATION": "Add the required add-on to the account subscription." + +"OAuthErrorCatalog::invalid_scope::SUMMARY": "The requested OAuth scope is invalid." +"OAuthErrorCatalog::invalid_scope::CAUSE": "The scope parameter contains values not permitted for the app." +"OAuthErrorCatalog::invalid_scope::REMEDIATION": "Request only scopes that the app is configured to use." + +"OAuthErrorCatalog::quota_reached::SUMMARY": "The account has reached its usage quota for this OAuth app." +"OAuthErrorCatalog::quota_reached::CAUSE": "The authorizing account has exhausted its quota for the integration." +"OAuthErrorCatalog::quota_reached::REMEDIATION": "Contact the app owner or upgrade the account quota." + +"OAuthErrorCatalog::server_error::SUMMARY": "An internal server error occurred during OAuth processing." +"OAuthErrorCatalog::server_error::CAUSE": "An unexpected error on the server side while handling the OAuth request." +"OAuthErrorCatalog::server_error::REMEDIATION": "Retry the request; if it persists, contact support." +"OAuthErrorCatalog::server_error::BACKOFF": "Retry with exponential backoff." + +"OAuthErrorCatalog::temporary_unavailable::SUMMARY": "The OAuth service is temporarily unavailable." +"OAuthErrorCatalog::temporary_unavailable::CAUSE": "The service is under maintenance or experiencing temporary issues." +"OAuthErrorCatalog::temporary_unavailable::REMEDIATION": "Retry after a short delay." +"OAuthErrorCatalog::temporary_unavailable::BACKOFF": "Retry with exponential backoff." + +############################# +# Webhook Error Events # +############################# + +"ErrorEventCatalog::signature_request_invalid::SUMMARY": "Asynchronous error while processing a signature request." +"ErrorEventCatalog::signature_request_invalid::CAUSE": "A signature request could not be processed (e.g. invalid tags, fields, or merge data)." +"ErrorEventCatalog::signature_request_invalid::REMEDIATION": "Inspect event.event_metadata.event_message in the callback, correct the request, and resend." + +"ErrorEventCatalog::unknown_error::SUMMARY": "An unspecified asynchronous processing error occurred." +"ErrorEventCatalog::unknown_error::CAUSE": "An unexpected error occurred while processing the request asynchronously." +"ErrorEventCatalog::unknown_error::REMEDIATION": "Check the request status in the API dashboard; retry or contact support if it persists." + +"ErrorEventCatalog::file_error::SUMMARY": "Asynchronous error while processing an uploaded file." +"ErrorEventCatalog::file_error::CAUSE": "A file attached to a request could not be processed." +"ErrorEventCatalog::file_error::REMEDIATION": "Resend the request with a supported, non-corrupt file." + +"ErrorEventCatalog::template_error::SUMMARY": "Asynchronous error while creating a template." +"ErrorEventCatalog::template_error::CAUSE": "Template file processing failed (e.g. unsupported or corrupt file)." +"ErrorEventCatalog::template_error::REMEDIATION": "Recreate the template with a valid file; check status in the API dashboard." + +"ErrorEventCatalog::sign_url_invalid::SUMMARY": "An embedded signing URL has expired or become invalid." +"ErrorEventCatalog::sign_url_invalid::CAUSE": "The embedded sign_url is no longer valid (e.g. expired)." +"ErrorEventCatalog::sign_url_invalid::REMEDIATION": "Generate a fresh embedded sign_url via the embedded sign URL endpoint."