Public
Look up checkout donors by email
Checks whether a donor email already exists for the client before public checkout continues. The controller validates email, verifies the program belongs to the client, then returns lightweight donor choices for account selection or passwordless verification. The legacy alias /frontend/checkout_email_lookup/{client_id}/{program_id} is routed to the same method.
POST
/
frontend
/
checkout
/
email_lookup
/
{client_id}
/
{program_id}
Look up checkout donors by email
curl --request POST \
--url https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id} \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane@example.org"
}
'import requests
url = "https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}"
payload = { "email": "jane@example.org" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jane@example.org'})
};
fetch('https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}', 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.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'jane@example.org'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}"
payload := strings.NewReader("{\n \"email\": \"jane@example.org\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane@example.org\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jane@example.org\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"email": "jane@example.org",
"exists": true,
"count": 1,
"donors": [
{
"id": 12345,
"email": "jane@example.org",
"username": "janedonor",
"display_name": "Jane Donor",
"type": "INDIVIDUAL"
}
]
}
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Path Parameters
Client id that scopes the program and donor lookup.
Program id that must belong to the client before donor lookup is allowed.
Body
application/json
Email address entered during checkout.
Email to normalize and look up for this client. Validator rule: required|email.
Example:
"jane@example.org"
⌘I
Look up checkout donors by email
curl --request POST \
--url https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id} \
--header 'Content-Type: application/json' \
--data '
{
"email": "jane@example.org"
}
'import requests
url = "https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}"
payload = { "email": "jane@example.org" }
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({email: 'jane@example.org'})
};
fetch('https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}', 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.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => 'jane@example.org'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}"
payload := strings.NewReader("{\n \"email\": \"jane@example.org\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"jane@example.org\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/frontend/checkout/email_lookup/{client_id}/{program_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"jane@example.org\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"email": "jane@example.org",
"exists": true,
"count": 1,
"donors": [
{
"id": 12345,
"email": "jane@example.org",
"username": "janedonor",
"display_name": "Jane Donor",
"type": "INDIVIDUAL"
}
]
}
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}