Skip to content

Transactions ​

Search transactions ​

Finds a project's successful Stripe charges from payment evidence, for a backend that needs to match a transaction without keeping a second copy of the project's transaction database.

Scope: transactions:read

Request ​

http
POST /transactions/search?projectId=<project-id>
Content-Type: application/json

The body must include environment plus either an exact Stripe Charge (ch_*), PaymentIntent (pi_*) or Invoice (in_*) reference, or the complete amount, currency and transactionDate tuple.

Parameters ​

FieldRequiredPurpose
environmentYesStripe environment: live or test.
amountWith the core tupleInteger amount in Stripe minor units.
currencyWith the core tupleThree-letter currency code.
transactionDateWith the core tupleISO 8601 transaction timestamp.
referenceWhen the core tuple is absentStripe reference evidence. Only exact ch_*, pi_* or in_* IDs add an indexed reference match; other values require the core tuple.
windowDaysNoInclusive date window on either side of transactionDate; defaults to 3, range 0..7.
limitNoMaximum candidates; defaults to 1, range 1..100.
schemeNovisa or mastercard; not used to filter core candidates.
cardBinNoCard BIN; not used to filter core candidates.
cardLast4NoCard last-four fallback. It matches card last4 or wallet dynamic_last4.
authCodeNoStrong authorization-code evidence; an exact match wins over card fallback.

Optional headers:

HeaderPurpose
X-Request-IDA unique ID per lookup; funnelsgrove echoes it in the response.
X-Trace-IDGroups several related requests in server telemetry.
X-SDK-Request-Mode: shadowMarks a request whose result does not drive your live response. Omit for primary traffic.

Example ​

sh
curl -sS "https://sdk-api.funnelsgrove.com/integration/v1/transactions/search" \
  -H "X-SDK-Secret-Key: <project-sdk-secret-key>" \
  -H "X-Request-ID: lookup-<unique-id>" \
  -H "Content-Type: application/json" \
  --data '{
    "environment": "live",
    "scheme": "mastercard",
    "cardLast4": "4444",
    "amount": 3999,
    "currency": "USD",
    "transactionDate": "2026-08-10T12:00:00Z",
    "windowDays": 3
  }'

Response ​

json
{
  "transactions": [
    {
      "id": "stripe-mirror-row-id",
      "mode": "live",
      "chargeId": "ch_123",
      "paymentIntentId": "pi_123",
      "invoiceId": "in_123",
      "stripeCustomerId": "cus_123",
      "customerEmail": "buyer@example.com",
      "customerName": "Buyer Name",
      "customerFirstName": "Buyer",
      "customerLastName": "Name",
      "customerPhone": "+15551234567",
      "customerIpAddress": "8.8.8.8",
      "amount": 3999,
      "currency": "USD",
      "transactionDate": "2026-08-10T12:00:00.000Z",
      "cardBrand": "mastercard",
      "cardBin": "555555",
      "cardLast4": "4444",
      "cardDynamicLast4": "1111",
      "walletType": "apple_pay",
      "authCode": "123456",
      "networkTransactionId": "network-transaction-id",
      "paymentDescriptor": "CLAIMBEE",
      "stripePriceId": "price_123",
      "stripeProductId": "prod_123",
      "productName": "ClaimBee Annual Access",
      "productDescription": "Annual ClaimBee access",
      "productType": "subscription",
      "productUrl": null,
      "unitPriceAmount": 3999
    }
  ]
}

A normal miss returns 200 with { "transactions": [] }. Responses use Cache-Control: no-store and carry the handler duration as Server-Timing: transaction-search;dur=<ms>.

funnelsgrove searches successful paid charges by project, environment, amount, currency and date, and can union an exact Stripe reference match. It does not discard candidates based on the requested BIN, last four, scheme, authorization code or network transaction ID; keep the final card-network matching and ambiguity logic on your side so network-tokenized cards can still match using stronger identifiers.

customerIpAddress is the public IP captured with the payment metadata. It is never replaced with the IP of the backend calling this endpoint. Raw Stripe payloads, unfiltered metadata and internal IDs are not returned.

Server telemetry records only the bounded outcome, search strategy, candidate count and presence counts of matching evidence. Transaction IPs, card data, authorization codes, references, customer contact values and request bodies are not copied into telemetry.

Errors ​

StatusMeaning
400The request is invalid or the core tuple is incomplete.
503The lookup exceeded its 800 ms deadline; retry with backoff.
500An unexpected lookup error occurred.

Build. Launch. Grow.