Read what happened to submissions
Returns what happened to up to 20 submissions after they arrived: every email, webhook, Zapier zap and integration each one was sent to, along with the latest outcome of each.
One row per target, and each submission gets a status rolled up from its rows. Rows land within seconds of the submission, so one received a moment ago can have none yet. The log is kept 18 months, so an older submission responds with no rows and a null status rather than 404. Any ids the form does not have are left out.
curl --request GET \
--url https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"submission_id": "64c000000000000000000001",
"status": "succeeded",
"deliveries": [
{
"channel": "self_email_notification",
"target": "ann@example.com",
"webhook_id": "whk_3f9Kq2bLm8xZpQ1rT7vWc0",
"name": "Slack: new leads",
"status": "succeeded",
"code": "ERROR_WEBHOOK_HTTP_5XX",
"attempt": 3,
"http_status": 502,
"smtp_code": 550,
"node_error_code": "ECONNREFUSED",
"message": "<string>",
"occurred_at": "2026-09-16T10:04:12.000Z"
}
]
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
The form's id, as shown in the dashboard and in the form's endpoint URL
Query Parameters
The submissions to read, separated by commas. 1 to 20 ids of this form. Ids the form does not have are left out.
Response
In the order asked, without the ids the form does not have.
Show child attributes
Show child attributes
Was this page helpful?
curl --request GET \
--url https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.formcarry.com/v1/forms/{form_id}/submissions/deliveries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"submission_id": "64c000000000000000000001",
"status": "succeeded",
"deliveries": [
{
"channel": "self_email_notification",
"target": "ann@example.com",
"webhook_id": "whk_3f9Kq2bLm8xZpQ1rT7vWc0",
"name": "Slack: new leads",
"status": "succeeded",
"code": "ERROR_WEBHOOK_HTTP_5XX",
"attempt": 3,
"http_status": 502,
"smtp_code": 550,
"node_error_code": "ECONNREFUSED",
"message": "<string>",
"occurred_at": "2026-09-16T10:04:12.000Z"
}
]
}
]
}