Table of contents
The IvyForms REST API lets you list forms, read their fields, pull entries, and submit new ones from your own scripts or applications.
These endpoints require either Agency or Elite plan and a valid API key with the right scope. For setup, see How to use the REST API feature in IvyForms.
All endpoints share the same base path, and only the endpoint part changes:
{site}/wp-json/ivyforms-public/v1
Every request also needs the X-IvyForms-Api-Key header described in the setup documentation.
You can list every form on your site by sending a GET request to /forms, using a key with the read scope.
Method: GET
Endpoint: /forms
1
2
curl --location '{site}/wp-json/ivyforms-public/v1/forms' \
--header 'X-IvyForms-Api-Key: YOUR_API_KEY'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"data": [
{
"id": 71,
"name": "Contact form",
"fields": [
{
"id": 4,
"type": "email",
"fieldIndex": 0,
"label": "Email",
"required": true
},
{
"id": 5,
"type": "textarea",
"fieldIndex": 1,
"label": "Message",
"required": false
}
]
}
]
}
You can fetch one form, including its full field list, by sending a GET request to /forms/{form_id}, using a key with the read scope.
Method: GET
Endpoint: /forms/{form_id}
1
2
curl --location '{site}/wp-json/ivyforms-public/v1/forms/71' \
--header 'X-IvyForms-Api-Key: YOUR_API_KEY'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"id": 71,
"name": "Contact form",
"fields": [
{
"id": 4,
"type": "email",
"fieldIndex": 0,
"label": "Email",
"required": true
},
{
"id": 5,
"type": "textarea",
"fieldIndex": 1,
"label": "Message",
"required": false
}
]
}
You can list every entry submitted on a form by sending a GET request to /forms/{form_id}/entries, using a key with the read scope.
Method: GET
Endpoint: /forms/{form_id}/entries
1
2
curl --location '{site}/wp-json/ivyforms-public/v1/forms/71/entries' \
--header 'X-IvyForms-Api-Key: YOUR_API_KEY'
1
2
3
4
5
6
7
8
9
10
11
12
13
{
"data": [
{
"id": 132,
"form_id": 71,
"submitted_at": "2026-07-14 10:32:00",
"values": {
"4": "[email protected]",
"5": "Hi, I'd like a quote."
}
}
]
}
You can fetch one entry by sending a GET request to /entries/{entry_id}, using a key with the read scope.
Method: GET
Endpoint: /entries/{entry_id}
1
2
curl --location '{site}/wp-json/ivyforms-public/v1/entries/132' \
--header 'X-IvyForms-Api-Key: YOUR_API_KEY'
You can create a new entry by sending a POST request to /forms/{form_id}/submissions, with field values keyed by field ID.
A key with the submit scope can post entries directly. Without that scope, submissions still work if you include a valid form render nonce instead, the same way an embedded form would submit.
Method: POST
Endpoint: /forms/{form_id}/submissions
Required properties:
1
2
3
4
5
6
7
8
9
curl --location '{site}/wp-json/ivyforms-public/v1/forms/71/submissions' \
--header 'X-IvyForms-Api-Key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"values": {
"4": "[email protected]",
"5": "Hi, I'd like a quote."
}
}'
If you’re building an integration on top of these endpoints, test on a staging site first and log both requests and responses while you build.
turnstile_{fieldIndex}; there’s no way to bypass it through the API.