Stripe, is it possible to search a customer by their email?

Stripe Payments

Stripe Payments Problem Overview


Update: Since around January 2018, it is now possible to search using the email parameter on Stripe. See the accepted answer.


I was wondering if it was possible to search a customer only by their email address when using the Stripe API.

The documentation only indicates searching by:

created,
ending_before,
limit,
starting_after 

but not email.

I'd like to avoid having to list over all my customers to find which ones have the same email addresses.

Stripe Payments Solutions


Solution 1 - Stripe Payments

Stripe now allows you to filter customers by email.

https://stripe.com/docs/api#list_customers

Map<String, Object> options = new HashMap<>();
options.put("email", email);
List<Customer> customers = Customer.list(options).getData();

if (customers.size() > 0) {
    Customer customer = customers.get(0);
    ...

This is important to help ensure you don't create duplicate customers. Because you can't put creating a customer in Stripe and the storage of the Stripe customer ID in your system inside a single transaction you need to build in some fail safes that check to see if a particular customer exists before you create a new one. Searching customers by email is important in that regard.

Solution 2 - Stripe Payments

I did this by using the following API request. This was not available in stripe docs.I got this by tracking down their search in the dashboard area using Browser Developer Tools.

    url :https://api.stripe.com/v1/search?query="+email+"&prefix=false",
    method: GET
    headers: {
      "authorization": "Bearer Your_seceret Key",
      "content-type": "application/x-www-form-urlencoded",
    }

Warning This uses an undocumented API that is specific to the dashboard. While it might work today, there is no guarantee it will continue to work in the future.

Solution 3 - Stripe Payments

You need to retrieve and store the Stripe customer ID along with the other customer details in your database. You can then search for the email address in your database and retrieve the customer record from Stripe by using the Stripe customer ID.

Solution 4 - Stripe Payments

UPDATE: Stripe now allows searching via email

https://stripe.com/docs/api/php#list_customers

/**
 * Remember that Stripe unfortunately allows multiple customers to have the same email address.
 * @see https://stackoverflow.com/a/38492724/470749
 * 
 * @param string $emailAddress
 * @return array
 */
public function getCustomersByEmailAddress($emailAddress) {
    try {
        $matchingCustomers = [];
        $lastResult = null;
        $hasMoreResults = true;
        while ($hasMoreResults) {
            $searchResults = \Stripe\Customer::all([
                        "email" => $emailAddress,
                        "limit" => 100,
                        "starting_after" => $lastResult
            ]);
            $hasMoreResults = $searchResults->has_more;
            foreach ($searchResults->autoPagingIterator() as $customer) {
                $matchingCustomers[] = $customer;
            }
            $lastResult = end($searchResults->data);
        }
        return $matchingCustomers;
    } catch (\Exception $e) {
        Log::error($e);
        return [];
    }
}

Solution 5 - Stripe Payments

You can't directly search by email.

However, you can hack a little bit to list all users, and look after your email.

Here's my code (PHP) :

$last_customer = NULL;
$email = "[email protected]";
while (true) {
    $customers = \Stripe\Customer::all(array("limit" => 100, "starting_after" => $last_customer));
    foreach ($customers->autoPagingIterator() as $customer) {
		if ($customer->email == $email) {
			$customerIamLookingFor = $customer;
			break 2;
		}
	}
    if (!$customers->has_more) {
    	break;
	}
    $last_customer = end($customers->data);
}

Solution 6 - Stripe Payments

You only need to write this line

\Stripe\Customer::all(["email" => "YourDesiredEmail"]);

Solution 7 - Stripe Payments

Since you specified that

> The documentation only indicate to search by created, ending_before, limit and starting_after, but no "email".

You are right, you can't search using emails.

If you still wish to do that, What you can do instead is to get a list of all the customer and filter on the response you get using email.

For Example, in ruby you can do it as follows:

customers = Stripe::Customer.all

customer_i_need = customers.select do |c|
  c.email == "[email protected]"
end

PS: Stripe can have multiple customers associated with one email address.

Solution 8 - Stripe Payments

Please bear in mind when using Stripe API that it is case sensitive email (which is a bit stupid). Hopefully they change this.

Solution 9 - Stripe Payments

In NodeJs we can search for our desired customer with their email address like the following:

const stripeSecretKey = process.env.STRIPE_SECRET_KEY;
const stripe = require('stripe')(stripeSecretKey);

const findCustomerByEmail = async (email) => {
  try {
    const customer = await stripe.customers.list( {
      email: email,
      limit: 1
  });
   if(customer.data.length !== 0){
    return customer.data[0].id;
   }
  } catch (e) {
   return (e);
 }
};

The actual call to stripe is using the stripe.customers.list. If the email exists in our stripe account then the returned object will contain an element called data.

Solution 10 - Stripe Payments

Stripe API does not supports any search-by-email feature. They have this search in their dashboard but not released any to API; from the architectural concept it seems that there is no possibility or plan from stripe to include this in API; every object in their API is retrievable only by that specific objects id given by stripe while its created. May be, they have kept it as a scope for third party application developers involvement!!

So, the obvious solution is to store the customers in your own database that you want to be searchable in future - as Simeon Visser has said above

btw, for a workaround, if you already have used the stripe API a lot and there are many customer data which you now need to be searchable - the only way is to go thru the 'List all customers' functionality of API & build the database for your own purpose; ofcourse, you've to use pagination shortcut to iterate thru the whole list for doing so.

$customers = \Stripe\Customer::all(array("limit" => 3));
foreach ($customers->autoPagingIterator() as $customer) {
  // Do something with $customer
}

Solution 11 - Stripe Payments

You can try this. It worked for me. Below code will return empty list if not found data matching with email.

     $stripe = new \Stripe\StripeClient("YOUR_STRIPE_SECRET");

     $customers = $stripe->customers->all(['email'=>'[email protected]',
        'limit' => 15,
      ]);

Solution 12 - Stripe Payments

Stripe Search API Beta now is available

youtube link

Solution 13 - Stripe Payments

Here is The Async- Await Way This Method can Be Used For All Third Party Hits with Nodejs Particularly

    const configuration = {
            headers: {
                "authorization": `Bearer ${Your stripe test key}`,
                "content-type": "application/x-www-form-urlencoded",
            }
          };
          const requestUrl = `https://api.stripe.com/v1/search?
    query=${'email you are to use'} &prefix=false`
        const emailPayment = await axios.get(requestUrl, 
    configuration)

Axiom is Npm for creating http requests... very cool and dead simple

Solution 14 - Stripe Payments

Stripe allows the ability to have more than once customer with the same email. That said, if you wanted to, you can pass a filters hash param to the list method to return a single customer or array of customers.

Stripe::Customer.list(email: user.email).data

The above will return an array of Stripe::Customer instances with the email

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCyril N.View Question on Stackoverflow
Solution 1 - Stripe PaymentsRuss JacksonView Answer on Stackoverflow
Solution 2 - Stripe PaymentsSufyan AhmadView Answer on Stackoverflow
Solution 3 - Stripe PaymentsSimeon VisserView Answer on Stackoverflow
Solution 4 - Stripe PaymentsRyanView Answer on Stackoverflow
Solution 5 - Stripe PaymentsJulienView Answer on Stackoverflow
Solution 6 - Stripe PaymentsMuhammad Bin AbdulrazzaqView Answer on Stackoverflow
Solution 7 - Stripe PaymentsSagar RanglaniView Answer on Stackoverflow
Solution 8 - Stripe Paymentsuser3903110View Answer on Stackoverflow
Solution 9 - Stripe Paymentssediq khanView Answer on Stackoverflow
Solution 10 - Stripe PaymentsArifView Answer on Stackoverflow
Solution 11 - Stripe PaymentsU.MalikView Answer on Stackoverflow
Solution 12 - Stripe PaymentsBIS TechView Answer on Stackoverflow
Solution 13 - Stripe PaymentsChandan SharmaView Answer on Stackoverflow
Solution 14 - Stripe PaymentsZach ColonView Answer on Stackoverflow