{"templateId":"markdown","versions":[{"version":"1.0","label":"v1.0","link":"/omni-api/overview/integration-overview","default":true,"active":true,"folderId":"6bec560c"}],"sharedDataIds":{"sidebar":"sidebar-omni-api/@1.0/overview/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Integration overview","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":"integration-overview","__idx":0},"children":["Integration overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Omni CLO integration has two independent read workflows and one asynchronous write workflow."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"merchant-and-offer-discovery","__idx":1},"children":["Merchant and offer discovery"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the merchant and offer endpoints to synchronize the catalog available to your issuer. Every response is scoped by the issuer represented by the API token."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"Issuer server -> GET /api/v1/omni/merchant -> merchant catalog\nIssuer server -> GET /api/v1/omni/offer    -> offer catalog\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["List endpoints return currently relevant catalog data. ID endpoints support reconciliation and historical lookup, including an offer that has ended."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transaction-file-processing","__idx":2},"children":["Transaction-file processing"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"text","header":{"controls":{"copy":{}}},"source":"Issuer server -> GET /api/fileUpload -> presigned URL\nIssuer server -> PUT presigned URL    -> object storage\nPercents      -> download and validate schema\nPercents      -> signed validation webhook -> issuer webhook receiver\nPercents      -> ingest and process transactions asynchronously\n","lang":"text"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Getting the presigned URL only creates an upload slot. Processing does not begin until bytes are uploaded and Percents detects the object. For ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["plaid-txn-stream"]},", Percents downloads and validates the complete JSON contract during regular periodic file processing, which runs no less frequently than hourly. Downstream transaction processing and audits do not produce a second public file-result webhook."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"issuer-scope","__idx":3},"children":["Issuer scope"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Merchant and offer reads are scoped to the authenticated issuer. Uploaded files use the content format enabled for that issuer."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"environments","__idx":4},"children":["Environments"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Environment"},"children":["Environment"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Base URL"},"children":["Base URL"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Purpose"},"children":["Purpose"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sandbox"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://sandbox.percents.com"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Contract development and acceptance testing"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Production"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://prod.percents.com"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Live catalog and transaction processing"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Credentials, source-IP allowlists, upload enablement, and webhook destinations are configured separately per environment."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sandbox does not perform live transaction processing. It is used to coordinate contract validation with Percents; see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/omni-api/overview/sandbox-access"},"children":["Sandbox access"]}," for the validation model."]}]},"headings":[{"value":"Integration overview","id":"integration-overview","depth":1},{"value":"Merchant and offer discovery","id":"merchant-and-offer-discovery","depth":2},{"value":"Transaction-file processing","id":"transaction-file-processing","depth":2},{"value":"Issuer scope","id":"issuer-scope","depth":2},{"value":"Environments","id":"environments","depth":2}],"frontmatter":{"seo":{"title":"Integration overview"}},"lastModified":"2026-08-11T03:50:30.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/omni-api/overview/integration-overview","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}