{
  "info": {
    "name": "Olympus Pay \u2014 Merchant API",
    "description": "Olympus Pay merchant API, authenticated with an API key from Dashboard \u2192 Developers. Set the apiKey variable (an olp_test_\u2026 sandbox key is safest). Each request notes the scope it needs. Machine-readable spec: {{baseUrl}}/openapi.json",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://merchant.olympuspay.co/api/v1"
    },
    {
      "key": "apiKey",
      "value": "olp_test_REPLACE_ME"
    }
  ],
  "item": [
    {
      "name": "Account & verification",
      "item": [
        {
          "name": "View business profile and verification status",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/account",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "account"
              ]
            },
            "description": "Required scope: `account:read or kyc:read`."
          }
        },
        {
          "name": "Start identity verification",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/account/verification",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "account",
                "verification"
              ]
            },
            "description": "Starts a hosted identity + liveness session for the business owner and returns a URL to send them to. Poll `GET /api/v1/account` afterwards to see `kyc_status` move past `in_review`.\n\nRequired scope: `kyc:write`."
          }
        }
      ]
    },
    {
      "name": "Payments",
      "item": [
        {
          "name": "List payments",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payments",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments"
              ],
              "query": [
                {
                  "key": "limit",
                  "value": "25",
                  "disabled": true
                }
              ]
            },
            "description": "Required scope: `payments:read`."
          }
        },
        {
          "name": "Get a payment",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payments/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `payments:read`."
          }
        },
        {
          "name": "Cancel a pending payment",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payments/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Only works while the payment is still pending \u2014 cannot void a charge already submitted to the processor.\n\nRequired scope: `payments:cancel`."
          }
        },
        {
          "name": "Refund a payment (full or partial)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payments/:id/refund",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payments",
                ":id",
                "refund"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `refunds:create_full (no amount) or refunds:create_partial (with amount)`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 25.0\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Payment links",
      "item": [
        {
          "name": "Create a payment link",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payment-links",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payment-links"
              ]
            },
            "description": "Required scope: `payment_links:write (+ splits:assign if splitRecipientId is set)`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Order 1042\",\n  \"description\": \"Order 1042\",\n  \"amount\": 25.0,\n  \"currency\": \"BWP\",\n  \"idempotencyKey\": \"{{$guid}}\",\n  \"returnUrl\": \"https://example.com/thanks\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "QR codes",
      "item": [
        {
          "name": "Create a dynamic QR code",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/qr-codes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "qr-codes"
              ]
            },
            "description": "Required scope: `qr_codes:write (+ splits:assign if splitRecipientId is set)`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"mode\": \"fixed_amount\",\n  \"amount\": 25.0,\n  \"currency\": \"BWP\",\n  \"description\": \"Order 1042\",\n  \"singleUse\": false,\n  \"returnUrl\": \"https://example.com/thanks\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Split recipients",
      "item": [
        {
          "name": "List split recipients",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/split-recipients",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-recipients"
              ]
            },
            "description": "Required scope: `recipients:read`."
          }
        },
        {
          "name": "Register a split recipient",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/split-recipients",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-recipients"
              ]
            },
            "description": "Required scope: `recipients:write`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"externalReference\": \"landlord-042\",\n  \"name\": \"Kgosi Properties\",\n  \"accountBank\": \"BANK_CODE\",\n  \"accountNumber\": \"1234567890\",\n  \"recipientMobile\": \"+26771234567\",\n  \"splitValue\": 95\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Verify or disable a split recipient",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/split-recipients/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "split-recipients",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `recipients:verify (for verified) / recipients:disable (for disabled)`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"verified\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    },
    {
      "name": "Payouts",
      "item": [
        {
          "name": "List payouts",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payouts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payouts"
              ]
            },
            "description": "Required scope: `payouts:read`."
          }
        },
        {
          "name": "Request a payout",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/payouts",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payouts"
              ]
            },
            "description": "Live keys only \u2014 rejected outright on sandbox keys since payouts move real settlement funds.\n\nRequired scope: `payouts:create`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 25.0,\n  \"currency\": \"BWP\",\n  \"destinationType\": \"olympus_account\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Cancel a pending payout",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/payouts/:id/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "payouts",
                ":id",
                "cancel"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `payouts:cancel`."
          }
        }
      ]
    },
    {
      "name": "Settlements",
      "item": [
        {
          "name": "View settlements",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/settlements",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "settlements"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "2026-09-01"
                },
                {
                  "key": "to",
                  "value": "2026-09-30"
                },
                {
                  "key": "format",
                  "value": "csv",
                  "disabled": true
                }
              ]
            },
            "description": "Required scope: `settlements:read (+ reports:export for CSV)`."
          }
        }
      ]
    },
    {
      "name": "Webhooks",
      "item": [
        {
          "name": "List webhook endpoints",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Required scope: `webhooks:read_logs or webhooks:manage`."
          }
        },
        {
          "name": "Register a webhook endpoint",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/webhooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks"
              ]
            },
            "description": "Required scope: `webhooks:manage`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://example.com/webhooks/olympus\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "Remove a webhook endpoint",
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `webhooks:manage`."
          }
        },
        {
          "name": "View delivery logs for a webhook endpoint",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/:id/deliveries",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                ":id",
                "deliveries"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Required scope: `webhooks:read_logs`."
          }
        },
        {
          "name": "Retry a failed webhook delivery",
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/webhooks/deliveries/:id/retry",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "webhooks",
                "deliveries",
                ":id",
                "retry"
              ],
              "variable": [
                {
                  "key": "id",
                  "value": "<id>"
                }
              ]
            },
            "description": "Resends the exact original payload with a fresh signature timestamp.\n\nRequired scope: `webhooks:retry`."
          }
        }
      ]
    },
    {
      "name": "Reference",
      "item": [
        {
          "name": "Status values and webhook event type reference",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/reference",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "reference"
              ]
            },
            "description": "Status values and webhook event type reference"
          }
        }
      ]
    }
  ],
  "event": [
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "pm.test('Request accepted', function () { pm.expect(pm.response.code).to.be.below(300); });"
        ]
      }
    }
  ]
}