Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Developer tools
Get started
Payments
Finance automation
Get started
Payments
Finance automation
Platforms and marketplaces
Money management
Overview
Versioning
Changelog
Upgrade your API version
Upgrade your SDK version
Developer tools
SDKs
API
    API v2
    API keys
    Stripe-Context header
    Daily changelog
    Rate limits
    Automated testing
    Metadata
    Expanding responses
    Pagination
    Domains and IP addresses
    Search
    Localisation
    Error handling
    Error codes
Testing
Workbench
Event Destinations
Workflows
Stripe CLI
Stripe Shell
Developers Dashboard
Agent toolkit
Stripe health alertsBuild with LLMsStripe for Visual Studio CodeFile uploads
Security
Security
Extend Stripe
Stripe Apps
Stripe Connectors
Partners
Partner ecosystem
Partner certification
HomeDeveloper toolsAPI

Search

Look up objects in your Stripe data.

Some top-level API resources support retrieval with search API methods. You can use the search APIs to retrieve your Stripe objects in a flexible manner. Using search is a faster alternative to paginating through all resources. To create a search query, review the Search query language and reference the query fields of the resource:

  • Query fields for Charges
  • Query fields for Customers
  • Query fields for Invoices
  • Query fields for PaymentIntents
  • Query fields for Prices
  • Query fields for Products
  • Query fields for Subscriptions

Limitations

Minimum API version

The minimum supported API Version to use search is 2020-08-27. Read our API upgrades guide to learn more about upgrades. To use search without upgrading your account API version, you can override the API version on a single request by setting the Stripe-Version request header:

Command Line
-H "Stripe-Version: 2025-04-30.basil"

Read our SDKs guide on how to override an API version when using a library.

Data freshness

Don’t use search for read-after-write flows (for example, searching immediately after a charge is made) because the data won’t be immediately available to search. Under normal operating conditions, data is searchable in under 1 minute. Propagation of new or updated data could be delayed during an outage.

For read-after-write flows that require immediate data availability, use the various list APIs, such as List invoices). These APIs aren’t subject to the availability delays mentioned above.

Data mismatches

In some cases, the data you use to find search results might not match the results that you receive. This can happen because the Search API filters using a cached version of the PaymentIntent status, but returns data based on the latest version of the PaymentIntent.

For example, if you query the Search Payment Intents API for PaymentIntents with the status requires_capture, it might return some PaymentIntents with the status succeeded. This happens because the Search API finds cached PaymentIntents that have the older requires_capture status, but returns the current succeeded status in the results.

Rate limits

We apply a rate limit of up to 20 read operations per second which applies for all search endpoints in live mode and test environments. Live mode and test environment limits are separate. Keeping the rate limit in mind, for workloads where you need to run analytics on one or more API resources, Sigma is much more efficient. For workloads where you need to export a large portion of your API resource, our Data Pipeline product is more efficient.

Regional availability

Search isn’t available to merchants in India.

Test clock objects omitted in list all results

Stripe list APIs (such as List invoices) omit results generated by test clocks for list all requests. To see results generated by test clocks in these cases, you must request results within a specific parent, such as test_clock, customer, or subscription.

For example, GET /v1/invoices won’t return test clock generated invoices, but GET /v1/invoices/{customer_id} returns all invoices for that customer, including those that are test clock generated.

Similarly, you can specify a test clock ID in this example to get all invoices related to that test clock, or you can specify a subscription ID to return all invoices billed for that subscription, including test clock generated invoices.

Examples

Here are some examples of what you can do with the Search charges API and Search PaymentIntents API:

Charges metadata search

Look up charges matching a custom metadata value.

Command Line
cURL
curl -G https://api.stripe.com/v1/charges/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode query="metadata['key']:'value'"

Charges last4 search

Look up charges matching the last 4 digits of the card used for the payment.

Command Line
cURL
curl -G https://api.stripe.com/v1/charges/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode query="payment_method_details.card.last4:4242"

