diff --git a/openapi-raw.yaml b/openapi-raw.yaml index 132929285..b0ead1772 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: @@ -11481,6 +11524,68 @@ components: error_name: description: '_t__ErrorResponseError::ERROR_NAME' type: string + enum: + - bad_request + - unauthorized + - payment_required + - forbidden + - not_found + - conflict + - exceeded_rate + - unknown + - team_invite_failed + - max_faxes + - invalid_recipient + - signature_request_cancel_failed + - signature_request_remove_failed + - maintenance + - deleted + - method_not_supported + - invalid_reminder + - unavailable + - unprocessable_entity + - signature_request_expired + x-fern-enum: + bad_request: + description: '_t__ErrorCatalog::bad_request::SUMMARY' + unauthorized: + description: '_t__ErrorCatalog::unauthorized::SUMMARY' + payment_required: + description: '_t__ErrorCatalog::payment_required::SUMMARY' + forbidden: + description: '_t__ErrorCatalog::forbidden::SUMMARY' + not_found: + description: '_t__ErrorCatalog::not_found::SUMMARY' + conflict: + description: '_t__ErrorCatalog::conflict::SUMMARY' + exceeded_rate: + description: '_t__ErrorCatalog::exceeded_rate::SUMMARY' + unknown: + description: '_t__ErrorCatalog::unknown::SUMMARY' + team_invite_failed: + description: '_t__ErrorCatalog::team_invite_failed::SUMMARY' + max_faxes: + description: '_t__ErrorCatalog::max_faxes::SUMMARY' + invalid_recipient: + description: '_t__ErrorCatalog::invalid_recipient::SUMMARY' + signature_request_cancel_failed: + description: '_t__ErrorCatalog::signature_request_cancel_failed::SUMMARY' + signature_request_remove_failed: + description: '_t__ErrorCatalog::signature_request_remove_failed::SUMMARY' + maintenance: + description: '_t__ErrorCatalog::maintenance::SUMMARY' + deleted: + description: '_t__ErrorCatalog::deleted::SUMMARY' + method_not_supported: + description: '_t__ErrorCatalog::method_not_supported::SUMMARY' + invalid_reminder: + description: '_t__ErrorCatalog::invalid_reminder::SUMMARY' + unavailable: + description: '_t__ErrorCatalog::unavailable::SUMMARY' + unprocessable_entity: + description: '_t__ErrorCatalog::unprocessable_entity::SUMMARY' + signature_request_expired: + description: '_t__ErrorCatalog::signature_request_expired::SUMMARY' type: object FaxResponse: required: @@ -13928,3 +14033,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' + deleted: + http_status: 410 + summary: '_t__ErrorCatalog::deleted::SUMMARY' + cause: '_t__ErrorCatalog::deleted::CAUSE' + remediation: '_t__ErrorCatalog::deleted::REMEDIATION' + retryable: 'no' + 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' +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..bcddbab0c 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: @@ -11945,6 +11947,68 @@ components: error_name: description: 'Name of the error.' type: string + enum: + - bad_request + - unauthorized + - payment_required + - forbidden + - not_found + - conflict + - exceeded_rate + - unknown + - team_invite_failed + - max_faxes + - invalid_recipient + - signature_request_cancel_failed + - signature_request_remove_failed + - maintenance + - deleted + - method_not_supported + - invalid_reminder + - unavailable + - unprocessable_entity + - signature_request_expired + x-fern-enum: + bad_request: + description: 'The request contained invalid or malformed parameters.' + unauthorized: + description: 'The credentials supplied are missing or invalid.' + payment_required: + description: 'The account must be credited or upgraded to perform this action.' + forbidden: + description: 'The action is not allowed for these credentials or in the current context.' + not_found: + description: 'Nothing matches the requested resource.' + conflict: + description: 'The request was well-formed but conflicts with the current state.' + exceeded_rate: + description: 'Your account''s API request rate limit has been exceeded.' + unknown: + description: 'An unexpected error occurred.' + team_invite_failed: + description: 'The team invitation could not be completed.' + max_faxes: + description: 'Too many fax transmissions are currently pending or transmitting.' + invalid_recipient: + description: 'The recipient (fax number or email address) is invalid.' + signature_request_cancel_failed: + description: 'The signature request could not be cancelled.' + signature_request_remove_failed: + description: 'Access to the signature request could not be removed.' + maintenance: + description: 'The request could not be completed because the site is under maintenance.' + deleted: + description: 'The request was cancelled or deleted.' + method_not_supported: + description: 'The HTTP method is not supported for this endpoint.' + invalid_reminder: + description: 'The signature request reminder was invalid.' + unavailable: + description: 'The service is temporarily unavailable.' + unprocessable_entity: + description: 'The request was understood but the target entity cannot be processed.' + signature_request_expired: + description: 'The signature request has expired.' type: object FaxResponse: required: @@ -14507,3 +14571,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.' + 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' + 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' +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..daa3b8560 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: @@ -11925,6 +11927,68 @@ components: error_name: description: 'Name of the error.' type: string + enum: + - bad_request + - unauthorized + - payment_required + - forbidden + - not_found + - conflict + - exceeded_rate + - unknown + - team_invite_failed + - max_faxes + - invalid_recipient + - signature_request_cancel_failed + - signature_request_remove_failed + - maintenance + - deleted + - method_not_supported + - invalid_reminder + - unavailable + - unprocessable_entity + - signature_request_expired + x-fern-enum: + bad_request: + description: 'The request contained invalid or malformed parameters.' + unauthorized: + description: 'The credentials supplied are missing or invalid.' + payment_required: + description: 'The account must be credited or upgraded to perform this action.' + forbidden: + description: 'The action is not allowed for these credentials or in the current context.' + not_found: + description: 'Nothing matches the requested resource.' + conflict: + description: 'The request was well-formed but conflicts with the current state.' + exceeded_rate: + description: 'Your account''s API request rate limit has been exceeded.' + unknown: + description: 'An unexpected error occurred.' + team_invite_failed: + description: 'The team invitation could not be completed.' + max_faxes: + description: 'Too many fax transmissions are currently pending or transmitting.' + invalid_recipient: + description: 'The recipient (fax number or email address) is invalid.' + signature_request_cancel_failed: + description: 'The signature request could not be cancelled.' + signature_request_remove_failed: + description: 'Access to the signature request could not be removed.' + maintenance: + description: 'The request could not be completed because the site is under maintenance.' + deleted: + description: 'The request was cancelled or deleted.' + method_not_supported: + description: 'The HTTP method is not supported for this endpoint.' + invalid_reminder: + description: 'The signature request reminder was invalid.' + unavailable: + description: 'The service is temporarily unavailable.' + unprocessable_entity: + description: 'The request was understood but the target entity cannot be processed.' + signature_request_expired: + description: 'The signature request has expired.' type: object FaxResponse: required: @@ -14542,3 +14606,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.' + 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' + 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' +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/src/Dropbox.Sign/Model/ErrorResponseError.cs b/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs index f1b9ca907..f925bdc01 100644 --- a/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs +++ b/sdks/dotnet/src/Dropbox.Sign/Model/ErrorResponseError.cs @@ -33,6 +33,141 @@ namespace Dropbox.Sign.Model [JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)] public partial class ErrorResponseError : IEquatable, IValidatableObject { + /// + /// Name of the error. + /// + /// Name of the error. + [JsonConverter(typeof(StringEnumConverter))] + public enum ErrorNameEnum + { + /// + /// Enum BadRequest for value: bad_request + /// + [EnumMember(Value = "bad_request")] + BadRequest = 1, + + /// + /// Enum Unauthorized for value: unauthorized + /// + [EnumMember(Value = "unauthorized")] + Unauthorized = 2, + + /// + /// Enum PaymentRequired for value: payment_required + /// + [EnumMember(Value = "payment_required")] + PaymentRequired = 3, + + /// + /// Enum Forbidden for value: forbidden + /// + [EnumMember(Value = "forbidden")] + Forbidden = 4, + + /// + /// Enum NotFound for value: not_found + /// + [EnumMember(Value = "not_found")] + NotFound = 5, + + /// + /// Enum Conflict for value: conflict + /// + [EnumMember(Value = "conflict")] + Conflict = 6, + + /// + /// Enum ExceededRate for value: exceeded_rate + /// + [EnumMember(Value = "exceeded_rate")] + ExceededRate = 7, + + /// + /// Enum Unknown for value: unknown + /// + [EnumMember(Value = "unknown")] + Unknown = 8, + + /// + /// Enum TeamInviteFailed for value: team_invite_failed + /// + [EnumMember(Value = "team_invite_failed")] + TeamInviteFailed = 9, + + /// + /// Enum MaxFaxes for value: max_faxes + /// + [EnumMember(Value = "max_faxes")] + MaxFaxes = 10, + + /// + /// Enum InvalidRecipient for value: invalid_recipient + /// + [EnumMember(Value = "invalid_recipient")] + InvalidRecipient = 11, + + /// + /// Enum SignatureRequestCancelFailed for value: signature_request_cancel_failed + /// + [EnumMember(Value = "signature_request_cancel_failed")] + SignatureRequestCancelFailed = 12, + + /// + /// Enum SignatureRequestRemoveFailed for value: signature_request_remove_failed + /// + [EnumMember(Value = "signature_request_remove_failed")] + SignatureRequestRemoveFailed = 13, + + /// + /// Enum Maintenance for value: maintenance + /// + [EnumMember(Value = "maintenance")] + Maintenance = 14, + + /// + /// Enum Deleted for value: deleted + /// + [EnumMember(Value = "deleted")] + Deleted = 15, + + /// + /// Enum MethodNotSupported for value: method_not_supported + /// + [EnumMember(Value = "method_not_supported")] + MethodNotSupported = 16, + + /// + /// Enum InvalidReminder for value: invalid_reminder + /// + [EnumMember(Value = "invalid_reminder")] + InvalidReminder = 17, + + /// + /// Enum Unavailable for value: unavailable + /// + [EnumMember(Value = "unavailable")] + Unavailable = 18, + + /// + /// Enum UnprocessableEntity for value: unprocessable_entity + /// + [EnumMember(Value = "unprocessable_entity")] + UnprocessableEntity = 19, + + /// + /// Enum SignatureRequestExpired for value: signature_request_expired + /// + [EnumMember(Value = "signature_request_expired")] + SignatureRequestExpired = 20 + } + + + /// + /// Name of the error. + /// + /// Name of the error. + [DataMember(Name = "error_name", IsRequired = true, EmitDefaultValue = true)] + public ErrorNameEnum ErrorName { get; set; } /// /// Initializes a new instance of the class. /// @@ -44,7 +179,7 @@ protected ErrorResponseError() { } /// Message describing an error. (required). /// Path at which an error occurred.. /// Name of the error. (required). - public ErrorResponseError(string errorMsg = default(string), string errorPath = default(string), string errorName = default(string)) + public ErrorResponseError(string errorMsg = default(string), string errorPath = default(string), ErrorNameEnum errorName = default(ErrorNameEnum)) { // to ensure "errorMsg" is required (not null) @@ -53,11 +188,6 @@ protected ErrorResponseError() { } throw new ArgumentNullException("errorMsg is a required property for ErrorResponseError and cannot be null"); } this.ErrorMsg = errorMsg; - // to ensure "errorName" is required (not null) - if (errorName == null) - { - throw new ArgumentNullException("errorName is a required property for ErrorResponseError and cannot be null"); - } this.ErrorName = errorName; this.ErrorPath = errorPath; } @@ -85,13 +215,6 @@ public static ErrorResponseError Init(string jsonData) [DataMember(Name = "error_msg", IsRequired = true, EmitDefaultValue = true)] public string ErrorMsg { get; set; } - /// - /// Name of the error. - /// - /// Name of the error. - [DataMember(Name = "error_name", IsRequired = true, EmitDefaultValue = true)] - public string ErrorName { get; set; } - /// /// Path at which an error occurred. /// @@ -152,8 +275,7 @@ public bool Equals(ErrorResponseError input) ) && ( this.ErrorName == input.ErrorName || - (this.ErrorName != null && - this.ErrorName.Equals(input.ErrorName)) + this.ErrorName.Equals(input.ErrorName) ) && ( this.ErrorPath == input.ErrorPath || @@ -175,10 +297,7 @@ public override int GetHashCode() { hashCode = (hashCode * 59) + this.ErrorMsg.GetHashCode(); } - if (this.ErrorName != null) - { - hashCode = (hashCode * 59) + this.ErrorName.GetHashCode(); - } + hashCode = (hashCode * 59) + this.ErrorName.GetHashCode(); if (this.ErrorPath != null) { hashCode = (hashCode * 59) + this.ErrorPath.GetHashCode(); diff --git a/sdks/java-v1/docs/ErrorResponseError.md b/sdks/java-v1/docs/ErrorResponseError.md index 656aa5c7f..e6590f07d 100644 --- a/sdks/java-v1/docs/ErrorResponseError.md +++ b/sdks/java-v1/docs/ErrorResponseError.md @@ -9,8 +9,35 @@ 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_ | [```ErrorNameEnum```](#ErrorNameEnum) | Name of the error. | | | `errorPath` | ```String``` | Path at which an error occurred. | | +## Enum: ErrorNameEnum + +| Name | Value | +---- | ----- +| BAD_REQUEST | "bad_request" | +| UNAUTHORIZED | "unauthorized" | +| PAYMENT_REQUIRED | "payment_required" | +| FORBIDDEN | "forbidden" | +| NOT_FOUND | "not_found" | +| CONFLICT | "conflict" | +| EXCEEDED_RATE | "exceeded_rate" | +| UNKNOWN | "unknown" | +| TEAM_INVITE_FAILED | "team_invite_failed" | +| MAX_FAXES | "max_faxes" | +| INVALID_RECIPIENT | "invalid_recipient" | +| SIGNATURE_REQUEST_CANCEL_FAILED | "signature_request_cancel_failed" | +| SIGNATURE_REQUEST_REMOVE_FAILED | "signature_request_remove_failed" | +| MAINTENANCE | "maintenance" | +| DELETED | "deleted" | +| METHOD_NOT_SUPPORTED | "method_not_supported" | +| INVALID_REMINDER | "invalid_reminder" | +| UNAVAILABLE | "unavailable" | +| UNPROCESSABLE_ENTITY | "unprocessable_entity" | +| SIGNATURE_REQUEST_EXPIRED | "signature_request_expired" | + + + 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..c922f865c 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 @@ -14,10 +14,12 @@ import com.dropbox.sign.ApiException; import com.dropbox.sign.JSON; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.Map; @@ -37,8 +39,77 @@ public class ErrorResponseError { public static final String JSON_PROPERTY_ERROR_MSG = "error_msg"; @javax.annotation.Nonnull private String errorMsg; + /** Name of the error. */ + public enum ErrorNameEnum { + BAD_REQUEST(String.valueOf("bad_request")), + + UNAUTHORIZED(String.valueOf("unauthorized")), + + PAYMENT_REQUIRED(String.valueOf("payment_required")), + + FORBIDDEN(String.valueOf("forbidden")), + + NOT_FOUND(String.valueOf("not_found")), + + CONFLICT(String.valueOf("conflict")), + + EXCEEDED_RATE(String.valueOf("exceeded_rate")), + + UNKNOWN(String.valueOf("unknown")), + + TEAM_INVITE_FAILED(String.valueOf("team_invite_failed")), + + MAX_FAXES(String.valueOf("max_faxes")), + + INVALID_RECIPIENT(String.valueOf("invalid_recipient")), + + SIGNATURE_REQUEST_CANCEL_FAILED(String.valueOf("signature_request_cancel_failed")), + + SIGNATURE_REQUEST_REMOVE_FAILED(String.valueOf("signature_request_remove_failed")), + + MAINTENANCE(String.valueOf("maintenance")), + + DELETED(String.valueOf("deleted")), + + METHOD_NOT_SUPPORTED(String.valueOf("method_not_supported")), + + INVALID_REMINDER(String.valueOf("invalid_reminder")), + + UNAVAILABLE(String.valueOf("unavailable")), + + UNPROCESSABLE_ENTITY(String.valueOf("unprocessable_entity")), + + SIGNATURE_REQUEST_EXPIRED(String.valueOf("signature_request_expired")); + + private String value; + + ErrorNameEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ErrorNameEnum fromValue(String value) { + for (ErrorNameEnum b : ErrorNameEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + public static final String JSON_PROPERTY_ERROR_NAME = "error_name"; - @javax.annotation.Nonnull private String errorName; + @javax.annotation.Nonnull private ErrorNameEnum errorName; public static final String JSON_PROPERTY_ERROR_PATH = "error_path"; @javax.annotation.Nullable private String errorPath; @@ -82,7 +153,7 @@ public void setErrorMsg(@javax.annotation.Nonnull String errorMsg) { this.errorMsg = errorMsg; } - public ErrorResponseError errorName(@javax.annotation.Nonnull String errorName) { + public ErrorResponseError errorName(@javax.annotation.Nonnull ErrorNameEnum errorName) { this.errorName = errorName; return this; } @@ -95,13 +166,13 @@ public ErrorResponseError errorName(@javax.annotation.Nonnull String errorName) @javax.annotation.Nonnull @JsonProperty(JSON_PROPERTY_ERROR_NAME) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getErrorName() { + public ErrorNameEnum getErrorName() { return errorName; } @JsonProperty(JSON_PROPERTY_ERROR_NAME) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setErrorName(@javax.annotation.Nonnull String errorName) { + public void setErrorName(@javax.annotation.Nonnull ErrorNameEnum errorName) { this.errorName = errorName; } diff --git a/sdks/java-v2/docs/ErrorResponseError.md b/sdks/java-v2/docs/ErrorResponseError.md index 656aa5c7f..e6590f07d 100644 --- a/sdks/java-v2/docs/ErrorResponseError.md +++ b/sdks/java-v2/docs/ErrorResponseError.md @@ -9,8 +9,35 @@ 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_ | [```ErrorNameEnum```](#ErrorNameEnum) | Name of the error. | | | `errorPath` | ```String``` | Path at which an error occurred. | | +## Enum: ErrorNameEnum + +| Name | Value | +---- | ----- +| BAD_REQUEST | "bad_request" | +| UNAUTHORIZED | "unauthorized" | +| PAYMENT_REQUIRED | "payment_required" | +| FORBIDDEN | "forbidden" | +| NOT_FOUND | "not_found" | +| CONFLICT | "conflict" | +| EXCEEDED_RATE | "exceeded_rate" | +| UNKNOWN | "unknown" | +| TEAM_INVITE_FAILED | "team_invite_failed" | +| MAX_FAXES | "max_faxes" | +| INVALID_RECIPIENT | "invalid_recipient" | +| SIGNATURE_REQUEST_CANCEL_FAILED | "signature_request_cancel_failed" | +| SIGNATURE_REQUEST_REMOVE_FAILED | "signature_request_remove_failed" | +| MAINTENANCE | "maintenance" | +| DELETED | "deleted" | +| METHOD_NOT_SUPPORTED | "method_not_supported" | +| INVALID_REMINDER | "invalid_reminder" | +| UNAVAILABLE | "unavailable" | +| UNPROCESSABLE_ENTITY | "unprocessable_entity" | +| SIGNATURE_REQUEST_EXPIRED | "signature_request_expired" | + + + 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..47fed16ad 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 @@ -44,9 +44,80 @@ public class ErrorResponseError { @jakarta.annotation.Nonnull private String errorMsg; + /** + * Name of the error. + */ + public enum ErrorNameEnum { + BAD_REQUEST(String.valueOf("bad_request")), + + UNAUTHORIZED(String.valueOf("unauthorized")), + + PAYMENT_REQUIRED(String.valueOf("payment_required")), + + FORBIDDEN(String.valueOf("forbidden")), + + NOT_FOUND(String.valueOf("not_found")), + + CONFLICT(String.valueOf("conflict")), + + EXCEEDED_RATE(String.valueOf("exceeded_rate")), + + UNKNOWN(String.valueOf("unknown")), + + TEAM_INVITE_FAILED(String.valueOf("team_invite_failed")), + + MAX_FAXES(String.valueOf("max_faxes")), + + INVALID_RECIPIENT(String.valueOf("invalid_recipient")), + + SIGNATURE_REQUEST_CANCEL_FAILED(String.valueOf("signature_request_cancel_failed")), + + SIGNATURE_REQUEST_REMOVE_FAILED(String.valueOf("signature_request_remove_failed")), + + MAINTENANCE(String.valueOf("maintenance")), + + DELETED(String.valueOf("deleted")), + + METHOD_NOT_SUPPORTED(String.valueOf("method_not_supported")), + + INVALID_REMINDER(String.valueOf("invalid_reminder")), + + UNAVAILABLE(String.valueOf("unavailable")), + + UNPROCESSABLE_ENTITY(String.valueOf("unprocessable_entity")), + + SIGNATURE_REQUEST_EXPIRED(String.valueOf("signature_request_expired")); + + private String value; + + ErrorNameEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } + + @JsonCreator + public static ErrorNameEnum fromValue(String value) { + for (ErrorNameEnum b : ErrorNameEnum.values()) { + if (b.value.equals(value)) { + return b; + } + } + throw new IllegalArgumentException("Unexpected value '" + value + "'"); + } + } + public static final String JSON_PROPERTY_ERROR_NAME = "error_name"; @jakarta.annotation.Nonnull - private String errorName; + private ErrorNameEnum errorName; public static final String JSON_PROPERTY_ERROR_PATH = "error_path"; @jakarta.annotation.Nullable @@ -95,7 +166,7 @@ public void setErrorMsg(@jakarta.annotation.Nonnull String errorMsg) { } - public ErrorResponseError errorName(@jakarta.annotation.Nonnull String errorName) { + public ErrorResponseError errorName(@jakarta.annotation.Nonnull ErrorNameEnum errorName) { this.errorName = errorName; return this; } @@ -108,14 +179,14 @@ public ErrorResponseError errorName(@jakarta.annotation.Nonnull String errorName @JsonProperty(JSON_PROPERTY_ERROR_NAME) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public String getErrorName() { + public ErrorNameEnum getErrorName() { return errorName; } @JsonProperty(JSON_PROPERTY_ERROR_NAME) @JsonInclude(value = JsonInclude.Include.ALWAYS) - public void setErrorName(@jakarta.annotation.Nonnull String errorName) { + public void setErrorName(@jakarta.annotation.Nonnull ErrorNameEnum errorName) { this.errorName = errorName; } diff --git a/sdks/node/dist/api.js b/sdks/node/dist/api.js index 2e7b36985..2fff627fa 100644 --- a/sdks/node/dist/api.js +++ b/sdks/node/dist/api.js @@ -18009,7 +18009,7 @@ var ErrorResponseError = class _ErrorResponseError { { name: "errorName", baseName: "error_name", - type: "string" + type: "ErrorResponseError.ErrorNameEnum" }, { name: "errorPath", @@ -18026,6 +18026,31 @@ var ErrorResponseError = class _ErrorResponseError { return ObjectSerializer.deserialize(data, "ErrorResponseError"); } }; +((ErrorResponseError2) => { + let ErrorNameEnum; + ((ErrorNameEnum2) => { + ErrorNameEnum2["BadRequest"] = "bad_request"; + ErrorNameEnum2["Unauthorized"] = "unauthorized"; + ErrorNameEnum2["PaymentRequired"] = "payment_required"; + ErrorNameEnum2["Forbidden"] = "forbidden"; + ErrorNameEnum2["NotFound"] = "not_found"; + ErrorNameEnum2["Conflict"] = "conflict"; + ErrorNameEnum2["ExceededRate"] = "exceeded_rate"; + ErrorNameEnum2["Unknown"] = "unknown"; + ErrorNameEnum2["TeamInviteFailed"] = "team_invite_failed"; + ErrorNameEnum2["MaxFaxes"] = "max_faxes"; + ErrorNameEnum2["InvalidRecipient"] = "invalid_recipient"; + ErrorNameEnum2["SignatureRequestCancelFailed"] = "signature_request_cancel_failed"; + ErrorNameEnum2["SignatureRequestRemoveFailed"] = "signature_request_remove_failed"; + ErrorNameEnum2["Maintenance"] = "maintenance"; + ErrorNameEnum2["Deleted"] = "deleted"; + ErrorNameEnum2["MethodNotSupported"] = "method_not_supported"; + ErrorNameEnum2["InvalidReminder"] = "invalid_reminder"; + ErrorNameEnum2["Unavailable"] = "unavailable"; + ErrorNameEnum2["UnprocessableEntity"] = "unprocessable_entity"; + ErrorNameEnum2["SignatureRequestExpired"] = "signature_request_expired"; + })(ErrorNameEnum = ErrorResponseError2.ErrorNameEnum || (ErrorResponseError2.ErrorNameEnum = {})); +})(ErrorResponseError || (ErrorResponseError = {})); // model/eventCallbackHelper.ts var crypto2 = __toESM(require("crypto")); @@ -26790,6 +26815,7 @@ var WarningResponse = class _WarningResponse { // model/index.ts var enumsMap = { + "ErrorResponseError.ErrorNameEnum": ErrorResponseError.ErrorNameEnum, "EventCallbackRequestEvent.EventTypeEnum": EventCallbackRequestEvent.EventTypeEnum, FaxLineAreaCodeGetCountryEnum, FaxLineAreaCodeGetProvinceEnum, diff --git a/sdks/node/model/errorResponseError.ts b/sdks/node/model/errorResponseError.ts index 577bb5dd5..ac6e173ac 100644 --- a/sdks/node/model/errorResponseError.ts +++ b/sdks/node/model/errorResponseError.ts @@ -35,7 +35,7 @@ export class ErrorResponseError { /** * Name of the error. */ - "errorName": string; + "errorName": ErrorResponseError.ErrorNameEnum; /** * Path at which an error occurred. */ @@ -52,7 +52,7 @@ export class ErrorResponseError { { name: "errorName", baseName: "error_name", - type: "string", + type: "ErrorResponseError.ErrorNameEnum", }, { name: "errorPath", @@ -70,3 +70,28 @@ export class ErrorResponseError { return ObjectSerializer.deserialize(data, "ErrorResponseError"); } } + +export namespace ErrorResponseError { + export enum ErrorNameEnum { + BadRequest = "bad_request", + Unauthorized = "unauthorized", + PaymentRequired = "payment_required", + Forbidden = "forbidden", + NotFound = "not_found", + Conflict = "conflict", + ExceededRate = "exceeded_rate", + Unknown = "unknown", + TeamInviteFailed = "team_invite_failed", + MaxFaxes = "max_faxes", + InvalidRecipient = "invalid_recipient", + SignatureRequestCancelFailed = "signature_request_cancel_failed", + SignatureRequestRemoveFailed = "signature_request_remove_failed", + Maintenance = "maintenance", + Deleted = "deleted", + MethodNotSupported = "method_not_supported", + InvalidReminder = "invalid_reminder", + Unavailable = "unavailable", + UnprocessableEntity = "unprocessable_entity", + SignatureRequestExpired = "signature_request_expired", + } +} diff --git a/sdks/node/model/index.ts b/sdks/node/model/index.ts index 47632382b..963d98157 100644 --- a/sdks/node/model/index.ts +++ b/sdks/node/model/index.ts @@ -206,6 +206,7 @@ import { UnclaimedDraftResponse } from "./unclaimedDraftResponse"; import { WarningResponse } from "./warningResponse"; export let enumsMap: { [index: string]: any } = { + "ErrorResponseError.ErrorNameEnum": ErrorResponseError.ErrorNameEnum, "EventCallbackRequestEvent.EventTypeEnum": EventCallbackRequestEvent.EventTypeEnum, FaxLineAreaCodeGetCountryEnum: FaxLineAreaCodeGetCountryEnum, diff --git a/sdks/node/types/model/errorResponseError.d.ts b/sdks/node/types/model/errorResponseError.d.ts index 084f883b1..ecfe5d6d8 100644 --- a/sdks/node/types/model/errorResponseError.d.ts +++ b/sdks/node/types/model/errorResponseError.d.ts @@ -1,10 +1,34 @@ import { AttributeTypeMap } from "./"; export declare class ErrorResponseError { "errorMsg": string; - "errorName": string; + "errorName": ErrorResponseError.ErrorNameEnum; "errorPath"?: string; static discriminator: string | undefined; static attributeTypeMap: AttributeTypeMap; static getAttributeTypeMap(): AttributeTypeMap; static init(data: any): ErrorResponseError; } +export declare namespace ErrorResponseError { + enum ErrorNameEnum { + BadRequest = "bad_request", + Unauthorized = "unauthorized", + PaymentRequired = "payment_required", + Forbidden = "forbidden", + NotFound = "not_found", + Conflict = "conflict", + ExceededRate = "exceeded_rate", + Unknown = "unknown", + TeamInviteFailed = "team_invite_failed", + MaxFaxes = "max_faxes", + InvalidRecipient = "invalid_recipient", + SignatureRequestCancelFailed = "signature_request_cancel_failed", + SignatureRequestRemoveFailed = "signature_request_remove_failed", + Maintenance = "maintenance", + Deleted = "deleted", + MethodNotSupported = "method_not_supported", + InvalidReminder = "invalid_reminder", + Unavailable = "unavailable", + UnprocessableEntity = "unprocessable_entity", + SignatureRequestExpired = "signature_request_expired" + } +} diff --git a/sdks/php/src/Model/ErrorResponseError.php b/sdks/php/src/Model/ErrorResponseError.php index 65c09c1dc..7de829459 100644 --- a/sdks/php/src/Model/ErrorResponseError.php +++ b/sdks/php/src/Model/ErrorResponseError.php @@ -233,6 +233,58 @@ public function getModelName() return self::$openAPIModelName; } + public const ERROR_NAME_BAD_REQUEST = 'bad_request'; + public const ERROR_NAME_UNAUTHORIZED = 'unauthorized'; + public const ERROR_NAME_PAYMENT_REQUIRED = 'payment_required'; + public const ERROR_NAME_FORBIDDEN = 'forbidden'; + public const ERROR_NAME_NOT_FOUND = 'not_found'; + public const ERROR_NAME_CONFLICT = 'conflict'; + public const ERROR_NAME_EXCEEDED_RATE = 'exceeded_rate'; + public const ERROR_NAME_UNKNOWN = 'unknown'; + public const ERROR_NAME_TEAM_INVITE_FAILED = 'team_invite_failed'; + public const ERROR_NAME_MAX_FAXES = 'max_faxes'; + public const ERROR_NAME_INVALID_RECIPIENT = 'invalid_recipient'; + public const ERROR_NAME_SIGNATURE_REQUEST_CANCEL_FAILED = 'signature_request_cancel_failed'; + public const ERROR_NAME_SIGNATURE_REQUEST_REMOVE_FAILED = 'signature_request_remove_failed'; + public const ERROR_NAME_MAINTENANCE = 'maintenance'; + public const ERROR_NAME_DELETED = 'deleted'; + public const ERROR_NAME_METHOD_NOT_SUPPORTED = 'method_not_supported'; + public const ERROR_NAME_INVALID_REMINDER = 'invalid_reminder'; + public const ERROR_NAME_UNAVAILABLE = 'unavailable'; + public const ERROR_NAME_UNPROCESSABLE_ENTITY = 'unprocessable_entity'; + public const ERROR_NAME_SIGNATURE_REQUEST_EXPIRED = 'signature_request_expired'; + + /** + * Gets allowable values of the enum + * + * @return string[] + */ + public function getErrorNameAllowableValues() + { + return [ + self::ERROR_NAME_BAD_REQUEST, + self::ERROR_NAME_UNAUTHORIZED, + self::ERROR_NAME_PAYMENT_REQUIRED, + self::ERROR_NAME_FORBIDDEN, + self::ERROR_NAME_NOT_FOUND, + self::ERROR_NAME_CONFLICT, + self::ERROR_NAME_EXCEEDED_RATE, + self::ERROR_NAME_UNKNOWN, + self::ERROR_NAME_TEAM_INVITE_FAILED, + self::ERROR_NAME_MAX_FAXES, + self::ERROR_NAME_INVALID_RECIPIENT, + self::ERROR_NAME_SIGNATURE_REQUEST_CANCEL_FAILED, + self::ERROR_NAME_SIGNATURE_REQUEST_REMOVE_FAILED, + self::ERROR_NAME_MAINTENANCE, + self::ERROR_NAME_DELETED, + self::ERROR_NAME_METHOD_NOT_SUPPORTED, + self::ERROR_NAME_INVALID_REMINDER, + self::ERROR_NAME_UNAVAILABLE, + self::ERROR_NAME_UNPROCESSABLE_ENTITY, + self::ERROR_NAME_SIGNATURE_REQUEST_EXPIRED, + ]; + } + /** * Associative array for storing property values * @@ -304,6 +356,15 @@ public function listInvalidProperties() if ($this->container['error_name'] === null) { $invalidProperties[] = "'error_name' can't be null"; } + $allowedValues = $this->getErrorNameAllowableValues(); + if (!is_null($this->container['error_name']) && !in_array($this->container['error_name'], $allowedValues, true)) { + $invalidProperties[] = sprintf( + "invalid value '%s' for 'error_name', must be one of '%s'", + $this->container['error_name'], + implode("', '", $allowedValues) + ); + } + return $invalidProperties; } @@ -367,6 +428,16 @@ public function setErrorName(string $error_name) if (is_null($error_name)) { throw new InvalidArgumentException('non-nullable error_name cannot be null'); } + $allowedValues = $this->getErrorNameAllowableValues(); + if (!in_array($error_name, $allowedValues, true)) { + throw new InvalidArgumentException( + sprintf( + "Invalid value '%s' for 'error_name', must be one of '%s'", + $error_name, + implode("', '", $allowedValues) + ) + ); + } $this->container['error_name'] = $error_name; return $this; diff --git a/sdks/python/dropbox_sign/models/error_response_error.py b/sdks/python/dropbox_sign/models/error_response_error.py index 4f17bb6ee..b56b7f04f 100644 --- a/sdks/python/dropbox_sign/models/error_response_error.py +++ b/sdks/python/dropbox_sign/models/error_response_error.py @@ -17,7 +17,7 @@ import re # noqa: F401 import json -from pydantic import BaseModel, ConfigDict, Field, StrictStr +from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator from typing import Any, ClassVar, Dict, List, Optional from typing import Optional, Set from typing_extensions import Self @@ -38,6 +38,38 @@ class ErrorResponseError(BaseModel): ) __properties: ClassVar[List[str]] = ["error_msg", "error_name", "error_path"] + @field_validator("error_name") + def error_name_validate_enum(cls, value): + """Validates the enum""" + if value not in set( + [ + "bad_request", + "unauthorized", + "payment_required", + "forbidden", + "not_found", + "conflict", + "exceeded_rate", + "unknown", + "team_invite_failed", + "max_faxes", + "invalid_recipient", + "signature_request_cancel_failed", + "signature_request_remove_failed", + "maintenance", + "deleted", + "method_not_supported", + "invalid_reminder", + "unavailable", + "unprocessable_entity", + "signature_request_expired", + ] + ): + raise ValueError( + "must be one of enum values ('bad_request', 'unauthorized', 'payment_required', 'forbidden', 'not_found', 'conflict', 'exceeded_rate', 'unknown', 'team_invite_failed', 'max_faxes', 'invalid_recipient', 'signature_request_cancel_failed', 'signature_request_remove_failed', 'maintenance', 'deleted', 'method_not_supported', 'invalid_reminder', 'unavailable', 'unprocessable_entity', 'signature_request_expired')" + ) + return value + model_config = ConfigDict( populate_by_name=True, validate_assignment=True, 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..0419ed78d 100644 --- a/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb +++ b/sdks/ruby/lib/dropbox-sign/models/error_response_error.rb @@ -31,6 +31,28 @@ class ErrorResponseError # @return [String] attr_accessor :error_path + class EnumAttributeValidator + attr_reader :datatype + attr_reader :allowable_values + + def initialize(datatype, allowable_values) + @allowable_values = allowable_values.map do |value| + case datatype.to_s + when /Integer/i + value.to_i + when /Float/i + value.to_f + else + value + end + end + end + + def valid?(value) + !value || allowable_values.include?(value) + end + end + # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { @@ -139,6 +161,8 @@ def list_invalid_properties def valid? return false if @error_msg.nil? return false if @error_name.nil? + error_name_validator = EnumAttributeValidator.new('String', ["bad_request", "unauthorized", "payment_required", "forbidden", "not_found", "conflict", "exceeded_rate", "unknown", "team_invite_failed", "max_faxes", "invalid_recipient", "signature_request_cancel_failed", "signature_request_remove_failed", "maintenance", "deleted", "method_not_supported", "invalid_reminder", "unavailable", "unprocessable_entity", "signature_request_expired"]) + return false unless error_name_validator.valid?(@error_name) true end @@ -152,13 +176,13 @@ def error_msg=(error_msg) @error_msg = error_msg end - # Custom attribute writer method with validation - # @param [Object] error_name Value to be assigned + # Custom attribute writer method checking allowed values (enum). + # @param [Object] error_name Object to be assigned def error_name=(error_name) - if error_name.nil? - fail ArgumentError, 'error_name cannot be nil' + validator = EnumAttributeValidator.new('String', ["bad_request", "unauthorized", "payment_required", "forbidden", "not_found", "conflict", "exceeded_rate", "unknown", "team_invite_failed", "max_faxes", "invalid_recipient", "signature_request_cancel_failed", "signature_request_remove_failed", "maintenance", "deleted", "method_not_supported", "invalid_reminder", "unavailable", "unprocessable_entity", "signature_request_expired"]) + unless validator.valid?(error_name) + fail ArgumentError, "invalid value for \"error_name\", must be one of #{validator.allowable_values}." end - @error_name = error_name end diff --git a/translations/en.yaml b/translations/en.yaml index f32507e4f..4e85607ac 100644 --- a/translations/en.yaml +++ b/translations/en.yaml @@ -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."