Reviewing Spam Submissions

Reviewing Spam Submissions

Entry PageEntries FilterQuick ActionBulk ActionEntry Detail Page

The following features are available on the Entries List and Entry Detail pages when entries have been marked as spam by a compatible anti-spam plugin.

Entry Page

Entries Filter

A Spam link, with entry count, appears above the entries list table. This link allows you to view entries which have been marked as spam. This is where you will most likely find missing submissions.

Quick Action

A Spam or Not Spam link will appear as a quick action when hovering over each entry in the entries list table.

Clicking the Spam link changes the entry status property to spam, moving it out of the all entries view and into the spam filter view.

Clicking the Not Spam link changes the entry status property to active, moving it back into the all entries view.

Bulk Action

Multiple entries can be selected and marked as spam or not spam using the bulk action drop down, located above and below the entries list table.

Entry Detail Page

Spam or Not Spam links appear in the sidebar at the bottom of the entry info meta box.

{rest_api_url} Merge Tag

{rest_api_url} Merge Tag

SummaryUsageNotes

Summary
Returns the REST API URL (e.g. https://your.domain/wp-json/).
Usage
Use {rest_api_url} in the Webhooks Add-On Request URL setting to populate that setting with the REST API URL when the feed is processed.
For example using {rest_api_url}wp/v2/posts in the Request URL setting would send the request to https://your.domain/wp-json/wp/v2/posts.
Notes
Available with the Webhooks Add-On (v1.1.5+).

Repeater (beta)

Repeater (beta)

IntroductionAppearanceField PropertiesPermitted Sub-FieldsLabelMaximum Repeater ItemsButton TextRepeater Field NestingLimitationsEntriesExportSample FormsAll Supported FieldsNested RepeatersSample CodeExample 1Example 2Placement of the Repeater field within a form

Note: This field type, released with Gravity Forms 2.4, is currently in BETA. There is no Form Editor UI component built for this field yet. This means you cannot add this field to a form using standard Form Editor drag and drop methods. Currently this field is only intended for developers who can build their forms programmatically, or through other methods. Please open a support ticket if you are a developer who has run into trouble using this field.

Introduction

A repeater field is a collection of other Gravity Forms fields, combined together into a set that can then be used on a single form. The benefit is that when a user submits the form, the repeater field collection can be entered multiple times by the submitter, within the same single form submission.

Example: a repeater field for phone number, allowing a user to enter multiple country codes, phone numbers and associated phone number type data on a single contact form submission.Example: a repeater field consisting of attendee names and job titles, allowing a single convention registration form submission to include multiple people from the same organization.

Additionally, repeater fields can be nested within another repeater field. For example, you could allow multiple contact phone numbers to be entered for each attendee by combining the two examples mentioned above.

Save & Continue functionality is supported.

Appearance

Example of a Repeater field containing just one Name field.

Example with 3 nested Repeater fields.

Sub-fields are listed in the entry list filter so they can be searched like other fields on the form.

Field Properties

Permitted Sub-Fields

The fields property of the Repeater field is an array of fields (GF_Field objects). Supported field types are as follows:

Single Line Text; Paragraph Text; Drop Down; Multi Select; Number; Checkboxes; Radio Buttons; Name; Date; Time; Phone (「international」 format only); Address; Website; Email; List; Repeater (Nested).

Label

The value of the label property will be displayed at the top of the repeater field.

Maximum Repeater Items

The maximum number of items allowed in a repeater can be set using the maxItems field property (true/false).

Button Text

The button texts for adding and removing items for each repeater field can be defined with the field properties addButtonText and removeButtonText.

Repeater Field Nesting

A Repeater field can be nested inside another Repeater field.

There is no enforced limit to nesting depth, though form designers should consider the implications especially when designing for narrower screens.

Limitations

The following limitations exist for repeater fields as currently released. These items are likely to be addressed in future updates, so we recommend you monitor the latest releases to keep an eye on future improvements.

Conditional logic is not yet implemented.Calculations are not yet implemented.Re-ordering of items within the repeater field during form entry is not yet implemented.The rich text editor does not work within the paragraph field.The confirmation feature of the email field does not work.The 「Standard」 US format for the phone field does not work as expected.File Upload, Signature field, and Password field cannot be incorporated into a repeater fieldset.The CSS Ready classes will not work for fields inside the repeater.Dynamic population is not yet supported.Maintaining default values for the new items is not yet supported.Assigning unique tabindex attributes to new items is not yet supported. We recommend disabling the tabindex when embedding the form by using a value of 0.

Entries

All repeater field items will be displayed values that can be edited when the entry is edited.

To help with readability, the repeater field entry display uses indentation and line breaks to display the (possibly multiple) levels of input received in the single repeater field for an entry.

Export

The Conditional Logic setting for the entry export allows filtering by values of a Repeater』s sub-fields.

Note that indentations and line breaks will be present when you export the repeater data.

Sample Forms

All Supported Fields

All supported fields inside a repeater field:repeater-all-supported-fields.zip

Nested Repeaters

Three nested repeater fields:repeater-3-nested.zip

Sample Code

Example 1

How to add a Repeater field programmatically.

// Adjust your form ID
add_filter( 'gform_form_post_get_meta_149', 'add_my_field' );
function add_my_field( $form ) {

// Create a Single Line text field for the team member's name
$name = GF_Fields::create( array(
'type' => 'text',
'id' => 1002, // The Field ID must be unique on the form
'formId' => $form['id'],
'label' => 'Name',
'pageNumber' => 1, // Ensure this is correct
) );

// Create an email field for the team member's email address
$email = GF_Fields::create( array(
'type' => 'email',
'id' => 1001, // The Field ID must be unique on the form
'formId' => $form['id'],
'label' => 'Email',
'pageNumber' => 1, // Ensure this is correct
) );

// Create a repeater for the team members and add the name and email fields as the fields to display inside the repeater.
$team = GF_Fields::create( array(
'type' => 'repeater',
'description' => 'Maximum of 3 team members - set by the maxItems property',
'id' => 1000, // The Field ID must be unique on the form
'formId' => $form['id'],
'label' => 'Team Members',
'addButtonText' => 'Add team member', // Optional
'removeButtonText' => 'Remove team member', // Optional
'maxItems' => 3, // Optional
'pageNumber' => 1, // Ensure this is correct
'fields' => array( $name, $email ), // Add the fields here.
) );

$form['fields'][] = $team;

return $form;
}

// Remove the field before the form is saved. Adjust your form ID
add_filter( 'gform_form_update_meta_149', 'remove_my_field', 10, 3 );
function remove_my_field( $form_meta, $form_id, $meta_name ) {

if ( $meta_name == 'display_meta' ) {
// Remove the Repeater field: ID 1000
$form_meta['fields'] = wp_list_filter( $form_meta['fields'], array( 'id' => 1000 ), 'NOT' );
}

return $form_meta;
}

Example 2

This snippet grabs all the fields from another form, puts them into a single repeater field and adds the repeater to the form. Note that it may be necessary to set the pageNumber property.

// Adjust your form ID
add_filter( 'gform_form_post_get_meta_150', 'add_fields_from_another_form' );
function add_fields_from_another_form( $form ) {

$repeater = GF_Fields::create( array(
'type' => 'repeater',
'id' => 1000,
'formId' => $form['id'],
'label' => 'My Repeater',
'pageNumber' => 1, // Ensure this is correct
) );

$another_form = GFAPI::get_form( 103 );
foreach ( $another_form['fields'] as $field ) {
$field->id = $field->id + 1000;
$field->formId = $form['id'];
$field->pageNumber = 1; // Ensure this is correct

if ( is_array( $field->inputs ) ) {
foreach ( $field->inputs as &$input ) {
$input['id'] = (string) ( $input['id'] + 1000 );
}
}
}

$repeater->fields = $another_form['fields'];
$form['fields'][] = $repeater;

return $form;
}
// Remove the field before the form is saved. Adjust your form ID
add_filter( 'gform_form_update_meta_150', 'remove_my_field', 10, 3 );
function remove_my_field( $form_meta, $form_id, $meta_name ) {

if ( $meta_name == 'display_meta' ) {
// Remove the Repeater field: ID 1000
$form_meta['fields'] = wp_list_filter( $form_meta['fields'], array( 'id' => 1000 ), 'NOT' );
}

return $form_meta;
}

Placement of the Repeater field within a form

The placement of the repeater field in the form also needs to be controlled programmatically. Here is an example showing how you could insert the repeater field at a specific position in the fields array:

array_splice( $form['fields'], 2, 0, array( $repeater ) );

The fields array starts with an index of 0, using the above line which is adding the repeater field at index 2 would make the repeater field the third field on the form. You will need to determine what number you need to change the 2 in the example above to so that the repeater field falls between the range of fields in your form where you would like it to be located.

reCAPTCHA Add-On Settings Reference

reCAPTCHA Add-On Settings Reference

IntroductionGlobal SettingsWhere To Find ThemreCAPTCHA v3 SettingsreCAPTCHA v2 SettingsForm SettingsNotesFurther Information

Introduction

This quick reference guide lists all the settings related to the various CAPTCHA options offered within Gravity Forms, and includes a short description of their purpose.

Note that reCAPTCHA v3 settings are offered only if the reCAPTCHA Add-On is installed, while reCAPTCHA v2 settings are related to the CAPTCHA field.

For more detail, refer to the procedural guides and references listed in the Further Information section at bottom.

Global Settings

Where To Find Them

The reCAPTCHA Add-On global settings are accessible under the Gravity Forms Settings area in the WordPress admin. Follow the menu path Forms → Settings → reCAPTCHA.

Note that reCAPTCHA v3 settings are offered only if the reCAPTCHA Add-On is installed.

reCAPTCHA v3 Settings

SettingDescriptionSite KeyThe site key is used to invoke reCAPTCHA service on your site or mobile application. A valid key will have a green tick mark. See note (1).Secret KeyThe secret key authorizes communication between your application backend and the reCAPTCHA server to verify the user』s response. A valid key will have a green tick mark. See note (1).Score ThresholdEntries with a reCAPTCHA score less than or equal to this value will be classified as spam. Default is 0.5. See note (2).Disable Google reCAPTCHA BadgeThis will hide the Google reCAPTCHA Badge that is usually displayed on every page by default. To do this, you must confirm that you meet Google』s required conditions.

reCAPTCHA v2 Settings

SettingDescriptionSite KeySee v3 above. See note (1), (3).Secret KeySee v3 above. See note (1), (3).TypeDetermines which version of reCAPTCHA v2 will be used. Choose from Checkbox or Invisible. This is a site wide setting, and cannot be varied form to form. See note (4).Validate KeysComplete the 「I am not a robot」 reCAPTCHA to validate your v2 keys. If validation fails, an error message will be displayed here.

Refer to this article or this blog post for more detail on setting up reCAPTCHA version 2 for your site.

Form Settings

The reCAPTCHA Add-On adds a per form setting, which you can find within the Form Settings area. Note that reCAPTCHA v3 settings are offered only if the reCAPTCHA Add-On is installed.

SettingDescriptionDisable reCAPTCHA v3 for this formIf checked, will ignore reCAPTCHA scores for entries made through this particular form. Entries submitted when this setting is enabled will be marked as 「disabled」 under the score column in the entry list.

Notes

(1) Google reCAPTCHA keys are obtained from within your Google developer account. They must be generated for every site you wish to place reCAPTCHA on. (2) The higher the score (from 0 to 1) returned from Google, the more likely it reflects a good interaction. Refer to this Google article.(3) v2 Checkbox keys will not work for v2 Invisible reCaptcha. An invisible key pair is valid for either v2 type.(4) Refer to Google documentation in Further Information section for more information on reCAPTCHA v2 Types.

Further Information

Gravity Forms document Setting up the reCAPTCHA Add-On Gravity Forms document Using the reCAPTCHA Add-On.Google document reCAPTCHA developers pageGoogle document reCAPTCHA v2 info

Rest API Change Log

Rest API Change Log

2.0-rc-22.0-rc-12.0-beta-22.0-beta-1

2.0-rc-2

Updated the POST /forms//entries endpoint to override the form_id entry property with the Form ID in the URL.
Updated the GET /forms//entries endpoint to return only active entries by default.

2.0-rc-1

Added the Location header when the confirmation is a redirect.
Added sanitization to the /forms endpoint.
Added the POST /entries//notifications endpoint which (re)sends notifications.
Added the _fields query param to the GET /entries, GET /entries/ and GET /forms//fields/ and GET /forms//entries//fields/ endpoints
Removed support for semicolon separated entry IDs in the GET /entries endpoint. Use the include query param instead.

2.0-beta-2

Added support for optional labels to the GET /entries endpoint.
Added support for entry trashing. Entries can only be deleted by sending the force param.
Added support for form trashing. Forms can only be deleted by sending the force param.
Changed the POST, PUT and DELETE endpoints for forms and entries to return the form/entry on success.
Fixed an issue with PUT /entries/[ID].
Removed the PUT /entries endpoint. Use PUT /entries/[ID] instead.
Removed authentication. Use WordPress REST API authentication instead.

2.0-beta-1

All new.

Requiring a Cardholder Name

Requiring a Cardholder Name

As some payment add-ons such as the Authorize.Net add-on do not require the cardholder name to be validated, it is not typically required within the credit card field. This snippet will allow you to require the cardholder』s name.
12345678add_filter( 'gform_field_validation', function ( $result, $value, $form, $field ) {    if ( $field->type == 'creditcard' && $result['is_valid'] && rgempty( $field->id . '.5', $value ) ) {        $result['is_valid'] = false;        $result['message']  = 'Please enter the cardholder first and last name.';    }     return $result;}, 10, 4 );

reCAPTCHA Add-On Change Log

reCAPTCHA Add-On Change Log

1.1 | 2021-07-211.0 | 2021-06-23

1.1 | 2021-07-21

Fixed an issue where an undefined variable notice appears on the add-on settings page.
Fixed an issue where forms can fail validation if they include dynamically added fields such as the honeypot.
Fixed an issue where the reCAPTCHA response is saved and output by merge tags.
Fixed an issue where submissions from the User Registration Add-On login form are blocked.

1.0 | 2021-06-23

It's all new!

REST API v2 Authentication

REST API v2 Authentication

IntroductionAuthentication CredentialsGravity FormsWordPress Application PasswordsAuthentication MethodsBasic AuthenticationExamplesPostmanPHPOAuth 1.0a AuthenticationExamplesPostmanPHPWordPress AuthenticationTroubleshootingExample Logging StatementsSuccessful Basic Authentication using Gravity Forms CredentialsSuccessful Basic Authentication using WordPress Application PasswordSuccessful OAuth 1.0a AuthenticationOther Logging StatementsPossible Error Logging StatementsUnable to authenticate using Basic Authentication

REST API v2 Authentication
Introduction
The Gravity Forms REST API version 2 can be used to integrate Gravity Forms with custom apps, remote services, and other WordPress sites. Here are a few of the more common integrations we are aware of:

Zapier – documentation
Integromat – documentation
Automate.io – documentation
Zoho Flow – documentation

For authentication to succeed you must first ensure the REST API is enabled on the Forms > Settings > REST API page.
Authentication Credentials
Gravity Forms supports authenticating REST API requests using credentials created by Gravity Forms or WordPress.
Whichever credentials you choose to use please bear in mind that the Gravity Forms capabilities assigned to the user authenticating the request will be honored. For example, if the user does not have the capablility to edit entries (gravityforms_edit_entries), requests to update entries will fail. See the Role Management article for details about the available capabilities and how to manage them.
When creating your credentials, make sure to copy them as they will only be displayed once.
Gravity Forms
Credentials created by Gravity Forms can be used with both Basic Authentication and OAuth 1.0a Authentication methods. They can be created via the Forms > Settings > REST API page.
Click the 「Add Key」 button under the authentication section for version 2. You』ll be presented with the Add Key page:

a. Enter a friendly description for your API Key.
b. Select an existing WordPress user. This is the user whose account will be used to perform the requests.
c. Select the Permission level for this API Key. Note that in order for an API request to be successful, the user above must have the capabailities to do so, and the API Key permission must also allow it. For example, if you select 「Read」 permission for the API Key, all write requests to the REST API (i.e. edit entry, delete form, etc…) will be rejected even if the user configured above has the necessary capabilities to perform those actions.
d. Add Key to create your new key. The next page will display your Consumer Key & Secret Key.
NOTE: You will need to copy these keys down for your application as they will not be visible again once you leave this page.
When setting up Basic Authentication, use the Consumer Key as the username and Consumer Secret as the password.
WordPress Application Passwords
WordPress added support for Application Passwords in version 5.6. Starting with Gravity Forms 2.4.21.4 they can be used with the Basic Authentication method.
To create an Application Password with WordPress 5.6 or greater go to your profile page in the WordPress admin (/wp-admin/profile.php) and scroll towards the end of the page.

Enter a name in the 「New Application Password Name」 input and then click the 「Add New Application Password」 button. WordPress will generate and display the password which you can use to authenticate requests to the REST API.
When using this Application Password with Basic Authentication, use your account username or email address as the username.
Authentication Methods
Gravity Forms supports 2 built-in methods of authentication: Basic Authentication and OAuth 1.0a Authentication.
Basic Authentication
Basic Authentication is supported, but only on requests that are sent using HTTPS. HTTP requests must use OAuth 1.0a authentication.
Examples
Following are a few examples of requests with Basic Authentication:
Postman
Postman is a free app that allows you to easily send API requests without having to write any code. Download it here

PHP
$username = 'ck_c8d98772e0f4db070c97416796ff251fc991f454';
$password = 'cs_e0665f1acf0460581ab4fdce978404b28dab1a54';

$headers = array( 'Authorization' => 'Basic ' . base64_encode( "{$username}:{$password}" ) );
$response = wp_remote_get( 'https://gravityforms.local/wp-json/gf/v2/entries/5', array( 'headers' => $headers ) );

// Check the response code.
if ( wp_remote_retrieve_response_code( $response ) != 200 || ( empty( wp_remote_retrieve_body( $response ) ) ) ) {
// If not a 200, HTTP request failed.
die( 'There was an error attempting to access the API.' );
}

OAuth 1.0a Authentication
OAuth 1.0a is the recommended authentication method as it offers a higher level of security.
Note that array parameters must be indexed in order for the signature to validate correctly. For example use form_ids[0]=1&form_ids[1]=2 instead of form_ids[]=1&form_ids[]=2.
Examples
Following are a few examples of requests with OAuth 1.0a Authentication:
Postman
Postman is a free app that allows you to easily send API requests without having to write any code. Download it here

PHP
This example requires an OAuth helper class that can be downloaded here.
$consumer_key = 'ck_c8d98772e0f4db070c97416796ff251fc991f454';
$consumer_secret = 'cs_e0665f1acf0460581ab4fdce978404b28dab1a54';
$url = 'https://gravityforms.local/wp-json/gf/v2/forms';
$method = 'POST';
$args = array();

// Use helper to get oAuth authentication parameters in URL.
// Download helper library from: https://s22280.pcdn.co/wp-content/uploads/2017/01/class-oauth-request.php_.zip
require_once( 'class-oauth-request.php' );
$oauth = new OAuth_Request( $url, $consumer_key, $consumer_secret, $method, $args );

// Form to be created.
$form = array( 'title' => 'Form title' );

// Send request.
$response = wp_remote_request( $oauth->get_url(),
array(
'method' => $method,
'body' => json_encode( $form ),
'headers' => array( 'Content-type' => 'application/json' ),
)
);

// Check the response code.
if ( wp_remote_retrieve_response_code( $response ) != 200 || ( empty( wp_remote_retrieve_body( $response ) ) ) ) {
// If not a 200, HTTP request failed.
die( 'There was an error attempting to access the API.' );
}

WordPress Authentication
In addition to the authentication methods provided by Gravity Forms (described above), the REST API version 2 also supports any WordPress specific authentication, including cookie authentication and any of the authentication plugins. Here are some more information about those authentication methods:

WordPress REST API authentication documentation
WP REST API: Setting Up and Using Basic Authentication
WP REST API: Setting Up and Using OAuth 1.0a Authentication

Troubleshooting
Begin troubleshooting by:

Enable logging on the Forms > Settings page
On the Forms > Settings > Logging page, ensure that Gravity Forms API is enabled and set to log all messages.

Check our logging and debugging documentation for additional help.
As logging statements are only recorded when the functions they are contained within are run, perform the steps needed to replicate the issue such as connecting the integration or performing a request.
Example Logging Statements
Successful Basic Authentication using Gravity Forms Credentials

DEBUG –> GF_REST_Authentication::authenticate(): Running.
DEBUG –> GF_REST_Authentication::perform_basic_authentication(): Running.
DEBUG –> GF_REST_Authentication::perform_basic_authentication(): Valid.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Running for user #1.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Permissions valid.
DEBUG –> GF_REST_Controller::current_user_can_any(): method: GET; route: /gf/v2/forms; capability: 「gravityforms_edit_forms」; result: true.

Successful Basic Authentication using WordPress Application Password

DEBUG –> GF_REST_Authentication::authenticate(): Running.
DEBUG –> GF_REST_Authentication::perform_basic_authentication(): Running.
ERROR –> GF_REST_Authentication::perform_basic_authentication(): Aborting; user not found.
DEBUG –> GF_REST_Authentication::perform_application_password_authentication(): Running.
DEBUG –> GF_REST_Authentication::perform_application_password_authentication(): Valid.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Running for user #1.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Permissions valid.
DEBUG –> GF_REST_Controller::current_user_can_any(): method: GET; route: /gf/v2/forms; capability: 「gravityforms_edit_forms」; result: true.

Successful OAuth 1.0a Authentication

DEBUG –> GF_REST_Authentication::authenticate(): Running.
DEBUG –> GF_REST_Authentication::perform_basic_authentication(): Running.
ERROR –> GF_REST_Authentication::perform_basic_authentication(): Aborting; credentials not found.
DEBUG –> GF_REST_Authentication::perform_application_password_authentication(): Running.
ERROR –> GF_REST_Authentication::perform_application_password_authentication(): Aborting; user not found.
DEBUG –> GF_REST_Authentication::perform_oauth_authentication(): Running.
DEBUG –> GF_REST_Authentication::perform_oauth_authentication(): Valid.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Running for user #1.
DEBUG –> GF_REST_Authentication::check_user_permissions(): Permissions valid.
DEBUG –> GF_REST_Controller::current_user_can_any(): method: GET; route: /gf/v2/forms; capability: 「gravityforms_edit_forms」; result: true.

Other Logging Statements

DEBUG –> GF_REST_Authentication::is_request_to_rest_api(): Executing functions hooked to gform_is_request_to_rest_api.
DEBUG –> GF_REST_Authentication::authentication_fallback(): Running.
DEBUG –> GF_REST_Authentication::authenticate(): User #1 already authenticated.

Possible Error Logging Statements

ERROR –> GF_REST_Authentication::perform_basic_authentication(): Aborting; credentials not found.

This is used when the username (consumer key) and/or password (consumer secret) are not found in the request.

ERROR –> GF_REST_Authentication::perform_basic_authentication(): Aborting; user not found.

This is used when credentials are found in the request but a user could not be found for the username (consumer key).

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Consumer secret is invalid.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the basic auth username (consumer key) is valid and the password (consumer secret) is invalid.

ERROR –> GF_REST_Authentication::perform_application_password_authentication(): Aborting; user not found.

This is used when WordPress was not able to authenticate the request using an Application Password.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Unknown email address. Check again or try your username.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the WordPress Application Password validation fails.

ERROR –> GF_REST_Authentication::perform_oauth_authentication(): Aborting; OAuth parameters not found.

This is used when the OAuth parameters such as the consumer key, timestamp, nonce, signature, or singature method are not found in the request.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Consumer key is invalid.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when a user could not be found for the consumer key included in the OAuth request.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Invalid signature – failed to sort parameters.」]},」error_data」: {「gform_rest_authentication_error」:{「status」:401}}}