Customers email search

Look up customers matching an email.

Command Line
cURL
curl -G https://api.stripe.com/v1/customers/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode query="email:'sally@rocketrides.io'"

Negation filter

Look up PaymentIntents not in the USD currency.

Command Line
cURL
curl -G https://api.stripe.com/v1/payment_intents/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode query="-currency:'usd'"

Numeric filter

Filter invoice objects with a total greater than 1000.

Command Line
cURL
curl -G https://api.stripe.com/v1/invoices/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d query="total>1000"

Combining multiple filters

Look up charges matching a combination of metadata and currency.

Command Line
cURL
curl -G https://api.stripe.com/v1/charges/search \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ --data-urlencode query="metadata['key']:'value' AND currency:'usd'"

Search query language

Query structure and terminology

A query clause consists of a field followed by an operator followed by a value:

clauseemail:"amy@rocketrides.io"
fieldemail
operator:
valueamy@rocketrides.io

You can combine up to 10 query clauses in a search by either separating them with a space, or using the AND or OR keywords (case insensitive). You can’t combine AND and OR in the same query. Furthermore, there’s no option to use parentheses to give priority to certain logic operators. By default, the API combines clauses with AND logic.

The example query email:"amy@rocketrides.io" metadata["key"]:"value" matches records where both the email address is amy@rocketrides.io, and the metadata in the record includes key with a value of value.

Creating a query which does not match a clause

You can negate query clauses using a - character. For example, the following search returns records that don’t match the email amy@rocketrides.io.

-email:"amy@rocketrides.io"

Field types, substring matching, and numeric comparators

Every search field supports exact matching with a :. Certain fields such as email and name support substring matching. Certain other fields such as amount support numeric comparators like > and <.

Each field includes a type that defines the operations you can use in the field. For a full list of available fields, see supported query fields for each resource.

Using an unsupported operator, such as specifying greater than (>) on a string, returns an error.

typeoperators
tokenexact match (case insensitive)

string

exact match, substring (case insensitive)

An exact match on a string type returns any record where that record contains all of the words from the query in the same order. For example the query name:"one two three" would match both a result with the name “one two three” and a result with the name “one two three four”.

numericexact match, greater than and less than

Quotes

You must use quotation marks around string values. Quotation marks are optional for numeric values. For example:

  • currency:"usd" means quotes are required.
  • payment_method_details.card.last4:1234 means quotes are optional.

You can escape quotes inside of quotes with a backslash (\).

description:"the story called \"The Sky and the Sea.\""

Metadata

You can perform searches on metadata that you’ve added to objects that support it.

Use the following format to construct a clause for a metadata search: metadata["<field>"]:"<value>".

The following clause demonstrates how to create a clause that queries for records with a donation ID of “asdf-jkl”: metadata["donation-id"]:"asdf-jkl".

You can query for the presence of a metadata key on an object. The following clause would match all records where donation-id is a metadata key. -metadata["donation-id"]:null

Search Syntax

The following table lists the syntax that you can use to construct a query.

SyntaxUsageDescriptionExamples
:field:valueExact match operator (case insensitive)currency:"eur" returns records where the currency is exactly “EUR” in a case-insensitive comparison
AND, andfield:value1 AND field:value2The query returns only records that match both clauses (case insensitive)status:"active" AND amount:500
OR, orfield:value1 OR field:value2The query returns records that match either of the clauses (case insensitive)currency:"usd" OR currency:"eur"
--field:valueReturns records that don’t match the clause-currency:"jpy" returns records that aren’t in JPY
NULL, nullfield:nullA special token used for field presence (case insensitive)url:null returns records where a URL field is empty
\" \"\""Escape quotes within quotesdescription:"the story called \"The Sky and the Sea.\""
~field~valueSubstring match operator (substrings must be a minimum of 3 characters)email~"amy" returns matches for amy@rocketrides.io and xamy
>, <, =
  • field<value
  • field>value
  • field>=value
  • field<=value
