'Stripe API - Search Based on Metadata

I have an application that uses a deep integration with Stripe. My platform is occasionally charging the connected accounts and I am storing information about these charges in the metadata of the charge itself.

I want to display this information back to the connected account so I am using the Charge Service to list charges. However I want to filter that list based on some metadata key/value pair so that I don't have to list all of the charges each time, for every connected account.

Is there a clever way of doing this?



Solution 1:[1]

Filtering based on metadata is not supported.

Since you are doing this across Connected accounts, a better approach would be to store the Charge ID and metadata on your end so that you don't have to list and paginate through charges, looking for particular metadata.

Solution 2:[2]

Stripe recently added Search API that allows search by metadata. Currently, it does not have .NET / C# integration but you can query using HTTP call directly:

Example from their docs:

curl https://api.stripe.com/v1/search/charges \
  -u sk_test_daHanKyJOCiXCeBsa65biLML00wylimZ8S: \
  --data-urlencode "query=metadata['key']:'value'" \
  -H "Stripe-Version: 2020-08-27;search_api_beta=v1" \
  -G

Solution 3:[3]

I was able to accomplish this with the "TransferGroup" property of the ChargeCreateOptions object. I basically set the TransferGroup property to a unique value for each connected account which I can then query later.

CREATE THE CHARGE

//THERE IS NO ID IN THE REQUEST OPTIONS BECAUSE
//WE ARE USING THE PLATFORM
var requestOptions = new RequestOptions()
{
  ApiKey = {API Key}
};

//CHARGE OPTIONS
var chargeOptions = new ChargeCreateOptions
{
  Amount = {AMOUNT},
  Currency = "usd",
  Description = $"Platform Charge",
  SourceId = {StripeId},
  Metadata = {MetaData},
  TransferGroup = {Unique String For Each Connected Account}
};

//CREAT AND RETURN THE CHARGE
var chargeService = new ChargeService();
return chargeService.Create(chargeOptions, requestOptions);

QUERY THE PLATFORM CHARGES BASED ON TRANSFER GROUP

    public List<Charge> StripePlatformCharges(string apiKey, int days, string transferGroup)
    {
        try
        {
            RequestOptions requestOptions = new RequestOptions()
            {
                ApiKey = apiKey
            };

            ChargeListOptions chargeListOptions = new ChargeListOptions()
            {
                CreatedRange = new DateRangeOptions()
                {
                    GreaterThanOrEqual = DateTime.Now.AddDays(-days)
                },
                TransferGroup = transferGroup
            };

            ChargeService chargeService = new ChargeService();
            return chargeService.List(chargeListOptions, requestOptions).ToList();
        }
        catch (Exception ex)
        {
            throw new Exception("Error getting stripe charges from the platform", ex);
        }
    }

Solution 4:[4]

Stripe recently released a Search API which offers filtering by metadata for certain resources including charges. The documentation is at https://stripe.com/docs/search

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 hmunoz
Solution 2 Gabriel Lupu
Solution 3 Anzel
Solution 4 Amy