This is used when a user was found for the consumer key in the OAuth request but the request parameters could not be sorted into the correct order.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Invalid signature – signature method is invalid.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the OAuth request signature method is not HMAC-SHA1 or HMAC-SHA256.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Invalid signature – provided signature does not match.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the OAuth request signature does not match the expected signature for the request being performed.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Invalid timestamp.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the OAuth request timestamp does not match the current timestamp plus or minus a small window.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Invalid nonce – nonce has already been used.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the OAuth nonce has already been used by a previous request.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「The API key provided does not have read permissions.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the Gravity Forms credentials are valid but the user does not have permission to perform GET or HEAD requests.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「The API key provided does not have write permissions.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the Gravity Forms credentials are valid but the user does not have permission to perform POST, PUT, PATCH, or DELETE requests.

ERROR –> GF_REST_Authentication::set_error(): {「errors」:{「gform_rest_authentication_error」:[「Unknown request method.」]},」error_data」:{「gform_rest_authentication_error」:{「status」:401}}}

This is used when the Gravity Forms credentials are valid but an unknown request method is being used. Known request methods are HEAD, GET, POST, PUT, PATCH, DELETE, and OPTIONS.
Unable to authenticate using Basic Authentication
Some hosting environments, usually Apache based, aren』t configured to pass the basic authentication headers from incoming requests to PHP so they are not present when the WordPress and Gravity Forms APIs attempt to authenticate requests, which can result in authentication errors.
WordPress had a number of reports of issues like this during the development of their REST API. An engineer at WPEngine investigated and confirmed it is a hosting issue which hosts can resolve by making a change to the Apache configuration on the server hosting the site.
Please contact your web host and ask them to ensure the CGIPassAuth directive is enabled on the server hosting your site.
The WordPress REST API FAQ also includes additional solutions for this issue.

Resend Notifications

Resend Notifications

If you failed to receive a notification, Gravity Forms makes it easy to re-send that notification with just a few simple clicks. In this article, we will show you how to re-send a notification within Gravity Forms.

First, access your entries. To do so click on Forms on the left side navigation menu, hover over the form that you want to view the entries of, and click on Entries.You should now see a listing of all entries submitted through your form. Select the checkbox to the left of the entry, use the dropdown to select Resend Notifications, then click the Apply button.A window will now appear with notification options listed. Any notification that you have previously configured will appear here. Use these checkboxes select the notification type that you would like to send.Once your notification type is selected, an additional field will appear, allowing you to optionally override the email addresses within your selected notification type. If you would like to override the notification with different email addresses, simply place them within the Send To field in a comma-separated list.Once everything is set, go ahead and click the Resend Notifications button.

You can also access this option in Bulk Actions from the Entries List.