Greater than/less than operatorsamount>="10" brings up objects where the amount is 10 or greater

Supported query fields for each resource

Query fields for Charges

FieldusageType (token, string, numeric)
amountamount>1000numeric
billing_details.address.postal_codebilling_details.address.postal_code:12345token
createdcreated>1620310503numeric
currencycurrency:"usd"token
customercustomer:"cus_123"token
disputeddisputed:"true"token
metadatametadata["key"]:"value"token
payment_method_details.{{SOURCE}}.last4payment_method_details.card.last4:1234token
payment_method_details.{{SOURCE}}.exp_monthpayment_method_details.card_present.exp_month:12token
payment_method_details.{{SOURCE}}.exp_yearpayment_method_details.interac_present.exp_year:2022token
payment_method_details.{{SOURCE}}.brandpayment_method_details.card.brand:"visa"token
payment_method_details.{{SOURCE}}.fingerprintpayment_method_details.card.fingerprint:"fp"token
payment_method_details.{{SOURCE}}.readerpayment_method_details.wechat_pay.reader:"tmr_FDOt2wlRZEdpd7"token
payment_method_details.{{SOURCE}}.locationpayment_method_details.wechat_pay.location:"tml_FBakXQG8bQk4Mm"token
refundedrefunded:"true"token
statusstatus:"succeeded"token

For SOURCE, use card, card_present, interac_present, or any of the additional payment methods that Terminal supports. Use card for online charges, interac_present for Terminal card present charges for the Interac network, and card_present for other Terminal card present charges.

When querying for Terminal-related fields not specific to cards, like reader and location, you can also use other payment methods like wechat_pay.

The disputed field accepts only the tokens “true” and “false”, indicating the presence of disputes.

refunded:"true" filters for fully-refunded charges, refunded:"false" filters for charges that haven’t been refunded at all or have been partially refunded, and refunded:null filters for non-refunded charges.

Query fields for Customers

FieldusageType (token, string, numeric)
createdcreated>1620310503numeric
emailemail~"amyt"string
metadatametadata["key"]:"value"token
namename~"amy"string
phonephone:"+19999999999"string

Query fields for Invoices

FieldusageType (token, string, numeric)
createdcreated>1620310503numeric
currencycurrency:"usd"token
customercustomer:"cus_123"token
last_finalization_error_codelast_finalization_error_code:"customer_tax_location_invalid"token
last_finalization_error_typelast_finalization_error_type:"invalid_request_error"token
metadatametadata["key"]:"value"token
numbernumber:"MYSHOP-123"string
receipt_numberreceipt_number:"RECEIPT-123"string
statusstatus:"open"string
subscriptionsubscription:"SUBS-123"string
totaltotal>1000numeric

Query fields for PaymentIntents

FieldusageType (token, string, numeric)
amountamount>1000numeric
createdcreated>1620310503numeric
currencycurrency:"usd"token
customercustomer:"cus_123"token
metadatametadata["key"]:"value"token
statusstatus:"succeeded"token

Query fields for Prices

FieldusageType (token, string, numeric)
activeactive:"true"token
currencycurrency:"usd"token
lookup_keylookup_key:"standard_monthly"string
metadatametadata["key"]:"value"token
productproduct:"prod_123"string
typetype:"recurring"token

Query fields for Products

FieldusageType (token, string, numeric)
activeactive:"true"token
descriptiondescription~"t-shirts"string
metadatametadata["key"]:"value"token
namename~"amy"string
shippableshippable:"true"token
urlurl~"/dinosaur_swag"string

Query fields for Subscriptions

FieldusageType (token, string, numeric)
createdcreated>1620310503numeric
metadatametadata["key"]:"value"token
statusstatus:"active"token
canceled_atcanceled_at>1721521117numeric
Was this page helpful?
YesNo
Need help? Contact Support.
Join our early access programme.
Check out our changelog.
Questions? Contact Sales.
LLM? Read llms.txt.
Powered by Markdoc