{"templateId":"markdown","versions":[{"version":"2.0","label":"v2.0","link":"/percents-api/overview/sandbox","default":true,"active":true,"folderId":"27d36c3a"}],"sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Sandbox","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"sandbox","__idx":0},"children":["Sandbox"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://sandbox.percents.com"]}," for integration testing."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sandbox data is subject to daily purging. Do not rely on sandbox cardholder groups, activations, balances, transactions, webhook records, or generated ids persisting across days; integration tests should recreate the setup data they need."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sandbox uses the same API-token header shape as production:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"http","header":{"controls":{"copy":{}}},"source":"Authorization: token tok_11111111-1111-4111-8111-111111111111:api_test_secret\n","lang":"http"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transaction-matching","__idx":1},"children":["Transaction Matching"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantId"]}," field on ingested card authorization event and settled transaction event payloads is normal transaction data. It represents the merchant identifier from the ISO 8583 transaction message."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sandbox does not perform intelligent brand matching for the MVP. In sandbox only, Percents overloads ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantId"]}," as a forced-match input: pass the Percents ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mp_"]}," merchant partner id for the merchant you want the transaction event to match."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is separate from API authentication. API authentication uses the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}," token header."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Transaction payload fragment:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"merchantId\": \"mp_33333333-3333-4333-8333-333333333333\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the same sandbox ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantId"]}," value on the related settled transaction event payload when you want that event to qualify against the same merchant."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"refunds","__idx":2},"children":["Refunds"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Work with the Percents account manager to validate refund flows. Refund and clawback behavior is documented so integrators can build the production processing model and reconcile reversal effects."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"recommended-sandbox-flow","__idx":3},"children":["Recommended Sandbox Flow"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create or update a cardholder group with one cardholder and one card."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["List merchants and pick a merchant id returned by the sandbox."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Activate that merchant for the cardholder group. Activation is required for both cashback and branded balance offers."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ingest a card authorization event using the selected ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mp_"]}," merchant partner id as the sandbox ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantId"]}," forced-match value."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Ingest the matching settled transaction using the same sandbox ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["merchantId"]}," value."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Receive and verify webhooks."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Read reward summary, merchant balance, activity, and transaction reward detail."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"sandbox-data-expectations","__idx":4},"children":["Sandbox Data Expectations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sandbox ids use the same typed prefixes as production. Amounts are always minor units and currently USD-only where the contract requires currency. Timestamps are ISO 8601 strings."]}]},"headings":[{"value":"Sandbox","id":"sandbox","depth":1},{"value":"Transaction Matching","id":"transaction-matching","depth":2},{"value":"Refunds","id":"refunds","depth":2},{"value":"Recommended Sandbox Flow","id":"recommended-sandbox-flow","depth":2},{"value":"Sandbox Data Expectations","id":"sandbox-data-expectations","depth":2}],"frontmatter":{"seo":{"title":"Sandbox"}},"lastModified":"2026-07-21T18:22:26.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/percents-api/overview/sandbox","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}